# LinkedIn (/docs/linkedin)
LinkedIn [#linkedin]
The widest surface on SocialCrawl: public member profiles broken out into every sub-resource
LinkedIn renders (experiences, educations, skills, certifications, recommendations and more),
company pages with their posts, staff, hiring volume and workforce breakdowns, the full jobs
surface with LinkedIn's own filters, group feeds, and the LinkedIn Ad Library. If you are
building B2B prospecting, recruiting intelligence, or competitor tracking, this is where most of
that data lives.
Base URL: `/v1/linkedin/...`
Three different identifiers, and they are not interchangeable. Member and post endpoints take the page
`url`
. Company endpoints take a numeric
`company_id`
, which is
**not**
in the company URL — resolve it once with
`/v1/linkedin/company?url=…`
. Job and group endpoints take
`id`
and
`group_id`
, which come from a list call. Passing a
`url`
to a
`company_id`
endpoint is a
`400`
before billing.
Getting started [#getting-started]
Every endpoint is a `GET` with query parameters and an `x-api-key` header.
```bash
# A person, by profile URL
curl "https://www.socialcrawl.dev/v1/linkedin/profile?url=https://www.linkedin.com/in/williamhgates/" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
Company content is a two-step flow, because the numeric id LinkedIn indexes a company by does
not appear anywhere in its public URL:
```bash
# 1. Resolve the company page to its id
curl "https://www.socialcrawl.dev/v1/linkedin/company?url=https://www.linkedin.com/company/microsoft/" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
# 2. List its posts with the id from the response
curl "https://www.socialcrawl.dev/v1/linkedin/company/posts?company_id=1035" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
Hold the id: every other company endpoint on this platform takes the same `company_id`, so you
pay for the lookup once and reuse it.
People [#people]
`GET /v1/linkedin/profile` is the entry point for any person — name, headline, location,
follower and connection counts, picture. It deliberately returns the *condensed* profile, the
same summary LinkedIn shows above the fold, and each section below it is its own call, so you
only pay for what you read.
**Career and credentials.** Six endpoints cover the CV, each taking the same profile `url`:
| Endpoint | What it adds |
| ------------------------------------- | -------------------------------------------------------- |
| `/v1/linkedin/profile/experiences` | Full role history with dates, locations and descriptions |
| `/v1/linkedin/profile/educations` | Schools, degrees, fields of study and years attended |
| `/v1/linkedin/profile/skills` | Listed skills with the endorsements shown against each |
| `/v1/linkedin/profile/certifications` | Licences and certifications with issuer and expiry |
| `/v1/linkedin/profile/honors` | Awards, with issuer, date and description |
| `/v1/linkedin/profile/publications` | Articles, papers and books, with publisher and link |
**Everything else about a person.** `/v1/linkedin/profile/volunteers` covers unpaid and
community roles that the paid work history does not, and `/v1/linkedin/profile/recommendations`
returns written references, with `type` selecting those received or those given.
`/v1/linkedin/profile/interests/companies` and `/v1/linkedin/profile/interests/groups` list what
the member follows, which is a decent proxy for their vendor affinities.
`/v1/linkedin/profile/contact` returns the websites, phone numbers, address, WeChat and Twitter
a member has chosen to expose publicly.
Two cheaper reads answer narrow questions without pulling a section.
`/v1/linkedin/profile/stats` returns just the follower and connection numbers, and
`/v1/linkedin/profile/about` returns the month the member joined plus how recently they touched
their contact details and photo — the fastest way to tell a maintained profile from an abandoned
one.
`GET /v1/linkedin/search/people` searches all of LinkedIn by name and narrows with `title`,
`current_company`, `past_company`, `school`, `industry`, `geocode_location` and
`profile_language`. When you already know the employer, `/v1/linkedin/company/people` lists that
company's staff directly and skips the filter-id round trip.
Companies [#companies]
Past `company` and `company/posts`, three endpoints answer questions that would otherwise take a
crawl. `/v1/linkedin/company/insights` returns headcount broken down by location, school, job
function, skill and field of study — a workforce profile without paging through employees.
`/v1/linkedin/company/job-count` returns one number, the count of currently open roles, which is
the right shape for tracking hiring volume on a schedule.
`/v1/linkedin/company/affiliated-pages` maps a parent brand to its regional and product pages,
each of which has its own id you can then feed back into posts and jobs.
For a single-call company snapshot, `GET /v1/linkedin/profile/full?url=…` fans out to the
company page and its recent posts in parallel and returns both plus computed analytics — average
engagement rate, posting cadence, top post, format mix — for a flat 5 credits. Set `posts`
(1-100, default 25) to choose the window the averages are measured over, and `include=computed`
to drop the raw posts array from the payload.
Posts, comments and reactions [#posts-comments-and-reactions]
`GET /v1/linkedin/post?url=…` returns one post. Its audience splits three ways, and the split
matters because the prices differ: `/v1/linkedin/post/comments` returns who replied (5cr, with
`sort_order` of `relevance` or `recent`), `/v1/linkedin/post/reposts` returns who amplified it
(5cr), and `/v1/linkedin/post/reactions` returns who reacted, with their name, headline and
reaction type (10cr). To open one comment thread, pass its `comment_id` back alongside the post
`url` to `/v1/linkedin/post/comments/replies`.
On the publisher side, `/v1/linkedin/profile/posts` is what a member wrote,
`/v1/linkedin/profile/reactions` is what they engaged with, and `/v1/linkedin/profile/comments`
is what they said under other people's posts — three genuinely different signals about the same
person. `/v1/linkedin/profile/images` and `/v1/linkedin/profile/videos` narrow a feed to one
format, and `/v1/linkedin/post/transcript` returns the spoken text of a video post (10cr, and
only charged when a transcript actually comes back).
`GET /v1/linkedin/search/posts?query=…` searches public posts and Pulse articles by keyword,
with `date_posted` accepting `past_24h`, `past_week` or `past_month` (underscores, not hyphens).
It reads public search results rather than LinkedIn's internal index, so treat its coverage as
best effort — it is a monitoring tool, not a complete archive.
Jobs [#jobs]
Four endpoints, all working off the same posting objects. `/v1/linkedin/search/jobs` searches
openings across every employer and `/v1/linkedin/company/jobs` lists one employer's. Both accept
the same filter set — `date_posted`, `experience_level`, `job_type`, `remote`, `easy_apply`,
`sort_by` — and both return job ids rather than descriptions. Pass an id to `/v1/linkedin/job`
for the complete posting text, optionally with `include_skills`.
```bash
# 1. Find remote openings posted recently
curl "https://www.socialcrawl.dev/v1/linkedin/search/jobs?query=machine%20learning%20engineer&remote=true&date_posted=past_week" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
# 2. Read one posting in full, using a job id from that list
curl "https://www.socialcrawl.dev/v1/linkedin/job?id=$JOB_ID" \
-H "x-api-key: $SOCIALCRAWL_API_KEY"
```
Ads [#ads]
`GET /v1/linkedin/ads/search?company=Microsoft` searches the LinkedIn Ad Library, and also
accepts `keyword`, `companyId`, a comma-separated `countries` list, and a `startDate`/`endDate`
window. It paginates on `paginationToken` rather than a page number. Pass a result's Ad Library
URL to `GET /v1/linkedin/ad` for that single ad in full, including its creative images and total
impressions.
Groups [#groups]
`GET /v1/linkedin/group` returns a group's description, member count, posting rules and
public/active flags, and `/v1/linkedin/group/posts` returns its discussion feed. Both take a
numeric `group_id`, which LinkedIn does not put in the group URL — you get one from
`profile/interests/groups` on a member who belongs to it.
Turning names into filter ids [#turning-names-into-filter-ids]
LinkedIn's people and job search filter on internal ids, not on text. Three cheap resolvers (1
credit each) exist for exactly that: `/v1/linkedin/search/location` turns a city or country name
into a geocode id, `/v1/linkedin/search/schools` turns a university name into a school id, and
`/v1/linkedin/search/industry` turns an industry name into an industry id. Resolve once, cache
the id, and reuse it across every subsequent search.
Endpoints [#endpoints]
Read this before you build [#read-this-before-you-build]
**LinkedIn has no 1-credit content surface.** Unlike most platforms here, every profile, post
and company read is `advanced` (5 credits), and people search, company staff, company jobs, job
search, post reactions and video transcripts are `premium` (10 credits). Only the three id
resolvers above are 1 credit. Budget accordingly, and prefer the sub-resource that answers your
question over pulling the whole profile family.
**Sub-resources are per-person calls, not a bundle.** Thirteen profile sub-resources each take
the same profile `url`. Pulling a complete dossier on one member is thirteen billed calls, so
decide up front which sections your model actually reads.
**Most contact fields are empty.** `profile/contact` returns what the member chose to publish,
which for the large majority is nothing. No email address is returned by any endpoint on this
platform.
**Freshness values are relative text.** `profile/about` reports strings such as `Updated over 1
year ago` rather than dates, because that is what LinkedIn renders. Parse accordingly, and do
not expect to sort on them precisely.
Notes [#notes]
* All endpoints use `GET` with query parameters
* Authentication via the `x-api-key` header
* Responses follow the unified SocialCrawl schema
* Page-paginated endpoints start at `page=1`; cursor-paginated ones return a cursor to pass back
* `post/transcript` returns `transcript: null` with `transcriptNotAvailable: true` when the
video has no published transcript, and that call is not charged
Official LinkedIn Resources [#official-linkedin-resources]
* [LinkedIn API Documentation](https://learn.microsoft.com/en-us/linkedin/) — Official Microsoft
developer documentation
* [LinkedIn Marketing API](https://learn.microsoft.com/en-us/linkedin/marketing/) — Ads and
marketing data