# LinkedIn Posts Search Scraper (No Cookies) (`sfoln/linkedin-posts-search`)

Search public LinkedIn posts and articles by keyword with no account or cookies: text, date, author name, headline and followers, likes, comments, media type and hashtags, one JSON record per post. $0.80 per 1,000 posts + $0.004 per results page. Optional date window.

- Family: Social media data
- Categories: Lead generation, Social media, Automation
- Availability: on request (private on Apify). Email contact@sfoln.com with subject "Access request: LinkedIn Posts Search Scraper (No Cookies) (sfoln/linkedin-posts-search)" before calling; calls fail until it is public.
- JSON: https://www.sfoln.com/actors/linkedin-posts-search.json
- MCP: https://mcp.apify.com?tools=sfoln/linkedin-posts-search
- REST (sync): POST https://api.apify.com/v2/actors/sfoln~linkedin-posts-search/run-sync-get-dataset-items
- REST (async): POST https://api.apify.com/v2/actors/sfoln~linkedin-posts-search/runs

LinkedIn Posts Search Scraper (No Cookies) searches public LinkedIn posts and Pulse articles by keyword and returns one normalized record per post: post URL and activity ID, text, posting date, the author's name, profile URL, headline and follower count, like and comment counts, media type (article, document, video, image, text), image URLs and hashtags. It's built for B2B social listening, thought-leader and competitor research, lead discovery, content research and AI agents.

## Price per delivered record

| Event | Price | Per 1,000 | Charged for |
| --- | --- | --- | --- |
| LinkedIn post (`linkedin-post`) | $0.0008 | $0.80 / 1,000 | Charged once per LinkedIn post delivered as a dataset record. Query summary records are never charged. |
| LinkedIn search page (`linkedin-posts-query`) | $0.004 | $4 / 1,000 | Charged once per page of search results that delivered at least one new post. Covers the per-request upstream fee. Also charged for an empty page the upstream billed (when the budget covers it). |

Pay-per-event, USD, billed by Apify; no platform usage charge. Only records with status `ok` are charged. Cap a run with `maxTotalChargeUsd`. Apify free plan: up to 10 per run.

## Run

```bash
curl -X POST "https://api.apify.com/v2/actors/sfoln~linkedin-posts-search/run-sync-get-dataset-items" \
  -H "Authorization: Bearer $APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"keywords":["ai agents"],"maxPostsPerQuery":10}'
```

MCP client configuration:

```json
{
  "mcpServers": {
    "apify": {
      "type": "http",
      "url": "https://mcp.apify.com?tools=sfoln/linkedin-posts-search"
    }
  }
}
```

Example prompt: Find 20 public LinkedIn posts about "AI agents" from the past week and summarize the main themes and the most engaged authors.

## Input

Enter keywords. Each keyword produces one dataset record per post plus one summary record per keyword.

| Field | Type | Default | Meaning |
| --- | --- | --- | --- |
| `keywords` (required) | array | — | Keywords: Search terms, one per line. Duplicates are removed. Accounts on the Apify free plan can process up to 10 keywords per run. |
| `maxPostsPerQuery` | integer | `20` | Max posts per keyword: How many posts to return per keyword (1–200). Each delivered post is one charged event, plus one page event per results page. The upstream exposes at most 11 pages per keyword. |
| `datePosted` | string | — | Date posted: Only return posts that Google indexed within this window. Leave empty for any time. One of `"last-hour"`, `"last-day"`, `"last-week"`, `"last-month"`, `"last-year"`. |
| `maxQueries` | integer | `100` | Max keywords: Safety cap on the number of keywords processed in this run. |
| `concurrency` | integer | `4` | Concurrency: How many keywords are fetched in parallel (1–8). |
| `itemTimeoutSecs` | integer | `600` | Time limit per input (seconds): Pagination for one keyword stops cleanly shortly before this limit (60–3600). Raise it for very large per-input limits. |
| `includeRaw` | boolean | `false` | Include raw upstream response: Attach the unmodified provider object to each result record. |

Example input:

```json
{
  "keywords": [
    "ai agents"
  ],
  "maxPostsPerQuery": 10
}
```

## Output

One record per input item with `status` (`ok` is charged; `not_found`, `error`, `skipped_*` are free) and `charged`. The run stores an `OUTPUT` summary record.

| Field | Type | Meaning |
| --- | --- | --- |
| `input` | string | object | Input: The keyword as provided. |
| `recordType` | string | Record type: post (one per delivered post, charged) \| query (one summary per keyword, never charged) |
| `position` | integer | Position: 1-based position of the post within its input |
| `query` | string | null | Keyword |
| `datePosted` | string | null | Date filter: Summary records only. |
| `postUrl` | string | null | Post URL |
| `postId` | string | null | Activity ID |
| `text` | string | null | Text |
| `postedAt` | string | null | Posted at: ISO 8601 UTC |
| `authorName` | string | null | Author name |
| `authorUrl` | string | null | Author URL |
| `authorHeadline` | string | null | Author headline |
| `authorFollowers` | number | null | Author followers |
| `likes` | number | null | Likes |
| `comments` | number | null | Comments |
| `reposts` | number | null | Reposts |
| `mediaType` | string | null | Media type: article \| document \| video \| image \| text (inferred) |
| `imageUrls` | array | Image URLs |
| `hashtags` | array | Hashtags |
| `rowsDelivered` | integer | Posts delivered: Summary records only. |
| `pagesFetched` | integer | Pages fetched: Summary records only. |
| `pagesCharged` | integer | Pages charged: Summary records only. |
| `reachedEnd` | boolean | Reached end: Summary records only: the upstream reported no further pages. |
| `stopReason` | string | Stop reason: Summary records only: limit \| end \| budget \| max_pages \| deadline \| empty_pages \| error |
| `status` | string | Status: ok \| not_found \| error \| skipped_invalid \| skipped_budget \| skipped_free_plan |
| `charged` | boolean | Charged |
| `chargedEvent` | string | Charged event |
| `error` | object | Error |
| `warnings` | array | Warnings |
| `source` | string | Source |
| `fetchedAt` | string | Fetched at |

Example record:

```json
{
  "input": "ai agents",
  "recordType": "post",
  "position": 1,
  "query": "ai agents",
  "postUrl": "https://www.linkedin.com/posts/aagupta_what-you-need-to-know-ai-agents-activity-7354600338621906944-RvXR",
  "postId": "7354600338621906944",
  "text": "There's way too much hype about AI agents.\n\nHere's your simple guide: …",
  "postedAt": "2025-07-25T19:56:02.566Z",
  "authorName": "Aakash Gupta",
  "authorUrl": "https://www.linkedin.com/in/aagupta",
  "authorHeadline": null,
  "authorFollowers": 313422,
  "likes": 217,
  "comments": 25,
  "reposts": null,
  "mediaType": "document",
  "imageUrls": [
    "https://media.licdn.com/dms/image/v2/D4E1FAQHAzpgC7eaKgw/feedshare-document-images_160/…"
  ],
  "hashtags": [],
  "status": "ok",
  "charged": true,
  "chargedEvent": "linkedin-post",
  "source": "scrapecreators",
  "fetchedAt": "2026-10-14T10:00:00.000Z"
}
```

## Related

- [LinkedIn Company Details Scraper (No Login)](https://www.sfoln.com/actors/linkedin-company-lookup.md) (`sfoln/linkedin-company-lookup`)
- [LinkedIn Ads Library Scraper](https://www.sfoln.com/actors/linkedin-ads-search.md) (`sfoln/linkedin-ads-search`)
- [Reddit Posts Scraper (Subreddits)](https://www.sfoln.com/actors/reddit-subreddit-posts.md) (`sfoln/reddit-subreddit-posts`)
- [Brand Monitoring – X, Reddit, News & Bluesky](https://www.sfoln.com/actors/brand-mentions-monitor.md) (`sfoln/brand-mentions-monitor`)

Publisher: SFOLN LLC, contact@sfoln.com. Catalogue: https://www.sfoln.com/catalog.json. Agent guide: https://www.sfoln.com/agents.md.
