# Facebook Group Posts Scraper - Public Feed Export (`scrapingmonkey/facebook-group-posts-scraper`) Actor

Collect public Facebook group posts with pagination. Export text, authors, engagement, reaction breakdowns, media links and group context in one row per post.

- **URL**: https://apify.com/scrapingmonkey/facebook-group-posts-scraper.md
- **Developed by:** [ScrapingMonkey](https://apify.com/scrapingmonkey) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

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?

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

Collect posts from accessible public Facebook groups and keep every post with its author, media and group context. **Facebook Group Posts Scraper** accepts group URLs, vanity names or numeric IDs and returns one row per new post found in each group's page sequence.

Use the results for topic research, content indexing or community reporting. Multi-image and video attachments stay with the post as aligned lists in one table; the JSON export uses the same flat column names.

| At a glance | Details |
|---|---|
| 📥 Input | Group IDs, vanity names or full group URLs |
| 📤 Output | Post text, author, visible counts, reactions, media and group context |
| 📄 Pagination | `pagesPerGroup`, from 1 to 100; default 1 |
| 🔐 Facebook login | Not required |
| 💾 Delivery | One post per row in a single table with matching JSON |

### What the Facebook group posts scraper collects 📝

The Actor reads posts returned in the accessible discussion feed. Rows can include text, publication time, author identity, reaction breakdowns, engagement counts, media references and pinned or sponsored flags.

Each post retains source-group identity, privacy and membership context. Photos and videos include the fields Facebook exposes; several attachments still belong to a single result. Comment counts are included, but comment bodies are not collected.

### How to scrape Facebook group posts 🚀

1. Enter one or more group IDs, vanity names or URLs.
2. Set `pagesPerGroup` to the maximum number of feed pages to attempt.
3. Start the Actor and review each post row.
4. Export the dataset or send selected links to another workflow.

```json
{"inputList":["Python"],"pagesPerGroup":2}
```

Use groups whose discussion content is publicly accessible. A valid group address alone does not guarantee access to its posts.

### Group post data fields and output 📦

| Field group | Included data |
|---|---|
| Post identity | IDs, URL, type, text, publication time and feedback reference |
| Engagement | Reactions, comments, shares, views and reaction-type breakdowns |
| Author | Public identity, Page ID, name, link, picture and verification flag |
| Media | Photo and video links, thumbnails, dimensions, duration, captions and available playback references |
| Post state | Pinned and sponsored flags |
| Source group | Group ID, name, URL, privacy and member-count context |

Complete illustrative success row. This two-photo post demonstrates every current column without claiming a live result:

```json
{
  "input": "harborartists",
  "status": "success",
  "id": "678901234567890",
  "story_id": "U3Rvcnk6Njc4OTAxMjM0NTY3ODkw",
  "url": "https://www.facebook.com/groups/harborartists/posts/678901234567890/",
  "type": "carousel",
  "message": "A look inside our weekend printmaking workshop. Which technique would you like to try next?",
  "timestamp": 1788703200,
  "published_at": "2026-09-06T14:00:00Z",
  "reactions_count": 15,
  "comments_count": 4,
  "shares_count": 2,
  "views_count": 0,
  "image_url": "https://images.example.com/printmaking-workshop.jpg",
  "thumbnail_url": "https://images.example.com/printmaking-workshop.jpg",
  "video_url": "",
  "feedback_id": "ZmVlZGJhY2s6Njc4OTAxMjM0NTY3ODkw",
  "is_sponsored": false,
  "is_pinned": false,
  "author.id": "100200300400500",
  "author.page_id": "100200300400500",
  "author.username": "harborartscollective",
  "author.name": "Harbor Arts Collective",
  "author.url": "https://www.facebook.com/harborartscollective/",
  "author.profile_picture_url": "https://images.example.com/harbor-arts.jpg",
  "author.is_verified": false,
  "reactions.id": [
    "1635855486666999",
    "1678524932434102"
  ],
  "reactions.type": [
    "Like",
    "Love"
  ],
  "reactions.count": [
    12,
    3
  ],
  "media.id": [
    "567012345678902",
    "567012345678903"
  ],
  "media.type": [
    "photo",
    "photo"
  ],
  "media.url": [
    "https://www.facebook.com/photo/?fbid=567012345678902",
    "https://www.facebook.com/photo/?fbid=567012345678903"
  ],
  "media.image_url": [
    "https://images.example.com/printmaking-workshop.jpg",
    "https://images.example.com/finished-prints.jpg"
  ],
  "media.thumbnail_url": [
    "https://images.example.com/printmaking-workshop.jpg",
    "https://images.example.com/finished-prints.jpg"
  ],
  "media.video_url_hd": [
    "",
    ""
  ],
  "media.video_url_sd": [
    "",
    ""
  ],
  "media.dash_manifest_url": [
    "",
    ""
  ],
  "media.dash_manifest": [
    "",
    ""
  ],
  "media.duration_ms": [
    0,
    0
  ],
  "media.width": [
    1200,
    1200
  ],
  "media.height": [
    800,
    800
  ],
  "media.alt_text": [
    "Participants making prints at a workshop",
    "A display of completed prints"
  ],
  "media.captions_url": [
    "",
    ""
  ],
  "source_group.id": "457660044251817",
  "source_group.username": "harborartists",
  "source_group.name": "Harbor Artists Community",
  "source_group.url": "https://www.facebook.com/groups/harborartists/",
  "source_group.profile_picture_url": "https://images.example.com/harbor-artists.jpg",
  "source_group.privacy": "Public group",
  "source_group.members_count": 8400,
  "source_group.members_text": "8.4K members"
}
```

Dotted keys such as `author.name` and `media.image_url` are literal column names in JSON and the table. Matching positions in all `media.*` lists describe the same attachment. Missing item fields keep their place, empty lists remain `[]`, and nested lists retain their dimensions.

Source defaults such as empty strings, `0` and `false` are preserved on success. Missing or empty objects become `null`. A failed row keeps `input`, sets `status` to `failed` and leaves post-data columns `null`. Counts on successful rows can still be missing or defaulted.

### Input requirements and feed coverage ⚙️

| Parameter | Type | Required | Default and limits |
|---|---|---|---|
| `inputList` | Array of strings | Yes | At least one group target; no configured item-count maximum |
| `pagesPerGroup` | Integer | No | Default `1`; minimum `1`, maximum `100` |

Bare names or IDs accept letters, digits, dots, underscores and hyphens, up to 100 characters. Full URLs must identify a group under `/groups/` on a supported Facebook host.

The initial feed page counts as page 1. Collection follows new continuation cursors while pages remain available and the limit has not been reached. There is no fixed number of posts per page and no date or sort input. Post IDs are deduplicated within each group's page sequence; requested pages do not guarantee a complete history.

### Facebook group post use cases 🎯

#### Community topic research

Collect public text and dates to study recurring themes or questions in selected groups.

#### Content monitoring

Revisit a group feed to review newly returned posts, visible engagement and source-group context.

#### Public content search

Index post IDs, links, authors and text in a searchable database while retaining the original group input.

#### Media review workflows

Send media links and descriptive fields to an authorized review process without separating attachments from their parent post.

### Pricing and billable post rows 💰

See the Actor's **Pricing** tab for the current model and rate. Under dataset-item pricing, each saved post row can count as a billable result, and failed rows can count too.

More pages can yield more posts. Several attachments or reaction types do not create extra rows. Invalid or unavailable groups, an empty first page or a page that exhausts retries can save a failed row; automatic retry attempts do not independently add rows.

### Facebook group posts API and integrations 🔌

Use the Actor ID shown in its API tab for `$ACTOR_ID`, and your Apify token for `$APIFY_TOKEN`.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["Python"],"pagesPerGroup":2}'
```

Connect scheduled runs to a spreadsheet, database or reporting application. Completion webhooks can hand the dataset to Make, Zapier or your own processing service.

### Reliability and feed limits ⚠️

Facebook determines public feed availability and ordering. A visible group overview does not guarantee an accessible feed, and private discussions are outside this Actor's coverage. Counts and media fields can be missing even on a successful post.

Temporary failures are retried. A later page failure does not remove rows already saved, while an empty later page adds no placeholder posts. Media links can expire; startup or storage failures can interrupt the whole run.

### Frequently asked questions ❓

#### Can I request an exact number of posts?

No. Choose pages with `pagesPerGroup`; the number of new posts on each page depends on Facebook.

#### Does a post with multiple photos produce multiple rows?

No. One post remains one row, with the attachment fields stored in matching ordered lists.

#### Are comment texts included?

No. Use Facebook Post Comments Scraper with selected post URLs when you need comment content.

#### Does it work with private groups?

It does not provide access to private discussions. Only posts exposed in the public response can be returned.

#### Why can a group produce a failed row after some successes?

A later page can remain unavailable after retries. Previously saved posts stay in the dataset, and the failed row keeps the group input visible.

### Support, responsible use, and related actors 🛟

Share the run ID, a safe public group target and `pagesPerGroup` when reporting an issue. Do not send credentials or private group content.

Use collected public content in accordance with applicable privacy, copyright and platform requirements.

# Actor input Schema

## `inputList` (type: `array`):

Add one Facebook Group ID, vanity name or full Group URL per item. Every input produces success or failed output.

## `pagesPerGroup` (type: `integer`):

Maximum number of result pages to request for each input.

## Actor input object example

```json
{
  "inputList": [
    "Python"
  ],
  "pagesPerGroup": 1
}
```

# Actor output Schema

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

Actor dataset results with input and status columns.

# 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 = {
    "inputList": [
        "Python"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapingmonkey/facebook-group-posts-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 = { "inputList": ["Python"] }

# Run the Actor and wait for it to finish
run = client.actor("scrapingmonkey/facebook-group-posts-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 '{
  "inputList": [
    "Python"
  ]
}' |
apify call scrapingmonkey/facebook-group-posts-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrapingmonkey/facebook-group-posts-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/ykaaDNHXaaB69V1xS/builds/VNMncowiprGJmuKf7/openapi.json
