# LinkedIn Post Search ✅ NO COOKIES (`atomus/linkedin-post-search`) Actor

Search LinkedIn posts by keyword: author, full text, engagement and date. Filter by date, media type, author headline or industry, or posts mentioning a company or person. No account or cookies needed. Add-ons return the author's profile, who reacted and who commented. Up to 500 posts per search.

- **URL**: https://apify.com/atomus/linkedin-post-search.md
- **Developed by:** [Atomus APIs](https://apify.com/atomus) (community)
- **Categories:** Lead generation, Social media, Marketing
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.60 / 1,000 post scrapeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## LinkedIn Post Search

<table width="100%" style="border:none;border-radius:10px;background:#120306">
<tr><td style="padding:34px;border:none">
<span style="color:#F59E0B;font-size:13px;font-weight:700;letter-spacing:2px">LINKEDIN POST SEARCH &nbsp;&bull;&nbsp; LINKEDIN POST SEARCH API</span><br><br>
<span style="color:#F5F5F6;font-size:40px;font-weight:800;letter-spacing:-1.2px">Find everyone talking<br>about your market.</span><br><br>
<span style="color:#D6D3D1;font-size:16px">Search LinkedIn posts by keyword and get the author, the full text, the engagement counts and the date for every match. Search several terms in one run. Narrow it by date, media type, the author's headline or industry, to posts <b style="color:#F5F5F6">written by specific people or companies</b>, or to posts that mention one. Add the author's full profile or company record and turn a search into a lead list. No LinkedIn account, no login, no cookies, no ban risk.</span><br><br>
<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">CAP YOUR SPEND PER RUN</span>
<span style="background:#1C1917;color:#F59E0B;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">&nbsp;PART OF A FLEET THAT HAS DELIVERED 2.4M+ RESULTS&nbsp;</span>
</td></tr>
</table>

#### Copy to your AI assistant

Paste this into ChatGPT, Claude, Cursor, or any LLM to start using this Actor right away.

```
atomus/linkedin-post-search is an Apify Actor that searches LinkedIn posts by keyword and returns them as structured JSON: post text, media, mentions, repost data, author details, and reaction/comment/share counts. Use it whenever someone needs to find LinkedIn posts ABOUT a topic rather than posts FROM a known account - market monitoring, brand mentions, finding people who are talking about a problem you solve, or building a lead list from a conversation. Run it with curl: curl -X POST "https://api.apify.com/v2/acts/atomus~linkedin-post-search/run-sync-get-dataset-items?token=APIFY_TOKEN" -H "Content-Type: application/json" -d '{"search":["ai agents"],"maxPosts":100,"postedLimit":"week"}'. Or in Python: ApifyClient("APIFY_TOKEN").actor("atomus/linkedin-post-search").call(run_input={"search":["ai agents"],"maxPosts":100}) then client.dataset(run["defaultDatasetId"]).list_items().items. Inputs: search (list of strings, required, max 20, each term is its own search, and a post found by two terms is delivered and billed once), maxPosts (int, 1-500, per term), postedLimit ("any"|"1h"|"24h"|"week"|"month"|"3months"|"6months"|"year"), postedAfter (string "YYYY-MM-DD", an exact cutoff date that takes precedence over postedLimit; the date is included, and posts older than it are neither delivered nor charged), contentType ("all"|"videos"|"images"|"documents"|"jobs"|"live_videos"|"collaborative_articles"), profile (list, posts BY these people: profile URL, handle or the author.linkedin_id from a previous run), company (list, posts by these company or showcase pages: URL, handle or numeric id), authorsCompany (list, posts by anyone who works at these companies), group (string, one LinkedIn group URL or id), authorKeywords (string, matched on the author headline), authorsIndustryId (the author's company industry, a dropdown of all 487 industries LinkedIn publishes in the form and their numeric IDs over the API, e.g. 4 Software Development, 96 IT Services and IT Consulting; full list at learn.microsoft.com/en-us/linkedin/shared/references/reference-tables/industry-codes-v2), mentioningCompany (list, company URL or handle), mentioningMember (list, profile URL or handle), and the paid add-ons includeAuthorDetails (bool), includeReactions (bool) with maxReactionsPerPost, includeComments (bool) with maxCommentsPerPost. Rows carry a "type" field: "post", "author_profile", "author_company", "reaction", "comment", "summary" or "error" - filter on it before exporting. Each post row carries author.type ("profile" or "company"), author.username and author.linkedin_id, which are the values the profile and company filters take, so a search can be narrowed to the authors a previous run found. Billing is one event per post returned; each unique author is billed once per run however many of their posts match; each search term that returns nothing bills a single lookup event. LinkedIn stops serving new results for a search at around 500 posts per term, whatever total it reports. Full input schema, every enum and default, and the complete output field list: GET https://api.apify.com/v2/acts/atomus~linkedin-post-search/build/default
```

***

### LinkedIn MCP Server: use these Actors from ChatGPT, Claude or Cursor

Point your AI assistant at Atomus and it can read LinkedIn on its own: search posts by topic, then pull the profiles, reactions, comments, companies and employees behind them. No glue code, no scraping logic in your prompts.

```json
{
  "mcpServers": {
    "atomus": {
      "url": "https://mcp.apify.com?tools=atomus/linkedin-post-search,atomus/linkedin-posts-scraper-pro,atomus/linkedin-profile-scraper,atomus/linkedin-reactions-scraper-pro,atomus/linkedin-comments-scraper-pro,atomus/linkedin-company-scraper,atomus/linkedin-company-employees,atomus/leads-finder",
      "headers": { "Authorization": "Bearer YOUR_APIFY_TOKEN" }
    }
  }
}
```

Then ask, in plain language:

> "Find last week's LinkedIn posts complaining about CRM data quality, keep the ones written by heads of sales, and give me each author's company and headcount."

That one sentence is a search, a filter and an enrichment, and this Actor does all three. Pinning the `tools=` list is what keeps your assistant on these Actors instead of reaching for whatever scraper it finds first.

***

### How to search LinkedIn posts

#### What is being said about a topic right now

```json
{ "search": ["ai agents"], "postedLimit": "week", "maxPosts": 100 }
```

The past week's posts on a topic, ranked by LinkedIn's own relevance. This is the one to schedule daily.

#### Everything since a date you pick

```json
{ "search": ["ai agents"], "postedAfter": "2026-09-01", "maxPosts": 200 }
```

When none of the fixed windows is the right shape, give an exact date instead. The date itself is included, and posts published before it are neither delivered nor charged.

#### Who is talking about a company

```json
{ "search": ["crm"], "mentioningCompany": ["https://www.linkedin.com/company/salesforce/"], "maxPosts": 200 }
```

Brand monitoring rather than scraping: posts that mention a company, written by people who do not work there. No competitor exposes this well.

#### Find buyers by what they complain about

```json
{
  "search": ["spreadsheet chaos", "manual data entry"],
  "authorKeywords": "head of operations",
  "postedLimit": "month",
  "includeAuthorDetails": true
}
```

The topic finds the pain, the headline filter keeps the seniority, and the add-on returns each author's full profile. A search becomes a lead list in one run. Two terms means two searches, and `maxPosts` applies to each of them.

#### Watch the accounts that matter

```json
{
  "search": ["hiring"],
  "profile": ["https://www.linkedin.com/in/williamhgates", "satyanadella"],
  "company": ["microsoft", "1035"],
  "postedLimit": "month"
}
```

`profile` and `company` each take a profile or page URL, a plain handle, or the `author.linkedin_id` a previous run returned, so the natural loop is: search a topic once, keep the accounts worth watching, then run only those on a schedule. `authorsCompany` widens it from a company page to everyone who works there, and takes a company URL or company id (not a person's id).

#### Everyone who engaged with a conversation

```json
{
  "search": ["series a announcement"],
  "postedLimit": "24h",
  "maxPosts": 25,
  "includeReactions": true,
  "maxReactionsPerPost": 50,
  "includeComments": true
}
```

The posts, plus the people behind every reaction and comment. Reactions are the warm list; comments carry the intent.

#### Only video posts, newest first

```json
{ "search": ["product demo"], "contentType": "videos", "maxPosts": 50 }
```

Rows arrive newest first, whatever the window. The run picks how LinkedIn serves your term, so there is nothing to choose: every window is searched by relevance, which comes back full and covers the whole window, and the dates are put back in order before the rows are delivered. Measured 2026-09-07, `postedLimit: "24h"` returned 49 posts all published inside 24 hours, and `postedLimit: "week"` returned 49 spanning 125 hours. The one exception is `postedLimit: "1h"`, served by LinkedIn's live feed instead, which returns 50 of 50 inside the hour where relevance returns 5.

Ordering the search itself by date does not reach further back: widening the filter shrinks the set if anything (`week` reported 125, `month` 111), so that ordering is a feed of what was just published rather than a chronological archive. That is why the run reads the whole window and orders the rows itself.

The ordering is applied per search term, so each term's posts are delivered together, newest first. Every term is short (about 6 seconds at the default 100 posts, about 30 at the 500 ceiling), and near the run timeout the rows are delivered as they arrive rather than held.

***

### Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `search` | list of strings, **required**, max 20 | - | The keywords, exactly as you would type them in the LinkedIn search box. Each term is its own search, and `maxPosts` applies to each. A post found by two terms is delivered and billed once. |
| `maxPosts` | integer 1 to 500 | `100` | How many posts to return per term, at most. |
| `postedLimit` | `any` | `1h` | `24h` | `week` | `month` | `3months` | `6months` | `year` | `any` | Only posts published inside this window. Not used when `postedAfter` is set. |
| `postedAfter` | date, `YYYY-MM-DD` | - | Only posts published on or after this exact date, instead of a fixed window. The date itself is included, and posts older than it are neither delivered nor charged. Takes precedence over `postedLimit`. |
| `contentType` | `all` | `videos` | `images` | `documents` | `jobs` | `live_videos` | `collaborative_articles` | `all` | Biases the search towards one kind of post. |
| `profile` | list of strings | - | Only posts written by these people, as `https://www.linkedin.com/in/williamhgates`, `williamhgates` or the `author.linkedin_id` a previous run returned (`ACoAAA8BYqEB...`). All three resolve to the same author. |
| `company` | list of strings | - | Only posts published by these company pages, as `https://www.linkedin.com/company/microsoft/`, `microsoft` or `1035`. Showcase pages work. |
| `authorsCompany` | list of strings | - | Only posts whose author works at one of these companies, as `https://www.linkedin.com/company/microsoft/` or `1035`. |
| `group` | string | - | Only posts published inside one LinkedIn group, as `https://www.linkedin.com/groups/12345/` or `12345`. One group per run: extra values are ignored and the run says so. |
| `authorKeywords` | string | - | Matched against the author's headline: `founder`, `recruiter`, `head of data`. |
| `authorsIndustryId` | list of strings | - | The industry of the author's company. In the form it is a dropdown of all 487 industries LinkedIn publishes; over the API it takes their numeric IDs, for example `4` Software Development, `96` IT Services and IT Consulting, `6` Technology, Information and Internet, `43` Financial Services. [Full list, published by LinkedIn](https://learn.microsoft.com/en-us/linkedin/shared/references/reference-tables/industry-codes-v2). |
| `mentioningCompany` | list of strings | - | Only posts mentioning this company, as `https://www.linkedin.com/company/microsoft/` or `microsoft`. |
| `mentioningMember` | list of strings | - | Only posts mentioning this person, as `https://www.linkedin.com/in/williamhgates` or `williamhgates`. |
| `includeAuthorDetails` | boolean | `false` | **Paid add-on.** The author's full profile, or company record for a company page. |
| `includeReactions` | boolean | `false` | **Paid add-on.** Who reacted to each post. |
| `maxReactionsPerPost` | integer 1 to 100 | `5` | Caps reactions per post. |
| `includeComments` | boolean | `false` | **Paid add-on.** Who commented on each post. |
| `maxCommentsPerPost` | integer 1 to 100 | `5` | Caps comments per post. |

Three things worth knowing before your first run, all of them measured rather than assumed:

- **The result window ends near 500 posts.** LinkedIn keeps reporting a much bigger total, but stops serving new results well before it. `maxPosts` is capped at 500 for that reason: past it you would be paying for pages that come back empty.
- **`contentType` is a bias, not a hard filter.** On 50 results per type, roughly 1 in 8 came back without that media. Expect a few extras rather than a clean set.
- **A term LinkedIn does not recognise does not return nothing.** It falls back to loosely related posts. If your results look off-topic, the term is what to change, not the filters.

***

### What data does the LinkedIn Post Search return?

Every row carries a `type` field, because one run can produce several shapes. Filter on it before you export.

| `type` | When it appears | What it carries |
|---|---|---|
| `post` | Always | The post and its author. |
| `author_profile` | `includeAuthorDetails`, person author | The full person record: role, experience, education, skills, location, links. |
| `author_company` | `includeAuthorDetails`, company author | The company record: industry, headcount, revenue band, funding, HQ, technologies. |
| `reaction` | `includeReactions` | One person who reacted, and which reaction. |
| `comment` | `includeComments` | One comment, its text, its author and its date. |
| `summary` | An add-on lookup found nothing | Says which lookup was empty, so a billed line is never a mystery. |
| `error` | Bad input or a free-tier stop | A plain-language explanation. |

A `post` row, trimmed to show the shape:

```json
{
  "type": "post",
  "post_type": "video",
  "author_name": "Satya Nadella",
  "content": "No one becomes a clinician to do paperwork...",
  "post_url": "https://www.linkedin.com/posts/satyanadella_activity-7302346926123798528",
  "posted_at": "2026-03-15",
  "posted_ago": "3d",
  "is_repost": false,
  "images": [],
  "video_url": "https://dms.licdn.com/playlist/vid/...",
  "article": null,
  "doc": null,
  "mentions": [{ "start": 42, "length": 9, "type": "COMPANY", "url": "https://www.linkedin.com/company/microsoft/", "name": "Microsoft" }],
  "share_url": "https://www.linkedin.com/feed/update/urn:li:activity:7302346926123798528",
  "engagement": { "total_reactions": 1240, "comments": 87, "shares": 33, "reactions": [{ "type": "LIKE", "count": 900 }] },
  "author": {
    "name": "Satya Nadella",
    "type": "profile",
    "username": "satyanadella",
    "headline": "Chairman and CEO at Microsoft",
    "linkedinUrl": "https://www.linkedin.com/in/satyanadella/",
    "avatar": "https://media.licdn.com/dms/image/v2/...",
    "linkedin_id": "ACoAAAF...",
    "website_url": null,
    "website_label": null
  },
  "reposted_by": null,
  "_metadata": { "post_id": "urn:li:activity:7302346926123798528", "extracted_at": "2026-09-06T18:00:00.000Z", "search_term": "ai agents" }
}
```

**`post_type`** is derived from the post itself, not guessed from the text: `document`, `video`, `poll`, `article`, `image` or `text`. A document post that also carries cover images is still a document. One honest limitation: a job post carries no media at all, so it comes back as `text` even when `contentType: "jobs"` found it.

**Join the add-on rows to the posts on the author handle**: `author_slug` on an `author_profile` or `author_company` row matches `author.username` on the post rows, and `post_id` on a `reaction` or `comment` row matches `_metadata.post_id`. Both handles are lowercased, so the join works whatever case LinkedIn spells the profile with.

**`author.type`** is `profile` for a person and `company` for a company or showcase page, and it tells you where the handle goes back in: a `profile` handle into "Posts by these people", a `company` handle into "Posts by these companies". That is the loop this actor is built for: search broadly, keep the authors worth watching, then search only them.

***

### How much does it cost to search LinkedIn posts?

Pay per event, and the price drops on the higher Apify plans. Check the Actor's pricing tab for the exact figure on your plan.

| What you get | Event |
|---|---|
| A post | `post-scraped` |
| An author's full profile | `profile-enriched` |
| An author's company record | `company-enriched` |
| One person who reacted | `reaction-scraped` |
| One comment | `comment-scraped` |
| A search term that returned nothing | `empty-search` |

Three rules that decide what your bill actually looks like:

- **Each author is billed once per run**, however many of their posts come back and across every search term in that run. A topic is usually dominated by a handful of accounts, so this is the difference between paying per author and paying per post.
- **A lookup that finds nothing still bills one item.** A search request, or a reactions lookup on a post with no reactions, does the same work whether it comes back full or empty. That single item covers the request, which is what keeps thin results worth running instead of being refused outright. Lookups that *fail* are free.
- **The free tier gives you 20 chargeable events a month** so you can inspect every field before paying. Any paid Apify plan removes it.

***

### What do people use the LinkedIn Post Search for?

- **Market and topic monitoring**: schedule a daily run on the terms your market uses and read what changed, instead of scrolling a feed an algorithm chose for you.
- **Brand and competitor mentions**: `mentioningCompany` returns posts about a company written by people outside it. That is the conversation your competitor cannot see either.
- **Sales prospecting from intent**: people describing a problem in public are the warmest inbound there is. Search the problem, filter the headline, enrich the author, export the list.
- **Recruiting**: find who is posting about a technology or discipline, then pull their profile in the same run.
- **Content research**: see what actually got engagement on a topic before writing your own post, with the reaction and comment counts attached.
- **Building a warm audience**: the reactions and comments add-ons turn one high-engagement post into a list of people who already care about the subject.
- **Feeding an AI agent**: the MCP section above wires this into ChatGPT or Claude so the search, the filter and the enrichment happen in one prompt.

***

### LinkedIn Post Search vs cookie-based tools vs the official LinkedIn API

| | This Actor | Cookie or browser tools | Official LinkedIn API |
|---|---|---|---|
| LinkedIn account needed | No | Yes, and it is the one at risk | Yes, plus partner approval |
| Search posts by keyword | Yes | Yes, until the session breaks | **No.** Post search is not exposed |
| Ban risk | None, nothing runs as you | Real, this is the whole risk model | None |
| Author enrichment | Built in, one lookup per author | Another tool, another session | Not available |
| Runs unattended | Yes | Only while the cookie lives | Yes |
| Setup | Paste a keyword | Extract a session cookie, refresh it forever | An approval process measured in weeks |

The official API is the honest comparison to make: it is the safest option and it simply does not offer this. Keyword search over public posts is not a LinkedIn API product, at any tier.

### 🏆 Top LinkedIn Scrapers

### FAQ

**Can I search for posts from a specific person or company?**
Yes. `profile` takes people, `company` takes company and showcase pages, and `authorsCompany` takes everyone who works somewhere. All three take a list, and `profile` and `company` accept a URL, a plain handle, or the `author.linkedin_id` a previous run returned. `authorsCompany` names the employer, so it takes a company URL or company id. Combine any of them with a search term to ask "what did these accounts say about this topic".

One limit worth knowing: filtering the search by author returns fewer posts per account than reading their feed directly. When you want *everything* one account posted, **LinkedIn Posts Scraper** is the Actor for that.

**Can I use this from ChatGPT or Claude?**
Yes. The LinkedIn MCP Server section above is the whole setup: paste the JSON into your assistant's config and ask in plain language. Pin the `tools=` list so it stays on these Actors.

**Why did I get fewer results than the total LinkedIn reported?**
Two reasons, both measured. The reported total always runs a little ahead of what actually arrives: a term reporting 457 delivered 443, and one reporting 110 delivered 100. And LinkedIn serves a search in pages of 50 and stops at 10 pages, so 500 is the ceiling however big the total looks. The run stops at the first empty page rather than paying for the rest.

**My results look unrelated to my search term. Is it broken?**
No, and this one surprises everyone: LinkedIn does not return an empty result for a term it does not recognise. It falls back to loosely related posts. Change the term, not the filters.

**Do I pay for a search that finds nothing?**
One `empty-search` event for each term that comes back empty. The request costs the same whether it comes back full or empty, and a run with five terms makes five requests. A term that delivered posts is never also charged the floor, and a run that fails outright bills nothing.

**Are reposts included?**
Yes, all of them, and every row tells you which is which: `is_repost` is true for a repost, and `reposted_by` names who shared it when LinkedIn says. Filtering your export to originals only is one column away.

**Does the author add-on work for company pages too?**
Yes. A person author returns an `author_profile` row, a company page returns an `author_company` row with industry, headcount, revenue band and funding. Both are billed once per author per run.

**Do I need a LinkedIn account or cookies?**
No. Nothing runs as you, so there is nothing to get restricted.

### All Atomus scrapers

<span style="background:#10B981;color:#FFFFFF;font-size:13px;font-weight:700;padding:6px 13px;border-radius:5px">2.4M+ RESULTS DELIVERED</span>

### Support

### ⚠️ Disclaimer

This Actor collects only publicly available LinkedIn posts, the kind anyone can see without logging in. It does not log into any account, use cookies, or access private or connection-only content. You are responsible for using the output in line with LinkedIn's terms and with the data-protection law that applies to you, including GDPR and CCPA where relevant.

# Actor input Schema

## `search` (type: `array`):

The keywords to search LinkedIn posts for. Works like the LinkedIn search box: 'ai agents', 'hiring product designer', 'series a announcement'.

Add up to 20 terms. Each one is searched on its own, and Max posts applies to each of them: three terms at 100 returns up to 300 posts. A post found by two of your terms is delivered and billed once.

A term LinkedIn does not recognise does not come back empty. It falls back to loosely related posts, so if the results look off-topic, the term is the thing to change. A term that finds nothing bills $0.005 once, for the search itself.

## `maxPosts` (type: `integer`):

How many posts to return for each search term, at most. Defaults to 100, and 500 is the ceiling for one term.

## `postedLimit` (type: `string`):

Only return posts published inside this window.

If you set an exact date below, that one is used instead.

## `postedAfter` (type: `string`):

Only return posts published on or after this date, instead of one of the fixed windows above. The date itself is included.

Posts published before it are not returned, and you are not charged for them.

## `contentType` (type: `string`):

Biases the search towards one kind of post. LinkedIn treats this as a ranking hint rather than a hard filter, so expect a few posts without that media.

## `profile` (type: `array`):

Only return posts written by these people. One per line, in any of these forms:

• link: "https://www.linkedin.com/in/williamhgates"
• or just the handle: "williamhgates"
• or the author.linkedin\_id from a previous run: "ACoAAA8BYqEBCGLg\_vT\_ca6mMEqkpp9nVffJ3hc"

That last one is a value this Actor returns, so the authors one run finds can be fed straight into the next.

## `company` (type: `array`):

Only return posts published by the company page itself, the corporate account. One per line, in any of these forms:

• link: "https://www.linkedin.com/company/microsoft/"
• or just the handle: "microsoft"
• or the numeric page id: "1035"

Showcase pages work here too. For what the STAFF of that company posts on their own profiles, use the filter below instead.

## `authorsCompany` (type: `array`):

Only return posts whose author works at one of these companies, written on their own profile. One per line, in either of these forms:

• link: "https://www.linkedin.com/company/microsoft/"
• or the numeric page id: "1035"

This is the staff, not the company page. Searching Microsoft here returns posts by the people who work there; the filter above returns what the Microsoft page itself published.

## `authorKeywords` (type: `string`):

Free text matched against the author's headline, so you can search a topic and keep only the people you sell to: 'founder', 'recruiter', 'head of data'.

## `authorsIndustryId` (type: `array`):

Only return posts whose author works in one of these industries. Pick as many as you like, or leave empty for all.

Every option is one of the 487 industries LinkedIn itself publishes, so nothing you pick can come back empty for not existing. The industry is the one on the author's company, not a word in their headline; for the headline use the field above.

## `group` (type: `string`):

Only return posts published inside one LinkedIn group, in either of these forms:

• link: "https://www.linkedin.com/groups/12345/"
• or just the group id: "12345"

One group per run. A search cannot cover several groups at once, so run them one at a time.

## `mentioningCompany` (type: `array`):

Only return posts that mention this company. One per line, in either of these forms:

• link: "https://www.linkedin.com/company/microsoft/"
• or just the handle: "microsoft"

This is brand monitoring: who is talking about a company right now, in their own words.

## `mentioningMember` (type: `array`):

Only return posts that mention this person. One per line, in either of these forms:

• link: "https://www.linkedin.com/in/williamhgates"
• or just the handle: "williamhgates"

## `includeAuthorDetails` (type: `boolean`):

Adds one extra row per unique author: 'author\_profile' for a person, 'author\_company' for a company page. Join it to the posts on author\_slug.

## `includeReactions` (type: `boolean`):

Adds one 'reaction' row per person who reacted, with their name, headline and profile URL. A post with no reactions bills a single item for the lookup itself.

## `maxReactionsPerPost` (type: `integer`):

Caps how many reactions are returned for each post, so a viral post does not consume the whole run.

## `includeComments` (type: `boolean`):

Adds one 'comment' row per comment, with the text, the person and the date. A post with no comments bills a single item for the lookup itself.

## `maxCommentsPerPost` (type: `integer`):

Caps how many comments are returned for each post.

## Actor input object example

```json
{
  "search": [
    "ai agents"
  ],
  "maxPosts": 100,
  "postedLimit": "any",
  "postedAfter": "2026-09-01",
  "contentType": "all",
  "profile": [
    "https://www.linkedin.com/in/williamhgates"
  ],
  "company": [
    "https://www.linkedin.com/company/microsoft/"
  ],
  "authorsCompany": [
    "https://www.linkedin.com/company/microsoft/"
  ],
  "authorKeywords": "founder",
  "authorsIndustryId": [
    "96"
  ],
  "group": "https://www.linkedin.com/groups/12345/",
  "mentioningCompany": [
    "https://www.linkedin.com/company/microsoft/"
  ],
  "mentioningMember": [
    "https://www.linkedin.com/in/williamhgates/"
  ],
  "includeAuthorDetails": false,
  "includeReactions": false,
  "maxReactionsPerPost": 5,
  "includeComments": false,
  "maxCommentsPerPost": 5
}
```

# Actor output Schema

## `posts` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "search": [
        "ai agents"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("atomus/linkedin-post-search").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "search": ["ai agents"] }

# Run the Actor and wait for it to finish
run = client.actor("atomus/linkedin-post-search").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "search": [
    "ai agents"
  ]
}' |
apify call atomus/linkedin-post-search --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atomus/linkedin-post-search"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/GBbCglA4cdYyxryPo/builds/l9klglCNLamp1hq9b/openapi.json
