How to Scrape LinkedIn Data in 2026: Profiles, Companies, Posts, Ads
Get public LinkedIn profiles, company pages, posts, post search and Ad Library ads as clean JSON with one REST API: no login, no partner approval, 2 credits per call.
The simplest way to get public LinkedIn data in 2026 is a hosted scraping API: one HTTPS call returns a person’s public profile, a company page, their posts, posts matching a keyword or ads from LinkedIn’s Ad Library as JSON. With crawlfeed, every LinkedIn call costs 2 credits, needs only an API key rather than partner approval, and returns the same shape as X, Instagram and YouTube data.
LinkedIn is where companies announce hires, launches and funding, and where B2B buyers and sellers talk in public. For sales intelligence, recruiting research and competitive tracking, its public data is hard to replace, and hard to collect. This guide shows how to pull public LinkedIn data (profiles, company pages, posts, post search and Ad Library ads) with plain HTTPS calls, with working code in cURL, JavaScript and Python.
Why is LinkedIn data so hard to get?
LinkedIn is the most closed of the major networks:
- The official APIs need approval. Most LinkedIn APIs sit behind partner programmes, and each one is scoped to a use case such as sign-in, sharing or ad management. None of them lets a product read arbitrary public profiles or company pages.
- Logged-out access is minimal. Most of LinkedIn is behind a login, public pages show only part of the content, and automated traffic is challenged aggressively. A scraper built on a logged-in account puts that account at risk.
- The markup changes often. Public profile and company pages are reshaped regularly, so parsers need constant repair.
Here is how the usual options compare:
| Approach | Public profiles and companies | Posts | Ad Library |
|---|---|---|---|
| Official LinkedIn APIs | Only with partner approval, for approved use cases | Mostly your own or your members’ content | Your own ad accounts |
| Your own scraper | Partly, and fragile | Partly | Yes, with extra work |
| Scraping API (crawlfeed) | Yes | Yes | Yes |
The rest of this guide takes the last route.
What LinkedIn data can you get?
Every call below is live on crawlfeed today. The table is generated from the API’s own catalogue, so the endpoints and prices are exactly what you will be charged:
| Operation | Endpoint | Needs | Credits |
|---|---|---|---|
| Profile | /v1/linkedin/profile | handle | 2 |
| Posts | /v1/linkedin/posts | handle | 2 |
| Post | /v1/linkedin/post | id | 2 |
| Company | /v1/linkedin/company | handle | 2 |
| Company posts | /v1/linkedin/company/posts | handle | 2 |
| Transcript | /v1/linkedin/transcript | id | 2 |
| Summary | /v1/linkedin/summary | id | 5 |
| Search posts | /v1/linkedin/search/posts | q | 2 |
| Search ads | /v1/linkedin/ads/search | q | 2 |
| An advertiser's ads | /v1/linkedin/ads | advertiser | 2 |
| Ad | /v1/linkedin/ad | id | 2 |
Note the price column: every LinkedIn call costs 2 credits, because LinkedIn is more expensive to fetch upstream. Plan your paging with that in mind. Everything comes back in crawlfeed’s unified types (Profile, Post, Comment and friends), which are the same across all 26 platforms.
Get a LinkedIn profile
You need an API key (new accounts get 100 free credits) and the person’s public profile slug: the part after /in/ in their profile URL.
curl -G https://api.crawlfeed.dev/v1/linkedin/profile \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "handle=satyanadella"The response is a Profile wrapped in the standard envelope. Trimmed, and with illustrative numbers, it looks like this:
{
"data": {
"platform": "linkedin",
"handle": "satyanadella",
"display_name": "Satya Nadella",
"bio": "…",
"followers": 1234567,
"posts_count": null,
"links": ["…"]
},
"meta": { "credits_used": 2, "credits_remaining": 98, "cache": "MISS", "data_age_s": 0 }
}bio holds the profile’s about text or headline. A field LinkedIn does not show publicly comes back as null rather than disappearing, so your code does not need a special case per profile.
Get a company page
Company pages have their own call. Pass the company slug (the part after /company/ in the URL) or the page URL as handle:
curl -G https://api.crawlfeed.dev/v1/linkedin/company \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "handle=microsoft"A company comes back as a Profile too, so the same code handles people and organisations. For the company’s own updates, call /v1/linkedin/company/posts with the same handle; each result is a Post, and it pages like any other list.
Get a person’s posts
/v1/linkedin/posts returns a person’s recent public posts, one page per call:
curl -G https://api.crawlfeed.dev/v1/linkedin/posts \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "handle=satyanadella"Each item is a Post with text, created_at, media, engagement (likes, comments, shares and friends), hashtags and mentions.
To get the next page, pass meta.next_cursor back as cursor. When next_cursor is missing, you have reached the end. Every page costs 2 credits, so set a limit before you loop:
let cursor;
const posts = [];
let pages = 0;
do {
const params = new URLSearchParams({ handle: 'satyanadella', ...(cursor ? { cursor } : {}) });
const res = await fetch(`https://api.crawlfeed.dev/v1/linkedin/posts?${params}`, {
headers: { Authorization: `Bearer ${process.env.CRAWLFEED_KEY}` },
});
const { data, meta } = await res.json();
posts.push(...data);
cursor = meta.next_cursor;
pages += 1;
} while (cursor && pages < 5); // at most 10 creditsFor a single post you already know, pass its id or URL to /v1/linkedin/post. If the post has a video, /v1/linkedin/transcript returns its spoken text for the same price.
Search LinkedIn posts
To find content by topic rather than by account, /v1/linkedin/search/posts?q=… returns matching posts as Post objects, ready to store alongside everything else.
curl -G https://api.crawlfeed.dev/v1/linkedin/search/posts \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "q=ai agents"Read the LinkedIn Ad Library
LinkedIn publishes the ads that run on it in a public Ad Library, and crawlfeed exposes it with three calls:
- Search ads by keyword:
/v1/linkedin/ads/search?q=…, with an optionalcountry. - An advertiser’s ads:
/v1/linkedin/ads?advertiser=…, by advertiser name, page id or domain. - One ad:
/v1/linkedin/ad?id=…, by ad id or Ad Library URL.
curl -G https://api.crawlfeed.dev/v1/linkedin/ads \
-H "Authorization: Bearer $CRAWLFEED_KEY" \
--data-urlencode "advertiser=nike.com"Each result is an Ad. For competitive research this is often the most useful LinkedIn data of all: it shows what a competitor is saying to buyers right now.
Handle errors and rate limits
Errors are RFC 9457 problem details with a stable code, so branch on the code, not the message:
| Code | What it means | What to do |
|---|---|---|
not_found | The profile, company or post does not exist, or is not public | Check the slug; do not retry |
rate_limited | You sent requests faster than your limit | Wait retry_after seconds |
insufficient_credits | Your balance is lower than the call’s 2 credits | Top up; nothing was charged |
upstream_timeout | LinkedIn took too long to answer | Retry; the call was refunded |
platform_unavailable | LinkedIn or the upstream failed | Retry later; the call was refunded |
A call that fails is refunded automatically, so retrying never charges you twice. That matters more on a platform where each call costs 2 credits.
Add Arabic sentiment and dialect
For Gulf and wider Arabic-speaking B2B markets, add enrich=arabic to a profile or posts call. Each item gains an enrichment field with the dialect, sentiment, entities and topics, for 3 extra credits on top of the call’s 2.
Use LinkedIn data from Claude or Cursor
If you would rather ask than code, connect the crawlfeed MCP server and your assistant gets the same calls as tools:
claude mcp add --transport http crawlfeed https://mcp.crawlfeed.dev/mcp \
--header "Authorization: Bearer $CRAWLFEED_KEY"Then ask something like “what has Microsoft posted on LinkedIn this month, and which ads is it running?”. The setup for every client is in our guide to MCP.
Wrapping up
For public LinkedIn data, a scraping API saves you from partner applications, logged-in scrapers and parsers that break with every redesign. With crawlfeed, every LinkedIn call costs 2 credits, and the same code works for TikTok, Instagram, X and YouTube. The full reference is at /docs/platforms/linkedin.
Questions
Is it legal to scrape LinkedIn data?
Collecting publicly available data is generally lawful in many jurisdictions, but it depends on where you are, what you collect and what you do with it. crawlfeed only returns public data and never logs in to accounts. LinkedIn data is mostly about identifiable people, so if you store it you are responsible for having a lawful basis under laws such as the GDPR, and for honouring deletion requests.
Does LinkedIn have an official API for this?
LinkedIn’s APIs are mostly available through partner programmes that require approval, and they are scoped to specific use cases such as sign-in, posting on behalf of a member or managing ads. There is no open endpoint for reading arbitrary public profiles, company pages and posts, which is why most teams use a scraping API for public data.
How much does it cost to get LinkedIn data with crawlfeed?
Every LinkedIn call costs 2 credits: a profile, a company page, a page of posts, a post search or an ad lookup. That is double most platforms because LinkedIn costs more to fetch upstream. New accounts get free credits, and failed calls are refunded.
How fresh is the data?
Responses are cached briefly to keep repeat calls fast and cheap. meta.cache and meta.data_age_s tell you how old a response is; add fresh=true to fetch it live for double the price, which is 4 credits on LinkedIn.
Can I get email addresses or phone numbers from LinkedIn?
No. crawlfeed returns the public fields of a profile, company page, post or ad, mapped into its unified types. It does not return contact details, and it never logs in to see anything a logged-out visitor could not.
Try it on your own data
Every example above runs as written. New accounts get 100 free credits, no card needed.
Get an API key