LinkedIn Post Search Scraper - Posts by Keyword, No Login
Pricing
from $0.90 / 1,000 public linkedin posts
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
Maintained by CommunityActor stats
1
Bookmarked
156
Total users
76
Monthly active users
a day ago
Last modified
Categories
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.
| Input | Search phrases, and optionally the profile or company URLs to narrow them to |
| Output | One row per public post |
| Ceiling | 1,000 posts per run, about 90 per phrase |
| Account needed | None 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.
| Field | Form starts at | What it is |
|---|---|---|
searchQueries | b2b sales | Up to 20 phrases per run. Each one is searched separately. |
authorUrls | empty | Up to 10 profile or company URLs, like https://www.linkedin.com/in/williamhgates. Results are narrowed to posts they wrote. |
sortBy | relevance | relevance keeps search ranking order, date puts the newest first. |
postedLimit | any | Past hour, 24 hours, week, month, 3 months, 6 months or year. |
postedLimitDate | empty | Keep only posts on or after a date. Takes 2026-01-31, a full ISO string or a millisecond timestamp. |
contentType | all | Videos, images or documents. Jobs, live videos and collaborative articles are listed but cannot be detected, and behave as all. |
maxPosts | 20 | Per phrase, up to 200. 0 means as many as discovery finds. |
resultsLimit | 50 | The hard cap on charged rows for the whole run, up to 1,000. This is the one that decides your bill. |
requestTimeoutSecs | 25 | How long a single page gets before it is given up on. |
includeAuthorDetails | on | Adds 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}
| Field | What it is |
|---|---|
activityId | LinkedIn's own post id, and the key to de-duplicate on across runs. |
text | The full post body. headline is the first line of it, which is usually the hook. |
postedAt | A real timestamp, not "2d ago". When the page does not declare one it is decoded from the activity id. |
mediaType | videos, documents, images or text. videoUrl and imageUrl carry the first piece of media, or null. |
query | Which of your phrases found this row. Empty on an author-only run. |
authorFollowers | The author's follower count when the page publishes it, and null often enough that you should not depend on it. |
retrievedAt | When the row was read. The reaction and comment counts are a snapshot of that moment. |
🧾 Reading the output
| Row | How to spot it | Billed |
|---|---|---|
| A real post | ok: true, charged: true | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true with an errorCode | no |
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.
| Code | What it means |
|---|---|
NO_SEARCH_RESULTS | That phrase found nothing to open. |
NO_POSTS_MATCHED | Posts were found and none of them were actually about your phrase, so they were dropped rather than charged. |
NOTHING_FOUND_STOPPING_EARLY | The first three phrases returned nothing, so the rest were skipped instead of spending on them. |
PAGE_BUDGET_REACHED | The run hit its own page allowance for that phrase before filling maxPosts. Common with a media filter that few posts match. |
SEARCH_ENGINES_REFUSED | Discovery could not run for that phrase on this run. Retry, or reword it. |
CONTENT_TYPE_NOT_DETECTABLE | You picked jobs, live videos or collaborative articles, which cannot be told apart, so the run behaved as all. |
PROXY_INPUT_IGNORED, UNSUPPORTED_INPUT_IGNORED | You passed a setting this actor does not take. It was ignored and the run carried on. |
NO_RESULTS | The whole run found nothing. |
CHARGING_UNAVAILABLE, RUN_ERROR | Billing or the run itself hit a problem. Send us the run id. |
▶️ How to run it
- Open LinkedIn Post Search Scraper and click Try for free.
- Put your phrases into Search queries, one per line.
- Set Total results limit low while you are testing, since that is what you pay for.
- Optionally set Posted limit and Sort by to
dateif you only want recent posts. - 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,sortBytodate, and run it weekly. - Sorting on
reactionsCountto see which angle actually landed in your market before you write your own version. - Feeding a research pass. The full
textis 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
maxPoststo. - 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
aiorhrmatch 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. authorFollowersis oftennull, 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
alland 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 want | Use |
|---|---|
| Public posts found by keyword | This one |
| People found by keyword, title or location | LinkedIn Profile Search Scraper |
| The staff on a company page | LinkedIn Company Employees Scraper |
| Full profiles for URLs you already have | LinkedIn Profiles Scraper |
| Company pages: size, industry, headquarters | LinkedIn 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.