The LinkedIn API that runs entirely on public data

A LinkedIn API built on public data: one GET request returns a profile, company page, posts, or jobs as clean JSON. One credit per successful call, and an inaccessible profile costs nothing.

No accounts or cookies 1 credit per successful call Not-accessible profiles free
THE ENDPOINT

One endpoint, six data types

Everything lives at GET /v1/linkedin. Pick a surface with type, pass a URL or keywords, and the result comes back under a key named after the type.

Most tools in this space sell a LinkedIn profile API, a company API, and a jobs API as separate products with separate pricing. Here it is one LinkedIn data API with one billing rule: a successful call is one credit, an empty or inaccessible result is free.

typeWhat comes backInput
profileThe full public profile: name, headline, work history, education, follower count, and more. The default type.url (a linkedin.com/in/... URL)
refreshThe current company and school with their numeric LinkedIn ids, plus companyState. Markedly faster than a full profile read, built for keeping a database current.url
companyThe public company page. Add employees=true for the employee list.url (a linkedin.com/company/... URL)
postsPublic posts, up to 100 per call. Add comments=true for comments on each post.url (profile or company)
jobsPublic job listings, up to 50 per call, with paging via start.keywords plus optional location, or a job url
search (beta)People search. Add enrich=true to get each person's full profile in the same call.keywords

Note the input rule: profile, company, and posts take url, never a search query. If you only have a name, find the person first with type=search (beta), then pass the profile URL you get back.

curl "https://crustapi.com/v1/linkedin?type=profile&url=https://www.linkedin.com/in/williamhgates" \ -H "x-api-key: YOUR_KEY"
PULLED LIVE FROM THE API, AUGUST 4, 2026

A real response, not a mockup

This is the exact JSON the curl above returned, trimmed for width. It came back in 800 ms and cost 1 credit.

// trimmed for width: image URLs, null and empty fields, duplicate id and // date-text fields, parsed location detail, peopleAlsoViewed, and this // key's creditsRemaining removed { "type": "linkedin-profile", "url": "https://www.linkedin.com/in/williamhgates", "tookMs": 800, "accessible": true, "profile": { "id": "williamhgates", "name": "Bill Gates", "firstName": "Bill", "lastName": "Gates", "headline": "Chair, Gates Foundation and Founder, Breakthrough Energy", "currentTitle": "Co-chair", "currentCompany": "Gates Foundation", "companyState": "public", "about": "Chair of the Gates Foundation. Founder of Breakthrough Energy. Co-founder of Microsoft. Voracious reader. Avid traveler. Active blogger.", "followerCount": 40559134, "location": { "linkedinText": "Seattle, Washington, United States, US" }, "experience": [ { "position": "Co-chair", "companyName": "Gates Foundation", "companyLinkedinUrl": "https://www.linkedin.com/company/gates-foundation", "startDate": { "year": 2000 }, "endDate": { "text": "Present" } }, { "position": "Founder", "companyName": "Breakthrough Energy", "companyLinkedinUrl": "https://www.linkedin.com/company/breakthrough-energy", "startDate": { "year": 2015 }, "endDate": { "text": "Present" } }, { "position": "Co-founder", "companyName": "Microsoft", "companyLinkedinUrl": "https://www.linkedin.com/company/microsoft", "startDate": { "year": 1975 }, "endDate": { "text": "Present" } } ], "education": [ { "schoolName": "Harvard University", "schoolLinkedinUrl": "https://www.linkedin.com/school/harvard-university", "startDate": { "year": 1973 }, "endDate": { "year": 1975 } }, { "schoolName": "Lakeside School", "schoolLinkedinUrl": "https://www.linkedin.com/school/lakeside-school" } ], "influencer": true, "topVoice": true, "website": "https://gatesnot.es/sourcecode-li", "memberIdentifier": "251749025", "publicIdentifier": "williamhgates", "linkedinUrl": "https://www.linkedin.com/in/williamhgates" } }

Two fields worth noticing. accessible tells you whether the profile has a public page at all; when it is false, profile is null, a note explains why, and the call is not charged. memberIdentifier is LinkedIn's permanent numeric member id, which survives name and vanity-URL changes, so it is the right join key for a database.

THE FULL RECORD

What a profile call includes

The whole public record, structured. Same shape on every call, so your parser is written once.

Identityname · headline · location · photo · profile URLIdsmemberIdentifier · publicIdentifierWorkcurrent role · full experience history · company URLs · datesBackgroundeducation · schools · degreesSignalsabout · followerCount · influencer · topVoiceContactworkEmail with emailStatus, opt-in

The email field is opt-in: add email=true to a profile call and the response appends workEmail and emailStatus. The status is verified, pattern-likely, or unknown, so you can filter to the addresses that were actually confirmed and treat the rest as guesses. Email rides along as a field on the profile call, it is not a separate product.

WHAT IT DOES NOT RETURN

Fields that only exist behind a login stay out, on purpose. A person's connection list, mutual connections, who viewed a profile, or anything else that never appears on the logged-out page is not in the response. That boundary is what lets the API run with no accounts and nothing of yours at risk. If you need logged-in fields, a tool that runs on your own session can pull them, at that account's risk.

Make your first call in the next minute
Free 3,000 credits a month, no card.
Get started →
THE KNOBS

Parameters that matter

A handful of plain-English options. Everything else has a sane default.

ParameterApplies toWhat it does
urlprofile, refresh, company, posts, jobsA linkedin.com URL. Required for profile, company, and posts. jobs accepts a job URL instead of keywords.
keywordssearch (beta), jobsWhat to search for. Required for search; required for jobs unless you pass a job URL.
locationjobsCity or region filter for the job search.
limitjobs, posts, search (beta)How many results. jobs: default 25, max 50. posts: default 50, max 100. search: default 10, max 15.
startjobsResult offset for paging.
emailprofileAppends workEmail and emailStatus (verified, pattern-likely, or unknown) to the profile.
enrichsearch (beta)Returns each person's full profile in the same call. Bills 1 credit per full profile returned instead of 1 per call.
employeescompanyIncludes the employee list on the company page.
commentspostsIncludes comments on each post.
memberrefreshAlso returns memberIdentifier. Opt-in because it is a slower read; the id never changes, so fetch it once and keep it.
headlineprofileFor profiles whose companyState is restricted, attempts to recover the member's own public headline. Best effort, roughly one in twenty.
AT SCALE

Batch refresh, 100 profiles per request

Keeping a database current should not take one HTTP round trip per row. Send up to 100 profile URLs in one POST and get results back in input order.

curl -X POST "https://crustapi.com/v1/linkedin/batch" \ -H "x-api-key: YOUR_KEY" -H "content-type: application/json" \ -d '{"urls": ["williamhgates", "https://www.linkedin.com/in/satyanadella"], "type": "refresh"}'

The rules are built for large runs: results come back in the same order you sent them, a failing row never fails the batch, and a malformed URL comes back as a per-row error instead of a charge. Billing matches the single endpoint, one credit per successful row and not-accessible rows free. type can be refresh (the default, current company and school with numeric ids) or profile (the full record), and member: true adds memberIdentifier on refresh rows.

PRICING

What it costs

One billing rule across every type, and you only pay when data actually comes back.

Every successful call is one credit, whatever the type. The one exception is spelled out above: people search (beta) with enrich=true bills one credit per full profile it returns. A private or empty profile returns a null result with a note and is not charged, and an empty search result is free.

Credits are prepaid and never expire. The free tier is 3,000 credits every month with no card. Paid packs start at 25,000 credits for $49, which works out to $1.96 per 1,000 calls, and the rate drops as packs get bigger.

Related: Scrape LinkedIn without login · LinkedIn Profile Scraper · Bright Data LinkedIn alternative · Proxycurl alternative

BEFORE YOU ASK

Common questions

WORKS WITH YOUR STACK

Point it at a profile and see

Start on the free 3,000 credits a month, no card needed. One GET returns the public profile as clean JSON, and a profile that is not accessible costs you nothing. No account of yours is ever part of the request.

Get 3,000 free credits
No credit card required