# Facebook Groups Scraper - Posts & Comments \[NO LOGIN] ✅ (`unseenuser/fb-groups`) Actor

Extract posts from any public Facebook group - text, author, reactions, comment counts, top comments and timestamps. No login, no cookies, public groups only. We never touch member lists or private data. Full comment threads and replies available as add-ons.

- **URL**: https://apify.com/unseenuser/fb-groups.md
- **Developed by:** [Unseen User](https://apify.com/unseenuser) (community)
- **Categories:** Social media, Automation, Developer tools
- **Stats:** 5 total users, 3 monthly users, 100.0% runs succeeded, 4 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$4.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.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

## Facebook Groups Scraper (No Login)

> **Public group posts only. We never scrape members or private data.**

No login, no cookies, fast bulk public group posts. Extract post text, author, reactions, comment counts, top comments and timestamps from any public Facebook group, by URL. Optional add-ons pull full comment threads and replies per post.

### Table of contents

- [What this Actor does NOT do](#what-this-actor-does-not-do)
- [Disambiguation](#disambiguation-which-facebook-actor-do-you-need)
- [Free plan limit](#free-plan-limit)
- [Use cases](#use-cases)
- [Quick start](#quick-start)
- [Inputs](#inputs)
- [Output](#output)
- [Output views](#output-views)
- [Sample outputs](#sample-outputs)
- [Run statuses you may see](#run-statuses-you-may-see)
- [Performance and limits](#performance-and-limits)
- [Reliability](#reliability)
- [Integration examples](#integration-examples)
- [Scheduling](#scheduling)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Changelog](#changelog)
- [Related scrapers](#related-scrapers)
- [Terms of Service](#terms-of-service)
- [Support and contact](#support-and-contact)

---

### What this Actor does NOT do

Four hard boundaries. Each one is a deliberate product decision, not a missing feature:

1. **No member harvesting.** We never return member lists, member contact details, or anything that could be used to build a roster of who is in a group. Post and comment content only.
2. **No group search.** This Actor works on known group URLs (or IDs) you provide. It cannot discover groups by keyword.
3. **No group details / metadata.** Member counts, admin lists, rules, descriptions and join settings are out of scope. Posts only.
4. **No private groups, ever.** Public groups only. No cookies, no session tokens, no authentication of any kind.

If you need member rosters, group discovery, group metadata, or private-group access, this is not the Actor for you, and no Actor in the UnseenUser portfolio provides those.

---

### Disambiguation: which Facebook Actor do you need?

> Groups: which Actor do you need?
> - Scraping groups specifically, group-first workflow? -> **Facebook Groups Scraper** (you are here)
> - Mixing pages, profiles AND groups in one run? -> [Facebook Posts Scraper](https://apify.com/unseenuser/facebook-posts-scraper) (group mode)
> - Just comments on a known post? -> [Facebook Comments Scraper](https://apify.com/unseenuser/facebook-comments-scraper)
>
> Same group/posts backend, listings split by search intent so you land on the right one.

---

### Free plan limit

Free Apify users get up to **50 results per run**. Paying users are not affected and receive results normally.

This limit was set by the Actor developer, not by Apify. To remove it and receive unlimited results, upgrade to any paid Apify plan: https://apify.com/pricing

When a free plan run hits the cap, the Actor finishes successfully (status `SUCCEEDED`) and the run's status message explains what happened. No error is raised, so the first 50 results are fully usable as normal.

---

### Use cases

- **Social listening** - monitor what a public community is discussing in real time.
- **Community and trend research** - track topics, sentiment shifts and engagement curves in a group over time.
- **Lead and demand signals** - spot intent in public group discussion (always with a lawful basis for any follow-up).
- **Market research** - understand a niche community's vocabulary, pain points, and product references.
- **Content research** - study which post formats (questions, polls, photos, long-form) resonate in a given group.
- **Brand monitoring** - watch public mentions and sentiment around your brand in relevant groups.
- **Competitive intelligence** - see how a competitor's product is being discussed in user-run communities.
- **Editorial / journalism** - source primary public material for reporting on online community trends.
- **Academic research** - quantitative analysis of public group discourse with a documented ethics framework.

---

### Quick start

1. Click **Try for free** on this Actor's page.
2. Paste one or more **public** Facebook group URLs into **Public Group URLs** (replace the placeholder).
3. (Optional) Adjust **Max posts per group**.
4. (Optional) Toggle **Include top comments** off if you do not need them.
5. (Optional) Enable **Fetch full comment threads** and/or **Fetch comment replies** if you need full discussion data. Both are billed add-ons.
6. Click **Start**.
7. Watch results stream into the **Overview** dataset view.
8. When the run finishes, export as JSON, CSV, XLSX, or pull via the Apify API.

---

### Inputs

| Input | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrls` | array of strings | yes | - | One or more public Facebook group URLs (or numeric IDs). Minimum 1 entry. |
| `maxPosts` | integer | no | 30 | Stop after this many posts per group. Pagination returns 3 posts at a time, so values are effectively rounded up to the next multiple of 3. Minimum 3. |
| `includeTopComments` | boolean | no | true | Top comments are returned alongside each post at no extra cost. Set to false to drop them from the output. |
| `fetchAllComments` | boolean | no | false | **Billed add-on.** Paginate the full comment thread for every returned post. Off by default. |
| `fetchCommentReplies` | boolean | no | false | **Billed add-on.** Pull replies for every comment returned. Only effective when `fetchAllComments` is also true. |

#### Group input key: URL works, ID works

Either form is accepted in `startUrls`:

- Full URL with numeric ID: `https://www.facebook.com/groups/1234567890`
- Full URL with vanity name: `https://www.facebook.com/groups/your-group-vanity-name`
- Numeric ID alone: `1234567890`

Paste whichever you have. The Actor normalizes them.

#### Where to find a real public group URL

1. Open https://facebook.com.
2. Search for any topic in the search bar.
3. Click **Groups** in the left sidebar of the search results.
4. Pick a group whose listing says **"Public"** under its name.
5. Click into it. Copy the URL from your browser's address bar.
6. Paste that URL into **Public Group URLs**.

If a group is marked Private or requires you to be a member to see posts, the upstream will return an error and the Actor will emit a single error row explaining what happened.

---

### Output

The Actor pushes one row per post to the run's default dataset. Each row has this top-level shape:

| Field | Type | Always present | Description |
|---|---|---|---|
| `post` | object | yes (on success rows) | The post object as returned upstream. See per-field table below. |
| `comments` | array | only when `fetchAllComments` is true | Full comment thread, paginated. |
| `replies` | object | only when `fetchCommentReplies` is true | Replies keyed by comment ID. |
| `commentsError` | string | only when comment fetch failed for a single post | Error message; the post row is still emitted. |
| `error` | string | only on error rows | Error message for a request that could not be completed. |
| `_metadata` | object | yes | `{ fetched_at, group_url, page }`. |

#### `post` sub-fields (typical shape)

| Field | Type | Notes |
|---|---|---|
| `id` | string | Numeric post ID. |
| `text` | string | Post body. May be empty for photo-only or video-only posts. |
| `url` | string | Canonical post URL. |
| `permalink` | string | Permalink URL. |
| `groupUrl` | string | URL of the group the post was made in. |
| `author.id` | string | Author's numeric ID. |
| `author.name` | string | Author's display name. |
| `reactionCount` | number | Total reactions (likes + reactions). |
| `commentCount` | number | Total comments on the post. |
| `publishTime` | number | Unix epoch **seconds** (not milliseconds). |
| `videoDetails` | object | `{ sdUrl, hdUrl, thumbnailUrl }` when present. |
| `topComments` | array | Included by default; toggle off via `includeTopComments`. |

Sub-fields are not strictly typed in the dataset schema, because the upstream may add or remove fields over time. The Actor passes whatever it receives, plus the `_metadata` envelope.

#### `_metadata` sub-fields

| Field | Type | Description |
|---|---|---|
| `fetched_at` | string (ISO 8601) | When the Actor pushed this row. |
| `group_url` | string | The group URL that produced this row. |
| `page` | integer | 1-indexed pagination page within that group. |

#### Error rows

Error rows have the same `_metadata` envelope plus a single `error` field:

```json
{
  "error": "Upstream request failed (500): Group ID not found",
  "_metadata": { "fetched_at": "...", "group_url": "...", "page": 0 }
}
````

These are emitted instead of crashing the run, so one bad URL never wipes out the data from other URLs in the same run.

***

### Output views

The Apify Console renders results in four tabs, three of which are pre-defined by this Actor's output schema:

| View | Purpose |
|---|---|
| **Overview** | One row per post with post ID, text, author, reactions, comment count, timestamp and links. The default view. |
| **Engagement** | Posts ranked by reactions and comment counts. Useful for surfacing high-signal posts fast. |
| **Errors** | Any rows with an `error` field. Empty when everything succeeds. If this view has rows, look there first when triaging a run. |
| **All fields** | Apify's built-in catch-all view. Shows every field on every row, including nested objects. |

Field-coverage badges in the column headers (e.g. "100%") show the percentage of dataset rows that have a value for that column. They are descriptive, not failure indicators.

***

### Sample outputs

#### Basic post row (no add-ons)

```json
{
  "post": {
    "id": "1204545088344463",
    "text": "Anyone else having issues with their delivery this week? Mine has been delayed twice.",
    "url": "https://www.facebook.com/groups/example/posts/1204545088344463",
    "permalink": "https://www.facebook.com/groups/example/posts/1204545088344463",
    "groupUrl": "https://www.facebook.com/groups/example",
    "author": { "id": "100063669491743", "name": "Sample Author" },
    "reactionCount": 133,
    "commentCount": 12,
    "publishTime": 1734553170,
    "videoDetails": { "sdUrl": null, "hdUrl": null, "thumbnailUrl": null },
    "topComments": [
      {
        "id": "987654321",
        "text": "Same here, third delay this month.",
        "publishTime": 1734569761,
        "author": { "id": "100063669491800", "name": "Sample Commenter" }
      }
    ]
  },
  "_metadata": {
    "fetched_at": "2026-06-03T12:00:00.000Z",
    "group_url": "https://www.facebook.com/groups/example",
    "page": 1
  }
}
```

#### Post row with full comment thread (`fetchAllComments: true`)

```json
{
  "post": { "id": "1204545088344463", "text": "...", "author": { "name": "Sample Author" } },
  "comments": [
    { "id": "987654321", "text": "Same here, third delay this month.", "publishTime": 1734569761, "author": { "id": "100063669491800", "name": "Sample Commenter" } },
    { "id": "987654322", "text": "Mine arrived early actually!", "publishTime": 1734571200, "author": { "id": "100063669491801", "name": "Another Commenter" } }
  ],
  "_metadata": { "fetched_at": "2026-06-03T12:00:00.000Z", "group_url": "https://www.facebook.com/groups/example", "page": 1 }
}
```

#### Post row with comments AND replies (`fetchAllComments: true`, `fetchCommentReplies: true`)

```json
{
  "post": { "id": "1204545088344463", "text": "...", "author": { "name": "Sample Author" } },
  "comments": [
    { "id": "987654321", "text": "Same here, third delay this month.", "author": { "name": "Sample Commenter" } }
  ],
  "replies": {
    "987654321": [
      { "id": "111", "text": "Try contacting support, they refunded mine.", "publishTime": 1734580000, "author": { "id": "100063669492000", "name": "Helper" } }
    ]
  },
  "_metadata": { "fetched_at": "2026-06-03T12:00:00.000Z", "group_url": "https://www.facebook.com/groups/example", "page": 1 }
}
```

#### Error row (one bad URL in a multi-URL run)

```json
{
  "error": "Upstream request failed (500): Group ID not found",
  "_metadata": { "fetched_at": "2026-06-03T12:00:00.000Z", "group_url": "https://www.facebook.com/groups/example", "page": 0 }
}
```

#### Diagnostic row (group returned zero posts)

When a group yields zero posts and zero errors, the Actor still emits a single visible row explaining why, so the dataset is never silent:

```json
{
  "error": "No posts were extracted for this group. Upstream returned 0 item(s) in a recognized shape; response keys: (redacted top-level keys). The group may be empty, restricted, members-only, or the upstream response shape is unrecognized.",
  "_metadata": { "fetched_at": "2026-06-03T12:00:00.000Z", "group_url": "...", "page": 1 }
}
```

***

### Run statuses you may see

| Status | Meaning | What to do |
|---|---|---|
| `SUCCEEDED` (green) | Run completed without unrecoverable errors. The dataset may still contain `error` rows (per-URL failures isolated from each other). | Open the **Overview** view for real posts; check **Errors** to see any per-URL issues. |
| `SUCCEEDED` (green) with a status message about the free plan cap | Free plan cap of 50 reached. The first 50 rows are fully usable. | Upgrade to any paid Apify plan to remove the cap: https://apify.com/pricing |
| `FAILED` (red) | Unrecoverable error (e.g. malformed input, missing required configuration). | Check the run **Log** tab for the exact error; fix input or configuration and re-run. |
| `ABORTED` | You stopped the run manually, or it ran out of memory/time. | Reduce `maxPosts` or split the URL list across multiple runs. |
| `TIMED-OUT` | Run exceeded its timeout setting. | Increase the run timeout in **Actor settings**, or split the URL list. |

***

### Performance and limits

- **Pagination granularity.** The underlying source returns 3 posts per pagination page. `maxPosts` is honored but effectively rounds up to the next multiple of 3.
- **Concurrency.** A single group is paginated sequentially. Multiple groups in the same run are processed one after another to keep memory low and behavior predictable.
- **Memory.** Default 256 MB is enough for most runs. Increase to 1024 MB if you are pulling very large comment threads.
- **Run time.** A typical 30-post run for a single group completes in 5 to 30 seconds depending on upstream latency. Larger runs scale roughly linearly.
- **Comment add-ons.** Each post with `fetchAllComments` enabled triggers one or more comment-page requests; `fetchCommentReplies` adds one or more requests per comment. Leave both off unless you need full threads.
- **Output streaming.** Rows are streamed to the dataset as they are produced. You can start downloading partial results before the run finishes.

***

### Reliability

- **Retries.** 3 attempts with exponential backoff (1s, 2s, 4s) on transient HTTP errors (`429`, `502`, `503`, `504`).
- **Per-group error isolation.** A failure on one group does not crash the run; it is emitted as a single error row and the next group is processed.
- **Per-row `_metadata`.** Every row carries `{ fetched_at, group_url, page }` so you can correlate output back to inputs.
- **Diagnostic rows.** A group that returns zero posts and zero errors still produces one visible diagnostic row so silent failures are impossible.
- **Sanitized error messages.** Upstream error bodies are parsed and only the human message is surfaced; internal fields are never leaked into your dataset or logs.
- **Stable output schema.** The Actor never blocks a push because of upstream sub-field variation; whatever the upstream returns inside `post` is passed through.

***

### Integration examples

#### Run the Actor via Apify API (HTTP)

```bash
curl -X POST "https://api.apify.com/v2/acts/unseenuser~facebook-groups-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": ["https://www.facebook.com/groups/your-public-group"],
    "maxPosts": 30,
    "includeTopComments": true,
    "fetchAllComments": false,
    "fetchCommentReplies": false
  }'
```

#### Run synchronously and get the dataset items in one call

```bash
curl -X POST "https://api.apify.com/v2/acts/unseenuser~facebook-groups-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "startUrls": ["https://www.facebook.com/groups/your-public-group"], "maxPosts": 30 }'
```

#### Node.js (Apify client)

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('unseenuser/facebook-groups-scraper').call({
  startUrls: ['https://www.facebook.com/groups/your-public-group'],
  maxPosts: 30,
  includeTopComments: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(`Got ${items.length} rows`);
```

#### Python (Apify client)

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ["APIFY_TOKEN"])
run = client.actor("unseenuser/facebook-groups-scraper").call(run_input={
    "startUrls": ["https://www.facebook.com/groups/your-public-group"],
    "maxPosts": 30,
    "includeTopComments": True,
})
items = list(client.dataset(run["defaultDatasetId"]).iterate_items())
print(f"Got {len(items)} rows")
```

#### Webhook on run completion

Configure a webhook in **Actor settings -> Integrations -> Webhooks** to receive a POST when each run finishes. Apify sends the run ID, status, and dataset ID; fetch the dataset items with `GET /v2/datasets/{id}/items`.

***

### Scheduling

Use the Apify Console scheduler to run this Actor on a cadence:

1. Open the Actor page.
2. Click **Actions -> Schedule**.
3. Set cron (e.g. `0 */6 * * *` for every six hours).
4. Save your input as the schedule's task input.

For daily change-detection on a small set of groups, hourly or six-hourly schedules with `maxPosts: 30` strike a good balance.

***

### Troubleshooting

| Symptom | Likely cause | Fix |
|---|---|---|
| Dataset has 0 rows total, run SUCCEEDED, log shows `first page returned 0 post(s). Response keys: ...` | Group is empty, private, restricted, or the upstream response shape is unrecognized. A diagnostic row is now also emitted to the dataset. | Try a different known-public group URL. If multiple real groups all return 0 with the same response keys, share the diagnostic row with support so the extractor can be extended. |
| Single error row `"Upstream request failed (500): Group ID not found"` | The URL or numeric ID does not resolve to a real group. | Open the URL in a browser. If it 404s for you too, you have the wrong URL. |
| Run finished SUCCEEDED with status message about a 50-result cap | You are on the Apify free plan and hit the per-run cap. | Upgrade to any paid Apify plan: https://apify.com/pricing |
| Comments fetched but replies empty | `fetchCommentReplies` was true but `fetchAllComments` was false, so there were no comments to iterate. | Enable `fetchAllComments` as well. |
| `_metadata.page` is 0 on a row | That row is an error/diagnostic row, not a real post. | Look at `error` field for the cause. |

***

### FAQ

**Q: Do you scrape group members?**
A: No, never. This Actor pulls public post content only. It does not return member lists, member emails or phones, or any member data - by design and by policy.

**Q: Can it find groups by keyword?**
A: No. This Actor works on known group URLs or IDs you provide.

**Q: Does it return group details like member count, admins, rules?**
A: No. Posts only.

**Q: Does it work on private groups?**
A: No, by design. This Actor is public-only and never uses cookies or authentication.

**Q: How many posts can I get per run?**
A: As many as you want, subject to the free-plan cap above. Pagination is automatic. Each underlying page returns 3 posts, so `maxPosts` is effectively rounded up to the next multiple of 3.

**Q: How are the comment add-ons billed?**
A: They are separate, opt-in billed events. Leave both off if you only need post text, author and engagement counts.

**Q: How fresh is the data?**
A: Posts are fetched at the moment of the run. Each row has `_metadata.fetched_at` so you can reason about staleness in downstream pipelines.

**Q: Can I dedupe across runs?**
A: Yes - `post.id` is stable. Use it as a primary key in your downstream store.

**Q: Can I run multiple groups in parallel?**
A: Within a single run, groups are processed sequentially for predictability. To parallelize, launch multiple runs (e.g. with the API or scheduler) each with a subset of URLs.

**Q: What time zone are timestamps in?**
A: `publishTime` is Unix epoch **seconds** (UTC). `_metadata.fetched_at` is ISO 8601 in UTC. Format to local time in your downstream code.

**Q: What about Meta's anti-scraping enforcement?**
A: Meta's Terms restrict automated extraction. Your downstream use of the data must comply with Meta's Terms. The data-collection infrastructure is operated by an independent third-party provider, not by us. See the Terms section below.

**Q: Can I use this data to train AI?**
A: No. Meta's Terms prohibit AI training on Facebook data, and group posts and comments are independently copyrighted by their authors.

**Q: What about minors?**
A: Facebook has many under-18 users. Posters in groups may be minors. This Actor's Terms strictly prohibit using data of users you know or suspect are minors. See the Addendum below.

**Q: How do I cancel a run?**
A: Click **Abort** in the run's status header. The Actor honors abort signals and exits cleanly.

**Q: Where do I report a bug?**
A: Use UnseenUser's Apify profile contact form: https://apify.com/UnseenUser

***

### Changelog

| Version | Date | Notes |
|---|---|---|
| 1.0 | 2026-06-04 | Initial release. Free-plan 50-result cap, robust multi-shape extraction, diagnostic rows for zero-post groups, sanitized error messages, three pre-defined dataset views (Overview, Engagement, Errors), key-value store schema, OpenAPI live-view schema. |

***

### Related scrapers

Go deeper on public group conversations:

- [Facebook Posts Scraper](https://apify.com/unseenuser/facebook-posts-scraper) - pages, profiles and groups in one multi-mode Actor
- [Facebook Comments Scraper](https://apify.com/unseenuser/facebook-comments-scraper) - full comment threads and reaction breakdowns on group posts
- [Facebook Pages Scraper](https://apify.com/unseenuser/facebook-pages-scraper) - public Page posts
- [Facebook Profile Scraper](https://apify.com/unseenuser/facebook-profile-scraper) - public profile posts
- [Facebook Reels Scraper](https://apify.com/unseenuser/facebook-reels-scraper) - public Reels with metadata
- [Facebook Photos Scraper](https://apify.com/unseenuser/facebook-photos-scraper) - public photo posts
- [Facebook Events Scraper](https://apify.com/unseenuser/facebook-events-scraper) - public event listings
- [Facebook Marketplace Scraper](https://apify.com/unseenuser/facebook-marketplace-scraper) - public Marketplace listings

[See all scrapers by UnseenUser ->](https://apify.com/unseenuser)

***

### Terms of Service

By running this Actor you accept the UnseenUser Master Terms of Service V4.0 and the Actor-Specific Addendum below. Acceptance is by use.

#### Architecture

You (User) -> Apify Platform -> Actor (software) -> Third-party data infrastructure -> Public Facebook content

- **You** run the Actor on the Apify platform with input parameters you choose.
- **Apify** operates the cloud infrastructure that hosts and executes the Actor.
- **The Publisher (UnseenUser)** publishes software code (the Actor) on Apify's platform. The Publisher does not store or retain data returned by the Actor. The Publisher does not see, log, or process the personal data of any individuals returned in the Actor's outputs beyond what is incidental to passing the data through.
- **The third-party data infrastructure provider** is an independent company that operates the actual data-collection infrastructure and bears responsibility for the lawfulness of the collection itself.
- **The source platform** is Facebook (Meta). Its public-facing group content is what the Actor returns.

#### Actor-Specific Addendum

**A. Architectural disclosure.** This Actor is a software wrapper. It accepts your input parameters, requests the relevant public Facebook group content via a third-party data infrastructure provider, and returns the structured result to you on the Apify platform. UnseenUser does not store, log, or substantively process the data returned.

**B. Nature of data returned.** This Actor returns public Facebook group post data: post text, author, reaction and comment counts, top comments, timestamps, and (when enabled) full comment threads and replies. It returns **no member data of any kind** - no member lists, no member contact details. Post and comment authors are personal data subject to GDPR, CCPA, Israeli Privacy Protection Law (including Amendment 13), and equivalent laws in your downstream processing, but only in your hands as the data controller, not in UnseenUser's hands as the software vendor.

**C. Permitted use cases.** Social listening, community and trend research, lead and demand signals (with a lawful basis), market research, content research, brand monitoring.

**D. Specifically prohibited uses.** In addition to Master ToS Section 4 prohibitions, you may NOT:

- Scrape, derive, infer, or emit Facebook group member lists or any member data (post content only)
- Use group post or commenter data to power mass-DM or auto-message tools, or build engagement-scoring databases for sale
- Republish group posts or comments verbatim in commercial products without licensing
- Train commercial AI/ML models on group content without separate licensing authority
- Use sensitive group content (health, religion, politics, sexual orientation) to profile or target individuals
- Attempt to access private groups or use cookies/authentication of any kind

**E. Platform Terms of Service considerations.** Meta's Terms of Service prohibit automated extraction. Meta has aggressively litigated against scrapers. Your downstream use of any data obtained must independently comply with Meta's Terms. If Meta issues a cease-and-desist regarding data obtained via this Actor, notify UnseenUser within 48 hours via the Apify profile contact form (https://apify.com/UnseenUser) and cease your use immediately.

**F. Group posts only - no member harvesting.** This is the central boundary of this Actor. It returns **post content only**. You may NOT use it, or pair it with other tools, to collect, infer, or build lists of group members, member contact details, or membership rosters.

**G. Groups are a sensitive context.** Group membership and participation can reveal special-category data under GDPR Article 9: a health-condition support group, a religious or political group, an addiction-recovery group, or an LGBTQ group all expose sensitive characteristics by association. Treat post and comment content from such groups with heightened care.

**H. Post and comment author personal data.** Authors and commenters are identified individuals whose posts reveal opinions, interests and sometimes special-category views. Establish and document a lawful basis, apply data minimization, set retention limits, and honor data subject rights.

**I. Content copyright and AI training.** Each post and comment is independently copyrighted by its author. You may quote short excerpts with attribution and use aggregated metrics (counts are facts). You may NOT republish posts or comments verbatim in commercial products, build a "Facebook group search engine," or train commercial AI/ML models on group content without proper licensing. Meta's Terms prohibit AI training on Facebook data.

**J. Sensitive-content patterns.** Group discussions frequently include sensitive disclosures: support groups carry illness and bereavement content, advocacy groups carry political and protected-category views, and recovery groups carry addiction disclosures. Do NOT weaponize these.

**K. Minor protection - CRITICAL.** Facebook has a significant under-18 user population, and group posters and commenters may be minors. You MUST NOT use this Actor to scrape posts or comments of users you know or suspect are minors. You MUST NOT use this Actor for any product or service targeted at minors without parental-consent mechanisms compliant with COPPA (US), GDPR Article 8 (EU), and Israeli Privacy Law (heightened sensitivity for minors). DELETE any data you discover relates to a minor unless you have valid parental consent.

**L. Data subject rights.** Authors and commenters have rights under GDPR / CCPA / Israeli Privacy Law: access, deletion, objection, rectification, and portability. Honor these with a typical 30-day SLA.

#### Governing law

The Master Terms of Service are governed by the substantive laws of the State of Israel. Any dispute shall be brought exclusively in the competent civil courts of Tel Aviv-Jaffa, Israel.

***

### Support and contact

- **Bug reports and feature requests:** UnseenUser's Apify profile contact form: https://apify.com/UnseenUser
- **Response target:** Within 2 business days for first response.
- **Service status:** Inherits the Apify platform status (https://status.apify.com) and upstream third-party data infrastructure availability. No independent uptime SLA from UnseenUser.
- **Security disclosures:** Use the same Apify profile contact form. Do not include the affected API key in your message.

***

*Document version: 1.1. Master ToS version: 4.0.*

***

## Full Specification Reference

The remainder of this document is the complete specification this Actor was built from, preserved verbatim for reference (Parts 1 through 6, Master ToS V4.0, and Actor-Specific Addendum).

***

## 👥 Facebook Groups Scraper (No Login)

> **Scrape public Facebook group posts - text, author, reactions, comments and timestamps. No login, no cookies. Public groups only, never member data. JSON/CSV/Excel.**
> **Tier:** Tier 1 - Build Now (large category; public group posts, never members)

***

### 📋 Quick Reference

| Property | Value |
|---|---|
| **Public Name (Apify Title)** | `👥 Facebook Groups Scraper (No Login)` |
| **Apify Slug** | `UnseenUser/facebook-groups-scraper` |
| **Short Description (160 chars)** | Scrape public Facebook group posts - text, author, reactions, comments and timestamps. No login, no cookies. Public groups only, never member data. JSON/CSV/Excel. |
| **API Provider** | [Scrape Creators](https://scrapecreators.com) |
| **API Base URL** | `https://api.scrapecreators.com` |
| **Endpoints Wrapped** | `up to 3 endpoints` (group posts core + comments/replies add-ons) |
| **Endpoints List** | `/v1/facebook/group/posts (core) + /v1/facebook/post/comments + /v1/facebook/post/comment/replies` |
| **Authentication** | `x-api-key` header -> environment variable `SCRAPECREATORS_API_KEY` |
| **API Cost** | 1 credit per request; group posts return 3 per credit; comment add-ons billed separately |
| **Effective Date** | May 5, 2026 |
| **Keywords** | `facebook groups scraper`, `group posts`, `public group`, `social listening`, `community research`, `no login facebook` |

#### Endpoints Wrapped

| Endpoint | Purpose | Credits | Official Documentation |
|---|---|---|---|
| `GET /v1/facebook/group/posts` | Public group posts (3 per request; `cursor`) | 1 credit / request | https://docs.scrapecreators.com (verify group key) |
| `GET /v1/facebook/post/comments` | Full comment threads (add-on; `cursor`) | 1 credit / request | https://docs.scrapecreators.com (Facebook section) |
| `GET /v1/facebook/post/comment/replies` | Comment replies (add-on; `cursor`) | 1 credit / request | https://docs.scrapecreators.com (Facebook section) |
----------------------------------------------------------------------------------------------------------------------------------------------------------

## 📦 Part 1: Public-Facing README (paste into Apify Store listing)

### ⚡ Why This Actor?

Atomic, group-first actor: extract posts from any public Facebook group - text, author, reactions, comment counts, top comments and timestamps. Optionally pull full comment threads and replies per post. No login, no cookies, public groups only. We never touch member lists or private data: this pulls public group post content only, and member harvesting is something this Actor deliberately does not do. It works on known group URLs or IDs; it does NOT discover groups by keyword, return group details (member count, admins, rules), or access private groups via cookies.

### 🎯 Use Cases

- **Social listening** - monitor what a public community is discussing
- **Community and trend research** - track topics and engagement in a group
- **Lead and demand signals** - spot intent in public group discussion (with lawful basis for follow-up)
- **Market research** - understand a niche community's conversations
- **Content research** - study what posts resonate in a group
- **Brand monitoring** - watch public mentions in relevant groups

### 🚀 Quick Start

1. Click **Try for free** on this Actor's page
2. Enter the required identifier (see Inputs Overview below)
3. Run the Actor
4. Download results as JSON, CSV, or XLSX, or pull via Apify API

### ⚙️ Inputs Overview

| Input | Type | Required | Description | Example/Allowed Values |
|---|---|---|---|---|
| `startUrls` | array of strings | ✅ | One or more public Facebook group URLs (or IDs) | `https://www.facebook.com/groups/example` |
| `maxPosts` | integer | ❌ | Stop after this many posts per group. Each call returns 3. Default 30, minimum 3 | `30` |
| `includeTopComments` | boolean | ❌ | Included with the post response at no extra event. Default `true` | `true` |
| `fetchAllComments` | boolean | ❌ | **⚠️ COST WARNING: billed add-on.** Paginate full comment threads per post. | `false` |
| `fetchCommentReplies` | boolean | ❌ | **⚠️ billed add-on.** Pull replies per comment. | `false` |

### 💰 Pricing

Pay-per-event model on Apify. The group-posts endpoint returns 3 posts per credit. Comment threads and replies are separate billed add-ons that paginate.
**Pricing tier hint:** Anchor group-post extraction below the category flagship's $5/1k. Cheap players exist at the floor, but the win here is reliability plus no-cookies plus the trust signal of never scraping members.

> **⚠️ Cost Warning:** `fetchAllComments` and `fetchCommentReplies` paginate per post. Leave them off unless you need full threads.
> See exact per-event pricing on the Actor's Apify page.

### ❓ FAQ

**Q: Is this legal?**
A: This Actor wraps Scrape Creators endpoints that handle the underlying data collection. Your downstream use of the data is your responsibility - see the full Terms of Service and the Actor-Specific Addendum (Part 4) for details.
**Q: Do I need a Scrape Creators account?**
A: No. UnseenUser holds the Scrape Creators credentials. You only need an Apify account.
**Q: What about Facebook's anti-scraping enforcement?**
A: Meta's Terms restrict automated extraction. Scrape Creators handles the data collection - they bear the responsibility for their architecture's lawfulness. Your downstream use must comply with Meta's Terms.
**Q: What if Meta sends a cease-and-desist?**
A: Notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser) and cease using this Actor immediately.
**Q: Can I use this data to train AI?**
A: NO. Meta's Terms prohibit AI training on Facebook data, and group posts and comments are copyrighted by their authors.
**Q: What about minors?**
A: Facebook has many under-18 users, and group posters and commenters may be minors. This Actor's Terms strictly prohibit using data of users you know or suspect are minors. See Part 4 for details.
**Q: Do you scrape group members?**
A: No, never. This Actor pulls public post content only. It does not return member lists, member emails/phones, or any member data - by design and by policy. Scrape Creators has no member endpoint, and this is a deliberate boundary.
**Q: Can it find groups by keyword, or return group details like member count and admins?**
A: No to both. There is no group-search or group-details endpoint in Scrape Creators, so this Actor works on known group URLs/IDs and returns post content, not group metadata.
**Q: Does it work on private groups?**
A: No, by design. This Actor is public-only and never uses cookies or authentication.

### 🔧 Technical Details

- API: Scrape Creators (`https://api.scrapecreators.com`)
- Auth: `x-api-key` header
- Output: streamed via Apify dataset
- Format: JSON, CSV, XLSX, or via Apify API
- Retries: 3 with exponential backoff on 429/502/503/504
- No rate limit stated by Scrape Creators ("scrape as fast as you want")
- Pagination: cursor-based; group posts return 3 per request
- Public groups only; logged-off; never member data

***

## 🛠️ Part 2: Build Specification (for Claude Code)

### Build Specification

```
Build an Apify actor in Node.js (TypeScript) called "facebook-groups-scraper".
Core: /v1/facebook/group/posts  (+ add-ons: /post/comments, /post/comment/replies)
Auth: x-api-key header -> loaded from environment variable SCRAPECREATORS_API_KEY.
INPUT_SCHEMA.json:
- startUrls (array of strings, REQUIRED) - public group URLs (or IDs)
- maxPosts (integer, default 30, minimum 3)
- includeTopComments (boolean, default true)
- fetchAllComments (boolean, default false) - billed add-on
- fetchCommentReplies (boolean, default false) - billed add-on
Behavior:
1. Validate input - fail fast with helpful error messages (startUrls non-empty).
2. For each group, call /v1/facebook/group/posts. Returns 3 posts per request (hard FB limit).
   Paginate on `cursor`; hard stop on maxPosts and empty cursor.
   Confirm the group input key (url vs groupId) in the console.
   POST CONTENT ONLY. Never request, derive, or emit member lists or any member data.
3. Add-ons (gated, billed): fetchAllComments -> /post/comments (cursor);
   fetchCommentReplies -> /post/comment/replies (cursor).
4. Stream one row per post via Actor.pushData(); attach comments[]/replies[] when enabled.
5. Include _metadata field per row: { fetched_at, group_url, page }
6. On 4xx errors for individual items, emit error rows - do NOT crash the whole run.
Retries: 3 with exponential backoff (1s, 2s, 4s) on 429, 502, 503, 504.
Concurrency: 1 within post pagination; add-ons sequential per post.
User-Agent: OpusScale-Apify/1.0
```

### 📡 API Reference - Verified from Official Documentation

> Endpoint facts sourced from docs.scrapecreators.com (Facebook section). The group-posts shape follows the profile-posts family; confirm the group input key and exact fields in the console.

#### 📡 Endpoint: Group Posts ✅ VERIFIED (endpoint pattern)

**`GET https://api.scrapecreators.com/v1/facebook/group/posts`** - 1 credit

##### Authentication

| Header | Value | Required |
|---|---|---|
| `x-api-key` | Your Scrape Creators key | ✅ Required |

##### Query Parameters

| Parameter | Type | Required | Description | Example |
|---|---|---|---|---|
| `url` | string | ✅ (verify url vs groupId) | Public group URL | `https://www.facebook.com/groups/example` |
| `cursor` | string | ❌ | Pagination token | from prior `cursor` |
⚠️ **Caveat:** confirm the group input key (`url` vs `groupId`) and the exact post-object fields in the console. Returns 3 posts per request (hard Facebook limit, flagged by SC). **Post content only - no member data is available or to be derived.**

##### Response 200 - Sample (modeled on the profile-posts shape; confirm in console)

```json
{
  "groupUrl": "https://www.facebook.com/groups/example",
  "id": "1204545088344463",
  "text": "Post body text...",
  "url": "https://www.facebook.com/groups/example/posts/...",
  "permalink": "https://www.facebook.com/...",
  "author": { "name": "Sample Author", "id": "100063669491743" },
  "reactionCount": 133,
  "commentCount": 12,
  "publishTime": 1734553170,
  "videoDetails": { "sdUrl": null, "hdUrl": null, "thumbnailUrl": null },
  "topComments": [
    { "id": "...", "text": "Comment text", "publishTime": 1734569761, "author": { "id": "...", "name": "Sample Commenter" } }
  ],
  "cursor": "Cg8Ob3JnYW5pY19jdXJzb3IJ..."
}
```

#### 📡 Endpoint: Post Comments / Comment Replies (add-ons) ✅ VERIFIED (endpoint pattern)

**`GET .../v1/facebook/post/comments`** and **`.../v1/facebook/post/comment/replies`** - 1 credit each
**Source:** https://docs.scrapecreators.com (Facebook section)
Both paginate on `cursor`. See the dedicated Comments actor for the full comment schema (text, reactions, author, inferred gender).

#### Combined Output Structure (this Actor's contribution)

```json
{
  "post": { /* group post object */ },
  "comments": [ /* present only when fetchAllComments=true */ ],
  "replies": [ /* present only when fetchCommentReplies=true */ ],
  "_metadata": { "fetched_at": "...", "group_url": "https://...", "page": 2 }
}
```

### Pricing Strategy (pay-per-event)

Configure pay-per-event in Apify console. Anchor below the $5/1k flagship; compete on reliability and the never-scrape-members trust signal, not the absolute floor.
| Tier | Trigger | Suggested Apify Price | Rationale |
|---|---|---|---|
| **Post scraped** | per group post | **$3/1k** | Undercuts the $5 flagship; matches the no-cookies competitive band |
| **Comment collected (add-on)** | `fetchAllComments` | $2.5/1k | Matches the Posts/Comments actors |
| **Comment reply collected (add-on)** | `fetchCommentReplies` | $3/1k | |
**Important:** keep the start fee near zero ($0.00005/run).

### Tags (actor.json)

```
categories: ["SOCIAL_MEDIA", "LEAD_GENERATION"]
keywords: ['facebook groups scraper', 'group posts', 'public group', 'social listening', 'community research', 'no login facebook']
```

### Important Notes for Claude Code

1. Never log the API key in error messages or run logs
2. Emit failed requests as dataset rows with `error` field - do NOT crash the whole run
3. Include `_metadata` field per row: `{ fetched_at, group_url, page }`
4. For multiple groups per run, process sequentially with per-group error isolation
5. Log a one-line acceptance notice at start of every run:
   ```
   ℹ️ This Actor is governed by UnseenUser's Terms of Service V4.0.
   ℹ️ Running this Actor constitutes binding acceptance.
   ```
6. **NO MEMBER HARVESTING:** post content only. Never request, derive, or emit member lists, member emails/phones, or any member data. This is a hard rule and a market boundary.
7. **Critical pagination note:** group posts return 3 per request; loop on `cursor` with a hard stop on `maxPosts` and empty cursor.
8. **Confirm the group input key** (`url` vs `groupId`) and exact post fields in the console before shipping.
9. **Comment add-ons** gated behind toggles and billed separately; skip calls when off.
10. **No group search or group details** promised anywhere (SC has neither endpoint).

***

## Apify Actor - Terms of Service

**Version:** 4.0
**Effective Date:** May 5, 2026
-------------------------------

### 0. ACCEPTANCE BY USE - IMPORTANT

**Read this section first.**
These Terms of Service ("Terms") form a binding legal agreement between you ("User," "you," "your") and UnseenUser, the Publisher of this Apify actor ("UnseenUser," "the Publisher," "we," "us," "our").

#### 0.1 How You Accept These Terms

You accept these Terms by **any of the following actions**, each of which constitutes a clear, affirmative act of acceptance:

- (a) **Running the Actor** - Initiating any execution of the Actor on the Apify platform
- (b) **Using any output** returned by the Actor for any purpose
- (c) **Continuing to access** the Actor's listing or documentation after these Terms are visible

#### 0.2 Continuing Acceptance

Each time you run the Actor or use its outputs, you reaffirm your acceptance of the then-current Terms. If you do not agree to these Terms or any subsequent update, you must stop using the Actor immediately.

#### 0.3 No Anonymous Acceptance

You cannot disclaim acceptance by:

- Failing to read these Terms before running the Actor
- Running the Actor through automated systems
- Sharing your Apify account with others who may not have read these Terms
  By the act of running the Actor on Apify, you bind yourself, your organization (if applicable), and any individuals or systems acting on your behalf or under your authority.

#### 0.4 If You Do Not Accept

## **If you do not agree to these Terms, you must not run the Actor.** No use is authorized without acceptance.

### PREAMBLE - UNDERSTANDING THE ARCHITECTURE

Before using the Actor, please understand the technical architecture of the service:

#### The Data Flow

You (User) -> Apify Platform -> Actor (software) -> Third-Party API -> Source Platform
You (User) <- Apify Platform <- Actor (software) <- Third-Party API

#### What Each Party Does

- **You (the User):** Run the Actor on the Apify platform with input parameters you choose
- **Apify:** Operates the cloud infrastructure that hosts and executes Actors. Apify is a Czech-incorporated company (Apify Technologies s.r.o.) governed by its own Terms of Service.
- **The Publisher (us):** Publishes software code (the Actor) on Apify's platform. The Actor is a thin wrapper that translates your input into requests to a third-party API and returns the API's responses to you. **The Publisher does not operate scraping infrastructure. The Publisher does not store or retain data returned by the Actor. The Publisher does not see, log, or process the personal data of any individuals returned in the Actor's outputs beyond what is incidental to passing the data through.**
- **Third-Party API Provider:** HarvestAPI (https://harvest-api.com) or Scrape Creators (https://scrapecreators.com). These are independent third-party companies that operate scraping infrastructure and return data from source platforms.
- **Source Platform:** LinkedIn, TikTok, YouTube, Reddit, Linktree, etc. These are the platforms whose publicly visible data is accessed by the Third-Party API Providers.

#### Why This Matters

## Your relationship with the Publisher is that of a **software user** to a **software vendor**. The Publisher has the responsibilities of a software vendor (functional code, accurate documentation) and the limits of one (the Publisher is not responsible for how you use the data you obtain).

These Terms operate alongside but do not replace:

- Apify's Terms of Service and Acceptable Use Policy (governing your relationship with Apify)
- HarvestAPI Terms of Service and Scrape Creators Terms of Service (governing the underlying data infrastructure)
- Source Platform terms (LinkedIn, TikTok, etc.) governing the public data accessed
- Applicable law in your jurisdiction and the jurisdictions of data subjects
  These Terms incorporate the actor-specific addendum published in each Actor's individual listing ("Addendum"). In the event of a conflict, the more restrictive provision applies.

***

### 1. NATURE OF THE SERVICE

#### 1.1 What the Actor Is

The Actor is a software program published on the Apify platform. Each Actor:

- (a) Accepts structured input from you on the Apify platform
- (b) Translates that input into HTTP requests to a third-party API operated by HarvestAPI or Scrape Creators
- (c) Receives HTTP responses from that third-party API
- (d) Returns the response data to you in a structured format on the Apify platform
  The Actor's source code is hosted on Apify's infrastructure. The Actor runs in Apify's cloud, not on the Publisher's servers. The Publisher operates no servers running the Actor.

#### 1.2 What the Actor Is Not

The Actor is **not**:

- (a) A scraping tool - the Publisher does not operate scraping infrastructure, proxies, headless browsers, or fake accounts
- (b) A direct connection to any source platform - connections to source platforms are made by HarvestAPI / Scrape Creators
- (c) A data storage or data retention service - the Publisher does not maintain a database of any data the Actor returns
- (d) A licensed access channel to LinkedIn, TikTok, YouTube, Reddit, X (Twitter), Meta, Linktree, or any other source platform
- (e) Affiliated with, endorsed by, sponsored by, or authorized by any source platform

#### 1.3 The Publisher's Limited Role

The Publisher's role is limited to:

- (a) Designing and writing the Actor's source code
- (b) Publishing the Actor on the Apify Store
- (c) Maintaining the Actor (updating it when API providers change schemas)
- (d) Providing documentation and customer support via Apify's contact mechanism
  The Publisher is a software vendor, similar to a developer who publishes an app on the Apple App Store or Google Play Store. The Publisher is not a data provider, data broker, data processor, or data controller for purposes of GDPR, CCPA, Israel's Privacy Protection Law, or equivalent.

#### 1.4 The Third-Party API Providers' Role

HarvestAPI (https://harvest-api.com) and Scrape Creators (https://scrapecreators.com) are independent third-party companies. They:

- (a) Operate the actual data scraping infrastructure
- (b) Maintain relationships with source platforms (or accept the operational risk of accessing public data without such relationships)
- (c) Are themselves Apify publishers (HarvestAPI publishes 9+ actors directly; Scrape Creators publishes 10+)
- (d) Provide their own Terms of Service governing their operations
- (e) Are responsible for compliance obligations relating to the data collection itself
  The Publisher is a customer of these providers. The Publisher is not their agent, partner, or representative.

***

### 2. WHO MAY USE THE ACTOR

#### 2.1 Eligibility

You may use the Actor only if:

- (a) You are at least 18 years old or the age of majority in your jurisdiction
- (b) You have legal capacity to enter into binding contracts
- (c) You are not located in or resident of a country subject to comprehensive sanctions by the United States, European Union, United Kingdom, or Israel
- (d) You are not on any prohibited persons list

#### 2.2 User Representations

By using any Actor, you represent and warrant that:

- (a) **Truthful identity:** Information you provide about your identity and intended use is accurate
- (b) **Lawful intent:** Your intended use complies with applicable law in your jurisdiction
- (c) **Source platform compliance:** You will independently comply with the Terms of Service of any source platform whose data you obtain through the Actor
- (d) **Data subject rights:** Where Actor outputs include personal data, you will respect data subject rights under applicable law
- (e) **No prohibited use:** You will not use the Actor for any of the purposes prohibited in Section 4
  These representations are continuous - they must remain true throughout your use.

***

### 3. PERMITTED USES

The Actor may be used for any lawful purpose, including:

- Market research and competitive analysis
- Academic research
- Journalism and investigative reporting
- Internal business intelligence
- Brand monitoring
- Recruitment research where consistent with applicable employment law
- Building products that further process publicly available information lawfully
  Specific permitted uses for each Actor are described in that Actor's individual listing and Addendum.

***

### 4. PROHIBITED USES

You may not use the Actor for any of the following:

#### 4.1 Illegal Activity

Activity illegal under the law of your jurisdiction, the User's jurisdiction, or the jurisdiction of any data subjects.

#### 4.2 Harassment, Stalking, and Personal Targeting

- Compiling profiles for harassment, stalking, or doxxing
- Tracking individuals' movements or activities without their knowledge
- Building profiles of journalists, activists, dissidents, or vulnerable populations for retaliatory purposes

#### 4.3 Discrimination

- Using outputs for discriminatory employment, lending, housing, or insurance decisions based on protected characteristics
- Building lists for discriminatory purposes

#### 4.4 Spam and Unsolicited Commercial Communication

- Sending unsolicited marketing in violation of CAN-SPAM, CASL, GDPR, PECR, Israeli Anti-Spam Law (Section 30A of the Communications Law), or equivalent laws
- Building "lead lists" from scraped contacts without proper consent infrastructure
- Reselling contact data for spam purposes

#### 4.5 Fraud and Deception

- Identity theft or impersonation
- Generation of fake reviews, testimonials, or coordinated inauthentic behavior
- Election interference or political disinformation
- Securities fraud

#### 4.6 Source Platform Abuse

- Using outputs to circumvent technical protection measures of source platforms
- Creating fake accounts on source platforms based on Actor outputs
- Vote manipulation, engagement manipulation, or platform algorithm gaming
- Building services that competitively substitute for source platforms

#### 4.7 Reselling the Actor's Service

- Reselling raw Actor outputs as your own data product or scraping-as-a-service
- Sharing your Apify credentials to provide third parties indirect access
- Building competing API services using Actor outputs

#### 4.8 AI Training Without Authorization

- Using Actor outputs as training data for commercial AI/ML models without separate licensing authority from the source platform

#### 4.9 Sensitive Targeting

- Specifically targeting or profiling based on health conditions, sexual orientation, religious beliefs, political opinions, or other sensitive characteristics
- Targeting children under 16 (or local age of consent for data processing)

#### 4.10 Privacy Law Violations

- Processing personal data of EU/UK/California/Israeli residents without complying with applicable privacy law
- Failing to honor data subject access, deletion, or objection requests
- Processing data for purposes incompatible with its publication context

***

### 5. SOURCE PLATFORM TERMS - YOUR RESPONSIBILITY

#### 5.1 Acknowledgment

The Actor accesses publicly visible data on third-party platforms ("Source Platforms") through the Third-Party API Providers (HarvestAPI / Scrape Creators). Source Platforms include LinkedIn, TikTok, YouTube, Reddit, X (Twitter), Meta/Facebook, Linktree, Komi, Pillar, Linkbio, Linkme, and Amazon.

#### 5.2 Your Sole Responsibility

You acknowledge:

- (a) **You are solely responsible for ensuring your downstream use of data obtained through the Actor complies with the Source Platform's Terms of Service**
- (b) The Publisher makes no representation that any specific use is permitted under any Source Platform's terms
- (c) The Third-Party API Providers, not the Publisher, bear responsibility for the lawfulness of the data collection itself
- (d) You should review Source Platform terms before commercial use:
  - LinkedIn: https://www.linkedin.com/legal/user-agreement
  - TikTok: https://www.tiktok.com/legal/page/global/terms-of-service/en
  - YouTube: https://www.youtube.com/static?template=terms
  - X: https://twitter.com/en/tos
  - Reddit: https://www.redditinc.com/policies/user-agreement
  - Meta: https://www.facebook.com/legal/terms
  - Linktree: https://linktr.ee/s/terms/

#### 5.3 Cease-and-Desist Compliance

If you receive a cease-and-desist letter or other legal demand from a Source Platform regarding your use of Actor outputs, you must:

- (a) Cease the contested use immediately
- (b) Notify UnseenUser within 48 hours via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser)
- (c) Cooperate with the Publisher as needed to mitigate
- (d) Not assert against the Publisher any claim arising from your inability to use the Actor for that Source Platform

***

### 6. DATA PROTECTION - REFLECTING ACTUAL ARCHITECTURE

#### 6.1 Roles Under Privacy Law

For purposes of GDPR, UK GDPR, CCPA, Israel's Privacy Protection Law (PPL) including Amendment 13, and equivalents:

- **You (the User) are the Data Controller** of any personal data you obtain through the Actor and subsequently process for your own purposes
- **HarvestAPI and Scrape Creators** are the entities that collect data from source platforms - they bear the responsibilities of data processors or controllers (depending on context) for the collection itself
- **The Publisher acts solely as a software vendor**, not as a data controller or processor, because the Publisher does not store, retain, or substantively process personal data - the Actor merely passes API responses through

#### 6.2 No Data Retention by the Publisher

The Publisher confirms:

- (a) The Publisher does not maintain a database of personal data obtained through the Actor
- (b) The Actor passes data from the Third-Party API directly to you on the Apify platform - data does not flow through the Publisher's infrastructure
- (c) Apify's standard execution and operational logging may include limited information about Actor runs (input parameters, run duration, data volume) - this is governed by Apify's own privacy practices
- (d) The Publisher does not access, view, or analyze your Actor outputs except as needed for technical support if you specifically share them with the Publisher

#### 6.3 Your Obligations as Data Controller

Where your use of the Actor involves processing personal data, you are responsible for:

- (a) Establishing a lawful basis for your processing (consent, legitimate interest with documented balancing test, contract, etc.)
- (b) Providing transparent notice to data subjects as required by applicable law
- (c) Honoring data subject access, rectification, erasure, restriction, and portability requests
- (d) Implementing appropriate security measures
- (e) Conducting Data Protection Impact Assessments where required
- (f) Appointing a Data Protection Officer if your operations require one
- (g) Registering databases with applicable supervisory authorities
- (h) Honoring opt-out requests for direct marketing
- (i) Cross-border transfer safeguards where data crosses borders

#### 6.4 Israel's Amendment 13 - User Compliance

If your use of the Actor involves Israeli residents' personal data, you must comply with the Privacy Protection Law as amended (Amendment 13, effective August 14, 2025). These obligations are yours as the data controller, not the Publisher's as the software vendor.

#### 6.5 Sensitive Data Targeting Restrictions

You will not use the Actor to specifically target, profile, or build datasets focused on:

- Health or medical conditions
- Religious beliefs
- Political opinions
- Sexual orientation or gender identity
- Genetic or biometric data
- Criminal history
- Children under 16

***

### 7. INTELLECTUAL PROPERTY

#### 7.1 Actor Code

The Actor's source code, schemas, documentation, and branding are owned by the Publisher. You receive a limited, non-exclusive, non-transferable, revocable license to use the Actor for permitted purposes during your active subscription/run with Apify.

#### 7.2 Output Data

The Publisher claims no ownership over the public data the Actor returns. Source Platforms may have copyright, database rights, or other rights in their data; data subjects may have copyright in user-generated content. Your use of output data must respect these rights independently.

#### 7.3 Restrictions

You may not reverse engineer, decompile, or reuse the Actor's code in a competing actor.

#### 7.4 Feedback

## Feedback you provide may be used by the Publisher to improve products without compensation to you.

### 8. PRICING AND PAYMENT

#### 8.1 Apify Platform Billing

Pricing is administered through Apify's pricing models. Apify processes all payments. Apify's payment terms govern refunds and disputes.

#### 8.2 Pricing Changes

The Publisher may change Actor pricing with at least 14 days' notice via the Actor's Apify listing.

#### 8.3 No Refunds for Misuse

## If your access is suspended or terminated for breach of these Terms, you forfeit any unused balance and are not entitled to refunds.

### 9. SERVICE AVAILABILITY AND CHANGES

#### 9.1 No Uptime Guarantee

The Actor depends on:

- (a) The Apify platform
- (b) Underlying API providers (HarvestAPI, Scrape Creators)
- (c) Source Platforms' continued public accessibility
  Any of these may change behavior, restrict access, or become unavailable without notice. The Publisher makes no uptime guarantees.

#### 9.2 Service Discontinuation

## The Publisher may discontinue any Actor at any time. Reasonable notice will be provided when feasible.

### 10. DISCLAIMERS

#### 10.1 "AS IS" Service

THE ACTOR IS PROVIDED "AS IS" AND "AS AVAILABLE" WITHOUT WARRANTIES OF ANY KIND, INCLUDING WARRANTIES OF MERCHANTABILITY, FITNESS FOR PURPOSE, NON-INFRINGEMENT, OR ACCURACY OF DATA.

#### 10.2 No Representation of Lawfulness

The Publisher makes no representation that your specific use of the Actor or the data it returns is lawful in your jurisdiction or under any Source Platform's terms. The burden of determining lawfulness for your use case is yours.

#### 10.3 No Endorsement of Source Content

## Content returned by the Actor was created by third parties. The Publisher does not endorse, verify, or take responsibility for it.

### 11. LIMITATION OF LIABILITY

#### 11.1 Aggregate Liability Cap

TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL THE AGGREGATE LIABILITY OF THE PUBLISHER FOR ALL CLAIMS RELATING TO THE ACTOR EXCEED THE GREATER OF:

- (a) ONE HUNDRED U.S. DOLLARS (US $100), OR
- (b) THE AMOUNTS YOU PAID THROUGH APIFY FOR USE OF THE ACTOR IN THE THREE (3) MONTHS IMMEDIATELY PRECEDING THE EVENT

#### 11.2 Excluded Damages

THE PUBLISHER IS NOT LIABLE FOR INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES, OR FOR LOSS OF PROFITS, REVENUE, OR DATA, EVEN IF ADVISED OF THE POSSIBILITY.

#### 11.3 Time Limit

## Any claim must be brought within one (1) year of the event.

### 12. INDEMNIFICATION

#### 12.1 Your Indemnification of the Publisher

You agree to defend, indemnify, and hold harmless the Publisher from any:

- Claims arising from your use of the Actor
- Claims arising from your violation of these Terms
- Claims arising from your violation of any law (including privacy law)
- Claims arising from your violation of any Source Platform's Terms of Service
- Claims arising from your processing of personal data obtained through the Actor
- Reasonable attorneys' fees and costs of defending such claims

#### 12.2 Defense

The Publisher may assume defense at your expense. You will cooperate with the Publisher's defense.

#### 12.3 Scope

The indemnification covers reasonable, foreseeable third-party claims arising from your use. It does not extend to:

- Claims arising from the Publisher's gross negligence or willful misconduct
- Claims regarding the Actor's source code itself (those are the Publisher's responsibility)
- Claims regarding the Third-Party API Provider's data collection (those are their responsibility)

***

### 13. SUSPENSION AND TERMINATION

#### 13.1 Termination by the Publisher

The Publisher may terminate your access for material breach, illegal use, breach of warranty, or upon credible legal demand.

#### 13.2 Effects of Termination

Your license ends, you must cease use, and applicable provisions survive.

#### 13.3 Termination by You

## You may stop using the Actor at any time on Apify.

### 14. DISPUTE RESOLUTION

#### 14.1 Informal Resolution First

Send a detailed written description of the dispute via UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) and wait 60 days for resolution attempt before any formal claim.

#### 14.2 Governing Law

These Terms are governed by the substantive laws of the State of Israel, without regard to conflict of law principles.

#### 14.3 Exclusive Jurisdiction

Any dispute shall be brought exclusively in the competent civil courts of Tel Aviv-Jaffa, Israel.

#### 14.4 No Class Actions

You agree to bring claims only in your individual capacity.

#### 14.5 Attorneys' Fees

## The prevailing party recovers reasonable attorneys' fees.

### 15. MISCELLANEOUS

#### 15.1 Entire Agreement

These Terms (with Addendum and incorporated documents) are the entire agreement.

#### 15.2 Severability

Unenforceable provisions are reformed to the minimum extent or severed.

#### 15.3 Assignment

You may not assign without the Publisher's consent. The Publisher may assign to affiliates, successors, or acquirers.

#### 15.4 Force Majeure

Neither party is liable for failure due to events beyond reasonable control, including changes by Source Platforms or Third-Party API Providers, or actions by Apify.

#### 15.5 Third-Party Beneficiaries

Apify, HarvestAPI, and Scrape Creators are intended third-party beneficiaries of Sections 4 (Prohibited Uses), 5 (Source Platform Compliance), and 12 (Indemnification).

#### 15.6 Survival

Sections 0 (Acceptance), 4, 5, 6, 7, 10, 11, 12, 14, and 15 survive termination.

#### 15.7 Language

English controls. Translations are for convenience only.

#### 15.8 Publisher Identification for Legal Process

## The Publisher operates on the Apify platform under the username **UnseenUser** (apify.com/UnseenUser). The Publisher is a registered legal entity. Upon receipt of valid legal process (subpoena, court order, or equivalent) directed through Apify's official channels, the Publisher's full legal identity may be disclosed as required by law. This Section ensures that you have a valid path to legal recourse if needed.

### 16. ACKNOWLEDGMENT

By using any Actor, you acknowledge that:

- (a) You have read these Terms
- (b) You understand the architecture: you are using software (the Actor) on Apify's platform that calls third-party APIs
- (c) You accept responsibility for your use, including for compliance with Source Platform terms
- (d) Your indemnification obligations cover third-party claims arising from your use
- (e) Disputes are resolved in Israeli courts
- (f) The Publisher's identity, while not publicly disclosed in this listing, can be obtained through valid legal process via Apify
  For questions, use UnseenUser's Apify profile contact form (https://apify.com/UnseenUser) before running the Actor.

***

### APPENDIX - Document Version History

| Version | Date | Summary |
|---------|------|---------|
| 1.0 | May 5, 2026 | Initial publication |
| 2.0 | May 5, 2026 | Hardened (over-broad - treated User as data broker) |
| 3.0 | May 5, 2026 | Architecturally accurate - Publisher as software vendor |
| 4.0 | May 5, 2026 | **Anonymous Publisher.** All personally identifying information removed. Acceptance-by-Use mechanism formalized. |
----------------------------------------------------------------------------------------------------------------------------------------

## *These Terms reflect best practices for anonymous Apify actor publishing as of May 2026. Not a substitute for legal advice. Consult qualified Israeli commercial counsel before deploying.*

## 🛡️ Part 4: Actor-Specific Terms of Service Addendum

### 🛡️ Actor-Specific ToS Addendum - 👥 Facebook Groups Scraper

This addendum supplements the Master Terms of Service V4.0. By running this Actor, you accept both the Master ToS and this addendum.

#### A. Architectural Disclosure

This Actor is a software wrapper. It accepts your input parameters, calls the Scrape Creators `/v1/facebook/group/posts` endpoint (and, only when you enable them, `/v1/facebook/post/comments` and `/v1/facebook/post/comment/replies`), combines the results into a structured output, and returns the combined data to you on the Apify platform. UnseenUser does not store, log, or substantively process the data returned. The data flows from Scrape Creators through Apify's runtime directly to you.

#### B. Nature of Data Returned

This Actor returns public Facebook group post data: post text, author, reaction and comment counts, top comments, timestamps, and (when enabled) full comment threads and replies. It returns **no member data of any kind** - no member lists, no member contact details.
Post and comment authors are **personal data** subject to GDPR, CCPA, Israeli Privacy Protection Law (including Amendment 13), and equivalent privacy laws in your downstream processing - but **only in your hands as the data controller**, not in UnseenUser's hands as the software vendor.

#### C. Permitted Use Cases

You may use this Actor for the following purposes (non-exhaustive list):

- **Social listening** - what a public community discusses
- **Community and trend research** - topics and engagement in a group
- **Lead and demand signals** - intent in public discussion, with a lawful basis for follow-up
- **Market research** - a niche community's conversations
- **Content research** - what posts resonate
- **Brand monitoring** - public mentions in relevant groups

#### D. Specifically Prohibited Uses

In addition to Master ToS Section 4 prohibitions, you may NOT:

- Scrape, derive, infer, or emit Facebook group member lists or any member data (post content only)
- Use group post or commenter data to power mass-DM/auto-message tools or build engagement-scoring databases for sale
- Republish group posts or comments verbatim in commercial products without licensing
- Train commercial AI/ML models on group content without separate licensing authority
- Use sensitive group content (health, religion, politics, sexual orientation) to profile or target individuals
- Attempt to access private groups or use cookies/authentication

#### E. Platform Terms of Service Considerations

Meta's Terms of Service prohibit automated extraction. Meta has aggressively litigated against scrapers (Meta v. BrandTotal - settled with permanent injunction; Meta v. Octopus Data; Meta v. Bright Data - pending). Facebook's Terms of Service prohibit automated extraction. This Actor accesses publicly visible group post data via Scrape Creators - Scrape Creators bears responsibility for the lawfulness of the data collection. Your downstream use must independently comply with Meta's Terms of Service.
If Meta issues a cease-and-desist regarding data obtained via this Actor, notify UnseenUser within 48 hours via the Apify profile contact form (apify.com/UnseenUser) and cease your use immediately.

#### F. Group Posts Only - No Member Harvesting

This is the central boundary of this Actor. It returns **post content only**. You may NOT use it, or pair it with other tools, to collect, infer, or build lists of group members, member contact details, or membership rosters. Scrape Creators provides no member endpoint, and member harvesting is prohibited regardless. This is both a hard policy rule and a deliberate market boundary the Publisher does not cross.

#### G. Groups Are a Sensitive Context

Group membership and participation can reveal special-category data under GDPR Article 9: a health-condition support group, a religious or political group, an addiction-recovery group, or an LGBTQ group all expose sensitive characteristics by association. Treat post and comment content from such groups with heightened care: do not use it to infer or record a person's health, religion, politics, or sexual orientation, and do not build datasets that profile individuals by the sensitive groups they post in. Where group context is sensitive, the safest course is to store aggregate signal, not individual records.

#### H. Post and Comment Author Personal Data

Authors and commenters are identified individuals whose posts reveal opinions, interests and sometimes special-category views. Establish and document a lawful basis, apply data minimization (store the signal, not the full text, where possible), set retention limits, and honor data subject rights. Recent European DPA decisions increasingly hold that people do not reasonably expect their public group posts to be used for commercial outreach.

#### I. Content Copyright and AI Training

Each post and comment is independently copyrighted by its author. You may quote short excerpts with attribution (typically fair use) and use aggregated metrics (counts - facts). You may NOT republish posts or comments verbatim in commercial products, build a "Facebook group search engine," or train commercial AI/ML models on group content without proper licensing. Meta's Terms prohibit AI training on Facebook data. Recent litigation (NYT v. OpenAI, Andersen v. Stability AI, Reddit v. Perplexity) shows AI training on platform content is contested. Your AI training use is your own legal exposure.

#### J. Sensitive-Content Patterns

Group discussions frequently include sensitive disclosures: support groups carry illness and bereavement content, advocacy groups carry political and protected-category views, and recovery groups carry addiction disclosures. Do NOT weaponize these: do not build "vulnerability lists" from inferred life events, do not use bereavement content for grief-targeting marketing, and do not use health or recovery disclosures to identify candidates for products without explicit consent.

#### K. Minor Protection - CRITICAL

Facebook has a significant under-18 user population, and group posters and commenters may be minors (school groups, youth communities). You MUST:

- NOT use this Actor to scrape posts or comments of users you know or suspect are minors
- NOT use this Actor for any product or service targeted at minors without parental-consent mechanisms compliant with COPPA (US), GDPR Article 8 (EU), and Israeli Privacy Law (heightened sensitivity for minors)
- DELETE any data you discover relates to a minor unless you have valid parental consent
  If content or an author suggests a minor, treat the data as belonging to a minor by default. This restriction is non-negotiable.

#### L. Data Subject Rights and Cease-and-Desist Protocol

Authors and commenters have rights under GDPR / CCPA / Israeli Privacy Law: access, deletion, objection (absolute for direct marketing under Article 21), rectification, and portability. Honor these with a typical 30-day SLA.
If a data subject contacts YOU directly demanding deletion, honor it promptly, do NOT route them to UnseenUser (the software vendor is not the data controller), you may suggest they contact Meta directly since the data originates there, and document the request and your response. If Meta, Scrape Creators, or a regulator contacts UnseenUser regarding your use, UnseenUser will notify Apify per Master ToS Section 8, may suspend access pending investigation, and you agree to provide documentation of your lawful basis on reasonable request.
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

## ✅ Part 5: Implementation Checklist for Claude Code

When building this Actor, ensure:

- \[ ] Code is written in Node.js (TypeScript preferred)
- \[ ] Authentication uses `x-api-key` header from `SCRAPECREATORS_API_KEY` env variable (never hardcoded)
- \[ ] All endpoints are implemented with proper error handling
- \[ ] Input validation: required fields fail fast with clear error messages
- \[ ] Pagination respects max\_\* inputs strictly
- \[ ] Retry logic: 3 retries with exponential backoff (1s, 2s, 4s) on 429/502/503/504
- \[ ] Output uses `Actor.pushData()` to stream each result
- \[ ] Each row includes `_metadata`: `{ fetched_at, group_url, page }`
- \[ ] Failed requests emitted as dataset rows with `error` field - don't crash on individual failures
- \[ ] User-Agent header set to: `OpusScale-Apify/1.0`
- \[ ] INPUT\_SCHEMA.json includes all input fields with proper validation
- \[ ] README.md (matching Part 1 + Part 3 + Part 4 content) is committed
- \[ ] actor.json includes categories and keywords per Part 2
- \[ ] Pricing per-event configured in Apify console with appropriate margin
- \[ ] Acceptance-by-Use notice logged at start of every run
- \[ ] No personal information about UnseenUser in code or output
- \[ ] All references use "UnseenUser" or "the Publisher" (V4 anonymous framing)
- \[ ] **NO MEMBER HARVESTING** - post content only; never request, derive, or emit member data
- \[ ] **Group input key** (`url` vs `groupId`) and exact post fields confirmed in console
- \[ ] **Cursor loop** (3 posts/call); hard stop on `maxPosts` and empty cursor
- \[ ] **Comment + reply add-ons** gated and billed separately; skipped when off
- \[ ] **No group search or group details** promised anywhere (SC has neither)
- \[ ] **Distinct slug + group screenshots**; coexists with the Posts actor's group mode
- \[ ] Per-group error isolation

***

## 🚀 Part 6: Pre-Publish Checklist on Apify

Before clicking "Publish":

- \[ ] Test runs succeed with default inputs (a public group URL)
- \[ ] Test with invalid inputs - clear error messages, no crash
- \[ ] Test pagination - verify it stops at `maxPosts` and on empty cursor
- \[ ] Test comment + reply add-ons - billed and paginated correctly
- \[ ] Confirm output contains NO member data of any kind
- \[ ] Test a group with no posts (empty case) - emits cleanly, does not crash
- \[ ] Output schema matches what the README documents
- \[ ] Pricing per-event configured in Apify console (post + comment add-on tiers)
- \[ ] Apify "Title" field set to: `👥 Facebook Groups Scraper (No Login)`
- \[ ] Apify "Short Description" set to: `Scrape public Facebook group posts - text, author, reactions, comments and timestamps. No login, no cookies. Public groups only, never member data. JSON/CSV/Excel.`
- \[ ] Apify "README" tab populated with content from Part 1 + Part 3 + Part 4 (public-only + no-member-harvesting prominent)
- \[ ] Cover image uploaded (1920x1080 PNG, no Publisher branding)
- \[ ] Categories and keywords entered per Part 2
- \[ ] Tested the Apify contact form on UnseenUser's profile (this is the official legal channel)

***

**Document Version:** 4.0 (anonymous Publisher, UnseenUser identified)
**Last Updated:** May 5, 2026
**Master ToS Version:** 4.0
**Document Status:** Ready for Claude Code execution
**Atomic Actor Note:** This is a group-first actor wrapping a core API endpoint (`/v1/facebook/group/posts`) with two opt-in comment add-ons. Post content only, never member data.
**Listing Strategy Note (internal):** This actor shares the `/v1/facebook/group/posts` backend with the group mode of `UnseenUser/facebook-posts-scraper`. It is an intentional separate Store listing targeting the "facebook groups scraper" search intent - group-first README, group screenshots, group SEO - not duplicate engineering. Keep the slugs distinct; the two coexist.
**Facebook Suite Notes:** This actor is part of the UnseenUser Facebook actor suite. Companion actors:

- `UnseenUser/facebook-posts-scraper` - multi-mode posts (profile/group/single); this actor isolates its group mode
- `UnseenUser/facebook-comments-scraper` - standalone comments + replies
- `UnseenUser/facebook-pages-scraper`, `UnseenUser/facebook-profile-scraper`, `UnseenUser/facebook-reels-scraper`, `UnseenUser/facebook-photos-scraper`, `UnseenUser/facebook-events-scraper`, `UnseenUser/facebook-transcript-scraper`, `UnseenUser/facebook-marketplace-scraper`

***

*This is the complete safety + build specification for this Actor. It can be pasted into Claude Code to build the Actor on Apify.*

# Actor input Schema

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

One or more public Facebook group URLs (or numeric group IDs). Replace the placeholder with a real public group URL before running. Private groups are not supported.

## `maxPosts` (type: `integer`):

Stop after this many posts per group. Pagination returns 3 posts at a time, so values are rounded up to the next multiple of 3 in practice.

## `includeTopComments` (type: `boolean`):

Top comments are returned alongside each post at no extra cost. Set to false to drop them from the output.

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

Paginate full comment threads for every post. COST WARNING: this is a billed add-on and may significantly increase run cost. Leave off unless you need complete threads.

## `fetchCommentReplies` (type: `boolean`):

Fetch replies for every comment returned. COST WARNING: this is a billed add-on. Only effective when 'Fetch full comment threads' is also enabled.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/groups/REPLACE-WITH-PUBLIC-GROUP"
  ],
  "maxPosts": 30,
  "includeTopComments": true,
  "fetchAllComments": false,
  "fetchCommentReplies": false
}
```

# 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": [
        "https://www.facebook.com/groups/REPLACE-WITH-PUBLIC-GROUP"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("unseenuser/fb-groups").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": ["https://www.facebook.com/groups/REPLACE-WITH-PUBLIC-GROUP"] }

# Run the Actor and wait for it to finish
run = client.actor("unseenuser/fb-groups").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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": [
    "https://www.facebook.com/groups/REPLACE-WITH-PUBLIC-GROUP"
  ]
}' |
apify call unseenuser/fb-groups --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=unseenuser/fb-groups",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Facebook Groups Scraper - Posts & Comments [NO LOGIN] ✅",
        "description": "Extract posts from any public Facebook group - text, author, reactions, comment counts, top comments and timestamps. No login, no cookies, public groups only. We never touch member lists or private data. Full comment threads and replies available as add-ons.",
        "version": "0.0",
        "x-build-id": "YsEJuKmLLEebN4mKC"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/unseenuser~fb-groups/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-unseenuser-fb-groups",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/unseenuser~fb-groups/runs": {
            "post": {
                "operationId": "runs-sync-unseenuser-fb-groups",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/unseenuser~fb-groups/run-sync": {
            "post": {
                "operationId": "run-sync-unseenuser-fb-groups",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "Public Group URLs",
                        "minItems": 1,
                        "type": "array",
                        "description": "One or more public Facebook group URLs (or numeric group IDs). Replace the placeholder with a real public group URL before running. Private groups are not supported.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxPosts": {
                        "title": "Max posts per group",
                        "minimum": 3,
                        "type": "integer",
                        "description": "Stop after this many posts per group. Pagination returns 3 posts at a time, so values are rounded up to the next multiple of 3 in practice.",
                        "default": 30
                    },
                    "includeTopComments": {
                        "title": "Include top comments",
                        "type": "boolean",
                        "description": "Top comments are returned alongside each post at no extra cost. Set to false to drop them from the output.",
                        "default": true
                    },
                    "fetchAllComments": {
                        "title": "Fetch full comment threads (billed add-on)",
                        "type": "boolean",
                        "description": "Paginate full comment threads for every post. COST WARNING: this is a billed add-on and may significantly increase run cost. Leave off unless you need complete threads.",
                        "default": false
                    },
                    "fetchCommentReplies": {
                        "title": "Fetch comment replies (billed add-on)",
                        "type": "boolean",
                        "description": "Fetch replies for every comment returned. COST WARNING: this is a billed add-on. Only effective when 'Fetch full comment threads' is also enabled.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
