Look Up LinkedIn Profiles
li_enrich_profilesLook up who people are — name, headline, company, role, location — WITHOUT opening a browser at all. This reads a third-party data provider, so it costs enrichment lookups but takes NO browser time and cannot affect the LinkedIn account's standing. Lookups are SHARED across every account the owner holds: each account adds 400 for its whole trial or 1,500 a month once paid, so three accounts share one pool — sharedAcrossAccounts says how many, and remaining/allowance are the pool's. Each looked-up person also carries companyPage: their CURRENT employer read from its LinkedIn company page — name, website and domain, industry, size band, HQ, founding year, a one-line description, specialities and followers — at NO extra lookup (it comes with the profile, and a firm already read in the last 30 days is never re-fetched). Use it to judge ICP fit (industry, size, HQ) and to write the sequence (what the company does, in its own words). companyPage.status is ok/cached (facts present), not_found (the page returned nothing), failed (the read broke), skipped (not looked up) or no_company_page (the profile names no LinkedIn company page — self-employed, a typed-in employer) — never read a missing block as 'no company'; companyPages summarises the batch. Anyone already looked up in the last 30 days is returned FREE from a shared cache and costs nothing; pass refresh=true to force a re-fetch. Each profile comes back COMPACT by default — the flat fields plus what actually helps judge a person (about, audience size, open-to-work/hiring, account quality, current job, a short work and education history). The provider's own record is many times larger and is mostly people nobody asked about, followed companies and images, so it is never returned. For a LARGE batch, narrow it further with fields — e.g. fields: ['about','audience','currentRole'] — which keeps every person's identity and drops the rest; measured on real profiles, those three sections are about a FIFTH of the compact record and an empty fields list is about a TWELFTH, and the reply carries the payload twice — so a 46-profile batch that flooded a caller's context becomes something they can read. The reply then says which sections it carried and which it left out, so a trimmed record can never read as a whole one. Every row carries who the person is: publicProfileUrl (their public linkedin.com/in/ URL, the one to import; null when the provider named none), memberId (ACoAA…) and searchId (ACwAA…, when that is what you asked with). profileUrl stays the address you asked with, so rows pair with your list. Per-URL outcomes: 'ok' fetched, 'cached' free, 'not_found' means the provider looked and found nothing (a deleted, renamed or restricted profile — NOT an error), 'failed' means the lookup itself broke, 'skipped_no_credits' means the allowance ran out before reaching it. One caveat on not_found: if unmatched is above zero the provider DID return that many profiles which no requested URL could be tied to, so some of the not-found rows are a matching bug worth reporting rather than a fact about those people. Always relay message: it says what was charged and what is left. The reply also carries companies: the batch grouped by employer, on the LinkedIn company page where the provider gave one and a folded name otherwise, with counts for everyone it could NOT place. Relay companies.summary — a batch is usually far fewer firms than people, and that changes how it should be sent. It says nothing about your pipeline; li_check_targets with groupByCompany answers which of those firms you already have a contact at. Pass estimateOnly=true FIRST for a free preview of a big list — how many are already known, how many would actually be looked up, how many lookups that charges and what is left afterwards. It looks nothing up, charges nothing, and answers for a list longer than one real call takes, telling you how many calls to split it into. Use this before writing outreach, and before deciding whether to accept an inbound invitation. INPUTS: the only input passed to the data provider is the list of profile URLs (each person's employer page is then read from what comes back); the other inputs only preview the cost (estimateOnly), skip the cache (refresh), trim the reply (fields) or, when you have several LinkedIn accounts, say whose allowance pays (sessionId / sessionLabel).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Return only these parts of each profile, so a large batch does not flood the reply. The identity — profileUrl, publicProfileUrl, memberId, searchId, status, name, headline, company, role, location, fetchedAt, error — comes back on EVERY profile and never needs asking for. The sections you can add are: about, audience, signals, currentRole, experience, education, skills (audience is follower and connection counts; signals is open-to-work, hiring, premium, influencer, verified), plus companyPage for each person's employer block (it rides on the default view, and on this trimmed one only when named). Pass an empty array for identity only. An unknown name is refused naming the accepted set, and nothing is looked up or charged. Costs exactly the same as the full record — it only changes what is sent back. | |
| refresh | No | Ignore the cache and re-fetch, for when a cached profile is known to be out of date. Costs a lookup for every URL. | |
| sessionId | No | Only when you have more than one LinkedIn account: which one pays for the lookup (its plan and allowance gate the run). Account id from li_list_accounts. Never sent to the data provider. | |
| profileUrls | Yes | The LinkedIn profile URLs of the people to look up — the only input passed to the data provider. One real lookup takes at most 100 and a longer list is refused rather than silently truncated; estimateOnly answers for up to 500 and says how many calls to split it into. | |
| estimateOnly | No | Preview instead of looking anything up. Reports how many are already known (free), how many would be fetched, how many lookups that charges and what is left. Charges nothing and reserves nothing. | |
| sessionLabel | No | Same as sessionId, by account label, LinkedIn name, profile slug or member id (li_list_accounts). Only when you have more than one account. Never sent to the data provider. |