One URL in. Clean JSON out.
Give it a LinkedIn profile URL or a public handle and get back the person's headline, follower count, location, current company and about text as JSON. 10 credits per profile, or 25 if you add include_email=true and want the work email attempted. Public profile data only, read logged out — the same page an anonymous visitor sees.
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<div class="feed-shared-update-v2 artdeco-card" data-urn="urn:li:activity:7181111111111111111"><div class="update-components-text relative"><span dir="ltr">We just cut p95 latency in half by moving the cache closer to the edge.</span></div><div class="social-details-social-counts"><li class="social-details-social-counts__item"><span aria-label="842 reactions">842</span></li><li class="social-details-social-counts__comments">63 comments</li><li>41 reposts</li></div><time class="update-components-actor__sub-description">4d</time><code style="display:none">{"data":{"*elements":["urn:li:fsd_update:(urn:li:activity... {"data": {"platform": "linkedin","handle": "example-person","name": "Example Person","headline": "Head of Growth at Example Co","location": "Austin, Texas, United States","positions": [{"title": "Head of Growth","company": "Example Co","start": "2024-03","end": null}],"metrics": {"followers": 18240,"connections": "500+"}},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
One flat object per profile. The identity half is handle, name, headline and url; the context half is location, current_company, bio and the verified badge; the audience half is followers and following. That is enough to key a CRM record, score a lead, or decide whether a person is worth a human's attention.
What you do not get is the full CV. There is no positions array, no education, no skills, no endorsements. LinkedIn treats deep profile history as gated data and we do not go behind gates, so this endpoint documents the surface of a public profile rather than pretending to a résumé export.
The `posts` key is present in every response and is always null. It exists so the shape stays consistent with the other profile endpoints across platforms; LinkedIn does not publish a post count on the profile surface. If you want someone's actual posts, that is a different call.
How many accounts the person follows. Frequently null; LinkedIn shows this far less consistently than followers.
Pricing
One profile is 10 credits — about 5¢ on the monthly plan, 4.5¢ on annual. $5 covers roughly 100 profiles, and failed calls are never charged. include_email=true bills the higher 25-credit rate.
Estimate only, on a full-year basis. 10 credits per returned profile. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
Passing include_email=true switches the call to the 25-credit rate and attempts to surface a work email. It resolves for some profiles and returns null for many. The price is for the attempt, not the result, so budget for a hit rate well below 100% and do not build a flow that assumes an address will be there.
Leave the parameter off and you pay 10 credits and get `email: null` every time. If email is not central to your use case, that is the right default.
Names, headlines, employers and email addresses about identifiable people fall under GDPR, CCPA and their relatives, regardless of the data being public. You are the controller for anything you store. Have a lawful basis, honour deletion requests, and do not retain profiles you no longer have a reason to hold.
We read only what a logged-out visitor sees. There is no session, no connection graph, no contact info behind a mutual connection, and nothing from a profile set to private.
People change jobs without updating LinkedIn for weeks. current_company and headline reflect what the profile says today, not where the person actually works. If a record matters, look at recency signals elsewhere before acting on it.
Responses are cached in the slow class, which suits profile data — it barely changes day to day. Repeat calls inside the window return in milliseconds and set x-cache: hit. A cache hit costs the same credits. Pass fresh=true when you specifically need to bypass it, for example when re-checking a record you already know changed.
Most profiles are half-empty. No About text, no follower count, no location. The normalizer returns null for anything missing rather than guessing, so write your code to tolerate every field except the shape itself being absent. A profile that returns only handle, name and url is a valid response.
Genuinely unreachable profiles — deleted, private, or never public — return an error instead of a mostly-null object, and errors are not charged.
You can pass either the full https://www.linkedin.com/in/{handle} URL or the bare handle. Both resolve to the same call. Numeric LinkedIn member IDs and Sales Navigator links are not profile URLs and will not work — use the /in/ form.
Questions
Send a GET to /v1/linkedin/profile with the profile URL or handle and your API key. There is no LinkedIn login, no cookie to supply and no session to keep warm on your side. The endpoint reads the public profile page and returns JSON. Anything LinkedIn hides from logged-out visitors — private profiles, connection lists, contact details behind a connection — is simply not reachable and returns an error.
10 credits per profile, or 25 credits with include_email=true. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so a standard profile is about 5 cents and an email-attempted one about 12.5 cents. Cached responses cost the same as fresh ones. Failed calls are not charged.
Sometimes. Add include_email=true and the call attempts to resolve a work email, at the higher 25-credit rate. It succeeds on some profiles and returns null on many others, and you pay the higher rate regardless of outcome. We will not promise a hit rate we cannot control. Without the parameter, the email field is always null and you pay 10 credits.
No. This endpoint returns headline, current_company, location, About text, follower counts and the verified flag. There is no positions array, no education, no skills and no endorsements, and no parameter enables them. If your product depends on full employment history, this is not the right tool and you should not buy credits expecting it.
We are not lawyers and this is not legal advice. Reading public web pages has generally held up in US courts, but the data here is personal data about identifiable people, so GDPR, CCPA and similar rules apply to what you store and why. You are the controller for your copy. Get advice for your jurisdiction and use case before building on it at scale.
One profile per call, run concurrently. The API is built for parallel traffic, so a few hundred URLs finish in the time the slowest one takes. Since profiles change slowly, cache your own copy and re-run on a schedule — quarterly is plenty for most CRM hygiene work — rather than re-fetching the same person on every page load.
Because most LinkedIn profiles are sparse. Empty About sections, hidden follower counts and missing locations are ordinary, and the normalizer returns null rather than inventing a value. A response with only handle, name and url is valid. Reserve your error handling for actual errors — those come back as errors, not as null-filled objects, and are not charged.
Next
100 trial credits on signup — no card, key on screen immediately.