Linkedin Post Scraper
Pricing
$19.99/month + usage
Linkedin Post Scraper
๐ผ LinkedIn Post Scraper extracts public LinkedIn posts from profile or company profile with text, media, reactions, comments & author info. ๐ Ideal for market research, content analysis & lead generation. Export data in JSON, CSV, or Excel.
Pricing
$19.99/month + usage
Rating
5.0
(12)
Developer
Scraper Engine
Maintained by CommunityActor stats
7
Bookmarked
562
Total users
22
Monthly active users
89 days
Issues response
7 days ago
Last modified
Categories
Share
LinkedIn Post Scraper โ Post Text, Author and Publish Date
LinkedIn Post Scraper extracts public LinkedIn posts โ post text, publish date, author name and headline, and post images โ from any company or person profile URL, and returns them as structured JSON with no parsing required. It runs fully logged out, so there's no LinkedIn account or li_at cookie to manage. Add one or more profile URLs and run it on Apify to start pulling posts in minutes.
What is LinkedIn Post Scraper?
LinkedIn Post Scraper is an Apify Actor that reads the public posts on a LinkedIn company or person page and returns each post's text, URL, publish date, author details, and images as JSON. It works entirely logged out โ no LinkedIn account, password, or cookie is ever requested or required. It's built for growth marketers, sales teams, and developers who need a company's or individual's public post history in a structured feed instead of a browser tab.
What LinkedIn post data is publicly available to scrape?
LinkedIn serves post text, author identity, and images to anyone visiting a public company or person page โ no login needed. Engagement numbers (likes, comments, shares) and comment content are only rendered in the logged-in feed UI, so they are not present on the logged-out page LinkedIn Post Scraper reads.
| Data Category | Publicly Available (logged out) | Restricted (requires login) |
|---|---|---|
| Post text / article body | Yes | โ |
| Post publish date | Yes | โ |
| Post URL / URN | Yes | โ |
| Author name, headline, picture | Yes | โ |
| Post images | Yes | โ |
| Like / reaction counts | No | Requires login |
| Comment count and comment text | No | Requires login |
| Share count | No | Requires login |
LinkedIn Post Scraper only returns publicly visible data โ what any visitor sees. Nothing behind a login wall.
What data can I extract with LinkedIn Post Scraper?
LinkedIn Post Scraper returns one JSON object per post, covering the post's content and identity fields plus a set of engagement fields that are honestly nulled when LinkedIn doesn't expose them logged out.
Post content and author fields
| Field Name | Description |
|---|---|
urn | Post URN, e.g. urn:li:activity:<id>, urn:li:share:<id> or urn:li:ugcPost:<id>. |
text / postContent | Post body text (duplicated under both keys). |
url | Canonical post URL. |
postedAtTimestamp | Publish time as epoch milliseconds, or null if the page omits it. |
postedAtISO | Publish time as an ISO-8601 string. |
timeSincePosted | Relative age at scrape time, e.g. "2d", "3w", "1mo". |
authorType | "Company" or "Person". |
authorProfileUrl | The source URL that was scraped. |
authorProfileId | Public slug extracted from the URL (e.g. google). |
authorFullName / authorName | Author's display name (duplicated under both keys). |
authorHeadline / authorTitle | Author's headline/description (duplicated under both keys). |
author | Nested object: firstName, lastName, occupation, publicId, picture, backgroundImage (plus id, trackingId, profileId, always null โ see Output section). |
Media, type and engagement fields
| Field Name | Description |
|---|---|
image | First post image URL, or "" if none. |
images | Array of post image URLs (up to 5). |
type | "image" if the post has an image, else "text". |
isRepost | Always returned as false โ repost detection is not implemented (see Output notes). |
numLikes, numComments, numShares | Always null โ not present on logged-out pages. |
reactions, comments, attributes | Always null โ reaction breakdowns, comment threads and @mentions require a logged-in session. |
rawHtml | Full page HTML for the post โ only present when rawData is true. |
๐ค Add-on: Need additional LinkedIn data?
Pair this scraper with the ../linkedin-company-employees-ai-sentiment-lead-enrichment-scraper to turn a company's posters into a scored lead list, or the ../linkedin-b2b-emails-scraper-verified-email-finder to find verified domain emails for the companies you're tracking. For company-level context, add the ../linkedin-company-about-scraper or the ../LinkedIn-Company-Scraper-And-Open-Jobs-Finder.
How does LinkedIn Post Scraper differ from the official LinkedIn API?
LinkedIn's own APIs sit behind the Marketing Developer Platform partner program and, per Microsoft's LinkedIn developer documentation, are scoped to the pages and ad accounts your approved app manages โ there is no endpoint for pulling another company's or person's public post feed. LinkedIn Post Scraper instead reads any public company or person page directly, with no partner approval step (checked July 2026).
| Feature | LinkedIn API | LinkedIn Post Scraper |
|---|---|---|
| Access approval | Marketing Developer Platform partner review required | None โ provide a URL and run |
| Scope of accessible posts | Your own managed company pages / ad accounts | Any public company or person page |
| Third-party post data | Not available | Available |
| Authentication | OAuth 2.0 app + partner review | None โ logged out |
| Setup time | Development-tier review, then a separate Standard-tier application | Minutes |
| Engagement analytics | Available for your own owned pages | Not returned โ nulled, not fabricated |
Use LinkedIn's official API when you manage the page yourself and need its private analytics. Use LinkedIn Post Scraper when you need public posts from any company or person page without going through partner approval.
How to use LinkedIn Post Scraper
Run LinkedIn Post Scraper from its Apify Store page โ no separate signup or API key setup is needed beyond your Apify account.
- Open the LinkedIn Post Scraper page in Apify Console and click Run.
- Add
urlsโ one or more LinkedIn company or person profile URLs (required). - Optionally set
limitPerSource,scrapeUntil,deepScrape, orrawData. - Start the run.
- Download results as JSON, CSV, or Excel from the dataset, or read the mirrored
linkedin_posts.jsonkey-value record.
How to scale to bulk LinkedIn post extraction
urls accepts an array, so one run can cover many company or person pages at once โ each URL is scraped in turn, and each returns up to limitPerSource posts. There's no separate bulk mode or CSV upload; add as many URLs as you need to the same list and start a single run.
What can you do with LinkedIn post data?
- A content marketer tracking a competitor's thought leadership uses
authorFullName,postedAtISO, andtextto see how often a company posts and what topics it covers. - A sales rep watching for trigger events uses
authorProfileUrlandpostedAtTimestampto spot when a target account posts about hiring, funding, or expansion, then reaches out the same day. - A researcher studying a person's public activity uses
authorHeadline,text, andtimeSincePostedto build a timeline of their public commentary. - A brand team auditing visual consistency uses
imagesandtypeto check how often a company page posts image content versus text-only updates. - An AI engineer builds a RAG pipeline over
textandauthorHeadlinefields so an internal agent can answer questions like "what has this company said publicly this quarter," using the JSON output directly as context without any HTML parsing.
How does LinkedIn Post Scraper handle rate limits and blocking?
Requests use bounded concurrency (an asyncio semaphore, 16 concurrent requests by default) rather than firing every URL at once. On a 429 response, the Actor backs off with an increasing delay before retrying, and each failed request is retried up to 3 times before being given up on. When multiple source URLs are provided, the Actor pauses briefly between sources rather than hitting them back-to-back. An optional proxyConfiguration input routes requests through Apify Proxy for additional reliability. LinkedIn Post Scraper makes plain HTTP requests and parses the returned HTML/JSON-LD โ it does not run a browser and does not solve CAPTCHAs. If a source URL fails to load after its retries, that source is logged as an error and skipped; the run continues with the remaining URLs rather than aborting the whole job.
โฌ๏ธ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
urls | Yes | array | LinkedIn company or person profile URLs to scrape โ one or many. | ["https://www.linkedin.com/company/google/"] |
limitPerSource | No | integer | Maximum posts to collect per URL. Default 10, minimum 1. | 20 |
scrapeUntil | No | string | Only include posts published on or after this date (YYYY-MM-DD). | "2026-01-01" |
deepScrape | No | boolean | Crawl the linked post-URN graph for more posts. Default true. Off = only posts found inline on the first page. | true |
rawData | No | boolean | Include the raw page HTML (rawHtml) on each post. Default false. | false |
proxyConfiguration | No | object | Apify proxy configuration. | {"useApifyProxy": true} |
Example input
{"urls": ["https://www.linkedin.com/company/google/","https://www.linkedin.com/in/satyanadella/"],"limitPerSource": 20,"scrapeUntil": "2026-01-01","deepScrape": true,"rawData": false,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
โฌ๏ธ Output
Each post is pushed to the dataset as a separate row the moment it's found, so you can stream results instead of waiting for the whole run to finish. Results are available as JSON, CSV, or Excel from the Apify dataset, and the full run is also mirrored to the key-value store record linkedin_posts.json.
Example output
{"urn": "urn:li:activity:7300000000000000000","text": "Excited to share our latest product update...","postContent": "Excited to share our latest product update...","url": "https://www.linkedin.com/posts/google_product-update-activity-7300000000000000000","postedAtTimestamp": 1735732800000,"postedAtISO": "2026-01-01T12:00:00.000000Z","timeSincePosted": "2w","isRepost": false,"authorType": "Company","authorProfileUrl": "https://www.linkedin.com/company/google/","authorProfileId": "google","authorHeadline": "Search, Ads, Maps, YouTube, and more.","authorFullName": "Google","image": "https://media.licdn.com/dms/image/example.jpg","type": "image","images": ["https://media.licdn.com/dms/image/example.jpg"],"author": {"firstName": null,"lastName": null,"occupation": "Search, Ads, Maps, YouTube, and more.","id": null,"publicId": "google","trackingId": null,"profileId": null,"picture": "https://media.licdn.com/dms/image/company-logo.jpg","backgroundImage": ""},"authorName": "Google","authorTitle": "Search, Ads, Maps, YouTube, and more.","attributes": null,"comments": null,"reactions": null,"numShares": null,"numLikes": null,"numComments": null}
How does it work?
LinkedIn Post Scraper sends direct HTTP requests to each public company or person page (through Apify Proxy when configured) and reads the JSON-LD structured data block LinkedIn embeds in the page HTML โ the same data search engines index. When that block is missing or incomplete, it falls back to OpenGraph meta tags for the post text, date, and author. To find more than the posts shown inline, it extracts post URNs (activity, share, ugcPost) from the page and follows them breadth-first, up to limitPerSource per source. Because it reads structured data rather than scraping visual layout, the output field names stay the same even when LinkedIn changes its page design. Only what's visible to a logged-out visitor is ever returned โ nothing behind a login wall.
Integrations
LinkedIn Post Scraper runs on Apify, so it works with any tool that can call the Apify API or the Apify SDKs.
Calling LinkedIn Post Scraper programmatically
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("<your-username>/linkedin-post-scraper").call(run_input={"urls": ["https://www.linkedin.com/company/google/"],"limitPerSource": 20,})for post in client.dataset(run["defaultDatasetId"]).iterate_items():print(post["authorFullName"], "-", post["text"][:80])
Works in Go, Ruby, Node.js, cURL โ any language that can make an HTTP request.
MCP integration for AI agents
LinkedIn Post Scraper is callable through Apify's official MCP server. Configure your MCP client (Claude, Claude Code, or any MCP-compatible agent framework) with the server command npx @apify/actors-mcp-server --actors <your-username>/linkedin-post-scraper and your APIFY_TOKEN environment variable, or use the hosted https://mcp.apify.com endpoint to add the actor as a tool.
No-code tools (n8n, Make, LangChain)
In n8n, use the HTTP Request node pointed at the Actor's run-sync-get-dataset-items API endpoint to run it and pull results in one step. In Make, use the HTTP module against the same endpoint. In LangChain, use the ApifyWrapper integration to call the Actor and load its dataset directly as LangChain Document objects for a RAG pipeline.
Is it legal to scrape LinkedIn posts?
Scraping publicly available LinkedIn posts โ data visible to any logged-out visitor โ is generally permitted, but how you store and use it can still be regulated. LinkedIn Post Scraper returns only what's publicly visible on a company or person page; it never accesses content behind a login. Because posts include author names and headlines, which are personal data under GDPR and CCPA, you need a lawful basis for storing and using that data if your use case involves EU or California residents. Consult legal counsel if your use case involves bulk storage of personal data.
Frequently asked questions
What LinkedIn post fields does LinkedIn Post Scraper return?
It returns text, url, postedAtISO, authorFullName, and authorHeadline for every post, plus author and image details. See the full fields table above.
Does LinkedIn Post Scraper require a LinkedIn account or login?
No. It runs entirely logged out โ no LinkedIn username, password, or li_at cookie is ever requested.
How many LinkedIn posts can I extract in one run?
Up to limitPerSource posts per URL (default 10), for every URL you add to the urls list in that run โ there's no fixed cap on the number of URLs.
What happens if a company or person page has no public posts, or the page can't be loaded?
If the page fails to load after its retries, that source is logged as an error and skipped, and the run continues with the remaining URLs. If the page loads but has no detectable posts, the Actor simply returns no rows for that source rather than failing the run.
Can I scrape multiple LinkedIn company or person pages at once?
Yes. urls accepts an array, so one run can process any number of company or person page URLs in sequence.
Does LinkedIn Post Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes. It's reachable through Apify's official MCP server (npx @apify/actors-mcp-server or https://mcp.apify.com), and it's callable as a plain HTTP endpoint by any agent framework that can make API calls.
How does LinkedIn Post Scraper compare to other LinkedIn post scrapers?
We don't publish comparisons against other listings' unverified claims. What's verifiable about this Actor from its own code: it runs logged out only, never fabricates engagement numbers (they're returned as null instead of a faked value), and crawls the post-URN graph to surface more than the posts shown inline. Check any competing listing's current fields and input options directly before comparing.
Does LinkedIn Post Scraper return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with consistent field names across runs โ no HTML parsing or selectors needed. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.
What happens when LinkedIn changes its layout or anti-bot system?
LinkedIn Post Scraper is actively maintained, and its output schema is designed to stay stable across LinkedIn UI changes since it reads structured JSON-LD data rather than page layout. No specific update turnaround time is guaranteed.
Can I use LinkedIn Post Scraper without managing proxies or browser infrastructure?
Yes. The Actor makes its own HTTP requests with built-in retries and backoff; proxy configuration through Apify Proxy is optional. It doesn't use a browser at all, so there's no browser infrastructure to run or maintain.
Which LinkedIn post fields work best for AI training data and RAG indexing?
For RAG, index text alongside authorHeadline and authorFullName for source attribution. For structured training data, authorType, postedAtISO, and authorProfileId are the most consistently populated fields across records, since they come from JSON-LD rather than page-position fallbacks.
Related scrapers
| Scraper Name | What it extracts |
|---|---|
| LinkedIn Company Scraper & Open Jobs Finder | Company profile data plus open job listings |
| LinkedIn B2B Emails Scraper: Verified Email Finder | Verified company domain emails for outreach |
| LinkedIn Company About Scraper | Company "About" page details |
| LinkedIn Company Employees: AI & Lead Enrichment Scraper | Employee lists with AI sentiment and lead scoring |
| LinkedIn Profile & Credibility Analysis Scraper | Profile credibility scores and recommendations |
Your feedback
Found a bug or missing a field? Let us know through the Actor's Issues tab on Apify Console, or send feedback directly to the Scraper Engine support contact listed on the Actor's Store page. Reports like this directly shape what gets fixed next.