LinkedIn Profile Scraper API
Our LinkedIn profile scraper takes a public /in/ profile URL or a bare vanity slug and returns structured JSON: name, headline, location, about, profile image, current company, follower count, and experience and education arrays, all in one request.
Why LinkedIn Profile data is login-walled
LinkedIn login-walls the interactive profile, so a datacenter request usually lands on a "Sign in to continue" shell with no data. The logged-out /in/ page only renders a public preview on a clean residential egress, and when it is challenged our endpoint reports the wall plainly instead of returning a half-empty record.
Call the LinkedIn Profile Scraper API in one request
curl "https://api.linkedinscraperapi.com/api/v1/linkedin/profile?url=https://www.linkedin.com/in/reidhoffman&api_key=$API_KEY" import requests
BASE = "https://api.linkedinscraperapi.com"
API_KEY = "YOUR_API_KEY"
# Pass a full /in/ profile URL, or use username=reidhoffman instead.
data = requests.get(
f"{BASE}/api/v1/linkedin/profile",
params={
"url": "https://www.linkedin.com/in/reidhoffman",
"api_key": API_KEY,
},
timeout=30,
).json()
print(data["name"], "-", data["headline"])
print("Now at:", data["current_company"], "|", data["followers"], "followers")
# experience[] and education[] come from the public Person JSON-LD:
# the guest render exposes company and school names (roles/dates are null).
for role in data["experience"]:
print(role["company"])
for school in data["education"]:
print(school["school"]) Parameters
| Parameter | Required | Default | Notes |
|---|---|---|---|
url | optional | - | A full /in/{slug} profile URL, e.g. https://www.linkedin.com/in/reidhoffman. One of url or username is required. |
username | optional | - | The bare vanity slug instead of a URL, e.g. reidhoffman (the {slug} in /in/{slug}). One of url or username is required. |
api_key | required | - | Your API key, passed as a query parameter. Get one free at signup. |
The JSON the LinkedIn Profile Scraper API returns
{
"id": "reidhoffman",
"name": "Reid Hoffman",
"headline": "Co-Founder, Executive Board Chair",
"location": "United States",
"about": "My current priority is investing in and building with AI to benefit humanity. Recently, I've co-founded Inflection.AI and ManasAI.co. I am active in all facets of the consumer internet and software industries...",
"url": "https://www.linkedin.com/in/reidhoffman",
"image": "https://media.licdn.com/dms/image/v2/D5603AQHW7wKzPb3DAg/profile-displayphoto-shrink_200_200/0/1718216204174?e=2147483647&v=beta&t=_CCpDriOmxYQ2dvuyVwU7D63RyTduLzslIJTP75N9eQ",
"current_company": "Manas AI",
"followers": 2776004,
"connections": "500+",
"experience": [
{ "title": null, "company": "Manas AI", "date_range": null, "location": null },
{ "title": null, "company": "Greylock", "date_range": null, "location": null },
{ "title": null, "company": "Microsoft", "date_range": null, "location": null }
],
"education": [
{ "school": "Oxford University", "degree": null, "date_range": null },
{ "school": "Stanford University", "degree": null, "date_range": null }
]
} | Field | Type | Description |
|---|---|---|
id | string | The profile's vanity slug, the stable identifier from the /in/{slug} URL. |
name | string | The member's full display name from the public Person node. |
headline | string | The professional headline shown under the name, e.g. "Co-Founder, Executive Board Chair". |
location | string | The member's location as published on the public preview, e.g. "United States". |
about | string | The full About / summary text when the guest render exposes it. |
url | string | The canonical /in/ profile URL. |
image | string | URL of the profile photo. |
current_company | string | The current employer, taken from the first ongoing entry in experience. |
followers | integer | Follower count when the public render exposes it, otherwise null. |
connections | string | The connection count label such as "500+" when public, otherwise null. Rarely exposed logged-out. |
experience | array | Work history as { title, company, date_range, location }. The guest Person JSON-LD exposes company names; roles and dates are usually null. |
education | array | Schools as { school, degree, date_range }. School names come through; degree and dates are usually null on the guest render. |
Who pulls LinkedIn data, and for what
Sales and recruiting enrichment
Talent sourcing
CRM hygiene
People databases
Investor and founder research
Audience sizing
Why teams build on our LinkedIn Profile Scraper API
Pass a /in/ URL or a bare username and we resolve the canonical profile for you, with no LinkedIn login and no cookies to manage. Every request runs through residential proxies, anti-bot handling, and retries, returning validated JSON in about 2.6 seconds, and honestly reports an authwall rather than a partial record when the egress is challenged.
URL or username input
Residential-first routing
Honest wall reporting
Experience and education arrays
Auto-retry across pools
Validated JSON schema
LinkedIn Profile Scraper API measured against the alternatives
| Our API | DIY (requests / headless) | Official LinkedIn API | |
|---|---|---|---|
| Input by URL or slug | Yes, /in/ URL or username | Manual fetch and parse | No public profile-by-URL endpoint |
| Public profile fields | Name, headline, location, about, image | Possible, but the parser breaks often | Members API is partner-gated and consent-based |
| Setup | API key only | Residential proxies, headless browser, parsers | Partner Program approval plus OAuth |
| Login and cookies | None, logged-out only | You manage sessions and cookies | Member must authorize your app |
| Anti-bot and proxies | Residential-first, built in | You build and maintain it | Not applicable |
| Experience and education | Arrays of company and school names | Extra parsing per section | Only for members who connect your app |
| Behavior when walled | Reports the authwall honestly | Silent partial or empty record | Returns only authorized fields |
Usage-based pricing, no seats
| Plan | Price | Best for |
|---|---|---|
| Free | 1,000 requests | Testing and small jobs |
| Pro | $0.60 / 1k | Production workloads |
| Pay-as-you-go | $0.90 / 1k | Spiky or one-off volume |
Median response 2.6s. You only pay for successful requests.
FAQ
A LinkedIn profile scraper is a tool that reads a member's public profile data and returns it in a structured format. Our LinkedIn profile scraper API takes a /in/ URL or a vanity slug and returns the name, headline, location, about text, profile image, current company, follower count, and experience and education arrays as JSON from a single request.
Send one GET request to our linkedin/profile endpoint with the profile url or a username and your API key. We route the request through residential proxies, handle anti-bot checks, and parse the public Person data LinkedIn renders for logged-out visitors, so you get clean JSON back without a LinkedIn account, cookies, or a headless browser of your own.
Yes. You can pass a full /in/{slug} URL in the url parameter, or the bare vanity slug in the username parameter, for example reidhoffman. One of the two is required, and the endpoint resolves the canonical profile URL either way.
The logged-out profile page exposes a schema.org Person node whose worksFor and alumniOf lists carry company and school names, but usually not the role title or the start and end dates. So experience[] and education[] come back with company and school populated and title, date_range, and degree null. That is the ceiling of what LinkedIn renders publicly, and we return the real names rather than inventing dates.
Not always. The follower count appears on some public renders and comes back as an integer when present. The connection count is rarely public logged-out; when LinkedIn does print the owner's cap label we return it as a string like "500+", and otherwise both fields are null. We never guess these numbers.
The /in/ page is the most aggressively login-walled surface on LinkedIn. On a challenged egress it serves an authwall or "Sign in" shell with no Person data. When we cannot map a name from the JSON-LD or the og card, the endpoint returns an error that names the wall and the markers it matched, so a block is distinguishable from a genuinely empty profile. We lead with residential proxies to minimize how often this happens.
Median end-to-end response is about 2.6 seconds, which includes residential proxy routing, anti-bot handling, retries, and parsing. One call returns the full public profile record, so you do not chain extra requests to assemble it.