# Facebook Groups Scraper - Public Group Posts, No Login (`benthepythondev/facebook-groups-scraper`) Actor

Returns the posts of public Facebook groups: text, author, date, reactions, comments, shares, pictures, video and link of every post, newest first or by activity. Works from group links, ids or names, with a date limit and an only-new mode for monitoring. No login, no cookies, no browser.

- **URL**: https://apify.com/benthepythondev/facebook-groups-scraper.md
- **Developed by:** [Ben](https://apify.com/benthepythondev) (community)
- **Categories:** Social media, Marketing, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.40 / 1,000 posts

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

Returns the posts of public Facebook groups without a login, a cookie or a browser. Enter group links, ids or names and get one row per post: text, author, date, reactions by kind, comments, shares, pictures, video and link. Read a group newest first, stop at a date, or run it on a schedule and receive only the posts that are new.

**Price:** $4.00 per 1,000 posts on the Apify Free plan, down to $3.40 from the Gold plan up. A private or unknown group costs nothing. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the Facebook Groups Scraper?

A public group shows its posts to any visitor, three at a time, while you scroll. This Actor makes the same requests the group page makes and reads several groups side by side: 420 posts from seven groups in 100 seconds. Your own Facebook account is never involved, so nothing can happen to it.

#### What data does it extract?

- **Post:** id, link, text, publication time, and its type (video, photo, link, event, share or text)
- **Author:** name, id, profile or page link where Facebook shows it to visitors, and the badge on the post (admin, moderator, group expert, top contributor)
- **Engagement:** reactions in total and by kind (like, love, care, haha, wow, sad, angry), comments, shares, video views
- **Media:** every picture, the video file with its length, a preview picture, and the outside link of a link post with its headline
- **Shares:** the link, author and text of the post that was shared
- **Group:** id, name and link on every row

#### How it reads the site

The Actor does not open a browser. It sends the group page's own data requests directly, so a run needs 512 MB of memory instead of the gigabytes a browser takes, and several groups are read side by side. A private group is reported as private and costs nothing. With a date limit the read stops at the first older post, so older posts are neither fetched nor charged.

### ⬇️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `groups` | array | | Links of public groups, group ids, or the name in the group's link. An empty input reads a sample group |
| `maxResults` | integer | 15 | Posts to save per group, up to 2,000 |
| `sortBy` | string | `newest` | `newest`, `recent_activity` (posts with new comments first) or `top` (Facebook's selection) |
| `postedAfter` | string | empty | Stop each group at the first post older than this day (YYYY-MM-DD) or this period back from now (`3 days`, `2 weeks`) |
| `onlyNewPosts` | boolean | false | Skip every post an earlier run with the same monitor name delivered |
| `monitorId` | string | empty | Name of that memory |

#### Example input

The latest 100 posts of three groups:

```json
{
  "groups": [
    "https://www.facebook.com/groups/aldiaisleofshame",
    "https://www.facebook.com/groups/instantpotcommunity",
    "TampaBayTeslaClub"
  ],
  "maxResults": 100
}
```

Everything posted in a group since October 1:

```json
{
  "groups": ["https://www.facebook.com/groups/aldiaisleofshame"],
  "postedAfter": "2026-10-01",
  "maxResults": 2000
}
```

A daily watch that delivers only new posts:

```json
{
  "groups": ["TampaBayTeslaClub", "beginshopify"],
  "maxResults": 60,
  "onlyNewPosts": true,
  "monitorId": "my-groups"
}
```

The input names `startUrls`, `resultsLimit` and `onlyPostsNewerThan` of other Facebook group Actors are read as well, so an input written for one of them runs here unchanged.

### ⬆️ Output

One row per post. A link post by an organisation's page in a public group (the preview picture's link is shortened here):

```json
{
  "postId": "2039439090039661",
  "url": "https://www.facebook.com/groups/TampaBayTeslaClub/posts/2039439090039661/",
  "groupId": "108780073105582",
  "groupName": "Tampa Bay Tesla Club",
  "groupUrl": "https://www.facebook.com/groups/TampaBayTeslaClub/",
  "type": "link",
  "text": "More investment into AI",
  "title": "Tesla lines up $30 billion credit lines as capex, AI push accelerate",
  "createdAt": "2026-09-30T11:24:50+00:00",
  "authorName": "TeslaOwners",
  "authorId": "100063553391836",
  "authorUrl": "https://www.facebook.com/teslaownersnorthamerica",
  "authorBadge": null,
  "reactions": 1,
  "reactionCounts": { "like": 1 },
  "comments": 0,
  "shares": 0,
  "videoViews": null,
  "imageUrls": [],
  "videoUrl": null,
  "videoSeconds": null,
  "thumbnailUrl": "https://external-atl3-2.xx.fbcdn.net/emg1/v/t13/5108632857337792250?url=https%3A%2F%2Fwww.reuters.com%2Fresizer%2Fv2%2FAYJCA56K6BLSXHLQZYEGI2ADIE.jpg…",
  "linkUrl": "https://www.reuters.com/business/autos-transportation/tesla-lines-up-30-billion-credit-lines-capex-robotaxi-push-accelerate-2026-09-29/",
  "isShare": false,
  "sharedPost": null,
  "position": 31,
  "scrapedAt": "2026-10-04T08:59:43.262182+00:00"
}
```

A link post fills `title` with the headline; a share fills `sharedPost` with the link, author and text of the original post. `position` is the post's place in the group's feed in the chosen order. The run also writes a `SUMMARY` record that names the groups that were private, unknown or empty and the reason a run stopped.

### 💰 What a run costs

| Apify plan | Per 1,000 posts |
|---|---|
| Free | $4.00 |
| Bronze | $3.80 |
| Silver | $3.60 |
| Gold, Platinum, Diamond | $3.40 |

Apify's standard start event ($0.00005) is the only other charge; proxies are included. Not charged: a private group, a group that does not exist, a post already delivered in only-new mode, and posts older than your date limit. Set the run's maximum charge and the Actor stops at it with the rows it has saved.

### ⏱️ Measured on Apify (October 4, 2026)

| Run | Posts | Time |
|---|---|---|
| Empty input (sample group) | 15 | 14 s |
| Seven public groups, 60 posts each, plus one private and one unknown group | 420 | 100 s |
| One busy group, everything since the day before | 77 | 33 s |
| Only-new watch on one group, second run | 0 new of 40 | 6 s |

All at 512 MB. An aborted and resumed run of 270 posts saved no post twice.

### 🔔 Watching groups for new posts

Turn on `onlyNewPosts`, give the watch a `monitorId` and put the run on a schedule. The first run delivers the latest posts up to `maxResults`. Later runs read each group from its newest post and stop when they reach posts they have already delivered, so a quiet group costs nothing. The memory is a key-value store named `facebook-groups-monitor` in your own account; delete a record there to start a watch over.

### 🤖 For AI agents

Smallest useful call:

```json
{"groups": ["https://www.facebook.com/groups/aldiaisleofshame"], "maxResults": 30}
```

Each row is one post with `text`, `createdAt`, `type`, `authorName`, `reactions`, `reactionCounts`, `comments`, `shares`, `imageUrls`, `videoUrl`, `linkUrl` and `url`. `groups` takes several entries at once. A private or unknown group returns no rows; the status message and the `SUMMARY` record name it. No credentials are needed.

### 💡 Use cases

- 🛒 **Product and brand research:** what members of a community say about a product, with the engagement each post got.
- 🧭 **Lead finding:** posts in which people ask for a recommendation or a service in local and interest groups.
- 📈 **Community monitoring:** a daily feed of new posts across the groups of your market.
- 🧪 **Content research:** which kind of post gets reactions and comments in a niche.

### ⚠️ Limits, stated plainly

- **Public groups only.** A private group shows a visitor nothing, and this Actor does not log in.
- **Three posts per request.** That is what Facebook gives a visitor. One group yields about 100 posts a minute; several groups run side by side.
- **Comments are counted, not exported.** The number of comments is on every row; the comment texts are not part of this Actor. The [Facebook Comments Scraper](https://apify.com/benthepythondev/facebook-comments-scraper) returns them when you give it the `url` of a row.
- **Member profile links are often hidden.** Facebook shows visitors the name of a member and an anonymous id; `authorUrl` is filled for pages and for members whose profile link Facebook includes.
- **2,000 posts per group and run.** Use `postedAfter` or a schedule for more.
- **Facebook limits how often one address may ask.** The Actor changes addresses by itself. If Facebook stops answering in the middle of a group, the rows saved so far stay and the status message names the group.

### ❓ FAQ

**Do I need a Facebook account or cookies?** No. The Actor reads public groups the way a visitor without an account sees them.

**Can it read private groups?** No. It reports them as private and charges nothing.

**How do I find the group id?** You do not need it. Paste the group's link, or the name that follows `/groups/` in it.

**Why are there fewer posts than I asked for?** The group has fewer public posts, or your date limit was reached. The status message says what happened.

**Does it return the comments?** The count, not the texts. For the texts, pass the `url` of a row to the [Facebook Comments Scraper](https://apify.com/benthepythondev/facebook-comments-scraper).

**Which order should I choose?** `newest` for monitoring and for date limits. `recent_activity` when you want the discussions that are alive now. `top` for Facebook's own selection.

**Can I run it every hour?** Yes. With `onlyNewPosts` a run that finds nothing new ends after two requests per group.

**How do I call it from code?** With the Apify API or the Python and JavaScript clients; every run returns a dataset you can fetch as JSON or CSV. It also works as a tool through Apify's MCP server.

**Is it legal?** The Actor reads what Facebook shows to everyone without a login. Posts and names are personal data: GDPR, CCPA and similar rules apply to how you store and use them, and Facebook's terms apply to you as well. Collect only what you need and do not use it to contact people who did not ask for it.

### 🔗 You might also like

- [Facebook Posts Scraper](https://apify.com/benthepythondev/facebook-posts-scraper): posts of public pages and profiles with reactions, comments, shares and video views
- [Facebook Comments Scraper](https://apify.com/benthepythondev/facebook-comments-scraper): the comments and replies under a post
- [Facebook Pages Scraper](https://apify.com/benthepythondev/facebook-pages-scraper): business information and contacts of public pages
- [Meta Ad Library Scraper](https://apify.com/benthepythondev/meta-ad-library-scraper): the ads a brand runs on Facebook and Instagram
- [Reddit Scraper](https://apify.com/benthepythondev/reddit-scraper): the same kind of community research on Reddit
- [Telegram Channel Scraper](https://apify.com/benthepythondev/telegram-channel-scraper): posts of public Telegram channels

**Keywords:** facebook groups scraper, facebook group posts, scrape facebook group, facebook group export, public facebook groups, facebook group monitoring, facebook posts scraper, community research, social listening, lead generation from facebook groups, facebook group posts csv, facebook group api alternative, no login facebook scraper, group posts by date, new post alerts

# Actor input Schema

## `groups` (type: `array`):

Links of public groups (https://www.facebook.com/groups/…), group ids or the group's name in its link. Several groups are read side by side. A private group cannot be read without membership and is reported as private.

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

Posts to save for each group. Facebook gives a visitor three posts per request, so 100 posts of one group take about one minute.

## `sortBy` (type: `string`):

Newest first reads a group from its latest post backwards. Recent activity puts posts with new comments first. Top is Facebook's own selection.

## `postedAfter` (type: `string`):

Stops each group at the first post older than this day (YYYY-MM-DD) or this period back from now (3 days, 2 weeks, 6 months). Works with newest posts first.

## `onlyNewPosts` (type: `boolean`):

For scheduled runs: skips every post an earlier run with the same monitor name delivered, so you pay only for new posts. The memory is a key-value store in your own account.

## `monitorId` (type: `string`):

Name of the memory used by the option above. Give each watch its own name; without a name the list of groups is the name.

## Actor input object example

```json
{
  "groups": [
    "https://www.facebook.com/groups/874728723021553"
  ],
  "maxResults": 15,
  "sortBy": "newest",
  "onlyNewPosts": false
}
```

# Actor output Schema

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

No description

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

No description

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

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

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

```

## MCP server setup

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