# Facebook Group Post Search — Exact Mentions (`monkey.d.scraping/facebook-public-group-mentions`) Actor

$1.99/1k matched posts + $0.029/run. Search exact phrases in public Facebook groups, exclude terms and filter dates. No login. Limited discovery.

- **URL**: https://apify.com/monkey.d.scraping/facebook-public-group-mentions.md
- **Developed by:** [Monkey D. Scraping](https://apify.com/monkey.d.scraping) (community)
- **Categories:** Social media
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.99 / 1,000 matched public group posts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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 Group Post Search — Exact Mentions

Find exact words and phrases in publicly discoverable Facebook group posts. Collect matching post text, URLs, group and author details, publication dates and available engagement counts. Use exclusions to remove unwanted mentions and inspect `matchedKeywords` to see why each post was included. No Facebook login, cookies or AI key required.

**Pricing:** **$0.029 per run + $0.00199 per matched post delivered** ($1.99 per 1,000 posts, plus the run fee). Platform usage is included. The run fee applies even when no posts match. Results and complete coverage are not guaranteed.

### When to use it

- Find literal mentions of a brand, product, place or phrase in discoverable public group posts.
- Collect research samples whose matching rule can be checked against the original text.
- Exclude unwanted phrases without sending post text to an AI classifier.

For example, `pasta madre` matches that phrase with normalized spacing and capitalization. It does not expand to `lievito naturale`. Add multiple phrases when you want alternatives. A negative sentence mentioning your phrase is still a literal mention; this Actor does not infer sentiment or purchase intent.

### Quick start

1. Enter one or more words or phrases.
2. Choose a maximum number of posts per phrase, a publication period and search market.
3. Start the run and review **Matching posts** and **Search completion and limits**.

Start with a small sample:

```json
{"keywords":["python programming"],"maxPosts":3,"afterDate":"anytime","countryCode":"us"}
```

The maximum is a target, not a promise. This phrase has produced useful posts in private tests, but yield and runtime vary. A narrow phrase can return fewer posts than requested, including zero.

### Matching and filters

| Input | Behavior |
| --- | --- |
| `keywords` | Match any listed word or phrase in the available original post text; up to 100 phrases. No synonyms or semantic expansion. |
| `excludeKeywords` | Reject a post containing any excluded word or phrase, even when an inclusion matches. |
| `maxPosts` | Per-phrase upper bound. Global deduplication, availability and search limits can reduce the count. Large targets do not guarantee large datasets. |
| `afterDate` | Use `anytime`, `last_week` (7 days), `last_month` (30 days), `this_year`, a start date such as `2026-01-01`, or `14 days`. All dates use UTC. Missing dates are excluded when filtering is active. |
| `countryCode` | Discovery market: US, UK, Italy, Germany, France or Spain. This does not verify where authors live. |

Matching ignores letter case and normalizes Unicode and whitespace. Accents and punctuation remain meaningful. Word boundaries prevent `apple` from matching inside `pineapple`. Regular expressions are not supported. Missing post text cannot match; search snippets are never substituted for the post text.

Each post is saved once per run. When it matches several configured phrases, `matchedKeywords` lists all matches and `searchKeyword` records the first matching phrase with remaining capacity. Deduplication does not extend across separate runs.

### Output

| Fields | Meaning |
| --- | --- |
| `post_id`, `post_url`, `text` | Unique post identity, source link and available public text. Text may be a preview; completeness is not guaranteed. |
| `matchedKeywords`, `matchReason` | Literal phrases found and the rule explaining inclusion. No semantic probability is implied. |
| `group_id`, `group_name`, `group_url` | Available group context. |
| `author_id`, `author_name`, `author_url` | Available author details. |
| `date`, `processed_at` | Publication time when available and collection time. |
| `reaction_count`, `comment_count`, `share_count` | Public engagement counts at collection time. |
| `image_url` | An available post image; not a complete media export. |
| `searchKeyword`, `searchCountry`, `textCompleteness` | Attribution, discovery market and availability metadata. |

Unavailable fields are `null`. The dataset contains posts, not comment text, member lists or private-group content. Export the dataset using Apify's JSON, CSV or Excel options. API/MCP consumers should inspect the linked summary as well as the dataset.

#### Example output

Illustrative record with fictional identifiers; unavailable source fields stay `null`:

```json
{
  "post_id": "123456789",
  "post_url": "https://www.facebook.com/groups/example/posts/123456789/",
  "text": "Looking for Python programming study partners.",
  "matchedKeywords": ["python programming"],
  "matchReason": "literal-phrase",
  "searchKeyword": "python programming",
  "searchCountry": "us",
  "textCompleteness": "unknown",
  "date": null,
  "reaction_count": null
}
```

### Understand incomplete and empty results

Discovery is bounded. It stops when targets are reached, the source ends, a spending limit is reached or the operating-cost/time/request limits prevent further searching. This is not a complete group archive or an exhaustive search of Facebook.

The `SUMMARY` record distinguishes:

- **SUCCEEDED:** targets reached or recognized source pagination ended. An empty dataset can be valid.
- **PARTIAL:** searching stopped at a limit; some phrases may be `not-started`. Saved posts remain useful, but more matching posts may exist.
- **FAILED:** a source, processing or storage error prevented completion. Already saved records remain available.

A platform run marked SUCCEEDED can have a PARTIAL search summary. `economic-cost-limit` is an operating-cost stop, `customer-spending-limit` is your budget, and `source-exhausted` means the recognized source pagination ended. Rejected, excluded, unavailable and out-of-range counts explain why candidates were not delivered.

### Pricing and comparison

One run at the supported 256 MB memory costs **$0.029 + $0.00199 × delivered posts**, on every Apify tier. There is no result charge for rejected posts or duplicates. The start fee remains payable for empty or failed searches. Set a maximum run charge; the minimum supported limit is $0.03099, enough for the start and one result.

| Delivered posts | This Actor, all tiers | Lofomachines Free | Lofomachines Gold/Platinum/Diamond |
| --- | --- | --- | --- |
| 0 | $0.02900 | $0.03000 | $0.03000 |
| 1 | $0.03099 | $0.03499 | $0.03299 |
| 10 | $0.04890 | $0.07990 | $0.05990 |
| 100 | $0.22800 | $0.52900 | $0.32900 |

Tariff comparison checked 3 November 2026 against the [Lofomachines pricing](https://apify.com/lofomachines/facebook-groups-posts-search-scraper/pricing), assuming one run and one start event for each. These are calculations for the same delivered count, not promises that either tool will find that count or the same posts. The 100-post example is a price calculation, not a verified yield. Intermediate Lofomachines tiers fall between the shown prices.

Lofomachines advertises semantic topic relevance; this product verifies literal mentions and exclusions. Choose based on the matching behavior you need. A lower tariff is not evidence of equal semantic coverage or a universal lowest-price claim.

### Which tool fits your search?

| Need | This Actor | Lofomachines (documented behavior) |
| --- | --- | --- |
| Literal phrase evidence | `matchedKeywords` and `matchReason` explain every saved match | Topic relevance with an estimated probability |
| Meaning and synonyms | Not supported; list each phrase explicitly | Semantic matching advertised |
| Exclude unwanted phrases | Global literal exclusions, applied before saving | An exclusion input is not documented in the reviewed listing |
| Access | Public, anonymously readable group posts | Public posts without login or cookies |
| Dates | Presets, UTC start dates and relative day counts | Presets plus custom API dates advertised |
| Coverage | Bounded discovery; incomplete searches are identified in `SUMMARY` | Limited public discovery; maximum counts are not guarantees |
| Price | $0.029/run + $1.99/1,000 delivered posts | $0.03/run + $2.99–$4.99/1,000 results, depending on tier |

Comparison checked 3 November 2026 against the [Lofomachines listing](https://apify.com/lofomachines/facebook-groups-posts-search-scraper). Their column describes published claims, not independently verified performance. Our literal matching and exclusions have been tested; semantic coverage is deliberately different. Neither column implies complete Facebook coverage.

### FAQ

**Does it use AI?** No. Inclusion and exclusion use deterministic matching against available public post text. No AI account or enrichment service is required.

**Can it access private groups or login-only posts?** No. It only processes anonymously readable posts found through public discovery.

**Why did it return fewer posts than requested?** Some candidates were excluded, lacked usable text, were outside the date range, were duplicates or were inaccessible. Search and cost limits can also stop the run. Check the summary before interpreting low counts as low real-world activity.

**Are the posts ordered by date?** No chronological ordering is promised. Sort the available `date` field after export.

**Will it find every mention of my brand?** No. It searches publicly discoverable group posts and cannot guarantee complete indexing, access or text. Exact matching also does not recognize synonyms, misspellings or unlisted variations.

**Does the market prove author location?** No. It tunes discovery, not residency or exact geolocation.

**Can I resume a stopped run?** Automatic restart/resurrection is not supported by this Actor. Existing results are preserved; it refuses to repeat work on a restarted run to avoid duplicate billing. A new run is separate and may find overlapping posts.

### Ready-to-run examples

Use these inputs to try a small sample. Set a maximum run charge of $0.10; the start fee and delivered posts determine the actual charge.

| Example | Input | Expected maximum |
| --- | --- | --- |
| [Sourdough mentions](https://apify.com/monkey.d.scraping/facebook-public-group-mentions/examples/facebook-exact-mentions-sourdough-sample) | `keywords: ["sourdough"]`, `afterDate: "anytime"`, `countryCode: "us"`, `maxPosts: 5` | 5 posts |
| [Python this year](https://apify.com/monkey.d.scraping/facebook-public-group-mentions/examples/facebook-exact-mentions-python-this-year) | `keywords: ["python programming"]`, `afterDate: "this_year"`, `countryCode: "us"`, `maxPosts: 3` | 3 posts |
| [Italian baking phrases](https://apify.com/monkey.d.scraping/facebook-public-group-mentions/examples/facebook-exact-mentions-italian-baking) | `keywords: ["pasta madre", "lievito madre"]`, `excludeKeywords: ["vendita"]`, `afterDate: "anytime"`, `countryCode: "it"`, `maxPosts: 1` | 2 posts across both phrases |

Actual results can be lower or empty. These examples passed private validation; availability changes over time.

### More public-source research

For video research, [Bilibili Scraper](https://apify.com/monkey.d.scraping/bilibili-scraper) collects Bilibili video, creator and comment data. It is a separate Actor with its own pricing and source coverage.

# Actor input Schema

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

Match any listed phrase in the original public post text. Case-insensitive; no synonyms or semantic interpretation.

## `excludeKeywords` (type: `array`):

Reject a post if its text contains any listed phrase, even when an inclusion matches.

## `afterDate` (type: `string`):

Use anytime, last_week (7 days), last_month (30 days), this_year, YYYY-MM-DD or N days (for example 14 days). Dates use UTC; posts without a verifiable date are excluded when filtering.

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

Maximum target, not a guaranteed quantity. Availability and filters can reduce results.

## `countryCode` (type: `string`):

Tunes discovery. Does not verify author location.

## Actor input object example

```json
{
  "keywords": [
    "python programming"
  ],
  "excludeKeywords": [],
  "afterDate": "anytime",
  "maxPosts": 3,
  "countryCode": "us"
}
```

# Actor output Schema

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

Unique public posts containing the requested literal phrases after exclusions and date filters. Includes original text, matchedKeywords, matchReason and available author, group and engagement fields. Empty output can be valid; inspect the summary.

## `summary` (type: `string`):

Counts of saved, rejected, unavailable and out-of-range posts; per-phrase stop reasons. PARTIAL means discovery was limited by time, requests, operating costs or the customer spending limit, even if the platform run succeeded. Source exhaustion is distinct from a limit. Economics are estimated; billing events are recorded by Apify.

# 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": [
        "python programming"
    ],
    "maxPosts": 3
};

// Run the Actor and wait for it to finish
const run = await client.actor("monkey.d.scraping/facebook-public-group-mentions").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": ["python programming"],
    "maxPosts": 3,
}

# Run the Actor and wait for it to finish
run = client.actor("monkey.d.scraping/facebook-public-group-mentions").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": [
    "python programming"
  ],
  "maxPosts": 3
}' |
apify call monkey.d.scraping/facebook-public-group-mentions --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,monkey.d.scraping/facebook-public-group-mentions"
        }
    }
}
```

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/gQoYhudm0XdRBM0Rm/builds/WGPkKQaLR6uaS2IvP/openapi.json
