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 it is hard
LinkedIn login-walls the interactive profile, so a datacenter request usually lands on a Sign in shell with no data. The public /in/ preview renders only on a clean residential egress, so we route there and report the wall plainly when an egress is challenged.
Quickstart
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"]) Params
| 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. |
Response
{
"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. |
Use it for
Sales and recruiting enrichment
Talent sourcing
CRM hygiene
People databases
Under the hood
- URL or username input One endpoint takes a full /in/ URL or a bare vanity slug and resolves the canonical profile server side.
- Residential-first routing We lead with residential proxies and fall back through datacenter and free tiers, because LinkedIn walls datacenter egress on member pages far more often.
- Honest wall reporting When a challenged egress serves a sign-in shell, the endpoint reports the wall with matched markers instead of emitting a profile named "Sign Up".
- Experience and education arrays We fold the Person JSON-LD worksFor and alumniOf lists into experience[] and education[], de-duped, with company and school names populated.
How it compares
| 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 |
Pricing
| 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
What is a LinkedIn profile scraper?
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.
How do I scrape a LinkedIn profile without logging in?
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.
Can I pass a username instead of a full URL?
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.
Why are the roles and dates in experience null?
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.
Are follower and connection counts always returned?
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.