# Facebook Groups Search Scraper (`maximedupre/facebook-groups-search-scraper`) Actor

Search public Facebook groups by one or more keywords and an optional location, or enrich known public group URLs. Get group names, canonical URLs, IDs, visibility, descriptions, member counts, and search context when available. Filter by member size, track changes, and set a result limit.

- **URL**: https://apify.com/maximedupre/facebook-groups-search-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Social media, Developer tools
- **Stats:** 1 total users, 1 monthly users, 50.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.01 / 1,000 groups

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

### 🔎 Find public Facebook groups for your next search

Researchers, marketers, community managers, and developers can search public Facebook groups by keyword with an optional location qualifier, or enrich known public group URLs. The Actor saves structured rows with group names, canonical URLs, IDs, visibility, descriptions, member counts, and search context when Facebook exposes them. Use the rows to compare communities, review public group details, and build a focused list for a workflow.

- Find public groups for parents with **[Parenting Groups](https://apify.com/maximedupre/facebook-groups-search-scraper/examples/parenting-groups)**.
- Find outdoor communities with **[Hiking Groups](https://apify.com/maximedupre/facebook-groups-search-scraper/examples/hiking-groups)**.
- Build a community list with **[Photography Groups](https://apify.com/maximedupre/facebook-groups-search-scraper/examples/photography-groups)**.
- Look for career communities with **[Jobs Groups](https://apify.com/maximedupre/facebook-groups-search-scraper/examples/jobs-groups)**.
- Find property-focused communities with **[Real Estate Groups](https://apify.com/maximedupre/facebook-groups-search-scraper/examples/real-estate-groups)**.
- Find nearby communities with **[Local Community Groups](https://apify.com/maximedupre/facebook-groups-search-scraper/examples/local-community-groups)**.
- Find local marketplace communities with **[Buy and Sell Groups](https://apify.com/maximedupre/facebook-groups-search-scraper/examples/buy-and-sell-groups)**.

#### 📦 Group rows with public search context

Each saved row is the first eligible occurrence of one source group. If the same group appears again through another keyword, URL, or similar submitted value, the later match is ignored. The row keeps the first saved match and its search context. It does not combine evidence from later matches.

Facebook fields are returned when the public source exposes them. Missing values stay unfilled instead of being guessed. A public search is not a promise to find every Facebook group.

#### ▶️ Search by keyword or enrich known groups

Choose `Keywords` to search each topical keyword separately, with an optional location qualifier. Choose `Group URLs` to enrich known public groups. Fields in the other choice are ignored.

The Actor saves eligible groups as it finds them and continues until `Maximum groups` is reached or the source is exhausted. Use member filters to narrow keyword matches. Leave `Maximum groups` empty to keep all available results until the source is exhausted. Turn on `Track changes between runs` when you want new groups and groups with changed public member size or visibility, while unchanged groups are skipped.

**Run steps**

1. Choose `Keywords` or `Group URLs` in `Find groups by`.
2. Add values to the matching list and set any optional filters.
3. Start the Actor.
4. Open the saved group rows in the default dataset.

#### ⚙️ Input

Choose one input method for each run. The fields for the other method are ignored.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `findGroupsBy` | string | Selects keyword search or known group URL enrichment. Fields in the other choice are ignored. |
| `keywords` | array of strings | Searches each topical keyword separately. Each saved result keeps the keyword that produced it. |
| `location` | string | Adds an optional place name to the keyword search, such as `Austin` or `Canada`. |
| `minMembers` | integer | Keeps keyword matches with at least this many members. Leave it empty to skip the lower bound. |
| `maxMembers` | integer | Keeps keyword matches with at most this many members. Leave it empty to skip the upper bound. |
| `groupUrls` | array of objects | Adds one or more public Facebook group URL objects to enrich with available group data. |
| `groupUrls[].url` | string (URL) | Holds one public Facebook group URL to enrich. |
| `maxResults` | integer | Stops after keeping this many groups from the selected method. Leave it empty to keep all available results until the source is exhausted. |
| `trackChanges` | boolean | When true, compares this input with earlier runs, returns new or changed groups, and skips unchanged groups. When false or omitted, returns the current matches. |

**Example input**

This example is copied from the public input of the successful current-beta default-input run:

```json
{
  "findGroupsBy": "keywords",
  "keywords": [
    "photography"
  ],
  "maxResults": 2,
  "trackChanges": false
}
```

#### 🧾 Output

The run output contains a link to the default dataset. The dataset has one group row shape. Optional fields appear when Facebook exposes them.

**Run output link**

| Field | Type | What it does |
| --- | --- | --- |
| `results` | string | Links to the saved Facebook group rows in the default dataset. |

**Group row**

| Field | Type | What it does |
| --- | --- | --- |
| `name` | string | Required public group name. |
| `url` | string (URL) | Required canonical public Facebook group URL. |
| `groupId` | string | Stable Facebook group identifier when the source provides one. |
| `visibility` | string | Public visibility or privacy label when the source exposes it. |
| `description` | string | Public group description when available. |
| `searchSnippet` | string | Text shown with the group in the source search result when available. |
| `memberCount` | integer | Usable member count when the source provides a numeric value. |
| `memberCountText` | string | Member-size wording shown by the source. |
| `groupType` | string | Public group or entity type label shown by the source when available. |
| `imageUrl` | string (URL) | Public group image URL when the source provides one. |
| `activity` | object | Holds public activity information when the source shows it. |
| `activity.text` | string | Source wording for the group's visible activity. |
| `activity.postsPerWeek` | number | Normalized weekly posting rate when the source provides enough activity information. |
| `viewerAccess` | string | Public viewer access or join-state label supplied by the source when available. |
| `websites` | array of strings | Website URLs published in the group's public description when available. |
| `websites[]` | string (URL) | One website URL published by the group. |
| `emails` | array of strings | Email addresses published in the group's public description when available. |
| `emails[]` | string | One email address published by the group. |
| `keyword` | string | Keyword that produced the saved group result when it came from keyword search. |
| `location` | string | Location qualifier used with the saved keyword result when one was provided. |
| `resultRank` | integer | Group position in the source results for its saved keyword search. |

**Example group row**

This complete row is a genuine row from a successful current-beta run. It contains the public values returned for one group at retrieval time.

```json
{
  "name": "Photographers Of Upstate NY",
  "url": "https://www.facebook.com/groups/148331352392253",
  "groupId": "148331352392253",
  "visibility": "Public group",
  "description": "Photographers Of Upstate NY is a photography group based in Rochester.\n\nFeel free to share your images\nPost when your planning to shoot\nShare photography related articles\nOr list items for sale\nOr anything else photography related",
  "memberCount": 5981,
  "memberCountText": "5,981 total members",
  "groupType": "GROUP",
  "imageUrl": "https://scontent-dfw5-1.xx.fbcdn.net/v/t1.6435-9/126905035_1689919284522585_7622597776452257016_n.jpg?stp=c160.0.640.640a_cp0_dst-jpg_tt6&cstp=mx640x640&ctp=s50x50&_nc_cat=106&ccb=1-7&_nc_sid=33e84f&_nc_ohc=MQ8sw_CvzLwQ7kNvwEC3CLm&_nc_oc=AdozzXTkioa6L5ucyVHaZPr99Qsio7vF7fG4BEoJyDgpfmwGo-icC4B9errAQfgbxkM&_nc_zt=23&_nc_ht=scontent-dfw5-1.xx&_nc_gid=XGZL-yTvIDx5dwQolwypPQ&_nc_ss=70289&oh=00_AQK_7sUw8geGsZhsH4i2yvcFWyEAVIEl7G0EdvvhgOeB4w&oe=6ADE4E85",
  "activity": {
    "text": "13 posts in the last day; 477 posts in the last month",
    "postsPerWeek": 91
  },
  "viewerAccess": "CAN_JOIN",
  "searchSnippet": "ISO a Buffalo NY photographer for a courthouse elopement prob won't be until 2027, maybe 2026 of June pending cost of everything.",
  "keyword": "photography",
  "resultRank": 2
}
```

#### 💳 Pricing

The Actor uses pay-per-event pricing. One `Group` event is charged when one public Facebook group is saved to the dataset. The current price is shown in the Store pricing panel.

#### 🔌 Integrations

Start runs with the Apify API, read the default dataset, or export its rows as JSON, CSV, Excel, or XML. Use the structured rows in your own data workflow.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### How are duplicate groups handled?

The first eligible occurrence of a source group is saved. If the same group appears later through another keyword, URL, or similar submitted value, the later match is ignored. The saved row describes only the first match.

##### What happens when Facebook does not show a field?

The field is left unfilled rather than guessed. Optional fields can be missing, and arrays such as `websites` and `emails` can be empty.

##### Can I search by location?

Yes. Add a place name to a keyword search, such as `Austin` or `Canada`. The saved row keeps the location when one was used.

##### Can I enrich a known group URL?

Yes. Select `Group URLs` and submit one or more public Facebook group URL objects. The Actor returns the group's identity and available public metadata.

##### What does Track changes between runs do?

When it is true, the Actor compares the input with earlier runs, returns new groups and groups whose public member size or visibility changed, and skips unchanged groups. When it is false or omitted, it returns the current matches.

##### Can it search private groups?

No. It reads public Facebook group search results and public group pages. Private, member-only, login-gated, or otherwise inaccessible content is outside its scope.

##### Does it return posts or member lists?

No. It returns group-level data. Posts, comments, full member lists, administrator lists, and actions inside groups are outside its scope.

##### What happens when Maximum groups is empty?

The Actor keeps all available results until the source is exhausted. It does not promise a fixed number of groups.

##### Can one run search several keywords?

Yes. Add a simple list of topical keywords. Each keyword is searched separately, and each saved row keeps the keyword that first produced it.

### 📝 Changelog

**v0.0** (23-09-2026)

- Initial release.

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~facebook-groups-search-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Facebook Group Profile Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper): Enrich a known group URL with public profile metadata.
- [WhatsApp Group Links Scraper](https://apify.com/maximedupre/whatsapp-group-links): Find public WhatsApp group invite links for the same topic on another network.
- [Facebook Groups Search Scraper](https://apify.com/easyapi/facebook-groups-search-scraper): Run a separate keyword-based Facebook group search.
- [Facebook Groups Search Scraper (members, privacy, no login)](https://apify.com/datahamster/facebook-groups-search): Try a Facebook group search focused on member and privacy details.
- [Facebook Groups Search Scraper](https://apify.com/fetch_cat/facebook-groups-search-scraper): Compare another public Facebook group search for a related workflow.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `findGroupsBy` (type: `string`):

Choose Keywords to search for groups, or Group URLs to enrich known public groups.

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

One or more topical keywords to search. Each keyword is searched separately, and every result keeps its keyword.

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

Optional place name to add to the keyword search, such as Austin or Canada.

## `minMembers` (type: `integer`):

Keep keyword matches with at least this many members. Leave it empty to skip this lower bound.

## `maxMembers` (type: `integer`):

Keep keyword matches with at most this many members. Leave it empty to skip this upper bound.

## `groupUrls` (type: `array`):

One or more public Facebook group URLs to enrich with the group's name, canonical URL, identifier, and available public metadata.

## `maxResults` (type: `integer`):

Stop after keeping this many groups from the selected method. Leave it empty to keep all available results until the source is exhausted.

## `trackChanges` (type: `boolean`):

When true, compare this input with earlier runs. Return new groups and groups whose public member size or visibility changed, and skip unchanged groups. When false or omitted, return the current matches.

## Actor input object example

```json
{
  "findGroupsBy": "keywords",
  "keywords": [
    "photography"
  ],
  "maxResults": 2,
  "trackChanges": false
}
```

# Actor output Schema

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

Open the saved Facebook group results.

# 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 = {
    "findGroupsBy": "keywords",
    "keywords": [
        "photography"
    ],
    "maxResults": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/facebook-groups-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 = {
    "findGroupsBy": "keywords",
    "keywords": ["photography"],
    "maxResults": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/facebook-groups-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 '{
  "findGroupsBy": "keywords",
  "keywords": [
    "photography"
  ],
  "maxResults": 2
}' |
apify call maximedupre/facebook-groups-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/facebook-groups-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/qrradaLy5iM0fzNDk/builds/zMej8IwCAtx7gWxkb/openapi.json
