# Facebook Comments Scraper - Comments & Replies, No Login (`benthepythondev/facebook-comments-scraper`) Actor

Returns the comments of public Facebook posts, reels, videos and photos: text, author, date, reactions by kind, and every reply with its place in the thread. Newest first, most relevant or all, with a date limit and an only-new mode for monitoring. No login, no cookies, no browser.

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

## Pricing

from $1.20 / 1,000 comments

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 💬 Facebook Comments Scraper

Returns the comments of public Facebook posts without a login, a cookie or a browser. Paste links of posts, reels, videos or photos and get one row per comment: text, author, date, reactions by kind and the number of replies. Turn on replies and each comment is followed by its whole thread. Read newest first, stop at a date, or run it on a schedule and receive only the comments that are new.

**Price:** $1.50 per 1,000 comments on the Apify Free plan, down to $1.20 from the Gold plan up. A reply is a row like a comment. A post that is not public costs nothing. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

### 🔎 What is the Facebook Comments Scraper?

A public post shows its comments to any visitor, ten at a time, when you click "View more comments". This Actor makes the same requests the post makes: 1,000 comments of one post in a minute, several posts side by side. Your own Facebook account is never involved, so nothing can happen to it.

#### What data does it extract?

- **Comment:** id, link, text, time, picture or GIF
- **Author:** name, Facebook's visitor id, and the profile or page link where Facebook shows it
- **Engagement:** reactions in total and by kind (like, love, care, haha, wow, sad, angry), number of replies
- **Thread:** `depth` (0 comment, 1 reply, 2 reply to a reply) and `parentId`, so a thread can be rebuilt
- **Post:** id and link on every row

#### How it reads the site

The Actor does not open a browser. It sends the post's own data requests directly, so a run needs 512 MB of memory and a few seconds for the first rows. A limit is exact: ask for 15 comments and 15 rows are saved and charged, although Facebook hands them out in tens. The status message says how many comments and replies Facebook counts for the post, so you see how much more there is.

### ⬇️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `posts` | array | | Links of public posts, reels, videos or photos. An empty input reads a sample post |
| `maxResults` | integer | 20 | Rows to save per post, up to 10,000. Replies count as rows |
| `sortBy` | string | `newest` | `newest`, `all` (every comment, most relevant first) or `top` (Facebook's "Most relevant" view, which can leave out comments it rates low) |
| `includeReplies` | boolean | false | Adds the replies under each comment, and the replies to those |
| `postedAfter` | string | empty | Stop each post at the first comment older than this day (YYYY-MM-DD) or period (`3 days`, `2 weeks`). Works with `newest` |
| `onlyNewComments` | boolean | false | Skip every comment an earlier run with the same monitor name delivered |
| `monitorId` | string | empty | Name of that memory |

These link forms were tested: `…/posts/<id>`, `…/posts/pfbid…`, `/groups/<group>/posts/<id>`, `/reel/<id>`, `/watch/?v=<id>`, `/<page>/videos/<id>`, `/photo/?fbid=<id>`, `/permalink.php?story_fbid=…` and share links (`/share/r/…`).

#### Example input

The 200 newest comments of two posts:

```json
{
  "posts": [
    "https://www.facebook.com/NASA/posts/1645077636987606",
    "https://www.facebook.com/reel/2141054613462232/"
  ],
  "maxResults": 200
}
```

Every comment with its replies, most relevant first:

```json
{
  "posts": ["https://www.facebook.com/groups/sciencehumor/posts/29015572704745743/"],
  "maxResults": 1000,
  "sortBy": "all",
  "includeReplies": true
}
```

A watch that delivers only new comments every hour:

```json
{
  "posts": ["https://www.facebook.com/NASA/posts/1645077636987606"],
  "maxResults": 100,
  "onlyNewComments": true,
  "monitorId": "launch-post"
}
```

#### Coming from another Facebook comments Actor?

The input names `startUrls`, `resultsLimit` and `includeNestedComments` are read as well, so an input written for one of the common Facebook comments Actors runs here unchanged:

```json
{
  "startUrls": [{ "url": "https://www.facebook.com/groups/sciencehumor/posts/29015572704745743/" }],
  "resultsLimit": 30,
  "includeNestedComments": true
}
```

### ⬆️ Output

One row per comment or reply. A page's own comment under its post (the text is shortened here):

```json
{
  "commentId": "1801443917842284",
  "url": "https://www.facebook.com/humansofnewyork/posts/pfbid0313GMHTmgAdXukr8Wb8qFxtTy16i6GH8GN46bL9h5aGsh2FeZi7sAyxikGTPycByxl?comment_id=1801443917842284",
  "postId": "1650977309926585",
  "postUrl": "https://www.facebook.com/humansofnewyork/posts/pfbid0313GMHTmgAdXukr8Wb8qFxtTy16i6GH8GN46bL9h5aGsh2FeZi7sAyxikGTPycByxl",
  "text": "If you would like to hire Gabby, you can reach her here: …",
  "createdAt": "2026-09-18T14:25:12+00:00",
  "authorName": "Humans of New York",
  "authorId": "100050429952420",
  "authorUrl": "https://www.facebook.com/humansofnewyork",
  "reactions": 5136,
  "reactionCounts": { "like": 3620, "love": 1198, "care": 317, "wow": 1 },
  "replies": 88,
  "depth": 0,
  "parentId": null,
  "imageUrl": null,
  "position": 1,
  "scrapedAt": "2026-10-04T11:40:35.660233+00:00"
}
```

A reply has `depth` 1 or 2 and the `commentId` of the comment it answers in `parentId`. `position` is the row's place in the post's list: each comment is followed by its replies. The run also writes a `SUMMARY` record that names the posts that were not public or had no comments and the reason a run stopped.

### 💰 What a run costs

| Apify plan | Per 1,000 comments or replies |
|---|---|
| Free | $1.50 |
| Bronze | $1.40 |
| Silver | $1.30 |
| Gold, Platinum, Diamond | $1.20 |

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

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

| Run | Rows | Time |
|---|---|---|
| Empty input (sample post) | 20 | 7 s |
| 1,000 newest comments of one post | 1,000 | 60 s |
| Three posts (group post, page post, reel) with replies, plus one that does not exist | 180 | 22 s |
| Four posts by photo, share, video and permalink link, plus one of them named twice | 40 | 8 s |
| Everything since two days ago on one post | 20 | 6 s |
| Only-new watch on one post, second run | 0 new | 7 s |

All at 512 MB. An aborted and resumed run of 600 comments and replies saved no row twice.

### 🔔 Watching posts for new comments

Turn on `onlyNewComments`, give the watch a `monitorId` and put the run on a schedule. The first run delivers the latest comments up to `maxResults`. Later runs read each post from its newest comment and stop when they reach comments they have already delivered; comments that were on the post before the watch began are left alone. The memory is a key-value store named `facebook-comments-monitor` in your own account; delete a record there to start a watch over.

### 🤖 For AI agents

Smallest useful call:

```json
{"posts": ["https://www.facebook.com/NASA/posts/1645077636987606"], "maxResults": 50}
```

Each row is one comment with `text`, `createdAt`, `authorName`, `reactions`, `reactionCounts`, `replies`, `depth`, `parentId` and `url`. `posts` takes several links at once. Add `"includeReplies": true` for whole threads. A post that is not public returns no rows; the status message and the `SUMMARY` record name it. No credentials are needed.

### 💡 Use cases

- 📣 **Campaign and brand feedback:** what people answer under a brand's or a competitor's posts, with the reactions each comment got.
- 🧭 **Lead finding:** comments in which people ask for a price, a link or a recommendation.
- 🧪 **Sentiment and topic analysis:** whole threads as input for a model or a spreadsheet.
- 🛟 **Community care:** a schedule that brings every new comment on your pinned or promoted posts.

### ⚠️ Limits, stated plainly

- **Public posts only.** A post shared with friends or in a private group shows a visitor nothing, and this Actor does not log in.
- **Ten comments per request.** That is what Facebook gives a visitor. One post yields about 1,000 comments a minute; reply threads take one or more requests each.
- **Tested up to 1,000 comments of one post in a run.** The limit per post is 10,000 rows; how deep Facebook lets a visitor page beyond what was tested is not known.
- **Reply counts can be a little higher than the replies delivered.** Facebook counts replies it does not show to visitors. In a test of 12 complete threads, ten matched their count and two were two or three short.
- **Author ids are visitor ids.** Facebook gives a visitor an anonymous id (`pfbid…`) for most members; the profile link is present where Facebook shows it (45 of 180 rows in one test).
- **A watch brings new comments, not later replies to old ones.** A reply written after its comment was delivered is not picked up.
- **Facebook limits how often one address may ask.** The Actor changes addresses by itself. If Facebook stops answering in the middle of a post, the rows saved so far stay and the status message names the post.

### ❓ FAQ

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

**Which links can I paste?** Post, reel, video, photo and share links of pages, profiles and public groups. A link to a page or a group itself is not a post and is skipped with a note.

**Does it return replies?** Yes, with `includeReplies`. Each comment is followed by its replies and the replies to those.

**Which order should I choose?** `newest` for date limits and monitoring. `all` when you want every comment and the most relevant ones first. `top` is Facebook's "Most relevant" view.

**Why are there fewer rows than the count on the post?** The count includes replies; without `includeReplies` only comments are returned. Raise `maxResults` if the status message says there is more.

**What happens when I give the same post twice under two links?** It is read once; the second link is named in the status message.

**Can I run it every hour?** Yes. With `onlyNewComments` a post without new comments is left after its two newest pages of comments.

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

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

### 🔗 You might also like

- [Facebook Posts Scraper](https://apify.com/benthepythondev/facebook-posts-scraper): posts of public pages and profiles, with the links this Actor takes
- [Facebook Groups Scraper](https://apify.com/benthepythondev/facebook-groups-scraper): posts of public Facebook groups
- [Instagram Comments Scraper](https://apify.com/benthepythondev/instagram-comments-scraper): comments of public Instagram posts and reels
- [YouTube Comments Scraper](https://apify.com/benthepythondev/youtube-comments-scraper): comments and replies of YouTube videos

**Keywords:** facebook comments scraper, facebook post comments, scrape facebook comments, facebook comment export, facebook replies, facebook reel comments, facebook video comments, comment reactions, facebook comments csv, facebook comments api alternative, no login facebook scraper, comment monitoring, social listening, sentiment analysis data, facebook group post comments

# Actor input Schema

## `posts` (type: `array`):

Links of public posts, reels, videos or photos of pages, profiles and groups. Several posts are read side by side. A post that is not public is reported and costs nothing.

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

Rows to save for each post; replies count as rows. Facebook gives a visitor ten comments per request.

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

Newest first is the order for date limits and monitoring. All comments lists every comment with the most relevant ones first. Most relevant is Facebook's own selection, which hides comments it rates low.

## `includeReplies` (type: `boolean`):

Adds the replies under each comment, and the replies to those, as rows of their own right after the comment.

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

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

## `onlyNewComments` (type: `boolean`):

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

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

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

## Actor input object example

```json
{
  "posts": [
    "https://www.facebook.com/NASA/posts/1645077636987606"
  ],
  "maxResults": 20,
  "sortBy": "newest",
  "includeReplies": false,
  "onlyNewComments": false
}
```

# Actor output Schema

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

No description

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "posts": [
        "https://www.facebook.com/NASA/posts/1645077636987606"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("benthepythondev/facebook-comments-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "posts": ["https://www.facebook.com/NASA/posts/1645077636987606"] }

# Run the Actor and wait for it to finish
run = client.actor("benthepythondev/facebook-comments-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "posts": [
    "https://www.facebook.com/NASA/posts/1645077636987606"
  ]
}' |
apify call benthepythondev/facebook-comments-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,benthepythondev/facebook-comments-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6iYJVqJnlYSZc1QTL/builds/T6dpF0amp7kCDjACy/openapi.json
