Live Fetch
Fetch a LinkedIn profile or company as it stands right now, by whatever identifier you happen to hold.
Live Fetch
Live Fetch returns a LinkedIn profile or company as it stands right now, rather than the version already in our index. Use it when the answer has to be current: verifying a lead before an email goes out, hydrating a record when a user opens it, or re-checking a company before a deal review.
Live Fetch returns profile and company data — roles, education, headcount, and the rest. It does not return emails or phone numbers. For those, use Contact Reveal.
Identifiers we accept
You don't have to normalize your input first. Both endpoints accept several identifier formats.
For a person — profileLiveEnrich
Pass it as identifier:
| Kind | Example |
|---|---|
| LinkedIn slug | williamhgates |
| Full LinkedIn URL | https://www.linkedin.com/in/williamhgates/ |
| Sales Navigator URN | ACwAAAjNR6wBsr_od4UG9Y-HRxg21mwhv5xO0FE |
| Numeric LinkedIn user ID | 443105112 |
One field, four formats, no type discriminator to set — so a CRM column
mixing profile URLs and bare slugs can go straight in.
For a company — companyLiveEnrich
Companies take a type and a value, so you tell us which kind you're
sending:
type | value example |
|---|---|
slug | microsoft |
liUrl | https://www.linkedin.com/company/microsoft |
orgId | 1441 |
The value field also accepts a Fiber company ID (comp_1441) if you're
round-tripping an ID from an earlier response.
Asking for more depth
Both endpoints take optional flags that widen the response. They cost nothing extra — they just take longer, so turn them on only when you'll use the data.
| Flag | Endpoint | What you get |
|---|---|---|
getDetailedEducation | Profile | Each school's LinkedIn URL, website, and location, in a detailedEducation array |
getDetailedWorkExperience | Profile | Each employer's LinkedIn URL, website, and location, in a detailedWorkExperience array |
getHistoricalHeadcount | Company | Total headcount over time and recent growth trends |
getHistoricalHeadcount gives you company-wide totals through time. If you
want the breakdown by department rather than the total, use the Depth Chart
endpoints instead.
When a record isn't there
Profiles answer with a found discriminator, so you branch on one field
rather than parsing an error. Companies return 404 when nothing matches.
Either way, check isCached404: it means the record is no longer
reachable on LinkedIn, but we still hold data for it, and that data is what
you got back.
Batches of up to 10,000
For volume, start a job and poll it.
startBatchLiveEnrich— sendtype(PROFILEorCOMPANY) and up to 10,000 identifiers, in any of the formats above. You get back ataskId.pollBatchLiveEnrich— pass thetaskIdand page through results, up to 100 per page (take), followingnextCursoruntil it comes back null.
One type per batch: a profile job takes profile identifiers, a company job takes company identifiers.
Your input is reconciled up front. The start response accounts for every identifier you sent:
numIdentifiersEnqueued + numDuplicatesSkipped + numMalformed = your input lengthDuplicates are dropped before enrichment, so submitting the same profile twice doesn't charge you twice.
Each polled result carries its own status:
| Status | Meaning |
|---|---|
COMPLETED | Enriched — profile or company is populated |
NOT_FOUND | The identifier is valid but nothing matched |
FAILED | Enrichment errored for this item |
MALFORMED | We couldn't parse the identifier you sent |
The progress object counts every state (pending included) against
total, so you can render progress without a separate query. The job's
own status moves PENDING → PROCESSING → COMPLETED or FAILED, and
completedAt is set when it lands.
Results come back in the order you submitted them, not the order they finished. A fast profile and a slow one keep their original positions, so don't read the ordering as completion time.
Using it effectively
- Use Live Fetch when the answer has to be current; use search or Kitchen Sink when indexed data will do. Live Fetch costs more per record.
- Leave the depth flags off unless you read the fields they add — they slow the call.
- Single-call rate limit is 600 requests/minute; allow around 30 seconds per call before timing out.
- Above a few hundred identifiers, use the batch endpoints rather than fanning out single calls: you get the duplicate and malformed accounting with them.
- Handle
MALFORMEDseparately fromNOT_FOUND. The first is a bug in your input; the second is a fact about the world.
Use cases
- Pre-send verification: confirm someone still holds the role your sequence assumes before the email goes out.
- CRM hydration: turn a column of mixed LinkedIn URLs and slugs into full records in one batch.
- Deal review: pull a company with
getHistoricalHeadcountto see whether growth held up since you last looked. - On-demand profile views: fetch when a user opens a record, so what they're looking at is what's live.
Cost
2 credits per profile or company fetched, on both the single and batch endpoints.
A record we determine isn't on LinkedIn counts as a fetch: we did the work,
and you often still get cached data back (that's what isCached404 is telling
you). A call that fails because Live Fetch itself was unavailable is not
charged — you'll see a cached response with advice to retry, and no credit
spent.
The chargeInfo on each response is what you were actually charged. See
Billing & credits.
Related
- Contact Reveal — emails and phone numbers, which Live Fetch doesn't return.
- Kitchen Sink — lookups by email, name plus domain, and other messier identifiers.
- Search — find records when you don't already have an identifier.
- Tracker — get told when something changes, instead of re-fetching to check.