> **For coding agents and LLMs:** This is one Social Fetch marketing page (markdown export). For API orientation start with [`/llms.txt`](https://www.socialfetch.dev/llms.txt); for auth and crawl rules use [`/agents.txt`](https://www.socialfetch.dev/agents.txt); for every operation use [`/llms-endpoints.txt`](https://www.socialfetch.dev/llms-endpoints.txt).

## This page

- **On-site (HTML):** <https://www.socialfetch.dev/platforms/linkedin/profiles>
- **Markdown (.mdx) URL:** <https://www.socialfetch.dev/platforms/linkedin/profiles.mdx>

---

# LinkedIn Profile API

Look up a public LinkedIn person by handle or entityId and get structured JSON — name, headline, experience, education, metrics — without running your own browser farm.

`GET /v2/linkedin/profiles` takes exactly one of `handle` or `entityId`. Do not send both. Branch on `data.lookupStatus` before you write — `found` vs `not_found`. When found, `data.profile` covers public identity fields (handle, display name, headline, bio, location and images), experience and education blocks, languages, selected resume sections, and follower/connection metrics when supplied. Use the v2 profile posts, recommendations, similar-people, and interests routes when you need those separate sections. Company `/company/…` pages belong on `GET /v1/linkedin/companies`; post permalinks belong on `GET /v1/linkedin/posts`.

Pricing is 3 credits per completed lookup, including a verified miss. For many `/in/…` URLs, call `GET /v2/linkedin/profiles/batch` (repeatable `url`, up to 50; 3 credits per completed profile URL, 150 credits maximum authorization). Technical failures and unstarted work cost zero. Check `meta.creditsCharged` on the response. Live data can be served within a documented freshness window, including cache hits.

## Request

- **Endpoint:** `GET /v1/linkedin/profiles`
- **Credits:** 3 credits per profile URL
Up to 50 profiles per request
Max 150 credits
- **Input:** by profile URL(s)
- **Platform page:** [/platforms/linkedin](https://www.socialfetch.dev/platforms/linkedin)

## FAQ

### How do I fetch a LinkedIn person profile via API?

Call `GET /v2/linkedin/profiles` with your Social Fetch API key (`x-api-key`) and either `handle` or `entityId` (for example `?handle=williamhgates`). Read `data.lookupStatus` and `data.profile` in the JSON response. See the API docs for parameters.

### How much does the LinkedIn Profile API cost?

3 credits per completed lookup, including a verified miss. Batch URLs on `GET /v2/linkedin/profiles/batch` at 3 credits per completed profile URL (up to 50 URLs, 150 credits maximum authorization). Technical failures and unstarted work cost zero. Always trust `meta.creditsCharged`.

### Can I look up multiple LinkedIn profiles in one request?

Not on `GET /v2/linkedin/profiles` — that route is one person. Pass multiple `url` query values on `GET /v2/linkedin/profiles/batch`, up to 50. The batch response returns a `results` array plus a `summary` of found, not_found, and errored counts.

### What fields does the LinkedIn profile response include?

Public person fields when available: handle, display name, headline, bio, location, avatar, current company, experience, education, languages, and follower/connection metrics. Coverage follows what is publicly visible on the profile page — gated or logged-in-only sections are out of scope.

### LinkedIn person profile vs company page endpoint?

Use `GET /v2/linkedin/profiles` for a person `handle` or `entityId`. Company pages use `GET /v1/linkedin/companies`. School and other organization pages use `GET /v2/linkedin/organizations/resolve` then `GET /v2/linkedin/organizations`. Passing a company URL into the person profile route will not return a company card.

### Do I need LinkedIn partner API access for this?

No. Social Fetch returns public LinkedIn person profile data for enrichment-style lookups. LinkedIn's official partner APIs are separate and require LinkedIn's access programs and member authorization.

### What happens when a LinkedIn profile is not found?

A completed miss still returns HTTP 200. Check `data.lookupStatus` and only upsert when it is `found`. Keep `meta.requestId` so you can retry or escalate failed enrichment rows.
