One URL in. Clean JSON out.
Give this endpoint a public LinkedIn post URL and it returns the comments on that post as a JSON array — each one with its text, the commenter's display name, its like count and when it was written. No LinkedIn app review, no session cookie, no headless browser to babysit. Billing is per comment returned, at 5 credits each, so you control the spend with the limit parameter.
This fixed it for me, thank you
The difference
On the left, what a headless browser hands you. On the right, what the endpoint hands you.
<div class="feed-shared-update-v2 artdeco-card" data-urn="urn:li:activity:7181111111111111111"><div class="update-components-text relative"><span dir="ltr">We just cut p95 latency in half by moving the cache closer to the edge.</span></div><div class="social-details-social-counts"><li class="social-details-social-counts__item"><span aria-label="842 reactions">842</span></li><li class="social-details-social-counts__comments">63 comments</li><li>41 reposts</li></div><time class="update-components-actor__sub-description">4d</time><code style="display:none">{"data":{"*elements":["urn:li:fsd_update:(urn:li:activity... {"data": [{"id": "c_9021","text": "This fixed it for me, thank you","author": {"handle": "dev.casey"},"likes": 412,"posted_at": "2026-07-01T09:12:00Z"}],"meta": {"count": 2,"limit": 50},"request_id": "req_01JZX4M8Q2TE9W"}
The payload
An array of comment objects, ordered as LinkedIn serves them on the post page. Each object is small on purpose: an id you can deduplicate on, the comment body, the name attached to it, a like count and an ISO timestamp. That is the whole shape. If you are building a discussion archive, a sentiment pass or a lead list of people who engaged with a competitor's post, this is the raw feed.
Comments with no text are dropped before they reach you. LinkedIn threads contain image-only and sticker replies, and a row with an empty body is noise in every downstream job we have seen, so the normalizer discards them rather than handing you blanks to filter. That means the count you get back can be lower than the count LinkedIn displays under the post.
The default page is 20 comments. Pass a higher limit to go deeper on a busy post, or a lower one when you only want to sample the top of the thread. You are charged for the comments actually returned, not for the limit you asked for.
ISO 8601 UTC timestamp for the comment. Derived from LinkedIn's relative label ("2w"), so older comments are accurate to the day rather than the minute.
Pricing
Each comment returned is 5 credits — about 2.5¢ on the monthly plan, billed per comment delivered rather than per call. A default 20-comment page runs about 50¢, and a call that returns nothing still costs 1 credit.
Estimate only, on a full-year basis. 5 credits per returned comment. Monthly: $5 per 1,000 credits with $4/1,000 top-ups. Annual: $54 per 12,000 credits with $3/1,000 top-ups. We show whichever plan is cheaper for your annual volume, divided by 12. Failed calls are never charged; cache hits cost the same as fresh calls.
Entry price, side by side
Credits are not equivalent units across vendors — each meters differently. Price your own workload on both before deciding on entry price alone. At high volume, several of these are cheaper per credit than we are.
Engineering notes
We document exactly how every endpoint behaves — nulls, caching, billing — so what you ship on day one is still running in month six. No surprises, no support tickets.
The billing unit here is one comment, at 5 credits. A default call returning 20 comments costs 100 credits — about 50 cents on the monthly plan. Ask for 200 comments and you are looking at 1,000 credits for a single post.
For most analysis work the first 20 to 50 comments carry the signal, because LinkedIn orders threads by relevance and the tail is largely congratulations. Start small, look at the data, then decide whether going deeper is worth the spend. Failed calls are never charged, and a call that returns nothing costs nothing.
This is the single most common surprise on this endpoint. LinkedIn's comment rendering gives a display name, and that is what we pass through. There is no public identifier, no headline, no current employer, no avatar URL.
Display names are also not unique. Two people called David Chen in one thread are indistinguishable on this response. If your workflow depends on resolving commenters to actual people, treat author as a search hint and confirm through the Profile endpoint — do not key a CRM record on it.
There is no parent_id and no nesting in the response. A reply to a comment comes back looking exactly like a top-level comment. If your product needs to render the conversation tree the way LinkedIn does, you cannot reconstruct it from this data.
For counting, tagging and text analysis the flattening is harmless and usually convenient. For anything that renders a thread, plan around it.
LinkedIn shows relative ages publicly — "3h", "2d", "1mo" — rather than exact times. We convert that to an ISO timestamp so it is sortable and storable, but the precision degrades with age. A comment from an hour ago is close to right; one labelled "2mo" lands on a plausible day inside that month.
Sort on it, bucket by week, chart activity over time. Do not use it to prove the exact minute something was said.
The post must be visible logged out. Posts restricted to connections, posts inside private groups and deleted posts return an error rather than an empty array. We read the same public page you can open in an incognito window, with no authenticated session.
Responses are cached in the fast class, so re-requesting the same post URL inside the window returns in milliseconds with x-cache: hit and costs the same credits. Add fresh=true when you are polling an active thread and need whatever landed in the last few minutes.
Questions
Send a GET request to /v1/linkedin/comments with the post URL and your API key. The post has to be publicly visible — the kind of link that renders for a logged-out visitor. There is no OAuth step and no LinkedIn developer application to get approved. LinkedIn's own Marketing API only reaches comments on posts belonging to pages you administer, which is why it does not help with competitor research.
5 credits per comment returned. Credits are $0.005 each on the monthly plan and $0.0045 on annual, so one comment is about 2.5 cents and a default 20-comment page runs roughly 50 cents. You are billed on comments actually delivered, not on the limit you requested, and a failed call costs nothing.
The default is 20 per call and you can raise it with the limit parameter. There is no guarantee of completeness on a very large thread — this reads what LinkedIn serves publicly, and the platform itself truncates long discussions. Because billing is per comment, deep pulls on a thousand-comment post add up quickly, so most people cap the limit somewhere between 20 and 100.
No. The author field is a display name string and nothing else. That is a genuine limit of what the public comment view exposes, not something we withhold. If you need headlines, companies or profile links, take the names as a starting point and run them through the LinkedIn Profile API or the People Search endpoint, then verify the match yourself before writing anything to a CRM.
Yes, but flat. Replies appear as ordinary items in the array with no parent reference, so you can read and analyse them but you cannot rebuild the nested thread structure. If you need the visual hierarchy, this response will not give it to you. For text analysis, sentiment scoring or counting who participated, flat is usually what you wanted anyway.
Two reasons. Comments with no text — image-only replies, stickers, deleted bodies — are dropped rather than returned as empty rows. And LinkedIn's own count includes replies and content it does not always render to logged-out visitors. A gap between the displayed number and the array length is normal and does not mean the call failed.
Only for recent comments. LinkedIn publishes relative ages rather than absolute times, so we convert those to ISO timestamps for you. Something posted hours ago is accurate; something labelled two months old resolves to a reasonable day within that period. Treat posted_at as reliable for sorting and weekly bucketing, and unreliable for minute-level forensics.
Next
100 trial credits on signup — no card, key on screen immediately.