Fiber AI
LinkedIn data

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:

OperationWhat it doesReference
Live profile fetchOne person's LinkedIn profile, as it stands right nowprofileLiveEnrich
Live company fetchOne company's LinkedIn record, as it stands right nowcompanyLiveEnrich
Live fetch (batch start)Enqueue up to 10,000 identifiers as one jobstartBatchLiveEnrich
Live fetch (batch poll)Page through a batch job's resultspollBatchLiveEnrich

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:

KindExample
LinkedIn slugwilliamhgates
Full LinkedIn URLhttps://www.linkedin.com/in/williamhgates/
Sales Navigator URNACwAAAjNR6wBsr_od4UG9Y-HRxg21mwhv5xO0FE
Numeric LinkedIn user ID443105112

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:

typevalue example
slugmicrosoft
liUrlhttps://www.linkedin.com/company/microsoft
orgId1441

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.

FlagEndpointWhat you get
getDetailedEducationProfileEach school's LinkedIn URL, website, and location, in a detailedEducation array
getDetailedWorkExperienceProfileEach employer's LinkedIn URL, website, and location, in a detailedWorkExperience array
getHistoricalHeadcountCompanyTotal 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).

  1. Start the batch: send type (PROFILE or COMPANY) and up to 10,000 identifiers, in any of the formats above. You get back a taskId.
  2. Poll for results: pass the taskId and page through results, up to 100 per page (take), following nextCursor until 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 length

Duplicates are dropped before enrichment, so submitting the same profile twice doesn't charge you twice.

Each polled result carries its own status:

StatusMeaning
COMPLETEDEnriched — profile or company is populated
NOT_FOUNDThe identifier is valid but nothing matched
FAILEDEnrichment errored for this item
MALFORMEDWe 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 MALFORMED separately from NOT_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 getHistoricalHeadcount to 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.

  • 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.

On this page