LinkedIn Profile API
Give it a LinkedIn URL and get back the profile as JSON — name, headline, location, full work history, education, skills, languages, certifications and follower counts. Every call is fetched live at request time, so what you get is what is on the page right now.
Example response
Generated from the live API, so it is exactly the shape your code will parse.
{
"element": {
"id": "ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVOgr1LM",
"publicIdentifier": "williamhgates",
"linkedinUrl": "https://www.linkedin.com/in/williamhgates",
"firstName": "William",
"lastName": "Gates",
"headline": "Co-chair, Bill & Melinda Gates Foundation",
"websites": [
"Google"
],
"openToWork": true,
"hiring": true,
"premium": true,
"influencer": true,
"memorialized": true,
"creator": true,
"location": {
"linkedinText": "Seattle, Washington, United States",
"countryCode": "us",
"parsed": {
"text": "Seattle, Washington, United States",
"countryCode": "us",
"regionCode": null,
"country": "US",
"countryFull": "United States",
"state": "Washington",
"city": "Seattle"
}
},
"objectUrn": "Google",
"registeredAt": "2026-08-02T15:29:54+00:00",
"topSkills": [],
"connectionsCount": 12,
"followerCount": 36284119,
"verified": true,
"about": "Engineering leader focused on data infrastructure, developer experience and shipping reliable systems.",
"currentPosition": [
{
"position": "Co-chair at Bill & Melinda Gates Foundation",
"location": null,
"employmentType": null,
"workplaceType": null,
"companyName": "Bill & Melinda Gates Foundation",
"companyLinkedinUrl": "https://www.linkedin.com/in/williamhgates",
"companyId": "1441",
"duration": "3 yrs 2 mos",
"description": null,
"skills": null,
"startDate": {
"year": 2019,
"text": "Jan 2019"
},
"endDate": {
"text": "Jan 2019"
},
"companyLogo": {
"url": "https://www.linkedin.com/in/williamhgates",
"sizes": [
{
"url": "https://www.linkedin.com/in/williamhgates",
"width": 100,
"height": 100
}
]
},
"companyUniversalName": "William Gates"
}
],
"profileTopEducation": [
{
"schoolName": "William Gates",
"schoolLinkedinUrl": "https://www.linkedin.com/in/williamhgates",
"schoolId": "ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVOgr1LM",
"degree": null,
"fieldOfStudy": null,
"period": "Google",
"startDate": {
"year": 2019,
"text": "Jan 2019"
},
"endDate": {
"year": 2019,
"text": "Jan 2019"
},
"schoolLogo": {
"url": "https://www.linkedin.com/in/williamhgates",
"sizes": [
{
"url": "https://www.linkedin.com/in/williamhgates",
"width": 100,
"height": 100
}
]
}
}
],
"profileActions": [
{
"label": "Google",
"url": "https://www.linkedin.com/in/williamhgates"
}
],
"profilePicture": {
"url": "https://www.linkedin.com/in/williamhgates",
"sizes": [
{
"url": "https://www.linkedin.com/in/williamhgates",
"width": 100,
"height": 100
}
]
},
"coverPicture": {
"url": "https://www.linkedin.com/in/williamhgates",
"sizes": [
{
"url": "https://www.linkedin.com/in/williamhgates",
"width": 100,
"height": 100
}
]
},
"photo": "https://media.licdn.com/dms/image/v2/sample/williamhgates.jpg",
"profileLocales": [
{
"country": "US",
"language": "English"
}
],
"primaryLocale": {
"country": "US",
"language": "English"
},
"multiLocaleHeadline": [
{
"headline": "Co-chair, Bill & Melinda Gates Foundation",
"locale": "Google"
}
],
"services": null,
"experience": [
{
"position": "Co-chair at Bill & Melinda Gates Foundation",
"location": null,
"employmentType": null,
"workplaceType": null,
"companyName": "Bill & Melinda Gates Foundation",
"companyLinkedinUrl": "https://www.linkedin.com/in/williamhgates",
"companyId": "1441",
"duration": "3 yrs 2 mos",
"description": null,
"skills": null,
"startDate": {
"year": 2019,
"text": "Jan 2019"
},
"endDate": {
"text": "Jan 2019"
},
"companyLogo": {
"url": "https://www.linkedin.com/in/williamhgates",
"sizes": [
{
"url": "https://www.linkedin.com/in/williamhgates",
"width": 100,
"height": 100
}
]
},
"companyUniversalName": "William Gates"
}
],
"education": [
{
"schoolName": "William Gates",
"schoolLinkedinUrl": "https://www.linkedin.com/in/williamhgates",
"schoolId": "ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVOgr1LM",
"degree": null,
"fieldOfStudy": null,
"skills": [],
"startDate": {
"year": 2019,
"text": "Jan 2019"
},
"endDate": {
"year": 2019,
"text": "Jan 2019"
},
"period": "Google",
"schoolLogo": {
"url": "https://www.linkedin.com/in/williamhgates",
"sizes": [
{
"url": "https://www.linkedin.com/in/williamhgates",
"width": 100,
"height": 100
}
]
}
}
],
"certifications": [],
"projects": [],
"volunteering": [],
"receivedRecommendations": [],
"skills": [],
"publications": [],
"courses": [],
"patents": [],
"honorsAndAwards": [],
"languages": [],
"organizations": [],
"causes": [],
"featured": {
"images": [],
"link": null,
"title": null,
"subtitle": null,
"slides": [
{
"title": "Co-chair at Bill & Melinda Gates Foundation",
"subtitle": "Google",
"description": null,
"url": "https://www.linkedin.com/in/williamhgates",
"image": {
"url": "https://www.linkedin.com/in/williamhgates"
}
}
]
},
"composeOptionType": null,
"moreProfiles": [
{
"id": "ACoAAA8BYqEBCGLg_vT_ca6mMEqkpp9nVOgr1LM",
"firstName": "William",
"lastName": "Gates",
"position": "Co-chair at Bill & Melinda Gates Foundation",
"publicIdentifier": "williamhgates",
"linkedinUrl": "https://www.linkedin.com/in/williamhgates"
}
],
"interests": [
{
"interestName": "William Gates",
"elements": [
{
"title": "Co-chair at Bill & Melinda Gates Foundation",
"subtitle": "Google",
"link": "https://www.linkedin.com/in/williamhgates",
"caption": "Google",
"image": {
"url": "https://www.linkedin.com/in/williamhgates"
}
}
]
}
]
},
"query": {
"publicIdentifier": "williamhgates"
},
"status": "ok"
}
Three ways to identify a person
Most people already have a profile URL, so url is the usual entry point. If you have stored the public identifier — the williamhgates part of the URL — pass publicIdentifier instead and skip a redirect. If you are working from data that came out of an earlier call, pass the opaque profileId, which stays stable even when somebody edits their vanity URL.
Vanity URLs change. Profile IDs do not. If you are building anything that stores people over time, keep the ID as your key and treat the URL as a display attribute — otherwise a rebrand quietly turns a live record into a 404 in your database.
Full profile or short profile
The default response is the complete profile: positions with dates and descriptions, education, certifications, recommendations, projects, publications and skills. That is the right call when you are enriching a record you will keep.
When you only need identity — name, headline, photo, follower count, current company — add short=1. It skips the expensive sections and costs less per call. For a deduplication pass over tens of thousands of URLs, that difference is the difference between a sensible bill and an unpleasant one.
What it will not do
This endpoint returns what a signed-out visitor can see. It does not return email addresses, phone numbers or anything else behind a login, and it does not touch private profiles, connections or messages. If a profile is set to private, you get an empty result rather than a partial scrape.
We do not ask for your LinkedIn cookies and we never sign in as you. That is a deliberate architectural choice, not a limitation we are apologising for: cookie-based scrapers put your account at risk of restriction, and plenty of teams have discovered that the hard way.
Rate, cost and failure behaviour
A full profile costs $0.0064 at Starter and drops with your tier — 42% less on Pro. Cost is returned on every response in the X-Request-Cost header along with X-Balance-Remaining, so you can meter your own spend without a second API call.
Failed requests cost nothing. If we cannot reach the source, you get a 502 with the code upstream_unavailable and your balance is untouched. Concurrency is capped per tier; going over returns 429 with a Retry-After header rather than silently queueing your request behind a timeout.
Storing what you retrieve
Two fields are worth treating differently from the rest. The profile ID is your key and should never change. Everything else is a snapshot with a timestamp, including the current position — which is precisely the field most likely to be stale in your database and most costly to be wrong about.
Keep the retrieval date alongside the record. It is the difference between "this contact works at Acme" and "this contact worked at Acme when we last checked, eight months ago", and only one of those is safe to put in front of a salesperson.
What it costs
Prices are per request, charged from a prepaid balance. Bigger top-ups lower every row — Scale takes 55% off.
| Request | Starter | Pro (42% off) | Scale (55% off) |
|---|---|---|---|
| Full profile | $0.0640 | $0.0371 | $0.0288 |
| Short profile (short=1) | $0.0400 | $0.0232 | $0.0180 |
Failed requests are never charged. See full pricing.
Frequently asked questions
Do I need a LinkedIn account or cookies to use the Profile API?
No. Enricho fetches public profile data server-side and never asks for your LinkedIn credentials or session cookies. Your own account is never used and never at risk.
Does the LinkedIn Profile API return email addresses?
No. Email addresses are not part of a public profile, so this endpoint does not return them and we do not offer email enrichment.
How fresh is the data?
Every request is fetched at call time rather than served from a stored dataset, so a profile updated an hour ago returns the updated version.
What happens if the profile does not exist or is private?
You get a successful response with an empty element rather than an error, and the call is still priced as a lookup. Use short=1 when you are validating URLs in bulk to keep that cost down.
Can I look up several profiles in one request?
Not on this endpoint — it resolves one person per call. To work through a list, run calls in parallel up to your tier concurrency limit; Pro allows 20 in flight at once.