SocialCrawl

LinkedIn

LinkedIn people, company pages, posts, comments, jobs, groups, and the Ad Library through one API key

The widest surface on SocialCrawl: public member profiles broken out into every sub-resource LinkedIn renders, 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. 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.

Quickstart

1. Fetch a profile

cURL
curl "https://www.socialcrawl.dev/v1/linkedin/profile?url=https://www.linkedin.com/in/williamhgates/" \
  -H "x-api-key: YOUR_API_KEY"

2. Fetch their content

cURL
curl "https://www.socialcrawl.dev/v1/linkedin/profile/posts?url=https://www.linkedin.com/in/williamhgates/" \
  -H "x-api-key: YOUR_API_KEY"

3. Read computed fields

When an endpoint supports a computed field and the required source inputs are present, the unified response includes that optional field. Depending on the endpoint, optional fields can include engagement_rate, language, content_category, and estimated_reach. See Computed fields for formulas, clamping rules, and null semantics.

People

GET /v1/linkedin/profile deliberately returns the condensed profile, the same summary LinkedIn shows above the fold. Each section below it is its own call against the same url, so you only pay for what you read.

EndpointCreditsWhat it returnsKey parameters
GET /v1/linkedin/profile5Name, headline, location, follower and connection counts, pictureurl
GET /v1/linkedin/profile/stats5Just the follower and connection numbersurl
GET /v1/linkedin/profile/about5Join month, plus how recently contact details and photo were touchedurl
GET /v1/linkedin/profile/contact5Websites, phone, address, WeChat, and Twitter the member exposedurl
GET /v1/linkedin/profile/experiences5Full role history with dates, locations, and descriptionsurl, page
GET /v1/linkedin/profile/educations5Schools, degrees, fields of study, years attendedurl, page
GET /v1/linkedin/profile/skills5Listed skills with the endorsements shown against eachurl, page
GET /v1/linkedin/profile/certifications5Licences and certifications with issuer and expiryurl, page
GET /v1/linkedin/profile/honors5Awards, with issuer, date, and descriptionurl, page
GET /v1/linkedin/profile/publications5Articles, papers, and books, with publisher and linkurl, page
GET /v1/linkedin/profile/volunteers5Unpaid and community roles the paid history does not coverurl, page
GET /v1/linkedin/profile/recommendations5Written references, with type selecting received or givenurl, type
GET /v1/linkedin/profile/interests/companies5The companies the member followsurl, page
GET /v1/linkedin/profile/interests/groups5The groups the member followsurl, page

profile/about is the fastest way to tell a maintained profile from an abandoned one. The two interest lists are a decent proxy for a member's vendor affinities.

What a member says and does

EndpointCreditsWhat it returnsKey parameters
GET /v1/linkedin/profile/posts5What the member wroteurl, urn, limit
GET /v1/linkedin/profile/reactions5What they engaged withurl, urn
GET /v1/linkedin/profile/comments5What they said under other people's postsurl, urn
GET /v1/linkedin/profile/images5Their feed narrowed to image postsurl, urn
GET /v1/linkedin/profile/videos5Their feed narrowed to video postsurl, urn

Posts, reactions, and comments are three genuinely different signals about the same person, and worth pulling separately rather than treating the feed as one thing.

These five are single-window feeds: LinkedIn serves one page and there is no second one to fetch, so they take no cursor. profile/posts accepts limit (up to 100, the provider's ceiling) at the same credit cost, which is the only depth control this surface has.

Every one of them accepts urn as an alternative to url. If you already hold the member's URN from a previous call (it is on author.ext.urn), pass it: the call then skips an internal profile lookup, which is faster and leaves more of the shared rate-limit budget for your other requests.

published_at on these feeds is derived from LinkedIn's own relative label ("15h", "5d", "2w"), not from a stored timestamp, so it is accurate to the hour, day, week, or month rather than the second. post.ext.published_at_precision tells you which, per post.

Companies

Company content is a two-step flow, because the numeric id LinkedIn indexes a company by does not appear anywhere in its public URL.

cURL
curl "https://www.socialcrawl.dev/v1/linkedin/company?url=https://www.linkedin.com/company/microsoft/" \
  -H "x-api-key: YOUR_API_KEY"

curl "https://www.socialcrawl.dev/v1/linkedin/company/posts?company_id=1035" \
  -H "x-api-key: YOUR_API_KEY"

Hold the id. Every other company endpoint takes the same company_id, so you pay for the lookup once and reuse it.

EndpointCreditsWhat it returnsKey parameters
GET /v1/linkedin/company5The company page, and the numeric id everything else needsurl
GET /v1/linkedin/company/posts5That company's postscompany_id, page, sort_by
GET /v1/linkedin/company/people10 to 50The staff directory, without a filter-id round trip; exact counts with include=profilecompany_id, page, include, limit
GET /v1/linkedin/company/jobs10One employer's open roles, with the full job filter setcompany_id, page
GET /v1/linkedin/company/insights5Headcount broken down by location, school, job function, skill, and fieldcompany_id
GET /v1/linkedin/company/job-count5One number: currently open rolescompany_id
GET /v1/linkedin/company/affiliated-pages5A parent brand mapped to its regional and product pagescompany_id
GET /v1/linkedin/profile/full5The company page and its recent posts plus computed analytics, in one callurl, posts (1-100, default 25), include

company/insights is a workforce profile without paging through employees, and company/job-count is the right shape for tracking hiring volume on a schedule. Each affiliated page has its own id you can feed back into posts and jobs.

Posts, comments and reactions

EndpointCreditsWhat it returnsKey parameters
GET /v1/linkedin/post5One posturl
GET /v1/linkedin/post/comments5Who repliedurl, sort_order, post_type, page
GET /v1/linkedin/post/comments/replies5One comment thread opened upurl and comment_id
GET /v1/linkedin/post/reposts5Who amplified iturl, cursor
GET /v1/linkedin/post/reactions10 to 50Who reacted, with their name, headline, and reaction type; exact counts with include=profileurl, type, page, include, limit
GET /v1/linkedin/post/transcript10The spoken text of a video posturl
GET /v1/linkedin/search/posts5Public posts and Pulse articles matching a keywordquery, date_posted, content_type, from_company, from_member

A post's audience splits three ways and the prices differ, so pick the one that answers your question rather than pulling all three.

date_posted on search/posts accepts past_24h, past_week, or past_month, with underscores rather than hyphens. The endpoint 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

EndpointCreditsWhat it returnsKey parameters
GET /v1/linkedin/search/jobs10Openings across every employer, as job idsquery, date_posted, experience_level, job_type, remote, easy_apply, sort_by
GET /v1/linkedin/company/jobs10One employer's openings, same filter setcompany_id, page
GET /v1/linkedin/job5The complete posting textid, include_skills

Both searches return job ids rather than descriptions. Pass an id to job for the posting itself.

cURL
curl "https://www.socialcrawl.dev/v1/linkedin/search/jobs?query=machine%20learning%20engineer&remote=true&date_posted=past_week" \
  -H "x-api-key: YOUR_API_KEY"

curl "https://www.socialcrawl.dev/v1/linkedin/job?id=$JOB_ID" \
  -H "x-api-key: YOUR_API_KEY"

Groups and ads

EndpointCreditsWhat it returnsKey parameters
GET /v1/linkedin/group5Description, member count, posting rules, public and active flagsgroup_id
GET /v1/linkedin/group/posts5The group's discussion feedgroup_id, page
GET /v1/linkedin/ads/search5The LinkedIn Ad Library, paged on paginationTokencompany, keyword, companyId, countries, startDate, endDate
GET /v1/linkedin/ad5One ad in full, including creative images and total impressionsurl

group_id is not in the group URL. You get one from profile/interests/groups on a member who belongs to it. countries is a comma-separated list, and ad takes a result's Ad Library URL.

Turning names into filter ids

LinkedIn's people and job search filter on internal ids, not on text. Three cheap resolvers exist for exactly that.

EndpointCreditsWhat it returnsKey parameters
GET /v1/linkedin/search/location1A city or country name as a geocode idquery
GET /v1/linkedin/search/schools1A university name as a school idquery, page
GET /v1/linkedin/search/industry1An industry name as an industry idquery
GET /v1/linkedin/search/people10 to 50Members matching a name and those filtersquery, title, current_company, past_company, school, industry, geocode_location, profile_language, include, limit

Resolve once, cache the id, and reuse it across every subsequent search. When you already know the employer, company/people lists that company's staff directly and skips the round trip.

Exact numbers on a people list

Three lanes return people rows: GET /v1/linkedin/search/people, GET /v1/linkedin/company/people, and GET /v1/linkedin/post/reactions. Each page is 10 members. On a plain call a row carries the name, headline, location and member URN, but author.followers is LinkedIn's rounded display bucket where it appears at all (39,000 for a member on 39,278), flagged author.ext.followers_approximate, and author.following is null on every row.

Add include=profile and every row is joined to that member's /v1/linkedin/profile lookup inside the same call, so you never loop the profile endpoint yourself:

cURL
curl "https://www.socialcrawl.dev/v1/linkedin/search/people?query=Bill%20Gates&include=profile&limit=3" \
  -H "x-api-key: YOUR_API_KEY"

author.followers becomes the member's exact follower count, and author.ext.followers_approximate reads false on every row the lookup filled, so one field tells you whether a figure is exact on every row instead of only on the rows that arrived rounded. A row the lookup could not fill keeps the flag it arrived with. author.following is filled with their connection count, which is what a member's following number means on LinkedIn. author.location, author.joined_at, and the country, website, cover image, and the creator, influencer, open-to-work, hiring, top-voice and premium flags on author.ext land on any row that lacks them.

The list stays 10 credits. The join holds 4 credits per row and keeps that only for the rows it filled from a fresh lookup, so a full page of 10 costs at most 50. Rows already in cache are free, rows it could not fill are refunded, and repeating a fully joined page inside the cache window costs nothing at all. limit (1 to 10) caps the rows served and the extra credits together, so limit=3&include=profile is at most 22 credits; the page cursor still advances past the full page of 10, so the rows past your limit are skipped rather than carried forward.

data.hydration reports rows, looked_up, filled, cached, unfilled, credits_held, extra_credits and ms, so you can see what the join did and what it cost. An include value other than profile is a 400 before anything is billed. No other LinkedIn lane takes the token: the job lists, profile/images, profile/videos and the comment lanes have no profile join.

All endpoints

45 endpoints available.

EndpointPathCredit Tier
LinkedIn company profile, recent posts, and computed analytics in one call./v1/linkedin/profile/fullstandard (5cr)
Resolve an industry name to a LinkedIn industry id/v1/linkedin/search/industrystandard (1cr)
Resolve a location to a LinkedIn geocode id/v1/linkedin/search/locationstandard (1cr)
Search LinkedIn schools/v1/linkedin/search/schoolsstandard (1cr)
Get LinkedIn ad details/v1/linkedin/adadvanced (5cr)
Search LinkedIn ads/v1/linkedin/ads/searchadvanced (5cr)
Get LinkedIn company page with its full About tab/v1/linkedin/companyadvanced (5cr)
List a company's affiliated/showcase pages/v1/linkedin/company/affiliated-pagesadvanced (5cr)
Get aggregate insights about a company's members/v1/linkedin/company/insightsadvanced (5cr)
Get a company's open job count/v1/linkedin/company/job-countadvanced (5cr)
List LinkedIn company posts/v1/linkedin/company/postsadvanced (5cr)
Get LinkedIn group details/v1/linkedin/groupadvanced (5cr)
List posts in a LinkedIn group/v1/linkedin/group/postsadvanced (5cr)
Get LinkedIn job details/v1/linkedin/jobadvanced (5cr)
Get LinkedIn post details/v1/linkedin/postadvanced (5cr)
Get LinkedIn post comments/v1/linkedin/post/commentsadvanced (5cr)
List replies to a LinkedIn comment/v1/linkedin/post/comments/repliesadvanced (5cr)
List reposts of a LinkedIn post/v1/linkedin/post/repostsadvanced (5cr)
Get LinkedIn user profile/v1/linkedin/profileadvanced (5cr)
Get a member's account freshness signals (NOT the profile About section)/v1/linkedin/profile/aboutadvanced (5cr)
List a member's licenses and certifications/v1/linkedin/profile/certificationsadvanced (5cr)
List a member's comments/v1/linkedin/profile/commentsadvanced (5cr)
Get a member's public contact info/v1/linkedin/profile/contactadvanced (5cr)
List a member's education history/v1/linkedin/profile/educationsadvanced (5cr)
List a member's work experiences/v1/linkedin/profile/experiencesadvanced (5cr)
List a member's honors and awards/v1/linkedin/profile/honorsadvanced (5cr)
List a member's image posts/v1/linkedin/profile/imagesadvanced (5cr)
List companies a member follows/v1/linkedin/profile/interests/companiesadvanced (5cr)
List groups a member follows/v1/linkedin/profile/interests/groupsadvanced (5cr)
List a LinkedIn member's posts/v1/linkedin/profile/postsadvanced (5cr)
Walk a LinkedIn member's COMPLETE post history, 100 posts a page, with exact publish times and share counts the other lanes cannot return. Metered: 5 credits per post returned, so try the cheaper /v1/linkedin/profile/posts first/v1/linkedin/profile/posts/archiveadvanced (5-500cr)metered
List a member's publications/v1/linkedin/profile/publicationsadvanced (5cr)
List posts a LinkedIn member reacted to/v1/linkedin/profile/reactionsadvanced (5cr)
List recommendations for a member/v1/linkedin/profile/recommendationsadvanced (5cr)
List a member's skills/v1/linkedin/profile/skillsadvanced (5cr)
Get a member's follower + connection counts/v1/linkedin/profile/statsadvanced (5cr)
List a member's video posts/v1/linkedin/profile/videosadvanced (5cr)
List a member's volunteer experiences/v1/linkedin/profile/volunteersadvanced (5cr)
Search public LinkedIn posts by keyword/v1/linkedin/search/postsadvanced (5cr)
List a company's job postings/v1/linkedin/company/jobspremium (10cr)
List people at a LinkedIn company/v1/linkedin/company/peoplepremium (10-50cr)metered
List reactors on a LinkedIn post/v1/linkedin/post/reactionspremium (10-50cr)metered
Get a LinkedIn post video transcript/v1/linkedin/post/transcriptpremium (10cr)
Search LinkedIn jobs/v1/linkedin/search/jobspremium (10cr)
Search LinkedIn people/v1/linkedin/search/peoplepremium (10-50cr)metered

Platform notes

LinkedIn has no 1-credit content surface. Every profile, post, and company read is 5 credits, and people search, company staff, company jobs, job search, post reactions, and video transcripts are 10. The three people lanes bill between 10 and 50 when you add include=profile. 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.

post/transcript is only charged when a transcript comes back. A post with no transcript, including a post with no video, returns 404 RESOURCE_NOT_FOUND with error.details.reason: "no_captions", at no cost. A repost is read from the original post it shares, because LinkedIn does not show a repost's content to logged-out viewers, and a _warnings note names the original post's URL. A post that cannot be read logged-out and cannot be resolved returns 404 with reason: "post_not_public", also at no cost.

Member and company URLs are normalised before they are looked up. https://www.linkedin.com/in/williamhgates/, http://uk.linkedin.com/in/williamhgates, and the same URL carrying tracking parameters such as ?trk=... all resolve to one record, so a second read of that member inside the cache window is a free cache hit rather than a repeat charge.

Pagination style varies by endpoint. Page-paginated endpoints start at page=1; cursor-paginated ones return a cursor to pass back. ads/search uses paginationToken instead of either.

Next steps