The LinkedIn enrichment API that fetches live, not from a cache

Current employer, numeric ids, and an opt-in email, fetched live.

Live, not cached the applicable price per successful call Not-accessible rows free
HOW IT WORKS

How does live enrichment work?

You already have LinkedIn URLs. Point the enrichment API at one and it fetches the public page at request time, then returns three things a GTM or sales-intel team actually joins on.

Most enrichment providers serve you a stored record scraped weeks or months ago, so the employer can be stale the day you need it. This one reads the page fresh on every call.

Drop it into a Clay column or an enrichment waterfall and it behaves like any other HTTP step.

What comes backThe fieldWhy it matters for enrichment
Current employercurrentCompany, experienceThe live job, read at request time, not a snapshot. The full experience history rides along.
Numeric idscompanyLinkedInId, schoolLinkedInId, memberIdentifierStable numeric keys, so an enriched row reconciles against your database instead of matching on a messy name string.
Work emailworkEmail, emailStatusOpt-in with email=true. Comes with a status of verified, pattern-likely, or unknown so you can filter.

Everything lives at one endpoint, GET /v1/linkedin. Pass type=profile with the profile url, and turn on the ids and email with query flags. It takes a linkedin.com/in URL, never a name or search query.

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

A real enriched record, not a mockup

This is the response from our dated example, trimmed for width. Current prices are listed below; a successful LinkedIn read uses the read rate.

// trimmed for width: profile photo, about, location, publicIdentifier, // currentTitle, older experience and education rows, date fields, // company and school URLs, and this key's creditsRemaining removed { "type": "linkedin-profile", "url": "https://www.linkedin.com/in/dharmesh", "tookMs": 1942, "accessible": true, "profile": { "name": "Dharmesh Shah", "headline": "Founder and CTO at HubSpot. Helping millions grow better.", "currentCompany": "HubSpot", "followerCount": 1189996, "memberIdentifier": "658789", "experience": [ { "companyName": "HubSpot", "companyLinkedInId": 68529 } ], "education": [ { "schoolName": "Massachusetts Institute of Technology", "schoolLinkedInId": 1503 } ], "workEmail": "dharmesh.shah@hubspot.com", "emailStatus": "verified", "emailConfidence": 92 } }

Read the ids from the row. companyLinkedInId is HubSpot's own numeric id, schoolLinkedInId is MIT's, and memberIdentifier is Dharmesh's permanent member id. Those are the values you join on.

The email came back verified with a confidence of 92, so it goes straight into the confirmed bucket.

THE FULL RECORD

What data do you get?

The whole public record, structured the same way on every call, so your parser is written once and your reconciliation logic never changes.

Identityname · headline · followerCountEmployer, livecurrentCompany · title · full experience historyNumeric idscompanyLinkedInId · schoolLinkedInId · memberIdentifierEducationschoolName · schools · datesEmail, opt-inworkEmail · emailStatus · emailConfidence

Names are a bad join key and numbers are a good one. A person moves companies, a company rebrands, someone edits their vanity URL, and a string match quietly breaks.

The numeric ids do not move, so an enriched row lines up against the record you already hold. Turn them on with companyId=true and schoolId=true.

The email field is opt-in: add email=true to a profile call and the response appends workEmail, emailStatus, and emailConfidence.

The status is verified, pattern-likely, or unknown, so you can keep the confirmed addresses and treat the rest as guesses. Email is a field on the profile call, not a separate product.

WHAT IT DOES NOT ENRICH

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.

Enrich your first row in the next minute
Try it free, no card.
Try for free
AT SCALE

Enrich a whole list in one request

Refreshing a list should not take one HTTP round trip per row. Send up to 100 LinkedIn URLs in one POST and get results back in the same order you sent them.

curl -X POST "https://crustapi.com/v1/linkedin/batch" \ -H "x-api-key: YOUR_KEY" -H "content-type: application/json" \ -d '{"urls": ["https://www.linkedin.com/in/dharmesh", "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 is a per-row error, not a charge.

Batch requests bill only successful rows at the applicable endpoint price. Inaccessible rows are free. type defaults to refresh, the lean call that returns the current company and school with their numeric ids; set it to profile for the full record.

THREE STEPS

How do you get started?

From zero to your first enriched profile in about two minutes:

  1. 1

    Create a free account. Try it free, no card needed.

  2. 2

    Copy your key from the dashboard. It is issued the moment you sign up.

  3. 3

    Run the curl above with any LinkedIn URL. The live record comes back as JSON.

PRICING

How much does enrichment cost?

Every successful enrichment is the applicable endpoint price, single call or batch row. A profile that is not accessible costs nothing. Here is what the packs cost:

DepositGoogle Search / 1,000 requestsMaps / 1,000 businessesLinkedIn Profiles / 1,000LinkedIn Companies / 1,000LinkedIn Posts / 1,000 requestsPeople, Jobs, Refresh / 1,000 units
$10+$1.00$1.96$4.00$3.00$6.00$1.96
$149+$0.76$1.49$3.00$2.50$4.50$1.49
$549+$0.56$1.10$2.50$2.00$3.30$1.10
$1,999+$0.41$0.80$2.00$1.75$2.45$0.80
$6,500+$0.33$0.65$1.75$1.60$1.95$0.65
$27,500+$0.28$0.55$1.60$1.50$1.65$0.55
$50,000+$0.26$0.50$1.50$1.50$1.50$0.50
$100,000+$0.20$0.40$1.50$1.50$1.50$0.40

Every eligible account gets $6 of free usage monthly. Each deposit keeps its prices until spent; paid funds never expire. People and Jobs bill per successful search, Refresh per accessible profile. Full profiles in People use the read rate per full profile. See all billing details.

Larger deposits unlock lower endpoint prices. Each deposit keeps its prices until spent. See the full deposit table on the pricing page. Prices in USD, ex-tax.

Funds are prepaid and never expire. The numeric ids and the email field are included flags, not add-on line items.

WHO IT'S FOR

Who uses this API?

Related: LinkedIn API reference · LinkedIn Profile Scraper · Proxycurl alternative · Bright Data LinkedIn alternative

BEFORE YOU ASK

Common questions

It takes a LinkedIn profile URL and returns the current record: name, headline, current employer, numeric company and school ids, follower count, and an opt-in work email. Every request is fetched live from the public page, not read from a cache. Pay per successful call.

Live. Each call fetches the public profile at request time, so the employer and title reflect the page as it reads today, not a snapshot from weeks ago. That is the difference from most enrichment providers, which return a stored record.

Yes. POST up to 100 LinkedIn URLs to /v1/linkedin/batch and results come back in the same order you sent them. The default type is refresh, which returns the current company and school with their numeric ids. Failing rows never fail the batch and not-accessible rows are free.

Because names are messy join keys and numbers are not. companyLinkedInId and schoolLinkedInId are LinkedIn's own numeric ids, and memberIdentifier is the person's permanent member id, so an enriched row reconciles against your database even after someone changes jobs or renames a vanity URL.

Add email=true to a profile call and the response appends workEmail, emailStatus, and emailConfidence. The status is verified, pattern-likely, or unknown, so you can keep the confirmed addresses and treat the rest as guesses. Email is a field on the profile call, not a separate product.

We read only the public, logged-out version of each page and use no fake accounts or logins. Logged-out, public-only collection has repeatedly defeated computer-fraud and contract claims, and what you get back is data that is public for anyone to see.

WORKS WITH YOUR STACK

Enrich a list and see the difference

Start free, no card needed. Send a URL, get the live employer, numeric ids, and an opt-in email, and a profile that is not accessible costs you nothing. No account of yours is ever part of the request.

Try for free
No credit card required