# Facebook Groups Scraper - Posts, Reactions & Authors (`eiv/facebook-groups-scraper`) Actor

Scrape posts from public Facebook groups by URL, name or ID: text, date, author with group badges, reactions by type, comments, shares, top comments, photos with image descriptions, videos, links and buy-and-sell listings. Free date filter. No login, no cookies.

- **URL**: https://apify.com/eiv/facebook-groups-scraper.md
- **Developed by:** [Eimantas V](https://apify.com/eiv) (community)
- **Features:** Limited permissions
- **Stats:** 3 total users, 0 monthly users, 96.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.70 / 1,000 post scrapeds

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 Groups Scraper** extracts posts from public **Facebook groups**. Paste group links, names or IDs, get one row per post with its text, date, author and group badges, reactions by type, comment and share counts, the top comments, photos with Facebook's image descriptions, videos, link previews and buy and sell listings. No login, no cookies, no browser, from **$2.70 per 1,000 posts**.

```json
{
    "postId": "2455812974827669",
    "url": "https://www.facebook.com/groups/dataminers/posts/2455812974827669/",
    "date": "2026-10-27T10:22:44.000Z",
    "text": "I built this scraper as a practice project. Any feedback on my performance and how to make it more efficient would be highly appreciated! ...",
    "authorName": "Youssef I.",
    "reactionCount": 2,
    "reactions": { "like": 1, "love": 1, "care": 0, "haha": 0, "wow": 0, "sad": 0, "angry": 0 },
    "commentCount": 8,
    "topComments": [{ "text": "use xpaths instead of css selectors ...", "reactionCount": 1, "replyCount": 3 }],
    "mediaType": "album",
    "photoCount": 3,
    "imageDescriptions": ["May be an image of text", "May be an image of text", "May be an image of text"],
    "groupName": "Web Scraping World"
}
```

**90 posts from 3 groups in 21 seconds, 50 posts from one group in 15 seconds: no login, no browser.**

### What does Facebook Groups Scraper do?

It reads a public group's feed the way Facebook's own website loads it for a visitor who is not logged in, and returns every post as a clean row you can export or feed to other tools. Choose the group's own sort order (new posts, newest activity, most relevant, or buy and sell listings), limit by date, and get exact reaction counts by type, the comments Facebook highlights under each post, and all the media.

- **Every way to name a group.** Group URLs with a name or an ID, group share links (facebook.com/share/g/...), group post URLs (their group is scraped), or bare names and IDs. Inputs written for apify/facebook-groups-scraper (`startUrls`, `resultsLimit`, `viewOption`, `onlyPostsNewerThan`) work unchanged.
- **More than text.** Reactions split into like, love, care, haha, wow, sad and angry; comment and share counts; author badges such as Admin, Moderator and Top contributor; hashtags, mentions and links in the text.
- **All the media.** Photos and albums with Facebook's automatic image descriptions ("May be an image of text"), videos with a direct file link, length and thumbnail, link previews with title, description and site, reshared posts, and buy and sell listings with title and price.
- **Top comments included.** The 1-2 comments Facebook shows under each post, with author, date, reactions and replies, at no extra cost.
- **Free date filter.** "Only posts published after" a date reads new posts and stops at the first older one, so you never pay for old posts (and pay nothing extra for the filter).
- **Only pay for results.** Groups that are private, deleted or cannot be read return an error row and are never charged.
- **Built for automation.** Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets or an AI agent through Apify's MCP server.

### Why it is fast and cheap

There is no browser to start. The Actor calls the same feed endpoint Facebook's website uses for logged-out visitors, three posts per request, and reads only the part of each answer that holds the posts. Facebook answers group feeds only to residential addresses, so the Actor uses Apify's residential proxy by default, moves to a fresh address whenever Facebook refuses one, and includes that traffic in the price per post.

### What data can you extract from Facebook groups?

| Field | Example | What it is |
|---|---|---|
| `postId`, `url` | `2455812974827669` | The post's ID and permalink |
| `date` | `2026-10-27T10:22:44.000Z` | When it was published, ISO 8601 UTC |
| `text` | `I built this scraper as a practice project...` | The post's full text |
| `authorName`, `authorId`, `authorUrl`, `authorPictureUrl` | `Youssef I.` | Who posted (a member or a Page) |
| `authorBadges` | `["Moderator"]` | Group roles and badges shown next to the name |
| `isAnonymous` | `false` | Posted anonymously |
| `reactionCount`, `reactions` | `2`, `{ "like": 1, "love": 1, ... }` | All reactions, and exact counts by type |
| `commentCount`, `shareCount` | `8`, `0` | Comments and shares |
| `topComments` | `[{ "text": "...", "replyCount": 3 }]` | The 1-2 comments shown in the feed, with author, date, reactions and replies |
| `mediaType` | `album` | text, photo, album, video, link, listing, shared_post, unavailable |
| `imageUrls`, `imageDescriptions`, `photoCount` | `["https://scontent..."]` | Photos and Facebook's descriptions of them |
| `videoUrl`, `videoThumbnailUrl`, `videoDurationSecs` | `470.6` | Video file, preview image and length |
| `linkUrl`, `linkTitle`, `linkDescription`, `linkDomain` | `chatgpt.com` | The page a link post shares |
| `listingTitle`, `listingPrice` | `2023 Nissan Pathfinder`, `$35,000` | Buy and sell posts |
| `sharedPostUrl` | `https://www.facebook.com/groups/.../posts/...` | The post this one reshares |
| `hashtags`, `mentions`, `links` | `["python"]` | Hashtags, tagged people and Pages, and web addresses in the text |
| `groupId`, `groupName`, `groupUrl` | `Web Scraping World` | The group |
| `position`, `sortOrder` | `1`, `NEW_POSTS` | Rank in the feed order it was read in |
| `feedbackId` | `ZmVlZGJhY2s6...` | Facebook's feedback ID of the post, for comment tools |
| `input`, `scrapedAt` | | The group exactly as you entered it, and when the run started |

### How to scrape Facebook groups

1. Click **Try for free** and paste group links, names or IDs into **Facebook groups**, one per line.
2. Set **Posts per group** and **Max posts in total**. You pay per post, so these are also your cost cap.
3. Pick the **Post order**, and optionally **Only posts published after** a date. Click **Start**. Each group gives about 3 posts a second; groups run in parallel.
4. Open the **Output** tab, or download the results as JSON, CSV, Excel or HTML.

### How much does it cost to scrape Facebook groups?

You pay per post returned, and the price drops on higher Apify plans:

| Apify plan | Per 1,000 posts |
|---|---|
| Free | $4.00 |
| Starter | $3.00 |
| Scale | $2.75 |
| Business | $2.70 |

- 50 posts from each of 20 groups (1,000 posts) on the Starter plan: **$3.00**.
- Every post of the last 7 days from 100 groups, 4,000 posts on the Business plan: **$10.80**.
- A run also costs **$0.00005** to start. The residential proxy is included. Groups that fail, private groups, duplicates and posts older than your date limit cost nothing.
- The Free plan's $5 monthly credit covers about **1,250 posts**.

### Input

```json
{
    "targets": [
        "https://www.facebook.com/groups/selftaughtprogrammers",
        "https://www.facebook.com/groups/536969943378658",
        "phototipsntricks"
    ],
    "maxPostsPerGroup": 100,
    "maxItems": 1000,
    "sortOrder": "NEW_POSTS",
    "postsNewerThan": "30 days"
}
```

| Field | Default | Notes |
|---|---|---|
| Facebook groups | | Group URLs, share links, group post URLs, names or IDs, one per line. Public groups only |
| Posts per group | 50 | Facebook serves 3 posts per request |
| Max posts in total | 1000 | Across all groups: your cost cap |
| Post order | New posts | New posts, Newest activity, Most relevant, or Buy and sell listings |
| Only posts published after | | A date (2026-01-31) or a period ("7 days"). Reads new posts and stops at the first older one |
| Proxy | Apify residential | Keep it: Facebook refuses group feeds from other addresses |

### Output

Each post is one row in the dataset. The **Overview** view shows the key columns, and the **Engagement**, **Media** and **Authors** views group the rest; every export includes all fields.

```json
{
    "recordType": "post",
    "input": "https://www.facebook.com/groups/dataminers/",
    "postId": "2455812974827669",
    "url": "https://www.facebook.com/groups/dataminers/posts/2455812974827669/",
    "date": "2026-10-27T10:22:44.000Z",
    "text": "I built this scraper as a practice project. Any feedback on my performance and how to make it more efficient would be highly appreciated! ...",
    "authorName": "Youssef I.",
    "authorId": "100035387599739",
    "authorUrl": "https://www.facebook.com/youssef.idrissi.761979",
    "authorPictureUrl": "https://scontent.xx.fbcdn.net/v/t39.30808-1/...",
    "authorBadges": [],
    "isAnonymous": false,
    "reactionCount": 2,
    "reactions": { "like": 1, "love": 1, "care": 0, "haha": 0, "wow": 0, "sad": 0, "angry": 0 },
    "commentCount": 8,
    "shareCount": 0,
    "topComments": [
        {
            "commentId": "2467780646964235",
            "text": "use xpaths instead of css selectors since they are slow ...",
            "date": "2026-10-27T11:10:37.000Z",
            "authorName": "ZippyCaterpillar7816",
            "authorId": "2952914768334...",
            "authorPictureUrl": "https://scontent.xx.fbcdn.net/v/t39.35477-6/...",
            "reactionCount": 1,
            "replyCount": 3,
            "url": "https://www.facebook.com/groups/dataminers/posts/2455812974827669/?comment_id=2467780646964235"
        }
    ],
    "mediaType": "album",
    "imageUrls": ["https://scontent.xx.fbcdn.net/v/t39.30808-6/...jpg", "...", "..."],
    "imageDescriptions": ["May be an image of text", "May be an image of text", "May be an image of text"],
    "photoCount": 3,
    "videoUrl": null,
    "videoThumbnailUrl": null,
    "videoDurationSecs": null,
    "linkUrl": null,
    "linkTitle": null,
    "linkDescription": null,
    "linkDomain": null,
    "listingTitle": null,
    "listingPrice": null,
    "sharedPostUrl": null,
    "hashtags": [],
    "mentions": [],
    "links": [],
    "groupId": "536969943378658",
    "groupName": "Web Scraping World",
    "groupUrl": "https://www.facebook.com/groups/dataminers/",
    "position": 1,
    "sortOrder": "NEW_POSTS",
    "feedbackId": "ZmVlZGJhY2s6MjQ1NTgxMjk3NDgyNzY2OQ==",
    "scrapedAt": "2026-10-29T16:52:14.573Z"
}
```

A group that cannot be read becomes a row with `"recordType": "error"` and an `errorCode` instead of failing the whole run:

| `errorCode` | Meaning |
|---|---|
| `NOT_FOUND` | No public group at this address, or the ID does not exist |
| `NOT_A_GROUP` | The ID belongs to a profile or a Page, not a group |
| `PRIVATE` | The group shows no posts to visitors who are not members (private, or empty) |
| `NO_LISTINGS` | "Buy and sell listings" was chosen but the group shows none |
| `RATE_LIMITED` | Facebook refused every address tried; run the group again later |
| `FACEBOOK_ERROR` | Facebook rejected the request itself (it may have changed its site) |

Error rows are never charged.

### Tips and limits

- **Public groups only.** Private groups show their posts to members only, and this Actor never logs in.
- **Top comments, not all comments.** Facebook shows 1-2 comments per post in the feed. For every comment and reply, feed the post URLs to [Facebook Comments Scraper](https://apify.com/eiv/facebook-comments-scraper).
- **Albums** carry their first few photos in the feed; `photoCount` says how many the album has.
- **Image and video links are temporary** Facebook CDN links: download what you need soon after the run.
- **"Most relevant" and "Newest activity" have no date order**, so a date limit reads new posts instead (the log says so).
- **Hit your spending limit?** The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.

### FAQ

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

This Actor collects only data that Facebook shows publicly to visitors who are not logged in. Posts and comments can still contain personal data, which laws such as the GDPR protect. Scrape personal data only for a legitimate purpose, and ask a lawyer if you are unsure. Facebook is a trademark of Meta Platforms; this Actor is not affiliated with or endorsed by Meta.

#### Do I need a Facebook account or cookies?

No. Nothing is logged in, and no cookies or tokens are needed. That is also why only public groups can be scraped.

#### Can I use it through the API or with Make, Zapier and n8n?

Yes. Every run can be started through the [Apify API](https://docs.apify.com/api/v2) and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the **Integrations** tab. A daily schedule with "Only posts published after" set to "1 day" returns each day's new posts.

#### Can AI agents use it?

Yes. Agents connected to [Apify's MCP server](https://mcp.apify.com) can find and run this Actor as a tool, with the same per-post pricing.

#### Why did I get fewer posts than I asked for?

The group has fewer posts than your limit (or fewer since your date), the run reached your maximum cost per run, or it reached its timeout. The log says which, and nothing collected before that is lost.

### Related scrapers

- [Facebook Comments Scraper](https://apify.com/eiv/facebook-comments-scraper): every comment and reply of the posts you found here, with reactions by type.
- [Facebook Pages Scraper](https://apify.com/eiv/facebook-pages-scraper): emails, phones, followers and ratings of the Pages that post in your groups.
- [Meta Ads Library Scraper](https://apify.com/eiv/meta-ads-library-scraper): the ads a brand runs on Facebook and Instagram.

### Support

Missing a field, or found a group that does not work? Open an issue on the **Issues** tab with the input you used, and it will be looked at quickly.

# Actor input Schema

## `targets` (type: `array`):

One per line. Group URLs (facebook.com/groups/<name or id>), group share links (facebook.com/share/g/...), group post URLs (their group is scraped), or bare group ids or names. Public groups only.

## `startUrls` (type: `array`):

The same groups in the URL-list shape other Actors output (and that apify/facebook-groups-scraper takes), so a previous Actor's results can be fed straight in. Use this or the field above.

## `maxPostsPerGroup` (type: `integer`):

Posts to collect from each group, in the order chosen below. Facebook serves 3 posts per request (about a second), so 300 posts take about 2 minutes per group; groups run in parallel.

## `maxItems` (type: `integer`):

Stop after this many posts across all groups. You pay per post, so this is also your cost cap for the run.

## `sortOrder` (type: `string`):

The order of the group's own sort menu. "New posts" starts with the latest, "Newest activity" with posts that got comments lately, "Most relevant" with Facebook's top posts. "Buy and sell listings" returns only for-sale posts (in buy and sell groups). A date limit below reads new posts.

## `postsNewerThan` (type: `string`):

Optional. Keep only posts published on or after this date, e.g. 2026-01-31 or "7 days" for the last week. Posts are read newest first and each group stops at the first older one, so old posts are neither fetched nor charged. Free, unlike some other group scrapers.

## `proxyConfiguration` (type: `object`):

Keep the default (Apify residential). Facebook answers group feeds only to residential addresses: Apify's own and datacenter addresses are refused on the first request. Residential traffic is included in the price per post.

## `maxConcurrency` (type: `integer`):

How many groups are processed at the same time. Each group's pages are read one after another.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one response before giving up on it (and moving to another address).

## `maxRetries` (type: `integer`):

Retries for failed connections when no proxy is used. With a proxy, a refused or failed request moves to another address instead.

## Actor input object example

```json
{
  "targets": [
    "https://www.facebook.com/groups/387875758242831"
  ],
  "maxPostsPerGroup": 50,
  "maxItems": 1000,
  "sortOrder": "NEW_POSTS",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  },
  "maxConcurrency": 5,
  "requestTimeoutSecs": 30,
  "maxRetries": 2
}
```

# Actor output Schema

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

One row per post (recordType "post"), plus one uncharged row per group that could not be read (recordType "error").

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

Totals for the run: targets, results, failures and why the run stopped.

# 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 = {
    "targets": [
        "https://www.facebook.com/groups/387875758242831"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("eiv/facebook-groups-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 = { "targets": ["https://www.facebook.com/groups/387875758242831"] }

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

```

## MCP server setup

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