# Facebook Post Search Scraper: Keyword and Hashtag Posts (`themineworks/facebook-post-search-scraper`) Actor

Search public Facebook posts by keyword or hashtag: post text, author page, date, reactions by type, comment count, share count, media and URL. Top or latest posts, date range and location filters. No login, no cookies. One row per post.

- **URL**: https://apify.com/themineworks/facebook-post-search-scraper.md
- **Developed by:** [The Mine Works](https://apify.com/themineworks) (community)
- **Categories:** Social media, Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.80 / 1,000 posts

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Facebook Post Search Scraper: Keyword and Hashtag Posts

[![20 Facebook posts by keyword with reactions, comments and shares in 7 seconds](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/facebook-post-search-scraper-hero.png)](https://console.apify.com/actors/agWOmIocpFWLfZZWb/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

From **The Mine Works**, makers of [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) and [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), with over 295,000 runs across 310+ public actors.

Updated 4 Nov 2026: first release. Keyword and hashtag search of public Facebook posts, top or latest order, date range, location, one flat row per post with text, author, date, reactions by type, comment count, share count, media and link. Bookmark this Actor on its Store page so it is one click away next time.

### Why choose this actor?

- **Search Facebook posts the way you search Facebook.** Type words or a hashtag and get the public posts Facebook lists for them: from Pages, public profiles and public groups. Run many keywords at once. A post found by two keywords is delivered and charged once.
- **Every number in its own column.** `reactions_count`, `reactions` split by type (like, love, care, haha, wow, sad, angry), `comments_count`, `shares_count`, and `video_views` on videos and reels, plus the full post text, the exact date and the post link.
- **A filter for what you really asked for.** Facebook's search also returns related posts that do not contain your words. Each row has `keyword_in_text`, and `onlyPostsContainingKeyword` drops the rest for free. For a brand name this is the difference between mentions and noise.
- **Honest about depth.** Facebook ends a logged out search list on its own. On 12 keywords we measured 71 to 303 posts per keyword in top order. The run summary lists, per keyword, how many posts Facebook gave and why the list stopped. To go further, add related keywords.
- **Empty runs stay cheap.** There is no warm-up page: a run's first request is already the first page of results. A keyword with no posts ends after that one request and you pay nothing, and no start fee, when no post is delivered.
- **No Facebook account.** No login, no cookies of yours, no browser and no CAPTCHA solving.

[![Run it on Apify](https://api.apify.com/v2/key-value-stores/cUXz95yxflDho41nn/records/button-run.png)](https://console.apify.com/actors/agWOmIocpFWLfZZWb/input?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Part of The Mine Works Social media and video family:** [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral), [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral).

### Try it in one minute

Paste this into the JSON tab of the input page. It returns 20 posts. It took 7 seconds in our test.

```json
{
  "keywords": ["electric cars"],
  "maxPostsPerKeyword": 20
}
```

Apify's free plan includes $5 of credit every month, which covers about 1,380 posts at this actor's price.

#### Copy to your AI assistant

```text
themineworks/facebook-post-search-scraper on Apify. Searches public Facebook posts by keyword or hashtag, logged out, and returns one flat row per post. Call ApifyClient("TOKEN").actor("themineworks/facebook-post-search-scraper").call(run_input={"keywords": ["electric cars"], "maxPostsPerKeyword": 50}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give keywords (list of words, hashtags or Facebook search links, up to 200) or query (one string). Optional: maxPostsPerKeyword (default 50, 1 to 1000), sortBy (top or latest), startDate and endDate (YYYY-MM-DD), location (city name or numeric Facebook place id), onlyPostsContainingKeyword (boolean, drops posts without the exact phrase for free). Post rows have no _type field and carry post_id, post_url, text, created_at, timestamp, author_name, author_id, author_url, author_picture_url, author_type, group_id, group_name, group_url, post_type, reactions_count, reactions, comments_count, shares_count, video_views, media, media_urls, link_url, link_title, link_domain, link_image, is_reshare, shared_post, place_id, place_name, sponsored, keyword, keyword_in_text, sort, position, scraped_at. Rows with _type are summary, info or error rows and are never charged. Priced per post delivered plus a small flat fee per run, charged only after the first post is delivered.
```

### Key features

- **Top or latest.** `top` is Facebook's own order. `latest` asks for recent posts first: in our test on "electric cars" every post was from the last 6 days. It returns a shorter list than top.
- **Date range.** `startDate` and `endDate` go to Facebook, and any post outside the range it returns anyway is dropped for free. In our test Facebook returned 12 such posts out of 45, and all 30 delivered posts were inside the range.
- **Location.** A city name or a Facebook place id. Facebook uses it as a preference for posts tagged there, not as a strict filter; `place_name` on each row shows the tag when there is one. The run summary names the city it used in `location_resolved`.
- **Keywords and hashtags.** `tesla`, `real estate agent`, `#electricvehicles`, or a pasted Facebook search or hashtag link. Any language.
- **Group posts named.** Posts from public groups carry `group_id`, `group_name` and `group_url` next to the author.
- **Reshares linked.** `is_reshare` and `shared_post` give the original post's id, link, author and date.
- **One record or a thousand.** `query` takes one keyword for a call per record from Clay, n8n or an AI agent. `keywords` takes a list, and three run at the same time.
- **Stops cleanly.** The run stops before its time limit, on your max cost, when Facebook refuses searches, or when pages bring nothing new, and it keeps every row it read.

### How to use it

#### Brand and competitor monitoring

Run your brand names once a day in latest order, keeping only posts with the exact name. Compare on `post_id` to see what is new.

```json
{
  "keywords": ["your brand", "your competitor"],
  "sortBy": "latest",
  "onlyPostsContainingKeyword": true,
  "maxPostsPerKeyword": 100
}
```

#### Social listening for one call in a pipeline

From Clay, n8n or an agent, call the actor once per record with `query`. A keyword that has no posts costs one small request and no fee.

```json
{
  "query": "acme plumbing austin",
  "maxPostsPerKeyword": 10
}
```

#### Lead signals by city

Search words people use when they are about to buy, in one city, in one month. Sort the rows by `comments_count` to find the live threads.

```json
{
  "keywords": ["looking for a realtor", "recommend a dentist"],
  "location": "Austin, Texas",
  "startDate": "2026-10-01",
  "endDate": "2026-10-31",
  "maxPostsPerKeyword": 100
}
```

#### Sentiment and topic datasets

Pull 200 posts per keyword across ten related keywords, then run your own classifier on `text`. `reactions` gives a ready made signal, and `sad` and `angry` counts often say more than the text.

#### Content research

Search your topic in top order and sort by `shares_count`. `post_type` tells you which format earned the shares: photo, album, video, reel, link or text.

### Input parameters

| Parameter | Type | Default | What it does |
|---|---|---|---|
| `keywords` | array of strings | empty | Words, hashtags or Facebook search links, one per line. Up to 200. |
| `query` | string | empty | One keyword, for calling the actor once per record. |
| `maxPostsPerKeyword` | integer | `50` | Most posts per keyword, 1 to 1,000. Facebook usually ends the list first. |
| `sortBy` | string | `top` | `top` or `latest`. |
| `startDate` | string | empty | Posts from this date on, `YYYY-MM-DD`. |
| `endDate` | string | empty | Posts up to and including this date, `YYYY-MM-DD`. |
| `location` | string | empty | City name or numeric Facebook place id. A preference, not a strict filter. |
| `onlyPostsContainingKeyword` | boolean | `false` | Keep only posts whose text has the exact phrase; the rest are dropped for free. |

Give `keywords`, `query` or both.

### What data do you get?

| Field | What it is |
|---|---|
| `post_id` | Facebook id of the post |
| `post_url` | Link to the post |
| `text` | Full post text with line breaks; absent on a photo or video with no caption |
| `created_at` | Publish date and time, ISO 8601 UTC |
| `timestamp` | The same moment as Unix seconds |
| `author_name` | Name of the Page or profile that posted |
| `author_id` | Facebook id of the Page or profile (a pfbid token for some profiles) |
| `author_url` | Link to the Page or profile, when Facebook gives one |
| `author_picture_url` | Profile picture link (expires after a few days) |
| `author_type` | Facebook's type: usually `User`, which includes modern Pages |
| `group_id`, `group_name`, `group_url` | The public group, when the post is a group post |
| `post_type` | `text`, `photo`, `album`, `video`, `reel`, `link` or `shared` |
| `reactions_count` | All reactions |
| `reactions` | Reactions by type that Facebook shows |
| `comments_count` | Comments |
| `shares_count` | Shares |
| `video_views` | Views, on videos and reels where Facebook shows them |
| `media` | Photos and videos: type, url, thumbnail, width, height, alt, id, duration |
| `media_urls` | Just the image and thumbnail links, for a sheet |
| `link_url`, `link_title`, `link_domain`, `link_image` | The shared link on link posts |
| `is_reshare`, `shared_post` | Whether it shares another post, and that post's id, link, author, text and date |
| `place_id`, `place_name` | The place tagged in the post |
| `sponsored` | `true` when Facebook marks the post as paid |
| `keyword` | The keyword that found the post |
| `keyword_in_text` | `true` when the text has the keyword as an exact phrase |
| `sort` | `top` or `latest` |
| `position` | Position among the delivered posts of its keyword |
| `scraped_at` | When the row was read |

#### Stable fields for automations

These were present in every post row of our test run (2,216 rows from 12 keywords), and their names will not change:

| Field | What it is |
|---|---|
| `post_id` | The key to store and join on |
| `post_url` | Open the post |
| `created_at` | Publish date |
| `author_name`, `author_id` | Who posted |
| `reactions_count`, `comments_count`, `shares_count` | Engagement |
| `post_type` | Format |
| `keyword`, `keyword_in_text` | What found it and whether the words are in it |

Empty values are left out of a row rather than sent as null, so a text post has no `media_urls`, and a post outside a group has no `group_id`.

#### Output examples

A post from a Page:

```json
{
  "post_id": "1566219672210300",
  "post_url": "https://www.facebook.com/LucidMotors/posts/pfbid02t74ZFgJrQRX1dgDeAoW2efjEzvG6B4neS6Wzd8QHHsDbKPwLL77A5DRq2ztMPbdfl",
  "text": "Car and Driver ranked Lucid first among car brands the outlet has tested over the years, earning a 10/10 rating based on perfect scores for both Lucid Air and Lucid Gravity...",
  "created_at": "2026-11-02T21:38:15.000Z",
  "timestamp": 1793655495,
  "author_name": "Lucid Motors",
  "author_id": "100064668460659",
  "author_url": "https://www.facebook.com/LucidMotors",
  "author_type": "User",
  "post_type": "photo",
  "reactions_count": 197,
  "reactions": { "like": 168, "love": 26, "wow": 2, "care": 1 },
  "comments_count": 30,
  "shares_count": 10,
  "media": [
    { "type": "photo", "url": "https://scontent-lga3-3.xx.fbcdn.net/v/...", "width": 2048, "height": 1536, "alt": "May be an image of car, road and text", "id": "1566219572210310" }
  ],
  "media_urls": ["https://scontent-lga3-3.xx.fbcdn.net/v/..."],
  "is_reshare": false,
  "sponsored": false,
  "keyword": "electric cars",
  "keyword_in_text": false,
  "sort": "top",
  "position": 1,
  "scraped_at": "2026-11-04T14:00:12.000Z"
}
```

Run summary (the last row of each run, never charged, also in the `OUTPUT` record):

```json
{
  "_type": "summary",
  "keywords_requested": 1,
  "keywords_read": 1,
  "pages_read": 2,
  "posts_found": 23,
  "posts_delivered": 20,
  "charged_for": 20,
  "per_keyword": [
    { "keyword": "electric cars", "pages": 2, "posts_found": 23, "posts_delivered": 20, "stopped": "max_posts_reached" }
  ]
}
```

`stopped` is `max_posts_reached` (your limit), `end_of_results` (Facebook's list ended), `no_new_posts`, `max_cost`, `time` or a refusal reason.

### Pricing

Pay per event: you pay for the posts you receive, plus a flat $0.001 per run, whatever memory you choose.

| Event | When it is charged | Free plan | Bronze (Starter) | Silver (Scale) | Gold (Business) |
|---|---|---|---|---|---|
| `post-scraped` | Once per post row stored in your dataset | $3.60 per 1,000 | $2.70 per 1,000 | $2.25 per 1,000 | $1.80 per 1,000 |
| `run-start` | Once per run, after the first post is delivered | $0.001 | $0.001 | $0.001 | $0.001 |

The price of one post is the price per 1,000 divided by 1,000.

Never charged:

- a keyword with no posts, and a run that delivers no post: the start fee is charged only after the first post reaches your dataset;
- a run Facebook refuses;
- a post that a second keyword of the same run finds again;
- posts outside your date range, and posts dropped by `onlyPostsContainingKeyword`;
- the summary, info and error rows;
- anything past your "Max cost per run". The actor checks the budget before each batch of rows and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

### Run it on a schedule

1. Open the actor in Apify Console, set your input and click **Save as a new task**.
2. In the task, open **Schedules**, click **Add schedule** and pick how often (every morning, every Monday at 08:00 and so on).
3. Use `sortBy` set to `latest` and compare runs on `post_id` to see what is new.
4. Optional: add an integration (Google Sheets, Slack, a webhook) so each run lands where your team works.

### FAQ

#### What does this actor read?

Facebook's public post search, as a visitor who is not logged in sees it: public posts from Pages, public profiles and public groups. It does not log in and cannot see private groups, friends only posts or anything behind a sign in.

#### How many posts can I get per keyword?

Facebook decides. It ends a logged out search list on its own: we measured 71 to 303 posts per keyword in top order on 12 keywords, and a shorter list in latest order. The summary shows where each list stopped. To collect more, add related keywords; a post found twice is charged once.

#### Why do some posts not contain my keyword?

Facebook's search matches related words and topics, not only your exact phrase. In our test about two thirds of the posts contained the exact keyword. Turn on `onlyPostsContainingKeyword` to keep just those. Dropped posts are free; the run takes longer because it reads more pages.

#### Is the date filter exact?

The rows you get are. Facebook mostly honours the range and sometimes returns posts outside it, and the actor drops those for free.

#### Is the location filter strict?

No. Facebook treats it as a preference for posts tagged in that place, so some results have no tag. Filter on `place_name` if you need only tagged posts.

#### Why is `author_url` missing on some rows?

Some personal profiles have no public link for a logged out visitor. `author_id` and `author_name` are still there, and when the post link carries the profile's name, we build the link from it.

#### Why is the count different from what I see when logged in?

Facebook personalises search for accounts. This actor sees what a logged out visitor sees.

#### How long does a run take?

Each request brings about 11 posts and takes 1 to 5 seconds, and three keywords run at the same time. 20 posts took 7 seconds, and 2,216 posts from 12 keywords took about 10 minutes in our test.

#### Do I need an account, cookies or a proxy?

No. Everything is included. You only need an Apify account.

#### Which actor should I use for the comments of these posts?

Feed `post_url` into [Facebook Comments Scraper](https://apify.com/themineworks/facebook-comments-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral) to get the comments and replies.

#### Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. The dataset has two ready views: Posts, and Authors and links. In CSV and Excel, `reactions` and `media` are flattened into columns such as `reactions/like` and `media/0/url`.

#### Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/facebook-post-search-scraper

- Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
- ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
- Cursor or VS Code: add it as an HTTP MCP server with that URL.
- Claude Code: `claude mcp add -t http facebook-post-search-scraper "https://mcp.apify.com/?tools=themineworks/facebook-post-search-scraper"`

#### Is it legal to scrape Facebook posts?

The actor reads only public posts that anyone can see without logging in. Posts can contain personal data, so you are responsible for how you use the data, including Facebook's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice.

### Integrations

- **Google Sheets**: send each run's posts to a sheet with Apify's Google Sheets integration; one row per post fits a sheet as is.
- **Make, Zapier and n8n**: start a run and read its dataset with the Apify apps and nodes, for example "new posts on our brand every morning to Slack".
- **Webhooks**: have Apify call your URL when a run succeeds, then fetch the dataset.
- **API and SDKs**: run it from Python or JavaScript with the Apify client, or with a plain HTTP call (see "Copy to your AI assistant" above).
- **MCP clients**: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

### More from The Mine Works

**Social media and video**

- [Threads Scraper](https://apify.com/themineworks/threads-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Scraper](https://apify.com/themineworks/reddit-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Threads Search Scraper](https://apify.com/themineworks/threads-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Profile Scraper](https://apify.com/themineworks/instagram-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Instagram Followers & Following](https://apify.com/themineworks/instagram-followers-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Reddit Search Scraper](https://apify.com/themineworks/reddit-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Twitter / X Scraper](https://apify.com/themineworks/twitter-x-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [YouTube Transcript](https://apify.com/themineworks/youtube-transcript-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Xiaohongshu (RED) Scraper](https://apify.com/themineworks/xiaohongshu-explore-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Scraper](https://apify.com/themineworks/telegram-channel-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Telegram Channel Finder](https://apify.com/themineworks/telegram-channel-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Pinterest Profile Scraper](https://apify.com/themineworks/pinterest-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Leads and business directories**

- [B2B Leads Finder](https://apify.com/themineworks/b2b-leads-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Skip Trace Lookup](https://apify.com/themineworks/skip-trace-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Maps Email Scraper](https://apify.com/themineworks/maps-leads?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [2GIS Places Scraper](https://apify.com/themineworks/2gis-places-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Marketing, SEO and reviews**

- [Facebook Ad Library Scraper](https://apify.com/themineworks/meta-ad-library-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google Ads Transparency Scraper](https://apify.com/themineworks/google-ads-transparency?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Similarweb Scraper](https://apify.com/themineworks/similarweb-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Google News Scraper](https://apify.com/themineworks/google-news?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**LinkedIn**

- [LinkedIn Company Scraper](https://apify.com/themineworks/linkedin-company-details?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Post Scraper](https://apify.com/themineworks/linkedin-post-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Employees Scraper](https://apify.com/themineworks/linkedin-employees?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [LinkedIn Profile Scraper](https://apify.com/themineworks/linkedin-profile-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Real estate**

- [Zillow Rentals Scraper](https://apify.com/themineworks/zillow-rental-listings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zillow Sold Comps Scraper](https://apify.com/themineworks/zillow-recently-sold?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Real Estate MCP](https://apify.com/themineworks/india-real-estate-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Housing.com Scraper](https://apify.com/themineworks/housing-com-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Science, health and government data**

- [Academic Research MCP](https://apify.com/themineworks/academic-research-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [CourtListener Scraper](https://apify.com/themineworks/courtlistener-court-records?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Socrata Open Data Scraper](https://apify.com/themineworks/socrata-open-data?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [OpenAlex Scraper](https://apify.com/themineworks/openalex-scholarly-works?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Jobs and hiring**

- [Foundit Monster India Jobs](https://apify.com/themineworks/foundit-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Hirist Jobs Scraper](https://apify.com/themineworks/hirist-jobs-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [India Jobs MCP](https://apify.com/themineworks/india-jobs-mcp?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naukri Jobs Scraper](https://apify.com/themineworks/naukri-jobs?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Company and business data**

- [Company Domain Finder](https://apify.com/themineworks/company-domain-finder?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GST Taxpayer Lookup](https://apify.com/themineworks/gst-taxpayer-lookup?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Company KYB Resolver](https://apify.com/themineworks/company-identity-resolver?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [SEC EDGAR Filings Scraper](https://apify.com/themineworks/sec-edgar-filings?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**E-commerce and marketplaces**

- [Ozon.ru Scraper](https://apify.com/themineworks/ozon-product-search?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [⭐ Amazon Reviews Scraper](https://apify.com/themineworks/amazon-reviews?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Amazon Product Scraper](https://apify.com/themineworks/amazon-products?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Etsy Listings Scraper](https://apify.com/themineworks/etsy-search-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Food and local services**

- [NoBroker Scraper](https://apify.com/themineworks/nobroker-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Swiggy Restaurant Scraper](https://apify.com/themineworks/swiggy-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Zomato Scraper](https://apify.com/themineworks/zomato-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**Developer and AI tools**

- [Website to Markdown Crawler](https://apify.com/themineworks/rag-crawler?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Skill Finder](https://apify.com/themineworks/github-skill-discovery?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Repo Scraper](https://apify.com/themineworks/github-repo-intelligence?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [GitHub Trending Scraper](https://apify.com/themineworks/github-trending-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

**More tools**

- [G2 Reviews Scraper](https://apify.com/themineworks/g2-reviews-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Naver Blog Scraper](https://apify.com/themineworks/naver-blog-posts-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [WeChat Article Scraper 微信公众号文章](https://apify.com/themineworks/wechat-article-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)
- [Taobao Products Scraper 淘宝 天猫](https://apify.com/themineworks/taobao-products-scraper?fpr=ymnoit\&utm_source=apify-readme\&utm_medium=referral)

### Support

Found a keyword that returns far fewer posts than expected, or a field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need that is not here, say so in the same place.

*Search public Facebook posts by keyword or hashtag and get every post back as one row, with text, author, date, reactions by type, comments, shares, media and link, no login.*

# Actor input Schema

## `keywords` (type: `array`):

What to search for, one per line, for example electric cars or #electricvehicles. A pasted Facebook search or hashtag link works too. Up to 200 per run; a post found by two keywords is delivered and charged once.

## `query` (type: `string`):

Same as a single entry in Keywords. Handy when you call the actor once per record from Clay, n8n or an AI agent.

## `maxPostsPerKeyword` (type: `integer`):

Stop after this many posts for each keyword. Facebook ends a logged out search list on its own, usually at 50 to 200 posts for a keyword. Use related keywords to go further.

## `sortBy` (type: `string`):

top is Facebook's default order. latest asks Facebook for recent posts first, which is the one to use for monitoring on a schedule. It returns a shorter list.

## `startDate` (type: `string`):

Only posts from this date on, as YYYY-MM-DD. Sent to Facebook, and any post outside the range that it returns anyway is dropped for free.

## `endDate` (type: `string`):

Only posts up to and including this date, as YYYY-MM-DD.

## `location` (type: `string`):

A city name such as London or Hyderabad, or a numeric Facebook place id. Facebook uses this to favour posts tagged there; it is a preference, not a strict filter, so check place_name on each row if you need it strict. The city used is named in the run summary.

## `onlyPostsContainingKeyword` (type: `boolean`):

Facebook's search also returns related posts that do not contain your words. Turn this on to drop those for free and keep only posts whose text has the exact phrase. Good for brand monitoring. Costs no extra per post, but the run reads more pages to reach your limit.

## Actor input object example

```json
{
  "keywords": [
    "electric cars",
    "#electricvehicles"
  ],
  "maxPostsPerKeyword": 20,
  "sortBy": "top",
  "onlyPostsContainingKeyword": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (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 = {
    "keywords": [
        "electric cars"
    ],
    "maxPostsPerKeyword": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("themineworks/facebook-post-search-scraper").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 = {
    "keywords": ["electric cars"],
    "maxPostsPerKeyword": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("themineworks/facebook-post-search-scraper").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 '{
  "keywords": [
    "electric cars"
  ],
  "maxPostsPerKeyword": 20
}' |
apify call themineworks/facebook-post-search-scraper --silent --output-dataset

```

## MCP server setup

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

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/agWOmIocpFWLfZZWb/builds/ogJma0kNoDSX2OfVp/openapi.json
