> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fetchin.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Profile

> Get detailed information about a professional profile

## Endpoint

```
GET /api/v1/profile
```

## Authentication

Include your API key in the request header:

```bash theme={null}
X-API-Key: your-api-key-here
```

## Parameters

<ParamField query="profileUrlOrUrn" type="string" required>
  The professional profile to fetch. Accepts any of:

  * **Profile URN**, recommended for consistency: a profile's public identifier (slug) can change over time, the URN does not. Example: `urn:li:fsd_profile:ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc`
  * **Public identifier (slug)**, also fine. Example: `williamhgates`
  * **Profile URL**. Example: `https://www.linkedin.com/in/williamhgates` (a trailing slash makes no difference)

  The slug is the last path segment of a profile URL (`linkedin.com/in/<slug>`). Pass just the slug, not the `/in/` prefix.
</ParamField>

## Response

<ResponseField name="profile" type="object">
  Professional profile information

  <Expandable title="Profile object">
    <ResponseField name="id" type="string">
      Professional profile URN (unique identifier)
    </ResponseField>

    <ResponseField name="firstName" type="string">
      Profile first name
    </ResponseField>

    <ResponseField name="lastName" type="string">
      Profile last name
    </ResponseField>

    <ResponseField name="title" type="string">
      Professional headline
    </ResponseField>

    <ResponseField name="description" type="string">
      About/summary section
    </ResponseField>

    <ResponseField name="location" type="string">
      Geographic location
    </ResponseField>

    <ResponseField name="profilePictureUrl" type="string">
      Profile picture URL
    </ResponseField>

    <ResponseField name="coverImageUrl" type="string">
      Profile banner/background image URL (optional, not all profiles have one)
    </ResponseField>

    <ResponseField name="publicIdentifier" type="string">
      Public identifier (slug), e.g. "williamhgates"
    </ResponseField>

    <ResponseField name="profileId" type="string">
      Member identifier, e.g. "ACoAAA8BYqEBCGLg\_vT..."
    </ResponseField>

    <ResponseField name="countryCode" type="string">
      ISO country code, e.g. "US", "FR"
    </ResponseField>

    <ResponseField name="geoLocationName" type="string">
      Full geographic location string, e.g. "Paris, Île-de-France, France"
    </ResponseField>

    <ResponseField name="geoCountryName" type="string">
      Country name, e.g. "United States", "France"
    </ResponseField>

    <ResponseField name="geoUrn" type="string">
      Geo URN, e.g. "urn:li:fsd\_geo:104116203"
    </ResponseField>

    <ResponseField name="connectionType" type="string">
      Relationship to the authenticated account, e.g. "OUT\_OF\_NETWORK", "CONNECTED"
    </ResponseField>

    <ResponseField name="jobTitle" type="string">
      Current job title, e.g. "Co-chair", "CEO"
    </ResponseField>

    <ResponseField name="companyName" type="string">
      Current company name, e.g. "Gates Foundation"
    </ResponseField>

    <ResponseField name="companyPublicId" type="string">
      Current company public identifier slug, e.g. "gates-foundation"
    </ResponseField>

    <ResponseField name="companyLinkedinUrl" type="string">
      Current company profile URL
    </ResponseField>

    <ResponseField name="currentPosition" type="object | null">
      The explicit "current company" block from the top of the profile page. Always present: an object when the member displays their current company at the top of their profile, `null` when they don't. Note that `null` only means the block is not displayed — the profile may still have an ongoing primary position (see `experiences[].current`).

      <Expandable title="CurrentPosition object">
        <ResponseField name="positionUrn" type="string">
          URN of the designated position, e.g. `urn:li:fsd_profilePosition:(ACoAA…,2839633222)`. Matches `experiences[].positionUrn`, so you can join back to the full experience entry.
        </ResponseField>

        <ResponseField name="title" type="string">
          Role title of the designated position, e.g. "CTO". Omitted when the position cannot be matched in `experiences`.
        </ResponseField>

        <ResponseField name="name" type="string">
          Company name, e.g. "Reverse Contact"
        </ResponseField>

        <ResponseField name="companyId" type="string">
          Numeric company id, e.g. "89181966". Usable with the company endpoints.
        </ResponseField>

        <ResponseField name="companyUrn" type="string">
          Full company URN, e.g. "urn:li:fsd\_company:89181966"
        </ResponseField>

        <ResponseField name="publicIdentifier" type="string">
          Company page slug, e.g. "reverse-contact"
        </ResponseField>

        <ResponseField name="url" type="string">
          Company page URL
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="currentSchool" type="object | null">
      The explicit "education" block from the top of the profile page. Always present: an object when the member displays their school at the top of their profile, `null` when they don't.

      <Expandable title="CurrentSchool object">
        <ResponseField name="educationUrn" type="string">
          URN of the designated education entry, e.g. `urn:li:fsd_profileEducation:(ACoAA…,363452424)`. Matches `educations[].educationUrn`.
        </ResponseField>

        <ResponseField name="name" type="string">
          School name
        </ResponseField>

        <ResponseField name="schoolId" type="string">
          Legacy school id from `urn:li:fsd_school:<id>`, e.g. "42867". Distinct from `companyId`.
        </ResponseField>

        <ResponseField name="schoolUrn" type="string">
          Full school URN, e.g. "urn:li:fsd\_school:42867"
        </ResponseField>

        <ResponseField name="companyId" type="string">
          Numeric organization id of the school's page, e.g. "15142508". Usable with the company endpoints.
        </ResponseField>

        <ResponseField name="publicIdentifier" type="string">
          School page slug, e.g. "esilvparis"
        </ResponseField>

        <ResponseField name="url" type="string">
          School page URL
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="followerCount" type="number">
      Number of followers
    </ResponseField>

    <ResponseField name="connectionsCount" type="number">
      Number of connections
    </ResponseField>

    <ResponseField name="creator" type="boolean">
      Whether the profile has Creator mode enabled
    </ResponseField>

    <ResponseField name="influencer" type="boolean">
      Whether the profile is an influencer
    </ResponseField>

    <ResponseField name="premium" type="boolean">
      Whether the profile has a Premium subscription
    </ResponseField>

    <ResponseField name="isVerified" type="boolean">
      Whether the profile has a verification badge
    </ResponseField>

    <ResponseField name="memberId" type="string">
      Numeric internal member id, e.g. "251749025". Distinct from `id`/`profileId`, which carry the `urn:li:fsd_profile:…` form.
    </ResponseField>

    <ResponseField name="openToWork" type="boolean">
      Whether the profile shows the public #OPEN\_TO\_WORK photo frame. Always present (true/false). Reflects the publicly visible badge only; "open to work" set visible to recruiters only reads as false.
    </ResponseField>

    <ResponseField name="inRemembrance" type="boolean">
      Whether the account is memorialized / "In Remembrance" (deceased member). Always present (true/false).
    </ResponseField>

    <ResponseField name="joinDate" type="object">
      Approximate account creation date (month + year)

      <Expandable title="JoinDate object">
        <ResponseField name="month" type="number">
          Month (1-12), e.g. 1 for January
        </ResponseField>

        <ResponseField name="year" type="number">
          Year, e.g. 2014
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="url" type="string">
      Canonical public URL of the professional profile page, e.g. `https://www.linkedin.com/in/williamhgates/`
    </ResponseField>

    <ResponseField name="pronoun" type="string">
      Publicly displayed pronouns (e.g. "she/her"). Omitted when the member doesn't display pronouns.
    </ResponseField>

    <ResponseField name="creatorInfo" type="object">
      Creator mode information (only present if profile has creator mode)

      <Expandable title="CreatorInfo object">
        <ResponseField name="hashTags" type="array">
          Creator hashtags, e.g. \["#books", "#climatechange"]
        </ResponseField>

        <ResponseField name="website" type="string">
          Creator website URL (null if not set)
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="experiences" type="array">
      Work experience history

      <Expandable title="Experience object">
        <ResponseField name="name" type="string">
          Company name
        </ResponseField>

        <ResponseField name="jobTitle" type="string">
          Job title/role
        </ResponseField>

        <ResponseField name="description" type="string">
          Role description
        </ResponseField>

        <ResponseField name="dateRange" type="string">
          Date range (e.g., "Sep 2016 - Sep 2019")
        </ResponseField>

        <ResponseField name="current" type="boolean">
          Whether this is the person's current role. At most one experience is `true` (the primary ongoing position); `false` for all others.
        </ResponseField>

        <ResponseField name="positionUrn" type="string">
          URN of this position entity, e.g. `urn:li:fsd_profilePosition:(ACoAA…,2839633222)`. Join key for the top-level `currentPosition.positionUrn`.
        </ResponseField>

        <ResponseField name="locationName" type="string">
          Job location (e.g., "Paris, Île-de-France, France")
        </ResponseField>

        <ResponseField name="employmentType" type="string">
          Employment type (e.g., "Freelance", "Part-time")
        </ResponseField>

        <ResponseField name="timePeriod" type="object">
          Structured time period with startDate and endDate
        </ResponseField>

        <ResponseField name="totalDuration" type="string">
          Duration string (e.g., "3 yrs 1 mo")
        </ResponseField>

        <ResponseField name="company" type="object">
          Company details

          <Expandable title="Company object">
            <ResponseField name="name" type="string">
              Company name
            </ResponseField>

            <ResponseField name="url" type="string">
              Company profile URL
            </ResponseField>

            <ResponseField name="logo" type="string">
              Company logo image URL
            </ResponseField>

            <ResponseField name="companyId" type="string">
              Numeric company id, e.g. "8736"
            </ResponseField>

            <ResponseField name="urn" type="string">
              Full company URN, e.g. "urn:li:fsd\_company:8736"
            </ResponseField>
          </Expandable>
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="educations" type="array">
      Education history

      <Expandable title="Education object">
        <ResponseField name="name" type="string">
          School/University name
        </ResponseField>

        <ResponseField name="description" type="string">
          Degree type and field of study combined
        </ResponseField>

        <ResponseField name="dateRange" type="string">
          Date range (e.g., "2016 - 2019")
        </ResponseField>

        <ResponseField name="current" type="boolean">
          Whether this is the person's current (ongoing) education. At most one education is `true`.
        </ResponseField>

        <ResponseField name="educationUrn" type="string">
          URN of this education entity, e.g. `urn:li:fsd_profileEducation:(ACoAA…,363452424)`. Join key for the top-level `currentSchool.educationUrn`.
        </ResponseField>

        <ResponseField name="degreeName" type="string">
          Degree name (e.g., "MBA", "MSEE", "B. Tech")
        </ResponseField>

        <ResponseField name="fieldOfStudy" type="string">
          Field of study (e.g., "Materials Science and Engineering")
        </ResponseField>

        <ResponseField name="grade" type="string">
          Grade or honors, as free text (e.g., "First Class Honours")
        </ResponseField>

        <ResponseField name="details" type="string">
          The member's own free-text description of this education entry. Distinct from `description`, which stays the synthesized degree + field string.
        </ResponseField>

        <ResponseField name="schoolLogo" type="string">
          School logo image URL
        </ResponseField>

        <ResponseField name="schoolUrl" type="string">
          School profile URL
        </ResponseField>

        <ResponseField name="timePeriod" type="object">
          Structured time period with startDate and endDate
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="volunteerCauses" type="array">
      Volunteer causes listed on the profile (string array, e.g., \["Education", "Science and Technology"])
    </ResponseField>

    <ResponseField name="skills" type="array">
      Professional skills listed on the profile

      <Expandable title="Skill object">
        <ResponseField name="name" type="string">
          Skill name, e.g. "JavaScript", "Leadership"
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="languages" type="array">
      Languages listed on the profile

      <Expandable title="Language object">
        <ResponseField name="name" type="string">
          Language name, e.g. "English", "French"
        </ResponseField>

        <ResponseField name="proficiency" type="string">
          Proficiency level (may be empty)
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="certifications" type="array">
      Licenses and certifications

      <Expandable title="Certification object">
        <ResponseField name="name" type="string">
          Certification name
        </ResponseField>

        <ResponseField name="organizationName" type="string">
          Issuing organization's name
        </ResponseField>

        <ResponseField name="organizationUrl" type="string">
          Issuing organization's professional page URL, when available
        </ResponseField>

        <ResponseField name="issuedDate" type="string">
          When the certification was issued (e.g. `Jun 2018`)
        </ResponseField>

        <ResponseField name="authority" type="string" deprecated>
          Legacy alias of `organizationName`, kept for backward compatibility
        </ResponseField>

        <ResponseField name="dateRange" type="string" deprecated>
          Legacy alias of `issuedDate`, kept for backward compatibility
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="recommendations" type="array">
      Recommendations received by the member. Best-effort: omitted when this section could not be fetched, empty array when the member has none.

      <Expandable title="Recommendation object">
        <ResponseField name="description" type="string">
          The recommendation text
        </ResponseField>

        <ResponseField name="caption" type="string">
          The recommender's headline at the time of the fetch (the context line shown under the author's name)
        </ResponseField>

        <ResponseField name="authorFullname" type="string">
          The recommender's full name
        </ResponseField>

        <ResponseField name="authorUrl" type="string">
          The recommender's public profile page URL
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="testScores" type="array">
      Test scores listed on the profile

      <Expandable title="TestScore object">
        <ResponseField name="name" type="string">
          Test name, e.g. "TOEIC"
        </ResponseField>

        <ResponseField name="score" type="string">
          Score, as free text, e.g. "990"
        </ResponseField>

        <ResponseField name="date" type="string">
          When the test was taken (e.g. `Jun 2018`)
        </ResponseField>
      </Expandable>
    </ResponseField>
  </Expandable>
</ResponseField>

## Example Request

<CodeGroup>
  ```bash cURL theme={null}
  curl -X GET "https://api.fetchin.io/api/v1/profile?profileUrlOrUrn=https://www.linkedin.com/in/williamhgates" \
    -H "X-API-Key: your-api-key-here"
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch(
    'https://api.fetchin.io/api/v1/profile?profileUrlOrUrn=https://www.linkedin.com/in/williamhgates',
    {
      headers: {
        'X-API-Key': 'your-api-key-here'
      }
    }
  );

  const profile = await response.json();
  console.log(profile);
  ```

  ```python Python theme={null}
  import requests

  headers = {
      'X-API-Key': 'your-api-key-here'
  }

  params = {
      'profileUrlOrUrn': 'https://www.linkedin.com/in/williamhgates'
  }

  response = requests.get(
      'https://api.fetchin.io/api/v1/profile',
      headers=headers,
      params=params
  )

  profile = response.json()
  print(profile)
  ```

  ```php PHP theme={null}
  <?php

  $apiKey = 'your-api-key-here';
  $profileUrl = 'https://www.linkedin.com/in/williamhgates';

  $url = "https://api.fetchin.io/api/v1/profile?profileUrlOrUrn=" . urlencode($profileUrl);

  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HTTPHEADER, [
      'X-API-Key: ' . $apiKey
  ]);

  $response = curl_exec($ch);
  $profile = json_decode($response, true);

  curl_close($ch);
  print_r($profile);
  ?>
  ```
</CodeGroup>

## Example Response

<ResponseExample>
  ```json 200 Success theme={null}
  {
    "id": "urn:li:fsd_profile:ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc",
    "firstName": "Bill",
    "lastName": "Gates",
    "title": "Chair, Gates Foundation and Founder, Breakthrough Energy",
    "description": "Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.",
    "location": "Seattle, Washington, United States",
    "profilePictureUrl": "https://media.licdn.com/dms/image/...",
    "coverImageUrl": "https://media.licdn.com/dms/image/...",
    "publicIdentifier": "williamhgates",
    "profileId": "ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc",
    "countryCode": "US",
    "geoLocationName": "Seattle, Washington, United States",
    "geoCountryName": "United States",
    "geoUrn": "urn:li:fsd_geo:104116203",
    "connectionType": "OUT_OF_NETWORK",
    "creatorInfo": {
      "hashTags": ["#books", "#climatechange", "#healthcare", "#innovation", "#sustainability"],
      "website": "https://gatesnot.es/tgn"
    },
    "jobTitle": "Co-chair",
    "companyName": "Gates Foundation",
    "companyPublicId": "gates-foundation",
    "companyLinkedinUrl": "https://www.linkedin.com/company/gates-foundation/",
    "currentPosition": {
      "positionUrn": "urn:li:fsd_profilePosition:(ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc,392598211)",
      "title": "Co-chair",
      "name": "Gates Foundation",
      "companyId": "8736",
      "companyUrn": "urn:li:fsd_company:8736",
      "publicIdentifier": "gates-foundation",
      "url": "https://www.linkedin.com/company/gates-foundation/"
    },
    "currentSchool": null,
    "followerCount": 40076104,
    "connectionsCount": 8,
    "creator": true,
    "influencer": true,
    "premium": true,
    "isVerified": false,
    "memberId": "251749025",
    "openToWork": false,
    "inRemembrance": false,
    "joinDate": { "month": 5, "year": 2013 },
    "url": "https://www.linkedin.com/in/williamhgates/",
    "pronoun": "he/him",
    "experiences": [
      {
        "name": "Gates Foundation",
        "jobTitle": "Co-chair",
        "description": "",
        "dateRange": "2000 - Present",
        "current": true,
        "positionUrn": "urn:li:fsd_profilePosition:(ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc,392598211)",
        "timePeriod": {
          "startDate": { "year": 2000 },
          "endDate": null
        },
        "company": {
          "url": "https://www.linkedin.com/company/gates-foundation/",
          "name": "Gates Foundation",
          "logo": "https://media.licdn.com/dms/image/...",
          "companyId": "8736",
          "urn": "urn:li:fsd_company:8736"
        }
      },
      {
        "name": "Microsoft",
        "jobTitle": "Co-founder",
        "description": "",
        "dateRange": "1975 - Present",
        "current": false,
        "positionUrn": "urn:li:fsd_profilePosition:(ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc,392599749)",
        "timePeriod": {
          "startDate": { "year": 1975 },
          "endDate": null
        },
        "company": {
          "url": "https://www.linkedin.com/company/microsoft/",
          "name": "Microsoft",
          "logo": "https://media.licdn.com/dms/image/...",
          "companyId": "1035",
          "urn": "urn:li:fsd_company:1035"
        }
      }
    ],
    "educations": [
      {
        "name": "Harvard University",
        "description": "",
        "dateRange": "1973 - 1975",
        "current": false,
        "educationUrn": "urn:li:fsd_profileEducation:(ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc,157656829)",
        "grade": "3.9/4.0",
        "details": "Studied mathematics and computer science before leaving to co-found Microsoft.",
        "schoolLogo": "https://media.licdn.com/dms/image/...",
        "schoolUrl": "https://www.linkedin.com/school/harvard-university/",
        "timePeriod": {
          "startDate": { "year": 1973 },
          "endDate": { "year": 1975 }
        }
      }
    ],
    "skills": [],
    "languages": [],
    "certifications": [],
    "recommendations": [
      {
        "caption": "Chairman and CEO at Microsoft",
        "description": "Bill's clarity of thought and depth of curiosity are unmatched. Every conversation with him leaves you thinking bigger.",
        "authorFullname": "Satya Nadella",
        "authorUrl": "https://www.linkedin.com/in/satyanadella/"
      }
    ],
    "testScores": [
      {
        "name": "TOEIC",
        "score": "990",
        "date": "Jun 2018"
      }
    ],
    "volunteerCauses": []
  }
  ```

  ```json 400 Bad Request theme={null}
  {
    "error": "Missing profileUrlOrUrn parameter",
    "code": "MISSING_PARAMETER"
  }
  ```

  ```json 401 Unauthorized theme={null}
  {
    "error": "Invalid API key",
    "code": "INVALID_API_KEY"
  }
  ```

  ```json 404 Not Found theme={null}
  {
    "error": "LinkedIn profile not found",
    "code": "PROFILE_NOT_FOUND"
  }
  ```

  ```json 402 Payment Required theme={null}
  {
    "error": "Quota exceeded. Upgrade your plan or wait for renewal.",
    "code": "QUOTA_EXHAUSTED"
  }
  ```

  ```json 500 Internal Server Error theme={null}
  {
    "error": "Internal server error",
    "code": "INTERNAL_ERROR"
  }
  ```

  ```json 503 Service Unavailable theme={null}
  {
    "error": "Service temporarily unable to serve this request. Please retry.",
    "code": "SERVICE_UNAVAILABLE"
  }
  ```
</ResponseExample>

## Errors

See [Error Handling](/concepts/error-handling) for the full list of error codes and recommended handling.

* `400` `MISSING_PARAMETER` / `INVALID_URN`
* `401` `INVALID_API_KEY`
* `404` `PROFILE_NOT_FOUND`
* `402` `QUOTA_EXHAUSTED`
* `429` `RATE_LIMITED`
* `500` `INTERNAL_ERROR`
* `503` `SERVICE_UNAVAILABLE`

## Notes

<Info>
  This endpoint consumes 1 credit from your monthly quota. Failed requests (errors) do not count against your quota.
</Info>

<Warning>
  Profile data is fetched in real-time from professional data sources. Response times may vary.
</Warning>

<Tip>
  Cache profile data for frequently accessed profiles to optimize quota usage.
</Tip>

## Use Cases

<CardGroup cols={2}>
  <Card title="Lead enrichment" icon="user-plus">
    Enhance your CRM with up-to-date professional profile data
  </Card>

  <Card title="Recruitment" icon="briefcase">
    Build candidate profiles from professional data
  </Card>

  <Card title="Research" icon="magnifying-glass">
    Analyze professional backgrounds and career paths
  </Card>

  <Card title="Verification" icon="shield-check">
    Verify professional credentials and work history
  </Card>
</CardGroup>


## OpenAPI

````yaml GET /api/v1/profile
openapi: 3.1.0
info:
  title: Fetchin API
  version: 1.0.0
  description: Public B2B data API for fetching posts and profile information
servers:
  - url: https://api.fetchin.io
    description: Production server
security:
  - ApiKeyAuth: []
paths:
  /api/v1/profile:
    get:
      summary: Get profile information
      description: Fetch profile details using profile URL or URN
      parameters:
        - name: profileUrlOrUrn
          in: query
          required: true
          description: >-
            The professional profile to fetch. Accepts a profile URN
            (recommended for consistency, since a profile's public identifier
            can change over time while the URN does not; example
            `urn:li:fsd_profile:ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc`), a
            public identifier/slug (also fine; example `williamhgates`), or a
            full profile URL (example
            `https://www.linkedin.com/in/williamhgates`; a trailing slash is
            ignored). The slug is the last path segment of a profile URL, so
            pass just the slug, not the `/in/` prefix.
          schema:
            type: string
            example: urn:li:fsd_profile:ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc
      responses:
        '200':
          description: Successfully fetched profile
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    description: Profile URN (unique identifier)
                    example: urn:li:fsd_profile:ACoAAABCDEF
                  firstName:
                    type: string
                  lastName:
                    type: string
                  title:
                    type: string
                    description: Professional headline
                  description:
                    type: string
                    description: About/summary section
                  location:
                    type: string
                  profilePictureUrl:
                    type: string
                  experiences:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                          description: Company name
                        jobTitle:
                          type: string
                          description: Job title/role
                        description:
                          type: string
                          description: Role description
                        dateRange:
                          type: string
                          description: Date range
                        current:
                          type: boolean
                          description: >-
                            Whether this is the person's current role. At most
                            one experience is true (the primary ongoing
                            position).
                        positionUrn:
                          type: string
                          description: >-
                            URN of this position entity; join key for
                            currentPosition.positionUrn
                          example: >-
                            urn:li:fsd_profilePosition:(ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc,392598211)
                        locationName:
                          type: string
                          description: Job location
                        employmentType:
                          type: string
                          description: Employment type (e.g., Freelance, Part-time)
                        timePeriod:
                          type: object
                          properties:
                            startDate:
                              type: object
                              properties:
                                month:
                                  type: number
                                year:
                                  type: number
                            endDate:
                              type:
                                - object
                                - 'null'
                              properties:
                                month:
                                  type: number
                                year:
                                  type: number
                        totalDuration:
                          type: string
                          description: Duration string (e.g., 3 yrs 1 mo)
                        company:
                          type: object
                          properties:
                            name:
                              type: string
                            url:
                              type: string
                              description: Company profile URL
                            logo:
                              type: string
                              description: Company logo URL
                            companyId:
                              type: string
                              description: >-
                                Numeric company id (e.g. "8736"), parsed from
                                the company URN
                              example: '8736'
                            urn:
                              type: string
                              description: Full company URN
                              example: urn:li:fsd_company:8736
                  educations:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                          description: School/University name
                        description:
                          type: string
                          description: Degree and field combined
                        dateRange:
                          type: string
                          description: Date range
                        current:
                          type: boolean
                          description: >-
                            Whether this is the person's current (ongoing)
                            education. At most one education is true.
                        educationUrn:
                          type: string
                          description: >-
                            URN of this education entity; join key for
                            currentSchool.educationUrn
                          example: >-
                            urn:li:fsd_profileEducation:(ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc,157656829)
                        degreeName:
                          type: string
                          description: Degree name (e.g., MBA, MSEE)
                        fieldOfStudy:
                          type: string
                          description: Field of study
                        grade:
                          type: string
                          description: >-
                            Grade or honors, as free text (e.g. "First Class
                            Honours")
                        details:
                          type: string
                          description: >-
                            The member's own free-text description of this
                            education entry. Distinct from `description`, which
                            stays the synthesized degree + field string.
                        schoolLogo:
                          type: string
                          description: School logo URL
                        schoolUrl:
                          type: string
                          description: School profile URL
                        timePeriod:
                          type: object
                          properties:
                            startDate:
                              type: object
                              properties:
                                year:
                                  type: number
                            endDate:
                              type: object
                              properties:
                                year:
                                  type: number
                  volunteerCauses:
                    type: array
                    items:
                      type: string
                    description: Volunteer causes listed on the profile
                  skills:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                          description: Skill name
                  languages:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                          description: Language name
                        proficiency:
                          type: string
                          description: Proficiency level
                  certifications:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                          description: Certification name
                        organizationName:
                          type: string
                          description: Issuing organization's name
                        organizationUrl:
                          type: string
                          description: >-
                            Issuing organization's professional page URL, when
                            available
                        issuedDate:
                          type: string
                          description: When the certification was issued (e.g. Jun 2018)
                        authority:
                          type: string
                          deprecated: true
                          description: >-
                            Legacy alias of organizationName, kept for backward
                            compatibility
                        dateRange:
                          type: string
                          deprecated: true
                          description: >-
                            Legacy alias of issuedDate, kept for backward
                            compatibility
                  coverImageUrl:
                    type: string
                    description: Profile banner/background image URL
                  publicIdentifier:
                    type: string
                    description: Public identifier (slug)
                  profileId:
                    type: string
                    description: Member identifier
                  countryCode:
                    type: string
                    description: ISO country code
                  geoLocationName:
                    type: string
                    description: Full geographic location string
                  geoCountryName:
                    type: string
                    description: Country name
                  geoUrn:
                    type: string
                    description: Geo URN
                  connectionType:
                    type: string
                    description: Relationship to the authenticated account
                  creatorInfo:
                    type: object
                    description: Creator mode information
                    properties:
                      hashTags:
                        type: array
                        items:
                          type: string
                        description: Creator hashtags
                      website:
                        type:
                          - string
                          - 'null'
                        description: Creator website URL
                  jobTitle:
                    type: string
                    description: Current job title
                  companyName:
                    type: string
                    description: Current company name
                  companyPublicId:
                    type: string
                    description: Current company public identifier slug
                  companyLinkedinUrl:
                    type: string
                    description: Current company profile URL
                  currentPosition:
                    type:
                      - object
                      - 'null'
                    description: >-
                      Explicit "current company" block from the top of the
                      profile page. Object when the member displays it, null
                      when they don't (an ongoing primary position may still
                      exist in experiences).
                    properties:
                      positionUrn:
                        type: string
                        description: >-
                          URN of the designated position; matches
                          experiences[].positionUrn
                        example: >-
                          urn:li:fsd_profilePosition:(ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVffJ3hc,392598211)
                      title:
                        type: string
                        description: Role title of the designated position
                        example: Co-chair
                      name:
                        type: string
                        description: Company name
                        example: Gates Foundation
                      companyId:
                        type: string
                        description: Numeric company id, usable with the company endpoints
                        example: '8736'
                      companyUrn:
                        type: string
                        description: Full company URN
                        example: urn:li:fsd_company:8736
                      publicIdentifier:
                        type: string
                        description: Company page slug
                        example: gates-foundation
                      url:
                        type: string
                        description: Company page URL
                        example: https://www.linkedin.com/company/gates-foundation/
                  currentSchool:
                    type:
                      - object
                      - 'null'
                    description: >-
                      Explicit "education" block from the top of the profile
                      page. Object when the member displays it, null when they
                      don't.
                    properties:
                      educationUrn:
                        type: string
                        description: >-
                          URN of the designated education entry; matches
                          educations[].educationUrn
                        example: >-
                          urn:li:fsd_profileEducation:(ACoAABESIloBBibfTXhrzlOSTVNOHzLIIbQoDWw,363452424)
                      name:
                        type: string
                        description: School name
                        example: ESILV - Ecole Supérieure d'Ingénieurs Léonard de Vinci
                      schoolId:
                        type: string
                        description: >-
                          Legacy school id from urn:li:fsd_school:<id>; distinct
                          from companyId
                        example: '42867'
                      schoolUrn:
                        type: string
                        description: Full school URN
                        example: urn:li:fsd_school:42867
                      companyId:
                        type: string
                        description: >-
                          Numeric organization id of the school's page, usable
                          with the company endpoints
                        example: '15142508'
                      publicIdentifier:
                        type: string
                        description: School page slug
                        example: esilvparis
                      url:
                        type: string
                        description: School page URL
                        example: https://www.linkedin.com/school/esilvparis/
                  followerCount:
                    type: number
                    description: Number of followers
                  connectionsCount:
                    type: number
                    description: Number of connections
                  creator:
                    type: boolean
                    description: Whether Creator mode is enabled
                  influencer:
                    type: boolean
                    description: Whether the profile is an influencer
                  premium:
                    type: boolean
                    description: Whether the profile has Premium
                  isVerified:
                    type: boolean
                    description: Whether the profile has a verification badge
                  memberId:
                    type: string
                    description: >-
                      Numeric internal member id (e.g. "251749025"). Distinct
                      from `id`/`profileId`, which carry the
                      `urn:li:fsd_profile:…` form.
                    example: '251749025'
                  openToWork:
                    type: boolean
                    description: >-
                      Whether the profile shows the public #OPEN_TO_WORK photo
                      frame. Reflects the publicly visible badge only;
                      recruiter-only 'open to work' is not exposed.
                  inRemembrance:
                    type: boolean
                    description: >-
                      Whether the account is memorialized / 'In Remembrance'
                      (deceased member).
                  joinDate:
                    type: object
                    description: Approximate account creation date (month + year).
                    properties:
                      month:
                        type: number
                      year:
                        type: number
                  url:
                    type: string
                    description: Canonical public URL of the professional profile page
                    example: https://www.linkedin.com/in/williamhgates/
                  pronoun:
                    type: string
                    description: >-
                      Publicly displayed pronouns (e.g. "she/her"). Omitted when
                      the member doesn't display pronouns.
                    example: she/her
                  recommendations:
                    type: array
                    description: >-
                      Recommendations received by the member. Best-effort:
                      omitted when this section could not be fetched, empty
                      array when the member has none.
                    items:
                      type: object
                      properties:
                        caption:
                          type: string
                          description: >-
                            The recommender's headline at the time of the fetch
                            (the context line shown under the author's name)
                        description:
                          type: string
                          description: The recommendation text
                        authorFullname:
                          type: string
                          description: The recommender's full name
                        authorUrl:
                          type: string
                          description: The recommender's public profile page URL
                  testScores:
                    type: array
                    description: Test scores listed on the profile
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                          description: Test name (e.g. "TOEIC")
                        score:
                          type: string
                          description: Score, as free text (e.g. "990")
                        date:
                          type: string
                          description: When the test was taken (e.g. Jun 2018)
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/PaymentRequired'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/TooManyRequests'
        '500':
          $ref: '#/components/responses/InternalError'
        '503':
          $ref: '#/components/responses/ServiceUnavailable'
components:
  responses:
    BadRequest:
      description: Bad request - a required parameter is missing or a value is invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missingParameter:
              value:
                error: Missing profileUrlOrUrn parameter
                code: MISSING_PARAMETER
            invalidParameter:
              value:
                error: limit must be a number between 1 and 100
                code: INVALID_PARAMETER
            invalidUrn:
              value:
                error: 'Invalid URN format: foo'
                code: INVALID_URN
    Unauthorized:
      description: Unauthorized - the X-API-Key header is missing or invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            missingApiKey:
              value:
                error: Missing API key. Include X-API-Key header.
                code: UNAUTHENTICATED
            invalidApiKey:
              value:
                error: Invalid API key
                code: INVALID_API_KEY
    PaymentRequired:
      description: >-
        Payment required - your monthly credit quota is exhausted
        (QUOTA_EXHAUSTED). Upgrade your plan or wait for renewal; retrying will
        not help and no Retry-After is sent. Distinct from the per-second rate
        limit, which is a 429 (RATE_LIMITED).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            quotaExhausted:
              value:
                error: Quota exceeded. Upgrade your plan or wait for renewal.
                code: QUOTA_EXHAUSTED
    NotFound:
      description: >-
        Not found - the request was served successfully but the requested
        professional entity does not exist.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            profileNotFound:
              value:
                error: LinkedIn profile not found
                code: PROFILE_NOT_FOUND
            postNotFound:
              value:
                error: Unable to find post from url
                code: POST_NOT_FOUND
            companyNotFound:
              value:
                error: Unable to find company slug from urn
                code: COMPANY_NOT_FOUND
    TooManyRequests:
      description: >-
        Too many requests - your per-second rate limit (RATE_LIMITED) was
        exceeded. Back off and retry, honoring the Retry-After header. (Monthly
        credit quota exhaustion is a separate 402 PaymentRequired /
        QUOTA_EXHAUSTED.)
      headers:
        Retry-After:
          description: Number of seconds to wait before retrying the request.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            rateLimited:
              value:
                error: Rate limit exceeded. Try again later.
                code: RATE_LIMITED
    InternalError:
      description: >-
        Internal server error - an unexpected error occurred in our API. Safe to
        retry; contact support if it persists.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            internalError:
              value:
                error: Internal server error
                code: INTERNAL_ERROR
    ServiceUnavailable:
      description: >-
        Service unavailable - our API is temporarily unable to serve this
        request (capacity exhausted or overloaded). This is on our side, not
        yours and not an upstream service outage. Retry with backoff, honoring
        the Retry-After header.
      headers:
        Retry-After:
          description: Number of seconds to wait before retrying the request.
          schema:
            type: integer
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          examples:
            serviceUnavailable:
              value:
                error: >-
                  Service temporarily unable to serve this request. Please
                  retry.
                code: SERVICE_UNAVAILABLE
  schemas:
    Error:
      type: object
      required:
        - error
        - code
      properties:
        error:
          type: string
          description: >-
            Human-readable description of what went wrong. For display/logging;
            do not branch on this string.
        code:
          type: string
          enum:
            - MISSING_PARAMETER
            - INVALID_PARAMETER
            - INVALID_URN
            - UNAUTHENTICATED
            - INVALID_API_KEY
            - FORBIDDEN
            - NOT_FOUND
            - PROFILE_NOT_FOUND
            - POST_NOT_FOUND
            - COMPANY_NOT_FOUND
            - RATE_LIMITED
            - QUOTA_EXHAUSTED
            - INTERNAL_ERROR
            - UPSTREAM_ERROR
            - SERVICE_UNAVAILABLE
            - UPSTREAM_TIMEOUT
          description: >-
            Stable, machine-readable error code. Branch your integration on this
            value, not on the HTTP status alone or the message text.
        details:
          type: object
          additionalProperties: true
          description: Optional structured context (e.g. creditsNeeded on quota errors).
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key

````