~ / endpoints / Post API

LinkedIn Post Scraper API

Our LinkedIn post scraper takes a public /posts/ URL and returns structured JSON: the full post text, engagement counts, hashtags, attached media, the author with their profile link, the post ID, and the published timestamp, all in one request.

Get a free API keyBrowse the endpoints
1,000
free requests / mo
2.6s
median response
JSON
structured output
1
flat charge per post
why it is walled

Why LinkedIn Post data is login-walled

LinkedIn wraps the logged-out post page in the same authwall as the rest of the member surface, so a datacenter request usually gets a "Sign in to view" shell. On a clean residential egress the guest render does carry the post as structured data, and our endpoint reads that; use /posts/ URLs, since /feed/update/ links wall for guests.

one request

Call the LinkedIn Post Scraper API in one request

cURL
curl "https://api.linkedinscraperapi.com/api/v1/linkedin/post?url=https://www.linkedin.com/posts/maryam-asim_i-studied-500-linkedin-posts-this-year-activity-7457771025557061633-pza0&api_key=$API_KEY"
Python
import requests

BASE = "https://api.linkedinscraperapi.com"
API_KEY = "YOUR_API_KEY"

# Pass a public /posts/ URL (use /posts/, not /feed/update/).
data = requests.get(
    f"{BASE}/api/v1/linkedin/post",
    params={
        "url": "https://www.linkedin.com/posts/maryam-asim_i-studied-500-linkedin-posts-this-year-activity-7457771025557061633-pza0",
        "api_key": API_KEY,
    },
    timeout=30,
).json()

print(data["postAuthor"]["authorName"], "-", data["postedAt"])
print("likes:", data["engagement"]["likes"], "comments:", data["engagement"]["comments"])
print(data["content"][:200])
inputs

Parameters

ParameterRequiredDefaultNotes
urlrequired-A public /posts/{slug} post URL. Required. Use /posts/ links; /feed/update/ URLs wall for guests.
add_htmloptional-Pass true or 1 to include the post's raw HTML alongside the parsed content.
api_keyrequired-Your API key, passed as a query parameter. Get one free at signup.
the JSON

The JSON the LinkedIn Post Scraper API returns

200 OK
{
  "content": "I studied 500+ LinkedIn posts this year. The viral ones all follow the same 14 hook patterns. The dead ones all make the same 14 mistakes. Here's what I found: Viral hooks name something specific. Dead hooks stay vague on purpose...",
  "content_markdown": null,
  "engagement": {
    "likes": 517,
    "comments": 97,
    "shares": null,
    "views": null
  },
  "hashtags": [],
  "media": [
    {
      "mediaType": "image",
      "mediaUrl": "https://media.licdn.com/dms/image/v2/D4D22AQHjxZGfkH6JwQ/feedshare-shrink_800/B4DZ39TOQZKkAc-/0/1778071169119?e=2147483647&v=beta&t=6aE81_-uEvV7Pj_4Q_wcWkH70JOttnoxvJRnqT4psCU",
      "mediaDescription": "image"
    }
  ],
  "mentions": [],
  "comments": [],
  "postAuthor": {
    "authorId": null,
    "authorName": "Maryam Asim",
    "authorProfileLink": "https://www.linkedin.com/in/maryam-asim",
    "authorUsername": "maryam-asim"
  },
  "postId": "7457771025557061633",
  "postLink": "https://www.linkedin.com/posts/maryam-asim_i-studied-500-linkedin-posts-this-year-activity-7457771025557061633-pza0",
  "postedAt": "2026-05-06T12:39:31.157Z",
  "socialPlatform": "linkedin"
}
FieldTypeDescription
contentstringThe full post text, from the post's structured data.
engagementobjectEngagement counts: { likes, comments, shares, views }. Each is an integer when exposed, otherwise null.
engagement.likesintegerReaction count when the render exposes it, e.g. 517.
engagement.commentsintegerComment count when the render exposes it, e.g. 97.
hashtagsarrayHashtags parsed from the post text, without the # prefix. Empty when the post has none.
mediaarrayAttached media as { mediaType, mediaUrl, mediaDescription }, e.g. the post's image.
mentionsarrayMentions parsed from the post. Empty when none are exposed.
postAuthorobjectThe author: { authorId, authorName, authorProfileLink, authorUsername }.
postAuthor.authorNamestringThe author's display name, e.g. "Maryam Asim".
postAuthor.authorProfileLinkstringThe author's /in/ profile URL when resolvable.
postIdstringThe post activity ID, e.g. 7457771025557061633.
postLinkstringThe canonical post URL.
postedAtstringThe publish timestamp in ISO 8601, e.g. "2026-05-06T12:39:31.157Z", when exposed.
socialPlatformstringAlways "linkedin", so the shape matches other social endpoints.
who uses it

Who pulls LinkedIn data, and for what

>

Content and engagement analytics

Pull content and the engagement counts for a set of posts to study what topics and hook styles earn likes and comments.
>

Creator and thought-leader tracking

Read postAuthor and postedAt across a creator's posts to log posting cadence and how each post performed over time.
>

Social listening

Capture post text, hashtags, and media for posts about a brand or topic to feed a listening or sentiment pipeline.
>

Swipe files and research

Archive high-engagement posts with their text and counts to build a reference library of what worked in your niche.
>

Campaign reporting

Collect the likes and comments on posts from a campaign to report reach and engagement without manual screenshots.
>

Media harvesting

Read the media array to pull the image or asset attached to a post for archiving or downstream processing.
why this endpoint

Why teams build on our LinkedIn Post Scraper API

Pass a /posts/ URL and we parse the guest render into a consistent social-post shape: text, engagement, hashtags, media, and author, in the same format our other social endpoints use. Every request runs through residential proxies with anti-bot handling and retries at a 2.6s median, and a walled or removed post is reported honestly rather than returned as a bogus record.

*

Full post text

The complete post copy comes back in content, parsed from the post's structured data rather than a truncated preview.
*

Engagement counts

Likes and comments return as integers when the guest render exposes them, with shares and views null when LinkedIn omits them.
*

Author and media

The author (name, profile link, username) and any attached media come back alongside the text, so a post is one call.
*

Consistent social shape

Output matches the shape our other social endpoints use, so posts across platforms share one schema in your code.
*

Residential-first routing

We lead with residential proxies and fall back through datacenter and free tiers, because LinkedIn walls datacenter egress on posts more often.
*

Honest wall reporting

A challenged egress or a removed post is reported as a wall with matched markers, so you never store a post fabricated from a landing page.
measured against

LinkedIn Post Scraper API measured against the alternatives

Our APIDIY (requests / headless)Official LinkedIn API
Input by URLYes, a /posts/ URLManual fetch and parseNo public post-by-URL endpoint
Post text and engagementParsed content plus countsParse the guest render yourselfOnly your own or authorized content
SetupAPI key onlyResidential proxies, headless browser, parsersMarketing Developer Platform approval
Author and mediaReturned in one callExtra selectors per fieldLimited to authorized scopes
Anti-bot and proxiesResidential-first, built inYou build and maintain itNot applicable
Consistent shapeSame schema as other socialsYou normalize it yourselfPlatform-specific payloads
Behavior when walledReports the authwall honestlySilent partial or empty recordReturns only authorized fields
what it costs

Usage-based pricing, no seats

PlanPriceBest for
Free1,000 requestsTesting and small jobs
Pro$0.60 / 1kProduction workloads
Pay-as-you-go$0.90 / 1kSpiky or one-off volume

Median response 2.6s. You only pay for successful requests.

FAQ

What is a LinkedIn post scraper?

A LinkedIn post scraper is a tool that reads a public post and returns it in a structured format. Our LinkedIn post scraper API takes a /posts/ URL and returns the post text, engagement counts (likes, comments, shares, views), hashtags, attached media, the author with a profile link, the post ID, and the published timestamp as JSON from a single request.

How do I scrape a LinkedIn post?

Send one GET request to our linkedin/post endpoint with the post url and your API key. We route through residential proxies, handle anti-bot checks, and parse the guest render's structured data, so you get clean JSON back without a LinkedIn login or a headless browser of your own.

Should I use a /posts/ or a /feed/update/ URL?

Use the /posts/ URL. LinkedIn's /feed/update/ links wall for logged-out visitors, so they return an authwall rather than the post. The /posts/{slug} share URL is the one that renders public post data, and that is the input this endpoint expects.

Why are shares or views null?

The guest render exposes reaction and comment counts on most public posts, but share and view counts are frequently omitted. When a count is not present we return null for that field rather than guessing, so likes and comments come through as integers while shares and views may be null on a given post.

What happens if the post is private or removed?

On a challenged egress, or for a removed post, LinkedIn serves an authwall or a generic "Top Content" landing with no post data. Our endpoint detects that and returns an error naming the wall and the markers it matched, so a block is distinguishable from a real post. We never emit a post assembled from a landing page.

Do I need a LinkedIn login or the official API?

No. You only need a linkedinscraperapi key, passed as the api_key query parameter. There is no LinkedIn login, no cookies, and no Marketing Developer Platform approval. We read the public logged-out post page. The free tier includes 1,000 requests per month.

How fast is the LinkedIn post scraper API?

Median end-to-end response is about 2.6 seconds, which includes residential proxy routing, anti-bot handling, retries, and parsing. One call returns the full post record: text, engagement, media, and author.

Ship post api data as JSON today
Start with 1,000 free requests. No credit card, no LinkedIn login.
Get a free API key Browse the endpoints