Live Fetch
Fetch a LinkedIn profile or company as it stands right now, by whatever identifier you happen to hold.
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.
Two single-record operations do most of the work, with a batch pair for volume:
| Operation | What it does | Reference |
|---|---|---|
| Live profile fetch | One person's LinkedIn profile, as it stands right now | profileLiveEnrich |
| Live company fetch | One company's LinkedIn record, as it stands right now | companyLiveEnrich |
| Live fetch (batch start) | Enqueue up to 10,000 identifiers as one job | startBatchLiveEnrich |
| Live fetch (batch poll) | Page through a batch job's results | pollBatchLiveEnrich |
Identifiers we accept
You don't have to normalize your input first. Both endpoints accept several identifier formats.
For a person
Pass the person 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
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.
When live fetch is unavailable
If a live fetch can't complete right now, we fall back to our cached copy when
we have one. You get a 200 with the record, and advice explains what
happened:
"advice": [
"Live fetch is currently unavailable; this response is served from cached profile data.",
"Retry later to get the freshest real-time LinkedIn data for this profile."
]This fallback isn't charged. If we have no cached copy, the call returns
500 instead — retry later. isCached404 stays false here: it only marks
a confirmed LinkedIn 404 (see above), so branch on advice.
Batches of up to 10,000
For volume, start a job and poll it, or subscribe to the
batch_live_enrich.completed webhook to hear when it's done (see
Webhooks).
- Start the batch: send
type(PROFILEorCOMPANY) and up to 10,000 identifiers, in any of the formats above. You get back ataskId. - Poll for results: pass the
taskIdand 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 the last known version back (that's what
isCached404 is telling you). If a live fetch can't complete on our side, the
fallback isn't charged: when we have a cached copy you get it back with advice
to retry, and no credit is spent.
The chargeInfo on each response is what you were actually charged. See
Billing & credits. Credit amounts are defaults — custom pricing is available for bulk use cases.
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.