LinkedIn Profile Posts Scraper avatar

LinkedIn Profile Posts Scraper

Pricing

from $1.00 / 1,000 post scrapeds

Go to Apify Store
LinkedIn Profile Posts Scraper

LinkedIn Profile Posts Scraper

Scrape LinkedIn profile posts with automatic pagination. No cookies needed. Get rich post data including engagement metrics, content categories, hashtags, mentioned companies/profiles, and computed fields not available in other actors.

Pricing

from $1.00 / 1,000 post scrapeds

Rating

5.0

(1)

Developer

Capable Cauldron

Capable Cauldron

Maintained by Community

Actor stats

1

Bookmarked

32

Total users

6

Monthly active users

5 days ago

Last modified

Features

Limited permissions

Share

Scrape public posts from personal LinkedIn profiles with no cookies and no login. You get the text, media, article links, a full reaction breakdown, comment and repost counts, and 56 enriched fields per post including computed engagement totals, content category, hashtags and mentioned companies. Give it one or more profile usernames, set how many posts you want, and it paginates on its own.

Nothing touches your own LinkedIn account. Built on Apify, so you can schedule runs to track a profile over time, trigger them from the API or a webhook, and push results to Google Sheets or your warehouse. Click Try for free to open it in Console. Apify's free plan includes $5 of monthly credit, enough for about 1,600 posts when collecting 100 posts per profile.

What can LinkedIn Profile Posts Scraper do?

  • 🔓 No account needed, so there is no risk to your LinkedIn profile
  • 📜 Automatic pagination: ask for 10 posts or 2,000 and the Actor handles paging
  • 👥 Many profiles per run, one username or hundreds
  • 🧮 56 fields per post, pre-computed so you don't have to:
    • total engagement (reactions + comments + reposts)
    • content category (text, image, video, article, document, carousel, poll)
    • hashtags extracted and counted
    • mentioned companies and profiles as structured objects
    • reaction breakdown (like, love, celebrate, support, insight, funny, curious)
    • ISO-8601 dates for clean sorting, word and character counts
  • 🔁 Repost filter: keep only the profile's own writing with includeReposts: false
  • 💸 Hard cost cap on dataset items
  • 📤 Export to CSV, Excel, JSON or XML, or pull results via API

What data can you extract from LinkedIn posts?

Grouped by what you would use them for:

GroupFields
Identityactivity_urn, share_urn, ugcPost_urn, full_urn, post_url, post_type, is_repost, is_shared_content
Contenttext, content_category, word_count, char_count, hashtags, hashtag_count
Mediamedia_type, media_url, media_thumbnail, media_images
Article / documenthas_article, article_url, article_title, article_subtitle, article_thumbnail, has_document, document_title, document_page_count, document_url, document_thumbnail
Authorauthor_name, author_first_name, author_last_name, author_headline, author_username, author_profile_url, author_profile_picture, author_actor_type
Engagementtotal_reactions, reaction_like, reaction_love, reaction_celebrate, reaction_support, reaction_insight, reaction_funny, reaction_curious, num_comments, num_reposts, total_engagement
Mentionsmentioned_companies, mentioned_profiles, text_annotations
Datesposted_date, posted_relative, posted_timestamp, posted_date_iso
Run metadataprofile_username, scraped_at

Three pre-built dataset views in Console: Overview, Engagement Metrics and Content Analysis.

How to scrape LinkedIn posts from a profile

linkedin profile posts scraper input form

  1. Click Try for free to open the Actor in Apify Console.
  2. Enter one or more usernames. That is the last part of a profile URL, e.g. satyanadella from linkedin.com/in/satyanadella. Full URLs and member IDs work too.
  3. Set Max posts per profile. 100 is enough to see what the data looks like.
  4. Turn off Include reposts if you only want the profile's own writing.
  5. Click Start. Posts stream into the dataset as each page arrives.
  6. Open the Storage tab and export as CSV, Excel or JSON, or fetch the dataset from the API.

How much does it cost to scrape LinkedIn posts?

Pricing is per event. There is no charge for compute time.

EventWhen it firesPrice
post-scrapedEach post added to your dataset$0.003
profile-processedEach profile that was read. A profile that could not be found or read is free$0.01
apify-default-dataset-itemEach result in the default dataset$0.00001
apify-actor-startPer GB of allocated memory, with a minimum of one event$0.00005 per GB ($0.0002 at the 4 GB default)

Volume discounts on paid Apify plans bring the per-post price down to $0.001.

Worked examples

  • 100 posts from 1 profile costs $0.3112
  • 1,000 posts from 10 profiles costs $3.1102
  • 5,000 posts from 50 profiles costs $15.5502

These examples use free-plan event prices and one run at the default 4 GB memory. The calculation is posts × $0.00301 + readable profiles × $0.01 + $0.0002 for starting the run.

At 100 posts per profile, Apify's free plan ($5/month) covers about 1,600 posts across 16 readable profiles ($4.9762 at the default memory). Nothing is charged on top. maxDatasetItems is a hard ceiling; the run stops as soon as it is reached.

The profile-processed event is charged when a profile was successfully read, including a readable profile with zero posts. A profile that could not be read is not charged that event; the run's start fee still applies.

Input

FieldTypeRequiredDefaultDescription
usernamesarrayyes—LinkedIn usernames, profile URLs or member IDs, e.g. ["satyanadella", "williamhgates"]
maxPostsPerProfileintegerno100Posts to collect per profile, 1–2,000
includeRepostsbooleannotrueWhen false, returns only posts the profile authored (see below)
maxDatasetItemsintegerno10,000Hard cap on total posts across all profiles
maxRetriesintegerno3Retries for a failed request
{
"usernames": ["adamselipsky"],
"maxPostsPerProfile": 100,
"includeReposts": true,
"maxDatasetItems": 10000
}

Filtering out reposts

A LinkedIn feed mixes three kinds of posts:

post_typeWhat it isKept when includeReposts: false?
regularWritten by the profileYes
repostSomeone else's post, reshared as-isNo
quoteSomeone else's post with added commentaryNo

Set includeReposts to false for voice analysis, content audits or training data where reshared material is noise. Every row also carries is_shared_content so you can verify the filter yourself.

You still get the full count you asked for. Filtering happens per page, and the Actor keeps paginating until it has maxPostsPerProfile original posts. The only exception is a profile that does not have that many, in which case you get everything available and the log says how many were filtered. Reshare-heavy profiles take a little longer to reach the count.

Output

One item per post. This representative excerpt uses the profile in the input above; post content, dates and engagement change over time. The complete field list is in the table above.

{
"activity_urn": "7470793400858984449",
"share_urn": "7470793399273537536",
"full_urn": "urn:li:activity:7470793400858984449",
"post_url": "https://www.linkedin.com/posts/adamselipsky_achieving-success-with-ai-the-official",
"post_type": "repost",
"is_repost": true,
"is_shared_content": true,
"text": "My conversations with customers today are less about whether to adopt AI...",
"content_category": "article",
"word_count": 157,
"char_count": 990,
"hashtags": ["AI", "CloudComputing"],
"hashtag_count": 2,
"media_type": "image",
"media_url": "https://media.licdn.com/dms/image/...",
"media_thumbnail": "https://media.licdn.com/dms/image/...",
"has_article": true,
"article_url": "https://blogs.microsoft.com/blog/2026/06/16/achieving-success-with-ai/",
"article_title": "Achieving success with AI - The Official Microsoft Blog",
"article_subtitle": "blogs.microsoft.com",
"has_document": false,
"document_title": "",
"document_page_count": null,
"author_name": "Adam Selipsky",
"author_headline": "CEO of Helix Digital Infrastructure. Former CEO at Amazon Web Services.",
"author_username": "adamselipsky",
"author_profile_url": "https://www.linkedin.com/in/adamselipsky",
"author_profile_picture": "https://media.licdn.com/dms/image/...",
"total_reactions": 2173,
"reaction_like": 1882,
"reaction_love": 44,
"reaction_celebrate": 204,
"reaction_support": 12,
"reaction_insight": 30,
"reaction_funny": 1,
"reaction_curious": 0,
"num_comments": 187,
"num_reposts": 55,
"total_engagement": 2415,
"mentioned_companies": [
{ "name": "Amazon Web Services (AWS)", "urn": "https://www.linkedin.com/company/amazon-web-services/" }
],
"mentioned_profiles": [],
"posted_date": "2026-06-11 11:05:47",
"posted_relative": "1w",
"posted_timestamp": 1781175947394,
"posted_date_iso": "2026-06-11T11:05:47.394000+00:00",
"profile_username": "adamselipsky",
"scraped_at": "2026-06-17T15:30:00.000000+00:00"
}

A run summary is saved to the key-value store as OUTPUT, and its message is shown as the run's status in Console:

{
"status": "SUCCESS",
"reason": null,
"profiles_processed": 1,
"total_profiles": 1,
"total_posts_scraped": 100,
"message": "Collected 100 posts from 1 of 1 profile.",
"profiles": [
{ "profile": "adamselipsky", "status": "OK", "posts": 100, "reason": null, "message": null }
]
}

status is SUCCESS, PARTIAL_SUCCESS (some profiles could not be read in full), NO_RESULTS, STOPPED (the run could not continue, and the message says why) or VALIDATION_ERROR (a problem with the input). When something goes wrong, reason names it, message says what to do, and each entry in profiles carries its own reason.

Each link opens a pre-filled run you can start in one click:

API and integrations

Run it from your own code with the Apify API. Swap in your token; the Actor id stays as written.

Python

from apify_client import ApifyClient
client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("capable_cauldron/linkedin-profile-posts-scraper").call(run_input={
"usernames": ["satyanadella"],
"maxPostsPerProfile": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["posted_date_iso"], item["total_engagement"], item["text"][:80])

JavaScript

import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: "<YOUR_API_TOKEN>" });
const run = await client.actor("capable_cauldron/linkedin-profile-posts-scraper").call({
usernames: ["satyanadella"],
maxPostsPerProfile: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

CLI

$echo '{"usernames": ["satyanadella"], "maxPostsPerProfile": 100}' | apify call capable_cauldron/linkedin-profile-posts-scraper --silent --output-dataset

Connect results to Google Sheets, Airtable, Slack, Make, Zapier or n8n from the Actor's Integrations tab, run it on a Schedule to track a profile weekly, or fire a webhook when a run finishes.

FAQ

This Actor collects posts that are publicly visible on LinkedIn, without logging in. You are responsible for how you use the data, including compliance with LinkedIn's terms and the data-protection laws that apply to you (GDPR, CCPA). The Actor is an independent tool and is not affiliated with or endorsed by LinkedIn.

Do I need LinkedIn cookies or an account?

No. The Actor reads public post data without a session, so there is nothing to export or refresh and your own account is never involved.

Why did I get fewer posts than I asked for?

The profile has fewer posts than maxPostsPerProfile, or maxDatasetItems was reached across all profiles. With includeReposts: false, a profile that mostly reshares may not have enough original posts. Occasionally the feed stops responding part way; the posts collected so far are kept and the profile is marked PARTIAL. The run's status message and the profiles list in OUTPUT say which.

What happens if a profile can't be found?

That profile is skipped with the message "No public posts could be found for this profile", no profile or post event is charged for it, and the rest of the run continues. The run's start fee still applies. Check the spelling, or paste the full profile link. A readable profile with no posts is different: it still incurs the profile-processing event.

Can I scrape company pages?

This Actor is built for personal profiles (linkedin.com/in/...). Company page URLs are not supported.

How far back does it go?

As far as the profile's activity feed allows. Set maxPostsPerProfile up to 2,000 to walk a long history.

Can I scrape LinkedIn posts with Python?

Yes. See the Python snippet under API and integrations. The apify-client package is on PyPI; pass the same input you would use in Console.

How do I also get the comments on each post?

Feed the post_url values into LinkedIn Comment Scraper. That Actor needs your LinkedIn cookies because LinkedIn hides comments from anonymous visitors.

Other Actors by capable_cauldron

ActorWhat it does
App Store Reviews Scraper (private testing)Reviews and ratings for iPhone and iPad apps, grouped by app and country
Company Job Postings Scraper (private testing)Open roles and hiring summaries from supported company job boards
Bulk Email Validator (private testing)Syntax, mail-routing, disposable-domain and role-inbox checks
Work Email Finder (private testing)Verified professional emails from LinkedIn URLs or a name and company domain
GTM Account Enrichment (private testing)Public company contacts, technologies and hiring signals with an account fit score
Investor Database SearchFilter investors by stage, industry and geography and export available partner contacts
LinkedIn Comment ScraperLinkedIn comments and replies using your own session cookies
LinkedIn Post Comments Scraper (private testing)Comments, replies and reactions on public LinkedIn posts without cookies
Multi-Channel Ad IntelligenceCompetitor ads from Meta, Google, LinkedIn and TikTok in one dataset
TikTok Shop USA Scraper (private testing)US product, shop, creator and shoppable-video data from TikTok Shop
Website Contact Scraper (private testing)Public emails, phone numbers and social profile links from company websites
Website Tech Stack Detector (private testing)Visible website technologies and the evidence supporting each detection

Support

Found a bug or need a field that isn't here? Open an issue on the Actor's Issues tab. Issues are usually answered within 24 hours. If you need a custom version (company pages, comment threads, a private deployment), describe it in an issue and we will scope it.