# Facebook Group Profile Scraper (`maximedupre/facebook-group-profile-scraper`) Actor

Extract public Facebook group profiles from direct URLs, usernames, or numeric IDs. Get group identity, description, history, activity, membership, visibility, listed administrators, moderators, and rules in structured dataset rows.

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

## Pricing

$2.65 / 1,000 group profiles

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?

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

### 👥 Turn direct Facebook group sources into profile data

Community researchers, moderators, marketers, and developers can use this Facebook group profile scraper to turn direct Facebook group URLs, usernames, or numeric IDs into structured dataset rows. Each saved row includes group identity, public description, history, posting activity, membership, visibility, listed administrators and moderators, and public rules. Use those fields to compare communities or review a group's public profile without copying values by hand.

- Review a group's posting activity and member counts with **[Facebook Group Stats Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper/examples/facebook-group-stats-scraper)**.
- Collect a group's identity, description, history, and visibility with **[Facebook Group Info Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper/examples/facebook-group-info-scraper)**.
- Gather structured profiles from a list of direct sources with **[Facebook Group Data Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper/examples/facebook-group-data-scraper)**.
- Save a public profile for a known group with **[Facebook Group Profile Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper/examples/facebook-group-profile-scraper)**.
- Turn a URL, username, or numeric ID into a dataset row with **[Facebook Group Scraper](https://apify.com/maximedupre/facebook-group-profile-scraper/examples/facebook-group-scraper)**.

#### 📊 Review each group in one structured row

Each saved row is the first eligible occurrence of one submitted group. If the same source group appears again through another URL, username, or ID, the Actor ignores the later match. The row describes the first saved match and does not combine later matches.

Public fields are returned when Facebook exposes them. A missing source field stays unfilled, and an unresolved group does not produce a profile row.

#### ▶️ Run a Facebook group profile check

Choose `Direct group URL`, `Group username`, or `Numeric group ID` in `findGroupsBy`, then add values to the matching list. The other lists are ignored. The Actor reads the public group profile and saves one row for each group it can resolve. It does not discover groups by keyword or collect posts, comments, or member lists.

**Run steps**

1. Choose a source type in `findGroupsBy`.
2. Add one or more values to its matching list.
3. Start the Actor.
4. Open the group profiles in the default dataset.

#### ⚙️ Input

Choose one source type in `findGroupsBy`. Add values to its matching list. The other lists are ignored.

**Input fields**

| Field | Type | What it does |
|---|---|---|
| `findGroupsBy` | string | Selects `url`, `username`, or `id` and chooses which source list to use. |
| `groupUrls` | array of objects | Adds one or more direct public Facebook group URL objects. Use this when `findGroupsBy` is `url`. |
| `groupUrls[].url` | string | Holds one direct public Facebook group URL. |
| `groupUsernames` | array of strings | Adds one or more Facebook group usernames without `@`. Use this when `findGroupsBy` is `username`. |
| `groupIds` | array of strings | Adds one or more numeric Facebook group IDs. Keep each ID as a full number. Use this when `findGroupsBy` is `id`. |

**Example input**

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

```json
{
  "findGroupsBy": "url",
  "groupUrls": [
    {
      "url": "https://www.facebook.com/groups/1010440649638729"
    }
  ]
}
```

The example uses URL mode. For another source type, change `findGroupsBy` and fill the matching list.

#### 🧾 Output

**Run output**

| Field | Type | What it does |
|---|---|---|
| `dataset` | string | Opens the group profile rows from this run. |

**Group profile row**

The default dataset has one group profile row shape. `identity` is required. Other fields may be omitted when Facebook does not expose them, and arrays may be empty.

| Field | Type | What it does |
|---|---|---|
| `identity` | object | Holds the stable group identity and resolved public link. |
| `identity.groupId` | string | Gives Facebook's stable group ID. |
| `identity.name` | string | Gives the group name shown by Facebook. |
| `identity.url` | string | Gives the resolved public group URL. |
| `identity.username` | string | Gives the group username shown by Facebook, without `@`, when available. |
| `description` | string | Gives the public group description shown by Facebook. |
| `history` | object | Holds creation and history details shown by Facebook. |
| `history.createdAt` | string | Gives the group creation date in date form when it can be read exactly. |
| `history.summary` | string | Gives public history text shown by Facebook. |
| `postingActivity` | object | Holds daily and monthly posting activity. |
| `postingActivity.postsPerDay` | number | Gives the normalized daily post count from Facebook's displayed value. |
| `postingActivity.postsPerDayDisplay` | string | Gives the daily posting value as Facebook displays it. |
| `postingActivity.postsPerMonth` | number | Gives the normalized monthly post count from Facebook's displayed value. |
| `postingActivity.postsPerMonthDisplay` | string | Gives the monthly posting value as Facebook displays it. |
| `membership` | object | Holds member count and recent member growth. |
| `membership.memberCount` | integer | Gives the normalized member count from Facebook's displayed value. |
| `membership.memberCountDisplay` | string | Gives the member count as Facebook displays it. |
| `membership.recentMemberGrowth` | object | Holds the recent member-growth value. |
| `membership.recentMemberGrowth.count` | integer | Gives the normalized number of new members in the stated period. |
| `membership.recentMemberGrowth.period` | string | Gives the period used by Facebook for the growth value. |
| `membership.recentMemberGrowth.display` | string | Gives the recent growth value as Facebook displays it. |
| `visibility` | object | Holds the group's privacy and discoverability status. |
| `visibility.privacy` | string | Gives the group privacy status shown by Facebook. |
| `visibility.discoverability` | string | Gives the group discoverability status shown by Facebook. |
| `administrators` | array of objects | Lists administrators that Facebook shows for the group. |
| `administrators[].name` | string | Gives an administrator name shown by Facebook. |
| `administrators[].profileUrl` | string | Gives an administrator's public Facebook profile link. |
| `moderators` | array of objects | Lists moderators that Facebook shows for the group. |
| `moderators[].name` | string | Gives a moderator name shown by Facebook. |
| `moderators[].profileUrl` | string | Gives a moderator's public Facebook profile link. |
| `rules` | array of objects | Lists rules or guidelines that Facebook shows for the group. |
| `rules[].title` | string | Gives a rule title when Facebook shows one. |
| `rules[].text` | string | Gives the public rule text shown by Facebook. |

**Example group profile row**

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

```json
{
  "identity": {
    "groupId": "506273379443089",
    "name": "OFFRO CASA - AFFITTO ALLOGGI & STANZE X STUDENTI - TORINO",
    "url": "https://www.facebook.com/groups/OFFROCASA/",
    "username": "OFFROCASA"
  },
  "description": "> Dal 2012 sempre dalla parte degli studenti e dei privati <\nOggi probabilmente l’ultimo gruppo torinese di affiti non svenduto a compagnie. \n\nLeggete bene le regole prima di richiedere l’iscrizione, la quale sarà istantanea se vi iscrivete prima dal gruppo gemello CERCO. E fate i bravi una volta dentro.\nMettete LIKE qui se trovate casa/inquilino grazie a questo gruppo! (41)\n\n> WELCOME INTERNATIONALS! Group rules in English in first comment here. Like this post if you find your accomodation thanks to this group!",
  "history": {
    "createdAt": "2013-07-18",
    "summary": "Group created on July 18, 2013. Name last changed on February 12, 2018."
  },
  "postingActivity": {
    "postsPerDay": 20,
    "postsPerDayDisplay": "20",
    "postsPerMonth": 541,
    "postsPerMonthDisplay": "541"
  },
  "membership": {
    "memberCountDisplay": "43,351 total members",
    "memberCount": 43351,
    "recentMemberGrowth": {
      "display": "No new members in the last week",
      "count": 0,
      "period": "last week"
    }
  },
  "visibility": {
    "privacy": "Public group",
    "discoverability": "Visible"
  },
  "administrators": [
    {
      "name": "Alessandro Nince",
      "profileUrl": "https://www.facebook.com/profile.php?id=629158103"
    }
  ],
  "rules": [
    {
      "text": "Can't have rules in multiple languages. Google Translator works just fine for English. Erasmus this group was born for you! Good luck!",
      "title": "SORRY NON ITALIAN SPEAKERS!"
    },
    {
      "text": "Gruppo dedicato ad annunci di chi OFFRE in AFFITTO STANZE ed APPARTAMENTI per STUDENTI UNIVERSITARI a TORINO. NO annunci CERCO (vedere gruppo gemello). NO altre città, NO vendite, NO mobili e oggetti",
      "title": "Esclusivamente per chi OFFRE, ALLOGGI, a TORINO"
    },
    {
      "text": "Solo individui privati. NO attività commerciali, NO spam, NO housing websites o agenzie immobiliari. Questi non saranno accettati nel gruppo.",
      "title": "Esclusivamente per PRIVATI: NO AGENZIE o ATTIVITÀ"
    },
    {
      "text": "NO post ri-condivisi, NO post che rimandano a gruppi terzi. NO ups. Manteniamo la ricerca facile per il bene di tutti.",
      "title": "MASSIMO 1 POST a SETTIMANA per alloggio/persona"
    },
    {
      "text": "Esiste un gruppo gemello\nwww.facebook.com/groups/CERCOCASATORINO per gli annunci di tipo CERCO, qui quelli NON sono i benvenuti (scarsissimo successo poi). Approvazione automatica per chi è già di là",
      "title": "C'è GRUPPO GEMELLO per annunci di tipo CERCO"
    },
    {
      "text": "La SPAM, gli annunci sospetti, MULTIPLI, off-topic o che rimandano ad AGENZIE immobiliari o gruppi terzi VANNO SEGNALATI all'amministratore che provvederà a ripulire.",
      "title": "SEGNALARE agli admin la SPAM e i FUORI LUOGO"
    },
    {
      "text": "Chi non rispetta le regole del gruppo viene espulso alla velocità della luce e bloccato perennemente. Con troppi spammatori non si può fare altrimenti. Avvisati.",
      "title": "TOLLERANZA 0: sgarri 1 volta SEI FUORI per SEMPRE"
    },
    {
      "text": "Se hai trovato il tuo alloggio, o inquilino, grazie a questo gruppo, per favore metti MI PIACE al primo post fissato in alto (in \"Comunicazioni\")! Serve per fare un po' di statistica. GRAZIE!",
      "title": "LIKE al 1° post se trovi il tuo alloggio/inqulino"
    }
  ]
}
```

#### 💳 Pricing

**How charges work**

This Actor uses pay-per-event pricing. A `Group profile` event is charged for each public group profile saved to the dataset. The current price is shown in the Store pricing panel.

#### 🔌 Integrations

Start the Actor with the Apify API, then read the default dataset or export its rows as JSON, CSV, Excel, or XML. The structured dataset can also be used in your own scripts or data workflow.

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

#### ❓ FAQ

##### Why is the same group saved only once?

The Actor saves the first eligible occurrence of a source group. If another submitted URL, username, or ID points to that group later, the later match is ignored, and the saved row reflects only the first match.

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

The field is left unfilled rather than guessed. Arrays such as `administrators`, `moderators`, and `rules` may be empty when the public page does not expose matching data.

##### Can it profile private groups?

It reads publicly reachable group pages only. Private, member-only, or login-gated content is outside scope, so an inaccessible group may produce no row and unavailable fields are not invented.

##### Does it return posts, comments, or members?

No. It returns group-level profile data. Posts, comments, and full member lists are outside its scope.

##### What can I submit?

Choose a direct Facebook group URL, a group username, or a numeric group ID. The selected source list accepts one or more values, and only that list is used.

##### Can I submit several groups in one run?

Yes. Add several values to the selected list. The Actor handles each submitted source and saves a profile for each group it can resolve.

##### What are the normalized activity and membership values?

`postingActivity.postsPerDay` and `postsPerMonth` are numeric versions of Facebook's displayed posting values. `membership.memberCount` and `recentMemberGrowth.count` are numeric versions when the source value can be read; the matching display fields preserve what Facebook shows.

##### Does it need a Facebook login or developer API key?

No. It reads publicly reachable group pages without requiring a Facebook login or developer API key.

##### Does it find groups from a keyword?

No. This Actor profiles groups you submit directly. It does not search a directory or discover groups by keyword.

##### What can I do with the administrators and moderators fields?

They contain names and public profile URLs that Facebook lists for the group. They are not private contact details.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

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

### 🔗 Related Actors

- [Facebook User Posts Scraper](https://apify.com/maximedupre/facebook-user-posts-scraper). Collect public posts from related Facebook profiles or Pages for follow-up research.
- [Facebook Group Profile Scraper 📊](https://apify.com/easyapi/facebook-group-profile-scraper). Compare another public group-profile data source when you need a second extraction.
- [Facebook Group Post Scraper](https://apify.com/scraper-engine/facebook-group-post-scraper). Collect posts and engagement from a group after profiling it.
- [Facebook Groups Search Scraper With Member Filters](https://apify.com/api-empire/facebook-groups-search-scraper). Discover groups by keyword and member count before sending direct sources here.
- [Facebook Url To Id Scraper](https://apify.com/scraper-engine/facebook-url-to-id). Convert a Facebook group URL to a numeric ID before matching or storing profiles.

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

# Actor input Schema

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

Choose how you will provide the public Facebook groups. Add values only to the matching list; other lists are ignored.

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

Add one or more direct URLs for public Facebook groups. The Actor saves a profile for each group it can resolve.

## `groupUsernames` (type: `array`):

Add one or more Facebook group usernames without the @ sign. The Actor saves a profile for each group it can resolve.

## `groupIds` (type: `array`):

Add one or more numeric Facebook group IDs. Keep each ID as a full number. The Actor saves a profile for each group it can resolve.

## Actor input object example

```json
{
  "findGroupsBy": "url",
  "groupUrls": [
    {
      "url": "https://www.facebook.com/groups/1010440649638729"
    }
  ]
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the group profile rows from this run.

# 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": "url",
    "groupUrls": [
        {
            "url": "https://www.facebook.com/groups/1010440649638729"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/facebook-group-profile-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": "url",
    "groupUrls": [{ "url": "https://www.facebook.com/groups/1010440649638729" }],
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/facebook-group-profile-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": "url",
  "groupUrls": [
    {
      "url": "https://www.facebook.com/groups/1010440649638729"
    }
  ]
}' |
apify call maximedupre/facebook-group-profile-scraper --silent --output-dataset

```

## MCP server setup

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