LinkedIn Post Search Scraper - Posts by Keyword, No Login avatar

LinkedIn Post Search Scraper - Posts by Keyword, No Login

Pricing

from $0.90 / 1,000 public linkedin posts

Go to Apify Store
LinkedIn Post Search Scraper - Posts by Keyword, No Login

LinkedIn Post Search Scraper - Posts by Keyword, No Login

Search public LinkedIn posts by keyword. LinkedIn's own search needs an account. The public post pages behind it do not. Rows have the author, full post text, exact posting time, reactions, comments and the post URL. Filter by date, author or media type. $0.90 per 1,000 posts.

Pricing

from $0.90 / 1,000 public linkedin posts

Rating

5.0

(2)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

1

Bookmarked

156

Total users

76

Monthly active users

a day ago

Last modified

Share

LinkedIn Post Search Scraper: find public posts by keyword, with the full text and the real date

Type the keywords you would have typed into LinkedIn and get one row per public post: who wrote it, the whole post text, the exact posting time, reaction and comment counts, and the link. No account, no cookies, no login anywhere in the loop.

The limit worth knowing before you plan around it. A phrase tops out at roughly 90 distinct posts, so this is a slice of what LinkedIn holds rather than an archive, and a post published in the last hour is often not findable yet. Run several phrasings of the same idea if you want depth, and give anything very recent a few hours.

InputSearch phrases, and optionally the profile or company URLs to narrow them to
OutputOne row per public post
Ceiling1,000 posts per run, about 90 per phrase
Account neededNone from you
Price$0.90 per 1,000 posts, flat on every plan

🔎 What LinkedIn Post Search Scraper does

Each phrase is searched, the public post pages behind the results are read, and a row is built from what the page itself declares. That is why postedAt is a real ISO timestamp rather than "2d", and why reactionsCount and commentsCount are numbers you can sort on.

You can narrow the search in four ways, and they combine. authorUrls keeps only posts written by the people or companies you name. postedLimit and postedLimitDate cut by age, and both are checked against the post's real publish time rather than against the search result's wording. contentType keeps only posts carrying video, images or a document.

A repost resolves to the original post, so you get the source rather than the echo, and activityId de-duplicates the rest.

📥 What you give it

{
"searchQueries": ["b2b sales", "outbound prospecting"],
"sortBy": "date",
"postedLimit": "month",
"maxPosts": 20,
"resultsLimit": 50
}

Everything below is optional, and the form arrives with sensible starting values rather than schema defaults, so clearing a box is not the same as choosing what the form showed.

FieldForm starts atWhat it is
searchQueriesb2b salesUp to 20 phrases per run. Each one is searched separately.
authorUrlsemptyUp to 10 profile or company URLs, like https://www.linkedin.com/in/williamhgates. Results are narrowed to posts they wrote.
sortByrelevancerelevance keeps search ranking order, date puts the newest first.
postedLimitanyPast hour, 24 hours, week, month, 3 months, 6 months or year.
postedLimitDateemptyKeep only posts on or after a date. Takes 2026-01-31, a full ISO string or a millisecond timestamp.
contentTypeallVideos, images or documents. Jobs, live videos and collaborative articles are listed but cannot be detected, and behave as all.
maxPosts20Per phrase, up to 200. 0 means as many as discovery finds.
resultsLimit50The hard cap on charged rows for the whole run, up to 1,000. This is the one that decides your bill.
requestTimeoutSecs25How long a single page gets before it is given up on.
includeAuthorDetailsonAdds the author's profile URL, avatar and follower count. No extra request and no extra charge.

Run it with no phrases and no authors and you get one labelled sample row, so you can see the shape before committing a real run.

📤 What you get back

A real row from a real run. The post text and the avatar link are cut short so the block stays readable; on the real row text runs to 2,114 characters:

{
"ok": true,
"_sample": false,
"charged": true,
"postUrl": "https://www.linkedin.com/posts/coquinn_b2bsales-saleswisdom-thoughtleadership-activity-7378846497251106816-cw7k",
"activityId": "7378846497251106816",
"authorName": "Corey Quinn",
"authorType": "Person",
"text": "What B2B Sales Taught Me About B2B Sales:\n\nI've been in B2B sales for literally years. Here's what I learned:\n\nB2B sales is when you sell things to businesses. ...",
"headline": "What B2B Sales Taught Me About B2B Sales:",
"postedAt": "2025-09-30T17:41:37.263Z",
"reactionsCount": 152,
"commentsCount": 41,
"postType": "DiscussionForumPosting",
"mediaType": "text",
"videoUrl": null,
"imageUrl": null,
"query": "b2b sales",
"retrievedAt": "2026-09-21T01:45:13.228Z",
"authorUrl": "https://www.linkedin.com/in/coquinn",
"authorImageUrl": "https://media.licdn.com/dms/image/v2/D5603AQFJV5OVNEHgbQ/profile-displayphoto-shrink_200_200/...",
"authorFollowers": 35138
}
FieldWhat it is
activityIdLinkedIn's own post id, and the key to de-duplicate on across runs.
textThe full post body. headline is the first line of it, which is usually the hook.
postedAtA real timestamp, not "2d ago". When the page does not declare one it is decoded from the activity id.
mediaTypevideos, documents, images or text. videoUrl and imageUrl carry the first piece of media, or null.
queryWhich of your phrases found this row. Empty on an author-only run.
authorFollowersThe author's follower count when the page publishes it, and null often enough that you should not depend on it.
retrievedAtWhen the row was read. The reaction and comment counts are a snapshot of that moment.

🧾 Reading the output

RowHow to spot itBilled
A real postok: true, charged: trueyes
The sample row_sample: trueno
A diagnostic_diagnostic: true with an errorCodeno

Filter on charged == true and you have your posts. Treat that flag as what tells a real row apart from a sample or a diagnostic, not as a receipt for what was billed.

Diagnostic rows sit alongside real ones in the same dataset, so a partial query leaves both.

CodeWhat it means
NO_SEARCH_RESULTSThat phrase found nothing to open.
NO_POSTS_MATCHEDPosts were found and none of them were actually about your phrase, so they were dropped rather than charged.
NOTHING_FOUND_STOPPING_EARLYThe first three phrases returned nothing, so the rest were skipped instead of spending on them.
PAGE_BUDGET_REACHEDThe run hit its own page allowance for that phrase before filling maxPosts. Common with a media filter that few posts match.
SEARCH_ENGINES_REFUSEDDiscovery could not run for that phrase on this run. Retry, or reword it.
CONTENT_TYPE_NOT_DETECTABLEYou picked jobs, live videos or collaborative articles, which cannot be told apart, so the run behaved as all.
PROXY_INPUT_IGNORED, UNSUPPORTED_INPUT_IGNOREDYou passed a setting this actor does not take. It was ignored and the run carried on.
NO_RESULTSThe whole run found nothing.
CHARGING_UNAVAILABLE, RUN_ERRORBilling or the run itself hit a problem. Send us the run id.

▶️ How to run it

  1. Open LinkedIn Post Search Scraper and click Try for free.
  2. Put your phrases into Search queries, one per line.
  3. Set Total results limit low while you are testing, since that is what you pay for.
  4. Optionally set Posted limit and Sort by to date if you only want recent posts.
  5. Click Start, then download the dataset as JSON, CSV or Excel, or pull it from the Apify API.

💰 How much does it cost?

$0.90 per 1,000 posts. Flat on every Apify plan, no volume tiers.

Total results limit is the number that decides your bill, because it caps charged rows across every phrase. maxPosts only says how far to go into each one.

Posts dropped for being off-topic, for failing your date or media filter, or for sitting behind a members-only wall are not charged. Neither are diagnostic rows or the sample row. A post found by two of your phrases is charged once.

💡 What people use it for

  • Finding who is publicly talking about a problem you solve, then working the list by hand rather than blasting it.
  • Watching a competitor's topic without following anyone: set authorUrls, sortBy to date, and run it weekly.
  • Sorting on reactionsCount to see which angle actually landed in your market before you write your own version.
  • Feeding a research pass. The full text is on the row, so it goes straight into a summariser.

🚧 What it does not do

  • It is not a full-text archive of LinkedIn. About 90 distinct posts per phrase is the ceiling, whatever you set maxPosts to.
  • Very recent posts are thin. Something published minutes ago is usually not findable yet.
  • A two-letter phrase is a bad search. Short queries like ai or hr match inside other words, so off-topic posts get through and they count. Use a phrase.
  • No comment bodies and no reaction breakdown. Counts only, and they are a snapshot at retrievedAt, so two runs a day apart will disagree.
  • authorFollowers is often null, because not every page publishes it. A null beats a guess.
  • Members-only and deleted posts are skipped, uncharged. They simply do not appear.
  • Jobs, live videos and collaborative articles cannot be filtered. Picking one of those behaves as all and says so in a diagnostic row.
  • It reads what LinkedIn shows a signed-out visitor, so it can never see anything private.

🧭 Which LinkedIn scraper do you need?

If you wantUse
Public posts found by keywordThis one
People found by keyword, title or locationLinkedIn Profile Search Scraper
The staff on a company pageLinkedIn Company Employees Scraper
Full profiles for URLs you already haveLinkedIn Profiles Scraper
Company pages: size, industry, headquartersLinkedIn Companies Scraper

❓ Questions people ask

Do I need a LinkedIn account? No. LinkedIn's own search asks you to sign in; the public post pages behind it do not, and those are what this reads.

Why did I get fewer posts than I asked for? Either the phrase ran out at its ceiling, or your date or media filter removed the rest. The diagnostic row in your dataset names which.

Can I follow one person's posts? Yes. Put their profile URL in Only posts from these authors and leave the phrases empty. query comes back empty on those rows.

Is the date reliable? Yes, and it is the main reason to use this rather than reading the search page. It is a real timestamp taken from the post itself.

Is scraping LinkedIn legal? This reads public pages only, never anything behind a login. Results can contain personal data, which GDPR and similar laws cover, so have a reason for collecting it. Apify's write-up on the legality of web scraping is a reasonable starting point, and we are not lawyers.

🆘 If something breaks

Open the Issues tab on the actor page. Include the phrases you used and the run id. The diagnostic rows in your dataset usually name the reason already.