LinkedIn Profile Posts Scraper With Company Page Insights
Pricing
from $4.99 / 1,000 results
LinkedIn Profile Posts Scraper With Company Page Insights
π LinkedIn Profile Post Scraper pulls posts from public profilesβtext, media, timestamps, reactions, comments, shares, links & hashtags. βοΈ API-ready; export CSV/JSON. π Ideal for social listening, competitor analysis, content research & lead gen.
Pricing
from $4.99 / 1,000 results
Rating
0.0
(0)
Developer
API Empire
Maintained by CommunityActor stats
1
Bookmarked
16
Total users
9
Monthly active users
5 days ago
Last modified
Categories
Share
LinkedIn Posts Scraper β Extract Profile Posts, Comments & Reactions
Extract posts from LinkedIn profile pages and LinkedIn company pages in the same run β no login, no cookies, no li_at session token. Point it at a mix of linkedin.com/in/... and linkedin.com/company/... URLs and it returns three structured row types: posts, comments, and reactions, plus β for every company-authored post β the company's own tagline, employee count, follower count, and headquarters merged onto the row. Every field comes back as typed, normalized JSON, not raw HTML: no selectors, no parsing step before handing it to a script, a spreadsheet, or an LLM. Results land in the dataset live, post by post, while the run is still going. After reading this, you'll know exactly which fields you get, how the company enrichment works, and how to wire the output into your own pipeline.
What is LinkedIn Posts Scraper With Company Page Insights?
It's an Apify Actor that scrapes public LinkedIn profile and company pages for their recent posts, without requiring a LinkedIn account, login, or cookie. URLs are auto-detected by shape β /in/ is treated as a personal profile, /company/ as a company page β so both can sit in the same input list and run together. No LinkedIn credentials are read from or required by the Actor; it only fetches pages LinkedIn already serves anonymously.
- π Scrape posts from personal LinkedIn profiles
- π¬ Scrape comments nested on each post, promoted to their own rows
- π Scrape reactions nested on each post, promoted to their own rows
- π’ Enrich every company-authored post with tagline, employee count, follower count, and headquarters
- π€ Export results as JSON, CSV, or Excel directly from the Apify dataset
What data does LinkedIn Posts Scraper With Company Page Insights collect?
Every run returns up to four kinds of structured data, depending on what a post has attached to it and whether includeCompanyEnrichment is on:
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Posts | text, URL, author, engagement counts, timestamps | text, url, authorFullName, authorType, numLikes, numComments, postedAtISO |
| Comments (as child rows) | comment text, commenter identity, parent link | text, authorFullName, authorProfileId, parentId, rowType: "comment" |
| Reactions (as child rows) | reaction type, reactor identity, parent link | type, authorFullName, authorProfileId, parentId, rowType: "reaction" |
| Company Page Insights | tagline, employee count, follower count, HQ | companyTagline, companyEmployeeCount, companyFollowerCount, companyHeadquarters |
Need more LinkedIn data?
If you also need job listings rather than posts, API-Empire's LinkedIn Search Jobs Scraper covers that side of LinkedIn β pair it with this Actor to get both a company's job postings and its content activity from the same account.
Why not build this yourself?
LinkedIn does not offer a self-serve public API for pulling arbitrary profile or company post feeds. Its official developer platform is scoped to specific approved use cases (sign-in, marketing campaign management) and requires a partnership application β it isn't a general-purpose way to read a profile's or a company's recent posts on demand. Building a scraper yourself means maintaining HTML parsing against a site that changes markup often, rotating proxies to avoid the 999/403 blocks LinkedIn returns to bots, and re-solving all of that every time the layout shifts. This Actor already does the URL auto-detection, JSON-LD/HTML extraction, comment and reaction promotion, company enrichment, and proxy escalation β so you get structured rows instead of an ongoing scraping project.
Why do developers and teams scrape LinkedIn posts?
For AI engineers and agent builders
Post text, author identity, and engagement counts arrive as clean JSON with stable field names (urn, text, authorFullName, numLikes) β no HTML to strip before indexing. A common pattern: pull a list of company and executive profile URLs, run this Actor, and feed the text field into a vector store for a RAG pipeline that answers questions about a company's public messaging, or into an agent tool that checks a company's latest posts before drafting outreach.
For sales and marketing teams
Track a target account's LinkedIn activity β what the company page posts, how often, and how much engagement it gets (numLikes, numComments) β alongside companyEmployeeCount and companyFollowerCount for account sizing. A common workflow: scrape a prospect list's company pages weekly, watch for a spike in numComments, and flag warm accounts for outreach before a competitor does.
For researchers and analysts
Public corporate-communications and labour-market research can use post frequency, companyHeadquarters, and companyEmployeeCount as proxies for company activity and growth, scoped strictly to what LinkedIn already publishes without a login. A concrete example: comparing posting cadence and follower growth across a set of company pages in the same sector over time.
For developers building data products
authorProfileId is the real LinkedIn slug for both people and companies, not a synthetic placeholder, so posts, comments, and reactions can be joined back to a stable identifier in your own database. This makes it practical to build a scheduled monitoring product on top of the Actor's dataset output rather than a one-off export.
How to scrape LinkedIn posts (step by step)
- Open the Actor's page in Apify Console and click Try for free (or Start, if already added to your account).
- Paste your LinkedIn URLs into Profile & Company URLs (
startUrls) β mix/in/...and/company/...links freely. - Set Max posts per URL (
maxPosts, default 10) and leave Enrich company-authored posts (includeCompanyEnrichment) on if you want the company fields. - Click Start.
- Open the Dataset tab under Storage and export results as JSON, CSV, or Excel β or watch rows arrive live in the Output table while the run is in progress.
What to do when LinkedIn changes its structure
The Actor is maintained, and the output schema β field names and types β stays stable on your end even after a LinkedIn markup change is patched internally. No specific turnaround time is published for fixes.
β¬οΈ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | No | array | LinkedIn profile URLs (/in/...) and/or company URLs (/company/...), one per line. Each is auto-detected by shape. | ["https://www.linkedin.com/in/satyanadella", "https://www.linkedin.com/company/microsoft"] |
urls | No | array | Legacy alias β same purpose as startUrls, kept for compatibility with the base actor's input. If both are filled, startUrls wins. | [] |
maxPosts | No | integer | Maximum number of posts to collect per URL (profile or company). Minimum 1, maximum 500. Default 10. | 20 |
includeCompanyEnrichment | No | boolean | For each company URL, fetch the company's overview page once and merge companyTagline, companyEmployeeCount, companyFollowerCount, and companyHeadquarters onto every post row authored by that company. Adds one extra request per company. Default true. | true |
rateLimitDelay | No | integer | Base delay between page fetches, in seconds. Minimum 0, maximum 30. Default 1. | 1 |
fetchRetries | No | integer | How many times to retry a single page fetch before giving up on it. Minimum 0, maximum 10. Default 3. | 3 |
proxyConfiguration | No | object | Apify Proxy settings. Default has useApifyProxy: false, but the Actor automatically switches to Apify's residential proxy for any /in/ or /company/ page fetch regardless of this setting, to avoid LinkedIn's anti-bot block. | {"useApifyProxy": false} |
No parameter is required β at least one valid LinkedIn profile or company URL must appear in either startUrls or urls, or the run exits with a warning and pushes no rows.
Example input
{"startUrls": ["https://www.linkedin.com/in/satyanadella","https://www.linkedin.com/company/microsoft"],"maxPosts": 20,"includeCompanyEnrichment": true,"rateLimitDelay": 1,"fetchRetries": 3,"proxyConfiguration": { "useApifyProxy": false }}
The most common input mistake: setting rateLimitDelay to 0 expecting zero throttling β the Actor internally floors the effective delay at 0.2 seconds between page fetches regardless of this value, so runs are never fully unthrottled.
β¬οΈ Output
Results are pushed to the Apify dataset row by row, live, and can be exported as JSON, CSV, or Excel. Three rowType values share the dataset: post, comment, and reaction. Comments and reactions are pushed both as their own labeled rows (so they're easy to filter or count independently) and left nested inside the comments[] / reactions[] arrays on their parent post row β nothing is removed from the post row to make room for the child rows.
Scraped post (company-authored example)
{"urn": "urn:li:activity:7123456789012345678","text": "Excited to share our latest AI announcement...","url": "https://www.linkedin.com/posts/microsoft_ai-activity-7123456789012345678","postedAtTimestamp": 1732012800000,"postedAtISO": "2026-07-20T09:00:00.000000Z","timeSincePosted": "2w","isRepost": null,"authorType": "Company","authorProfileUrl": "https://www.linkedin.com/company/microsoft","authorProfileId": "microsoft","authorHeadline": "Every company has a mission. Ours is to empower every person...","authorFullName": "Microsoft","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": "Every company has a mission...","id": "microsoft","publicId": "microsoft","trackingId": "aBcDeFgHiJkLmNoPqRsTuA","profileId": "microsoft","picture": "","backgroundImage": ""},"authorName": "Microsoft","authorTitle": "Every company has a mission...","attributes": [],"comments": [],"reactions": [],"numShares": null,"numLikes": 842,"numComments": 37,"commentsTruncated": false,"commentsComplete": true,"reactionsTruncated": true,"canReact": null,"canPostComments": null,"canShare": null,"commentingDisabled": null,"allowedCommentersScope": null,"rootShare": null,"shareAudience": null,"companyTagline": "Empowering every person and organization to achieve more","companyEmployeeCount": 221000,"companyFollowerCount": 24500000,"companyHeadquarters": "Redmond, Washington, US","rowType": "post","isChild": false,"parentId": null,"scrapedAt": "2026-08-04T10:15:32.000000Z"}
Scraped comment (child row)
{"rowType": "comment","isChild": true,"parentId": "urn:li:activity:7123456789012345678","type": "comment","urn": null,"url": "https://www.linkedin.com/feed/update/comment/1234567890","text": "Great news, congrats to the team!","authorFullName": "Jane Doe","authorProfileId": "jane-doe","authorType": null,"authorProfileUrl": null,"authorHeadline": null,"postedAtTimestamp": 1754302532000,"postedAtISO": null,"timeSincePosted": null,"image": null,"images": [],"numLikes": null,"numComments": null,"numShares": null,"isRepost": null,"attributes": [],"commentsTruncated": null,"commentsComplete": null,"reactionsTruncated": null,"companyTagline": null,"companyEmployeeCount": null,"companyFollowerCount": null,"companyHeadquarters": null,"scrapedAt": "2026-08-04T10:15:32.000000Z"}
Scraped reaction (child row)
{"rowType": "reaction","isChild": true,"parentId": "urn:li:activity:7123456789012345678","type": "LIKE","urn": null,"url": null,"text": null,"authorFullName": "John Smith","authorProfileId": "john-smith","authorType": null,"authorProfileUrl": null,"authorHeadline": null,"postedAtTimestamp": null,"postedAtISO": null,"timeSincePosted": null,"image": null,"images": [],"numLikes": null,"numComments": null,"numShares": null,"isRepost": null,"attributes": [],"commentsTruncated": null,"commentsComplete": null,"reactionsTruncated": null,"companyTagline": null,"companyEmployeeCount": null,"companyFollowerCount": null,"companyHeadquarters": null,"scrapedAt": "2026-08-04T10:15:32.000000Z"}
Fields with no reliable anonymous source are always returned as null, never guessed: isRepost, numShares, canReact, canPostComments, canShare, commentingDisabled, allowedCommentersScope, rootShare, shareAudience, and any companyTagline / companyEmployeeCount / companyFollowerCount / companyHeadquarters that LinkedIn doesn't publish for a given company.
How does LinkedIn Posts Scraper With Company Page Insights compare to other LinkedIn scrapers?
| Feature | This Actor | Generic alternative |
|---|---|---|
| Output format | Typed JSON, stable field names | β /β varies β some return raw HTML fragments |
| Mixed input in one run | β Profile and company URLs in the same list, auto-detected | β Typically one URL type per Actor |
| Company enrichment | β Tagline, employee count, follower count, HQ merged onto posts | β Not typically included |
| Comment/reaction rows | β Promoted to independent, filterable rows, still nested too | β Usually nested only, or omitted |
| Login/cookie requirement | β None β public pages only | β/β varies by Actor |
If you're building an AI agent or RAG pipeline, the output-format row is the decision-maker β parsing HTML inside an agent loop is a reliability failure mode, not a feature.
How many results can you scrape with this Actor?
maxPosts caps collection at 500 posts per URL β that's the schema's hard maximum, with a default of 10. Below that cap, the Actor does a breadth-first crawl of the post graph starting from the profile or company page: it collects the posts visible on the first fetch, then follows every post URN it can find in that page's HTML to fetch each post's own feed-update page, extracting more posts from each, until it hits maxPosts or runs out of URNs to follow. There is no separate pagination parameter β the crawl simply stops at the cap or when the queue empties. No benchmark run time is published; actual duration depends on how many posts a profile or company has recently published and how much proxy escalation a given run needs.
Integrate LinkedIn Posts Scraper With Company Page Insights and automate your workflow
This Actor works with any language or tool that can send an HTTP request, through the standard Apify API and client libraries.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("api-empire/linkedin-profile-posts-scraper-with-company-page-insights").call(run_input={"startUrls": ["https://www.linkedin.com/company/microsoft"],"maxPosts": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["rowType"], item.get("text"))
Works in Python, Node.js, Go, Ruby, cURL β anything that can call the Apify API with your token.
Automation platforms (n8n, Make)
Apify publishes generic "Run Actor" integrations for both n8n and Make: point either platform's Apify node/module at this Actor's ID, pass the same input JSON shown above, and the resulting dataset items flow into the rest of your workflow β no custom HTTP node required.
βοΈ Is it legal to scrape LinkedIn?
Scraping publicly available LinkedIn data is generally lawful; this Actor only reads pages LinkedIn already serves without a login. Because the output includes personal data β post authors' names and headlines, and commenters' and reactors' names β anyone storing or processing it is subject to GDPR (if EU/UK personal data is involved) or CCPA (if California residents' data is involved), and needs a lawful basis for collecting and retaining it. LinkedIn's own Terms of Service also restrict automated access, separately from data-protection law. Consult legal counsel for commercial use cases involving bulk personal data.
β Frequently asked questions
Does this Actor work without a LinkedIn account?
Yes. It reads publicly available profile and company pages directly β no li_at cookie, no login, and no LinkedIn account is required or used.
How often is the scraped data updated?
Every run does a live fetch of the current page state β nothing is served from a cache. Run it again (on a schedule if you like) to get the current set of posts.
What happens if a post has been deleted or a profile has no public posts?
If a page returns no extractable posts, the Actor logs a warning for that URL and simply pushes no rows for it β the run continues to the next URL rather than failing.
Can I scrape private LinkedIn profiles or posts?
No. Only content LinkedIn serves on its public, unauthenticated pages is returned. Private profiles, posts restricted to a viewer's network, or content behind a login wall are not accessible to this Actor.
Is there a free trial?
Access terms and any trial are set on the Actor's Apify Store listing page, not in this README β check the listing for current pricing and trial availability.
Does this Actor work for AI agent workflows and LLM pipelines?
Yes. It's callable as a standard HTTP endpoint through the Apify API by any agent framework, and every row is typed JSON with stable field names β no HTML parsing step is needed before passing results into an LLM context window or a vector store.
How does this Actor handle LinkedIn's anti-bot system?
It starts every run on a direct connection, and automatically escalates to Apify's datacenter proxy and then residential proxy if a fetch is blocked (HTTP 401/403/429/999, or a captcha/forbidden response body). Profile and company page fetches specifically start on residential proxy immediately, since those pages trigger LinkedIn's 999 block most aggressively. A single proxy session is pinned for the whole run so an IP that's already "warmed up" stays consistent across requests, and failed fetches are retried with backoff up to fetchRetries times.
How does this Actor compare to other LinkedIn scrapers?
It covers profile and company URLs in the same run with a single auto-detecting input field, and merges company overview data (tagline, employee count, follower count, headquarters) onto company-authored posts β features not every single-purpose LinkedIn post scraper combines in one Actor.
Does this Actor return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with stable field names across every run β no HTML, no selectors, no parsing step. Pass it directly into an LLM prompt, index it into a vector store, or route it through an agent tool.
Can I use this Actor without managing proxies?
Yes. Proxy selection and escalation (direct β datacenter β residential) is handled internally. You can still supply your own proxyConfiguration if you want a specific starting setup, but it isn't required.
What happens when LinkedIn changes its structure or blocks the scraper?
The Actor is maintained, and its output schema stays the same on your end β field names and types don't change β even when the underlying extraction logic needs an internal fix after a LinkedIn markup change. No specific turnaround time is published.
π¬ Your feedback
Found a bug or missing a field? We want to know. Report issues or request changes through the Actor's page on the Apify Store, or via the Issues tab on the Actor's Apify Console page β active maintenance means fixes and improvements ship back into this same Actor.