Profiles
Resolve a public LinkedIn profile URL or vanity slug to a typed person record.
The Profiles surface returns a typed Profile record — name, headline,
location, current and past roles, education, skills, certifications.
Every profile is captured through the end user's own LinkedIn
session via the LinkFetch Chrome extension; we
never hit a fake account on your behalf.
- GET5 credits
/v1/profilesGet Profile
Full profile for a LinkedIn member by slug or URL.
- POST5 credits
/v1/profiles/ingestIngest Profile
Extension-side write path. Reference only — not runnable from here.
- GET3 credits
/v1/profiles/{slug}/postsGet Profile Posts
Recent posts from a profile (migration pending).
Get profile by URL or slug
The cache-first read. Returns the full structured profile. On a cache
miss the API returns 422 extension_required and the extension
captures the row from the user's signed-in tab; the next call hits the
cache and returns 200.
/v1/profiles5 creditsReads our cache. If the row isn't cached, returns 422 with a hint to run the LinkFetch Chrome extension on a signed-in tab — the extension will post the capture to /v1/profiles/ingest.
url and slug are interchangeable — supply whichever you have on
hand. Pass a full https://www.linkedin.com/in/<slug>/ URL or the bare
slug. The response includes the profile's entityUrn tail; keep it if
you plan to call profile-posts or post-reactions later.
Recent posts by profile
/v1/profiles/{slug}/posts3 creditsStub — returns 501. Will wrap the voyager `Profile — Posts` path with normalization + pagination once the extension has a capture flow.
Returns the most recent activity authored by the profile, paginated.
Pair with GET /v1/posts/:id to enrich each entry
with reaction counts and full body. Useful for warm-intro context and
"who has been talking about X" digests.
Ingest profile (extension write-path)
/v1/profiles/ingest5 creditsCalled by the LinkFetch Chrome extension after it captures a profile from a signed-in LinkedIn tab. Upserts the row and debits credits atomically. GDPR-suppressed slugs return 410.
urlstring<url> · in body · requiredCanonical linkedin.com/in/<slug> URL.
profileobject<Profile> · in body · requiredNormalised payload — see packages/shared/src/profile.ts.
fetched_atstring<ISO-8601> · in body · optionalWhen the extension captured the page. Defaults to now.
This endpoint isn’t directly callable — it’s invoked by the LinkFetch extension or another LinkFetch service. The shape above is documented so you can build matching integrations.
open in full playground →This route exists for the LinkFetch extension. It POSTs a freshly captured profile from the user's signed-in tab and the API normalises, caches, and debits credits atomically. You do not call this yourself — it's documented so you can build matching integrations or replicate the contract from a server-to-server pipeline if you have one of our enterprise plans.
Notes
- 5 credits per call regardless of profile size.
- Profiles cache for 30 days; pass
?fresh=trueto force a re-capture. - Suppressed profiles (under DSR) return
410 gonepermanently — including via the extension capture path.