# Facebook Group Posts & Comments Scraper (`parsebird/facebook-group-posts-comments-scraper`) Actor

Scrape public Facebook group posts with comments and replies: text, author, date, reactions, shares, photos, Marketplace listing price and location, plus price, beds and phone read from listing posts.

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

## Pricing

from $1.19 / 1,000 group 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 Group Posts & Comments Scraper

**Facebook Group Posts & Comments Scraper** extracts posts, comments and replies from public [Facebook](https://www.facebook.com) groups without a login: post text, author, date, reactions by type, comment and share counts, photos, Marketplace listing details, and price, bedrooms and phone numbers read from listing posts, as JSON, CSV or Excel.

<table><tr>
<td style="border-left:4px solid #1877F2;padding:12px 16px;font-weight:600">
Add public group links and get every post with its full comment threads (replies included), keyword and date-range filters, Marketplace listing location and coordinates, and an "only new posts" mode for scheduled monitoring.
</td>
</tr></table>

<br>

<table>
<tr>
<td colspan="3" style="padding:10px 14px;background:#1877F2;border:none;border-radius:4px 4px 0 0">
<span style="color:#FFFFFF;font-size:14px;font-weight:700;letter-spacing:0.5px">ParseBird Facebook Suite</span>
<span style="color:#D8E6FD;font-size:13px">&nbsp;&nbsp;&bull;&nbsp;&nbsp;Pages, posts, groups, reviews &amp; media</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-right:none;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/facebook-user-posts-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Facebook User Posts Scraper</a><br>
<span style="color:#78716C;font-size:11px">Posts from profiles and Pages</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/facebook-page-video-downloader" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Facebook Page Video Downloader</a><br>
<span style="color:#78716C;font-size:11px">Every video on a Page, MP4 links</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/facebook-media-downloader" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Facebook Media Downloader</a><br>
<span style="color:#78716C;font-size:11px">HD/SD links for videos, reels, photos</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-right:none;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/facebook-group-posts-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Facebook Public Group Posts Scraper</a><br>
<span style="color:#78716C;font-size:11px">Group posts, reactions, photos</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/facebook-group-profile-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Facebook Group Profile Scraper</a><br>
<span style="color:#78716C;font-size:11px">Members, activity, admins, rules</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
<a href="https://apify.com/parsebird/facebook-reviews-scraper" style="color:#1C1917;text-decoration:none;font-weight:700;font-size:13px">Facebook Page Reviews Scraper</a><br>
<span style="color:#78716C;font-size:11px">Recommendations, tags, comments</span>
</td>
</tr>
<tr>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 0 4px;border-right:none;border-top:none;vertical-align:top;width:33%;background:#E7F0FE">
<a href="https://apify.com/parsebird/facebook-group-posts-comments-scraper" style="color:#1877F2;text-decoration:none;font-weight:700;font-size:13px">Facebook Group Posts &amp; Comments Scraper</a><br>
<span style="color:#1877F2;font-size:11px;font-weight:600">You are here</span>
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-right:none;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
</td>
<td style="padding:10px 14px;border:1px solid #E7E5E4;border-radius:0 0 4px 0;border-top:none;vertical-align:top;width:33%;background:#FFFFFF">
</td>
</tr>
</table>

##### Copy to your AI assistant

Copy this block into ChatGPT, Claude, Cursor, or any LLM to start using this actor.

```
Apify Actor: parsebird/facebook-group-posts-comments-scraper. Scrapes posts and comments from public Facebook groups without login. Call via ApifyClient: client.actor("parsebird/facebook-group-posts-comments-scraper").call(run_input={"startUrls": [{"url": "https://www.facebook.com/groups/874728723021553"}], "maxItems": 50, "onlyPostsNewerThan": "30 days", "fetchAllComments": true}). Inputs: startUrls (array of {url}, public facebook.com/groups/<id or username> links, max 100 groups, required), maxItems (integer, posts per group, default 100, 0 = all), viewOption (string: CHRONOLOGICAL | RECENT_ACTIVITY | TOP_POSTS | CHRONOLOGICAL_LISTINGS; logged-out visitors usually get the group's default order, CHRONOLOGICAL_LISTINGS returns only for-sale posts of buy/sell groups), search (string, keep posts whose text contains it, case-insensitive, matched on the feed), onlyPostsNewerThan / onlyPostsOlderThan (string, date 2026-04-20, date-time, or period like "30 days", "1 month"), includeComments (boolean, comments Facebook already includes in the feed, free, often empty), fetchAllComments (boolean, load each commented post's top-level comments), includeCommentReplies (boolean, also load replies; implies fetchAllComments), maxCommentsPerPost (integer, default 100), enrichMarketplaceListings (boolean, open each Marketplace listing for title, location, latitude/longitude), monitoringMode (boolean, return only posts not delivered in earlier runs), proxy (object, default Apify residential). Output per post: facebookUrl, inputUrl, facebookId, groupTitle, url, legacyId, id, text, attachedStoryText (reshares), time, timeSource, user {id, name, url, profilePicture}, feedbackId, reactionsCount, topReactionsCount, reactionLikeCount, reactionLoveCount, reactionCareCount, reactionHahaCount, reactionWowCount, reactionSadCount, reactionAngryCount, likesCount, commentsCount, sharesCount, attachments [{type, id, url, thumbnail, width, height, description, download_urls}], photoCount, additionalPhotoCount, topComments [{commentId, id, text, threadingDepth, parentCommentId, date, profileId, profileName, profilePicture, profileUrl, commentUrl, reactionsCount, repliesCount}], Marketplace posts only: isMarketplaceListing, marketplaceListingId, marketplaceUrl, marketplacePrice, marketplaceIsSold, marketplaceIsLive, marketplaceIsPending, marketplaceTitle, marketplaceLocation, marketplaceLatitude, marketplaceLongitude; listing-like text only: parsedPrice, parsedPriceText, parsedPricePeriod, parsedBedrooms, parsedBathrooms, parsedSquareFeet, parsedSquareMeters, parsedPhone, parsedPhones; scrapedAt. Pricing: pay per post (result) plus additional-data events per loaded comment/reply, enriched listing, or already-seen post in monitoring mode. Full API spec: https://apify.com/parsebird/facebook-group-posts-comments-scraper/api. Get your token: https://console.apify.com/settings/integrations.
```

### What is Facebook Group Posts & Comments Scraper?

Public Facebook groups hold a lot of useful conversation: buy/sell and rental listings, local news, product questions, job leads and community feedback. **Facebook Group Posts & Comments Scraper** turns those groups into a clean dataset. Paste one or more group links, press Start, and get each post with its author, date, reactions, photos and, when you turn it on, every comment and reply Facebook shows to visitors.

It works as a **Facebook group API alternative**: there is no Facebook login, no cookies and no Graph API app to set up. Download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.

### What can Facebook Group Posts & Comments Scraper do?

- 🧾 **Scrape group posts in bulk.** Up to 100 public groups per run, using group links with a numeric ID or a username, including m.facebook.com and web.facebook.com links.
- 💬 **Full comment threads.** Load each post's comments with author, date, link and reply count, and optionally the replies under every comment, nested with `threadingDepth` and `parentCommentId`.
- 🔎 **Keyword filter.** Keep only posts that mention a word or phrase, such as `condo` or `for rent`.
- 📅 **Date ranges.** Keep posts newer than, older than or between two dates. Relative periods like `30 days` or `1 month` work too.
- 🏷️ **Marketplace listings.** Posts that come from Facebook Marketplace get the listing price and status, and optionally the listing title, location and map coordinates.
- 🏠 **Listing details from the text.** On posts that read like a listing, the price (with rent period), bedrooms, bathrooms, floor area and phone numbers are pulled out of the author's own words into `parsed*` fields.
- 🔁 **Only new posts.** Monitoring mode remembers what earlier runs delivered and returns only new posts, so scheduled runs give you a clean feed of what's new.
- 📅 **Scheduling and integrations.** Run every hour or day with [Apify Schedules](https://docs.apify.com/platform/schedules), and send posts to Google Sheets, Slack, Zapier, Make or a webhook with [Apify integrations](https://docs.apify.com/platform/integrations).
- 🔌 **API access.** Start runs and read results from your own code with the [Apify API](https://docs.apify.com/api/v2).

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

| Field | Description |
|-------|-------------|
| `groupTitle` / `facebookId` / `facebookUrl` | Group name, numeric group ID and group link |
| `url` / `legacyId` / `id` | Post link, numeric post ID and Facebook's story ID |
| `text` / `attachedStoryText` | Post text; for reshares, `attachedStoryText` holds the original post's text |
| `time` / `timeSource` | When the post was published (UTC) and where that time came from |
| `user` | Author ID, name and profile picture |
| `reactionsCount` and `reaction*Count` | Total reactions and the count per type: like, love, care, haha, wow, sad, angry |
| `commentsCount` / `sharesCount` | Comment total (Facebook counts replies too) and shares |
| `attachments` / `photoCount` / `additionalPhotoCount` | Photos and videos with download links, the total number of photos on the post, and how many of those were not included in `attachments` |
| `topComments` | Comments and replies: text, author, date, comment link, reactions, reply count, depth |
| `marketplace*` | Marketplace listing ID, link, price and sold/live/pending status; title, location and coordinates with enrichment |
| `parsed*` | Price, rent period, bedrooms, bathrooms, square feet or meters, and phone numbers stated in the post text |

`time` is `null` when Facebook doesn't send a publish time for a post. `timeSource` is `story` when the time comes from the post's own timestamp, `unverified` when it was found elsewhere in the post data, and `unknown` when there is none.

### How to scrape Facebook group posts and comments

1. Open [Facebook Group Posts & Comments Scraper](https://apify.com/parsebird/facebook-group-posts-comments-scraper) and click **Try for free**.
2. Paste one or more public **Facebook group URLs**, for example `https://www.facebook.com/groups/874728723021553`.
3. Set **Max posts per group**.
4. Optionally add a **keyword** or a **date range**.
5. Turn on **Add all comments** (and **Add comment replies** if you need whole threads), or **Add Marketplace listing location** for buy/sell groups.
6. Click **Start**, then download the posts from the **Output** tab as JSON, CSV, Excel or HTML.

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

This scraper uses pay-per-event pricing. You pay for each post saved, and a smaller amount for each extra item of data you ask for. Compute and residential proxy costs are included in these prices.

| Event | Free | Bronze | Silver | Gold |
|-------|------|--------|--------|------|
| Result: post saved (`result`) | $1.49 / 1,000 | $1.39 / 1,000 | $1.29 / 1,000 | $1.19 / 1,000 |
| Additional data (`additional-data`) | $0.99 / 1,000 | $0.89 / 1,000 | $0.89 / 1,000 | $0.79 / 1,000 |

**Additional data** is charged for:

- each comment or reply loaded with **Add all comments** or **Add comment replies**;
- each Marketplace listing enriched with **Add Marketplace listing location**;
- each already-delivered post read again in **monitoring mode**, which is billed at this lower rate instead of as a result.

Comments from **Add comments shown in the feed** are free.

For example, on the Free plan 1,000 posts cost **$1.49**. 1,000 posts plus 5,000 loaded comments cost $1.49 + $4.95 = **$6.44**. Posts skipped by your keyword or date filters are not charged. Apify's free plan includes monthly platform credit you can use to try the scraper. Set a maximum cost per run in the run options and the scraper stops when it reaches it, without loading data it can't charge for.

### Input

Add group links and options in the **Input** tab, or send JSON through the API.

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `startUrls` | array | **Yes** | — | Public Facebook group links (max 100) |
| `maxItems` | integer | No | `100` | Posts per group; `0` = all Facebook shows |
| `viewOption` | string | No | `CHRONOLOGICAL` | `CHRONOLOGICAL`, `RECENT_ACTIVITY`, `TOP_POSTS`, `CHRONOLOGICAL_LISTINGS` |
| `search` | string | No | — | Keep posts whose text contains this phrase |
| `onlyPostsNewerThan` | string | No | — | Date, date-time or period (`30 days`) |
| `onlyPostsOlderThan` | string | No | — | Date, date-time or period |
| `includeComments` | boolean | No | `false` | Comments Facebook includes in the feed (free, often empty) |
| `fetchAllComments` | boolean | No | `false` | Load each post's top-level comments |
| `includeCommentReplies` | boolean | No | `false` | Also load replies (turns comment loading on) |
| `maxCommentsPerPost` | integer | No | `100` | Comments and replies per post |
| `enrichMarketplaceListings` | boolean | No | `false` | Add listing title, location and coordinates |
| `monitoringMode` | boolean | No | `false` | Return only posts not delivered in earlier runs |
| `proxy` | object | No | Apify residential | Proxy settings |

**Example: last 30 days with comments**

```json
{
    "startUrls": [{ "url": "https://www.facebook.com/groups/874728723021553" }],
    "onlyPostsNewerThan": "30 days",
    "fetchAllComments": true,
    "maxItems": 50
}
```

**Example: a closed date range**

```json
{
    "startUrls": [{ "url": "https://www.facebook.com/groups/developerkaki" }],
    "onlyPostsNewerThan": "2026-10-01",
    "onlyPostsOlderThan": "2026-10-08",
    "maxItems": 500
}
```

**Example: rental listings with Marketplace location**

```json
{
    "startUrls": [{ "url": "https://www.facebook.com/groups/302792601187841" }],
    "search": "condo",
    "enrichMarketplaceListings": true,
    "maxItems": 50
}
```

### Output example

A post with comments loaded (text shortened, image links cut):

```json
{
    "facebookUrl": "https://www.facebook.com/groups/797518550594060",
    "inputUrl": "https://www.facebook.com/groups/developerkaki",
    "facebookId": "797518550594060",
    "groupTitle": "Developer Kaki",
    "url": "https://www.facebook.com/groups/developerkaki/posts/3004054629940430/",
    "legacyId": "3004054629940430",
    "id": "UzpfSTEwMDAwMTUyMTQ0OTIxNTpWSzozMDA0MDU0NjI5OTQwNDMw",
    "text": "(Quoted from an absolutely BASED guy on  LinkedIn)\n\nWe could remove 90% of software out there...",
    "time": "2026-10-13T12:47:27.000Z",
    "timeSource": "story",
    "user": {
        "id": "100001521449215",
        "name": "Wan Ardie",
        "url": null,
        "profilePicture": "https://scontent.fkul15-1.fna.fbcdn.net/v/t39.30808-1/475653..."
    },
    "feedbackId": "ZmVlZGJhY2s6MzAwNDA1NDYyOTk0MDQzMA==",
    "reactionsCount": 0,
    "topReactionsCount": 0,
    "reactionLikeCount": 0,
    "reactionLoveCount": 0,
    "reactionCareCount": 0,
    "reactionHahaCount": 0,
    "reactionWowCount": 0,
    "reactionSadCount": 0,
    "reactionAngryCount": 0,
    "likesCount": 0,
    "commentsCount": 1,
    "sharesCount": 0,
    "attachments": [],
    "photoCount": 0,
    "additionalPhotoCount": 0,
    "topComments": [
        {
            "commentId": "3004075089938384",
            "id": "Y29tbWVudDozMDA0MDU0NjI5OTQwNDMwXzMwMDQwNzUwODk5MzgzODQ=",
            "text": "what would more software engineers do with less software? An oxymoron don't you think?...",
            "threadingDepth": 0,
            "parentCommentId": null,
            "date": "2026-10-13T13:09:03.000Z",
            "profileId": "pfbid0314ufFKmWAW8r8iCW2bkGuKZieJZPq28gpfsqzAEeEW5h7JXiKkTEtD8WZVAToYwTl",
            "profileName": "Daryl Phuah",
            "profilePicture": "https://scontent.fkul10-2.fna.fbcdn.net/v/t1.6435-1/29425038...",
            "profileUrl": null,
            "commentUrl": "https://www.facebook.com/groups/developerkaki/permalink/3004054629940430/?comment_id=3004075089938384",
            "reactionsCount": 0,
            "repliesCount": 0
        }
    ],
    "scrapedAt": "2026-10-13T13:14:06.000Z"
}
```

A Marketplace listing post with enrichment adds fields like these:

```json
{
    "groupTitle": "CEBU HOMES AND CONDO RENTALS",
    "legacyId": "1677490737051347",
    "isMarketplaceListing": true,
    "marketplaceListingId": "1128172069647463",
    "marketplaceUrl": "https://www.facebook.com/marketplace/item/1128172069647463/",
    "marketplacePrice": "PHP6,500,000",
    "marketplaceIsSold": false,
    "marketplaceIsLive": true,
    "marketplaceIsPending": false,
    "marketplaceTitle": "5 beds 4 bathrooms – Flat",
    "marketplaceLocation": "Lapu-Lapu City, PH-07",
    "marketplaceLatitude": 10.312487830756,
    "marketplaceLongitude": 123.94856929779
}
```

And a listing-like post gets the details stated in its text (illustrative example):

```json
{
    "text": "3bd/2ba brick ranch for sale by owner. Asking $245,000 OBO. 1,450 sqft. Call or text (336) 555-0142",
    "parsedPrice": 245000,
    "parsedPriceText": "$245,000",
    "parsedPricePeriod": null,
    "parsedBedrooms": 3,
    "parsedBathrooms": 2,
    "parsedSquareFeet": 1450,
    "parsedSquareMeters": null,
    "parsedPhone": "+13365550142",
    "parsedPhones": ["+13365550142"]
}
```

Marketplace fields appear only on posts that come from a Marketplace listing, and `parsed*` fields only when the text states at least one of them. The **Posts**, **Comments** and **Listings** views in the Output tab show the most-used columns.

### Use the Facebook Group Posts & Comments Scraper API

With the [Apify API client for Python](https://docs.apify.com/api/client/python):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("parsebird/facebook-group-posts-comments-scraper").call(run_input={
    "startUrls": [{"url": "https://www.facebook.com/groups/874728723021553"}],
    "onlyPostsNewerThan": "7 days",
    "fetchAllComments": True,
    "maxItems": 100,
})
for post in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(post["time"], post["user"]["name"], post["commentsCount"], len(post["topComments"]))
```

With the [Apify API client for JavaScript](https://docs.apify.com/api/client/js):

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('parsebird/facebook-group-posts-comments-scraper').call({
    startUrls: [{ url: 'https://www.facebook.com/groups/302792601187841' }],
    search: 'for rent',
    enrichMarketplaceListings: true,
    maxItems: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((p) => console.log(p.parsedPrice, p.parsedPricePeriod, p.marketplaceLocation, p.url));
```

See the [API tab](https://apify.com/parsebird/facebook-group-posts-comments-scraper/api) for HTTP endpoints, including a single call that runs the scraper and returns the dataset.

### Use cases

- **Real estate and rentals.** Collect rental and for-sale listings from local groups with price, bedrooms, phone numbers and Marketplace location.
- **Community and brand monitoring.** Track what people say about a product, place or company in public groups, including the comment threads.
- **Lead generation.** Find people asking for services or recommendations in niche groups.
- **Market and sentiment research.** Analyse discussions, reactions and replies over a date range.
- **Scheduled feeds.** Combine monitoring mode with a schedule to get only new posts each day, sent to Slack or a sheet.

### How it works

1. The scraper looks up each group and reads its post feed the way a logged-out visitor sees it, three posts per page, newest first in most groups.
2. Each post is checked against your date range and keyword, and posts outside them are skipped without charge.
3. With comments turned on, it loads the comments (10 per request) and, with replies on, the replies under each comment.
4. With Marketplace enrichment on, it opens each listing page for its title, location and coordinates.
5. It reads listing details from the post text, saves the post and charges for it.

### FAQ

**Do I need a Facebook account or cookies?**
No. The scraper reads public groups the way a logged-out visitor sees them. Private groups can't be scraped; they are reported as failed in the run log.

**Why doesn't `topComments` contain every comment?**
`commentsCount` is Facebook's total and includes replies. Turn on **Add comment replies** to get replies as well. Facebook also hides some comments from logged-out visitors: in our tests a post showing 15 comments returned 14. **Add comments shown in the feed** is often empty, because Facebook rarely includes comments in the group feed; use **Add all comments** for reliable results.

**Does the sort option change the order?**
Facebook usually serves logged-out visitors the group's default order whatever you choose. The exception is `CHRONOLOGICAL_LISTINGS` (**Listings only**), which returns just the for-sale posts of buy/sell groups. When Facebook's listings feed is unavailable, the scraper reads the regular feed and keeps only the Marketplace listing posts, so you still get listings only.

**How far back can I go?**
Facebook shows logged-out visitors a limited recent window of each group. If `onlyPostsOlderThan` is further back than the feed reaches, the run stops after reading about 360 posts and asks you to use a more recent date.

**How does the keyword filter work?**
Facebook's group search requires a login, so the scraper reads the feed and keeps posts whose text contains your phrase. A rare keyword in a busy group means many posts are read to find matches, which takes longer. Narrow the date range to speed it up.

**How does monitoring mode work?**
The scraper stores the IDs of posts it delivered for each group (the last 5,000) in a named key-value store in your account. The next run returns only posts not in that list that are newer than the posts it already delivered, and stops once it reaches them. Older posts that an earlier run skipped because of its post limit are not treated as new. Already-delivered posts read again are billed as additional data, not as results.

**Can I export the data?**
Yes. Download it as JSON, CSV, Excel, XML or HTML from the Output tab, or read it through the [Apify API](https://docs.apify.com/api/v2).

**Something doesn't work. What should I do?**
Open an issue on the **Issues** tab with your input and the run link.

### Is it legal to scrape Facebook groups?

This scraper collects only posts and comments that Facebook shows publicly to logged-out visitors. It does not log in or access private groups. Posts and comments contain personal data such as names and profile pictures, so make sure you have a lawful basis under the GDPR, CCPA or other laws that apply to you before storing or using it, and respect [Facebook's terms](https://www.facebook.com/terms). Read more in Apify's blog post on [the legality of web scraping](https://blog.apify.com/is-web-scraping-legal/).

### Other Facebook scrapers

- [Facebook Public Group Posts Scraper](https://apify.com/parsebird/facebook-group-posts-scraper) – a lighter group posts scraper without comments
- [Facebook Group Profile Scraper](https://apify.com/parsebird/facebook-group-profile-scraper) – group name, members, privacy and description
- [Facebook User Posts Scraper](https://apify.com/parsebird/facebook-user-posts-scraper) – posts from public profiles and Pages
- [Facebook Page Reviews Scraper](https://apify.com/parsebird/facebook-reviews-scraper) – Page reviews and recommendations
- [Facebook Media Downloader](https://apify.com/parsebird/facebook-media-downloader) – download videos, reels and photos
- [Facebook Page Video Downloader](https://apify.com/parsebird/facebook-page-video-downloader) – all videos from a Page
- [Meta | Facebook Ads Library Scraper](https://apify.com/parsebird/facebook-ads-library-scraper) – ads from the Meta Ad Library

# Changelog

This Actor's version history is a separate document: https://apify.com/parsebird/facebook-group-posts-comments-scraper/changelog.md

# Actor input Schema

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

Add public group links, for example https://www.facebook.com/groups/874728723021553 or https://www.facebook.com/groups/developerkaki. web.facebook.com and m.facebook.com links also work. Up to 100 groups per run.

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

Stop after this many posts from each group. Set 0 to collect every post Facebook shows.

## `viewOption` (type: `string`):

Which feed to request. 'Listings only' returns just the for-sale posts of buy/sell groups. Facebook usually serves logged-out visitors the group's default order for the other views; see the README.

## `search` (type: `string`):

Keep only posts whose text contains this phrase (not case-sensitive). The scraper keeps reading the feed until it finds 'Max posts per group' matches or the feed ends, so rare keywords read many posts. Leave empty to keep all posts.

## `onlyPostsNewerThan` (type: `string`):

Keep posts published after this point and stop once the feed reaches older posts. Use a date (2026-04-20), a date and time (2026-04-20T10:00:00Z), or a period ('30 days', '2 weeks', '1 month').

## `onlyPostsOlderThan` (type: `string`):

Keep posts published before this point, same formats as above. Combine both fields for a date range. Newer posts are skipped without charge while the scraper reads back to your range.

## `includeComments` (type: `boolean`):

Add the comments Facebook already includes in the group feed. No extra requests and no extra charge, but Facebook includes them for few posts, so this is often empty. Use 'Add all comments' for reliable results.

## `fetchAllComments` (type: `boolean`):

For each post with comments, load its top-level comments (text, author, date, link, reply count). Posts with no comments are skipped. Each comment is billed as additional data.

## `includeCommentReplies` (type: `boolean`):

Also load the replies under each comment (marked with threadingDepth 1 and parentCommentId). Turns on comment loading by itself. Slower on busy posts; each reply is billed as additional data.

## `maxCommentsPerPost` (type: `integer`):

Stop loading comments (and replies) for a post after this many.

## `enrichMarketplaceListings` (type: `boolean`):

For posts that are Marketplace listings, open the listing page to add its title, location and map coordinates. One extra request per listing, billed as additional data.

## `monitoringMode` (type: `boolean`):

Remember the posts delivered for each group and return only posts not seen in earlier runs. Stops reading once it reaches already-delivered posts. Good for scheduled runs. Already-seen posts that are read again are billed as additional data, not as results.

## `proxy` (type: `object`):

Facebook answers logged-out group requests only from residential IPs, so keep Apify residential proxy unless you have your own.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/groups/874728723021553"
    }
  ],
  "maxItems": 20,
  "viewOption": "CHRONOLOGICAL",
  "includeComments": false,
  "fetchAllComments": false,
  "includeCommentReplies": false,
  "maxCommentsPerPost": 100,
  "enrichMarketplaceListings": false,
  "monitoringMode": false,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `dataset` (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 = {
    "startUrls": [
        {
            "url": "https://www.facebook.com/groups/874728723021553"
        }
    ],
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parsebird/facebook-group-posts-comments-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 = {
    "startUrls": [{ "url": "https://www.facebook.com/groups/874728723021553" }],
    "maxItems": 20,
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("parsebird/facebook-group-posts-comments-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 '{
  "startUrls": [
    {
      "url": "https://www.facebook.com/groups/874728723021553"
    }
  ],
  "maxItems": 20,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call parsebird/facebook-group-posts-comments-scraper --silent --output-dataset

```

## MCP server setup

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