LinkedIn Profile Posts Scraper
Pricing
from $5.00 / 1,000 linkedin post scrapeds
LinkedIn Profile Posts Scraper
Scrape a LinkedIn person's recent public posts by profile URL. Returns post text, post URL, posted date, reactions, comments, shares, media, repost flag, and author identity. Provider-backed, no login or cookies. Charged $0.005 per post. MCP/API-ready.
Pricing
from $5.00 / 1,000 linkedin post scrapeds
Rating
0.0
(0)
Developer
Khadin Akbar
Maintained by CommunityActor stats
0
Bookmarked
41
Total users
13
Monthly active users
2 days ago
Last modified
Categories
Share
LinkedIn Profile Posts Scraper — Posts by Person URL
LinkedIn Profile Posts Scraper is an Apify Actor for collecting a person's recent public LinkedIn posts by profile URL. It accepts one or more public linkedin.com/in/... profile URLs or bare vanity handles, and returns one dataset row per visible post or activity item from that profile's public activity preview. Each record can include post text, post URL, posted date, reactions, comments, shares, media, repost status, and author identity, plus a machine-readable run summary. This Actor is provider-backed, requires no LinkedIn login or cookies, and is usable through Apify MCP.
Best fit and connected workflows
This Actor fits workflows that start from a known LinkedIn person profile and need structured post data from that profile's recent public activity.
Common routing patterns include:
- Prospect and account research: start with a person's profile URL, collect recent public posts, and review the post stream alongside the author's identity fields.
- Social listening on individuals: track the public posting pattern of a founder, recruiter, executive, or creator from their profile URL.
- Agent workflows: send a profile URL to an Apify MCP client and receive flat, structured rows that are easier to parse than free-form page output.
- Data preparation pipelines: use
authoredOnly,includeReposts, andenrichPostDetailsto shape the output for tables, alerts, or review queues.
Practical scenario
Maya, a recruiter, has a candidate's public LinkedIn profile URL and wants the latest visible posts before a screening call. She runs the Actor with that profile URL, authoredOnly: true, and outputMode: "compact". The returned rows include authorName, postUrl, publishedAt, text, and activityKind, so she can see which posts were originally authored and which ones were reposts. She uses the most recent authored post as a discussion topic and then opens the postUrl for context.
Input
Use the profileUrls field for one or more public LinkedIn person profile URLs or bare handles. Each profile is resolved through managed data providers, so no LinkedIn login or cookies are required.
Input fields
| Field | Type | Required | Description |
|---|---|---|---|
profileUrls | array of strings | Yes | Public LinkedIn person profile URLs or handles whose recent posts you want. One handle per line is accepted. |
maxPostsPerProfile | integer | No | Maximum number of post rows saved per profile. Accepts 1 to 200. Default is 20. |
authoredOnly | boolean | No | Keeps only posts the profile owner authored themselves. Default is false. |
includeReposts | boolean | No | Includes reposts or shared content. Default is true. |
enrichPostDetails | boolean | No | Fetches full post details for exact engagement counts and fuller text. Default is false. |
includeComments | boolean | No | Includes up to five public comments inside enriched post payloads. Default is false. |
outputMode | string | No | Use full for richer post fields or compact for smaller agent records. Default is full. |
includeRawData | boolean | No | Attaches raw provider payloads under rawPost and rawDetail. Default is false. |
providerOrder | string | No | Chooses provider priority and fallback behavior. Default is scrapecreators-first. |
Focused JSON example
{"profileUrls": ["https://www.linkedin.com/in/williamhgates/","satyanadella"],"maxPostsPerProfile": 20,"authoredOnly": true,"includeReposts": false,"enrichPostDetails": false,"includeComments": false,"outputMode": "compact","includeRawData": false,"providerOrder": "scrapecreators-first"}
What you get
The default dataset contains one row per public post or activity item found for each requested profile. The table below shows the persisted dataset fields and how they are used.
Output fields
| Field | Type | Description |
|---|---|---|
profileInput | string | Canonical LinkedIn profile URL used as the source for the row. |
profileUrl | string or null | Public LinkedIn profile URL of the post author. |
authorName | string or null | Public name of the profile owner who authored or shared the post. |
authorHeadline | string or null | Profile headline or about summary when outputMode is full. |
authorLocation | string or null | Public location of the profile owner when outputMode is full. |
authorImage | string or null | Public profile image URL when outputMode is full and exposed. |
authorFollowers | integer or null | Public follower count of the profile owner when exposed. |
postUrl | string or null | Public LinkedIn URL for the post, feed update, or article. |
postId | string or null | LinkedIn activity, share, article, or provider identifier when available. |
activityType | string or null | Raw activity label from the profile preview. |
activityKind | string | Normalized activity classification for filtering. |
isRepost | boolean | True when the profile owner reshared or reposted content from someone else. |
isAuthored | boolean | True when the profile owner originally authored this post. |
publishedAt | string or null | Provider-returned publication date or timestamp when available. |
text | string or null | Visible post body, article text, or provider description. |
likeCount | integer or null | Public like count when available. |
reactionCount | integer or null | Total reaction count when available. |
commentCount | integer or null | Public comment count when available. |
shareCount | integer or null | Share or repost count when available. |
engagementCount | integer or null | Convenience total of available reactions or likes, comments, and shares. |
mediaUrl | string or null | Primary media or image URL when available. |
mediaUrls | array of strings | All public media URLs when outputMode is full. |
commentsPreview | array | Up to five public comments returned inside an enriched post payload. |
position | integer | One-based position in the output order. |
provider | string | Managed data provider or provider chain used for the row. |
runId | string or null | Apify run ID that produced the row. |
scrapedAt | string | ISO 8601 timestamp when the row was saved. |
Illustrative JSON record
{"profileInput": "https://www.linkedin.com/in/williamhgates/","profileUrl": "https://www.linkedin.com/in/williamhgates/","authorName": "William H. Gates","authorHeadline": "Co-chair at the Gates Foundation","authorLocation": "United States","authorImage": "https://example.com/profile-image.jpg","authorFollowers": 30000000,"postUrl": "https://www.linkedin.com/posts/williamhgates_example-activity-7354600338621906944","postId": "example-activity-7354600338621906944","activityType": "Posted by William H. Gates","activityKind": "posted","isRepost": false,"isAuthored": true,"publishedAt": "2026-01-01T12:00:00Z","text": "Example public post text","likeCount": null,"reactionCount": 1234,"commentCount": 56,"shareCount": 12,"engagementCount": 1302,"mediaUrl": "https://example.com/media.jpg","mediaUrls": ["https://example.com/media.jpg"],"commentsPreview": [{"commenterName": "Alex Kim","commenterProfileUrl": "https://www.linkedin.com/in/alexkim/","commentText": "Thanks for sharing this update.","commentReactionCount": 4,"replyCount": 1}],"position": 1,"provider": "scrapecreators","runId": "example-run-id","scrapedAt": "2026-01-01T12:05:00Z"}
How it works
The Actor resolves each requested profile through managed data providers. The live contract defines scrapecreators-first as the default provider order, with sociavault-first, scrapecreators-only, and sociavault-only available for explicit routing. Optional enrichment fetches each post's detail data for fuller text and exact engagement counts. includeComments adds a preview of up to five public comments inside enriched post payloads. The output is written to the default dataset, and a run summary is written to the default key-value store.
Pricing
This Actor uses Apify Pay per event pricing together with Apify platform usage pricing. The live contract charges an Actor start event, a LinkedIn post scraped event for each saved post row, and an optional Post detail enrichment event when enrichPostDetails is enabled.
For example, a run that saves ten posts and enriches three of them includes one Actor start event, ten post scraped events, and three post detail enrichment events, plus Apify platform usage for the run. For current pricing details, open the live Pricing tab on the Actor page.
Use with AI agents (MCP)
This Actor is available through Apify MCP as a structured tool for fetching recent public LinkedIn posts from a person profile URL. The exact Actor identity is khadinakbar/linkedin-profile-posts-scraper.
Tool description: provide one or more LinkedIn person profile URLs or handles, and the tool returns one record per public post or activity item, with optional enrichment for exact engagement counts and comments preview.
Fetch the recent public posts for this LinkedIn person profile URL. Return compact records, keep only authored posts, and include the dataset output so I can summarize the most recent topics and engagement fields.
Output interpretation:
activityKindgives the normalized type for downstream filtering.isAuthoredandisReposthelp separate original posts from reshared content.providershows which managed provider or provider chain produced the row.scrapedAtrecords when the row was saved.commentsPreviewis a preview inside enriched records, not a full comment archive.
Provenance and scope:
- Records come from the public activity preview visible on the profile.
- The Actor returns rows for public posts and other visible activity items exposed by the provider.
- The dataset also carries
profileInput, which links each row back to the requested profile URL.
Pagination and cost guidance:
maxPostsPerProfilecaps the number of saved rows per profile and therefore caps billable post-scraped events per profile.outputMode: "compact"keeps the payload smaller for agents.enrichPostDetails: trueadds post detail enrichment charges only for posts that are enriched.
API example
import { ApifyClient } from 'apify-client';const client = new ApifyClient({token: process.env.APIFY_TOKEN,});const run = await client.actor('khadinakbar/linkedin-profile-posts-scraper').call({profileUrls: ['https://www.linkedin.com/in/williamhgates/','satyanadella',],maxPostsPerProfile: 10,authoredOnly: true,includeReposts: false,outputMode: 'compact',});const dataset = await client.dataset(run.defaultDatasetId).listItems();console.log('Run ID:', run.id);console.log('Items:', dataset.items.length);console.log(dataset.items);
Best results and outcome guidance
For focused results, start with a profile URL that clearly identifies one person, then choose the smallest field set that matches your workflow.
Helpful settings:
- Use
authoredOnly: truewhen you want only original posts from the profile owner. - Use
includeReposts: falsewhen reshared content is not relevant. - Use
enrichPostDetails: truewhen exact reaction, comment, and share counts matter. - Use
includeComments: truewhen you want the small public comments preview inside enriched records. - Use
outputMode: "compact"when the data is headed into an AI agent or a compact table.
Continue the workflow
- Then use LinkedIn Profile Search Scraper to extend LinkedIn Profile Posts Scraper — Posts by Person URL research with a complementary discovery contract.
- Then use LinkedIn Sales Navigator Scraper to extend LinkedIn Profile Posts Scraper — Posts by Person URL research with a complementary content contract.
Design note
I found that the live dataset contract requires profileInput, activityKind, provider, and scrapedAt on every row, which keeps provenance and filtering available across all outputs.
FAQ
Can I pass a bare LinkedIn handle instead of a full profile URL?
Yes. The input contract accepts a bare vanity handle and expands it to a full /in/ profile URL.
Does this Actor return company-page feeds?
This Actor is built for person profiles. For company pages, use linkedin-company-posts-scraper.
Does it search by keyword or topic?
This Actor starts from a person profile URL. For keyword or general post search, use linkedin-posts-scraper.
Why might reaction or comment counts be missing?
The public profile preview often exposes only partial engagement data. Enable enrichPostDetails when you need exact counts.
Can I get the full public comment thread?
This Actor can include a comments preview inside enriched records. For exhaustive comment rows, use a dedicated comments actor.
Responsible use
Use this Actor to collect publicly visible LinkedIn profile post data in a way that respects applicable law, platform terms, and the rights of the people whose profiles you analyze. Keep usage aligned with legitimate research, analysis, and automation workflows. Review your downstream handling of personal data before storing, sharing, or enriching the output.