# Facebook Comments Scraper - Replies, Reactions & Commenters (`eiv/facebook-comments-scraper`) Actor

Scrape comments and replies from public Facebook posts, videos, reels, photos and group posts: text, date, reactions by type, reply count, commenter name, ID and picture, badges, mentions and links. No login or cookies. Date filter, newest-first and only-new-since-last-run modes.

- **URL**: https://apify.com/eiv/facebook-comments-scraper.md
- **Developed by:** [Eimantas V](https://apify.com/eiv) (community)
- **Features:** Limited permissions
- **Stats:** 4 total users, 2 monthly users, 81.8% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.35 / 1,000 comment scrapeds

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** extracts comments and replies from public **Facebook** posts, videos, reels, photos and group posts. Paste post links, get one row per comment with its text, date, reactions by type, reply count and the commenter's name, ID and picture. No login, no cookies, no browser, from **$0.35 per 1,000 comments**.

```json
{
    "commentId": "481627996424606",
    "text": "This is one of my favorite stories to date. Good nutrition is at the heart of so many solutions. 💚",
    "date": "2021-08-15T20:01:24.000Z",
    "reactionCount": 442,
    "reactions": { "like": 368, "love": 71, "care": 3, "haha": 0, "wow": 0, "sad": 0, "angry": 0 },
    "replyCount": 8,
    "authorName": "Judie W.",
    "language": "en",
    "postAuthorName": "Humans of New York",
    "postCommentCount": 2806
}
```

**1,716 comments and replies from 3 busy posts in 63 seconds, with post details, from Apify's own address: no proxy, no browser.**

### What does Facebook Comments Scraper do?

It reads the comments Facebook shows anyone who opens a public post, the same way Facebook's own website loads them, and returns them as clean rows you can export or feed to other tools. Each comment comes with exact reaction counts by type, its replies (and replies to replies) with their parent comment's ID, and the post it belongs to.

- **Every kind of Facebook link.** Posts (pfbid or numeric), permalink.php and story.php links, group posts, videos, watch links, reels, photos, share links (facebook.com/share/...) and fb.watch links.
- **More than text.** Reactions split into like, love, care, haha, wow, sad and angry, reply count, "Top fan" and other badges, verified flag, language, mentions, links, and stickers, GIFs, photos or links attached to a comment.
- **Full threads.** Replies and replies to replies, each with the ID of the comment it answers.
- **Three orders and a date filter.** All comments, Most relevant or Newest first, plus "only comments posted after" a date, which stops reading at the first older comment so you never pay for old ones.
- **Monitoring mode.** "Only comments new since the last run" returns just what was posted since your previous run on the same post: schedule it and get only the new comments each time.
- **Only pay for results.** Posts that are deleted, private or cannot be read return an error row and are never charged.
- **Built for automation.** Run it on a schedule, call it from the API, or connect it to Make, Zapier, n8n, Google Sheets or an AI agent through Apify's MCP server.

### Why it is fast and cheap

It asks Facebook's own comment service directly, ten comments per request, and reads each answer only as far as the comments go. There is no browser to start and no page to render, and Facebook answers these requests from Apify's own address, so no proxy is needed. That is why a comment costs a fraction of what browser-based scrapers charge, and why 1,000 comments of one post arrive in about a minute.

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

| Field | Example | What it is |
|---|---|---|
| `text` | `This is one of my favorite stories...` | The comment's full text |
| `date` | `2021-08-15T20:01:24.000Z` | When it was posted, ISO 8601 UTC |
| `reactionCount` | `442` | All reactions on the comment |
| `reactions` | `{"like": 368, "love": 71, ...}` | Exact counts per reaction type |
| `replyCount` | `8` | Replies under the comment |
| `depth`, `isReply`, `parentCommentId` | `1`, `true`, `481627996424606` | Thread position: 0 = comment, 1 = reply, 2 = reply to a reply |
| `position` | `1` | Rank in Facebook's order for the post or thread |
| `commentId`, `commentUrl` | `481627996424606` | Facebook's ID of the comment and a direct link to it |
| `authorName`, `authorId`, `authorUrl` | `Judie W.` | The commenter (a person or a Page) |
| `authorPictureUrl`, `authorType`, `authorVerified` | `User`, `false` | Profile picture, person or Page, verified badge |
| `authorBadges` | `["Top fan"]` | Badges Facebook shows next to the name |
| `language` | `en` | Facebook's guess at the comment's language |
| `mentions`, `mentionedIds`, `links` | `["Northern Michigan University"]` | People and Pages tagged, and web addresses in the text |
| `attachmentType`, `attachmentUrl`, `attachmentImageUrl`, `attachmentTitle` | `gif` | A sticker, GIF, photo, video or link attached to the comment |
| `postId`, `postUrl`, `postCommentCount` | `6375219342552112` | The post the comment is on, and how many comments Facebook counts on it |
| `postAuthorName`, `postAuthorId` | `Humans of New York` | Who published the post |
| `postText`, `postDate`, `postReactionCount`, `postShareCount` | `181816` | With "Add post details": the post's full text, date, reactions and shares |
| `input` | your link | The link exactly as you entered it, so rows join back to your list |
| `scrapedAt` | `2026-10-29T15:23:54Z` | When this run started |

### How to scrape Facebook comments

1. Click **Try for free** and paste your Facebook post, video, reel or photo links into **Posts, videos or reels**, one per line.
2. Set **Comments per post** and, if you want them, **Replies per comment**. **Max comments in total** is your cost cap.
3. Click **Start**. 100 comments take about 5 seconds; 1,000 comments of one post about a minute.
4. Open the **Output** tab, or download the results as JSON, CSV, Excel or HTML.

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

You pay per comment or reply returned, and the price drops on higher Apify plans:

| Apify plan | Per 1,000 comments |
|---|---|
| Free | $0.60 |
| Starter | $0.50 |
| Scale | $0.45 |
| Business | $0.35 |

- 1,000 comments from ten posts on the Starter plan cost **$0.50**.
- Watching 20 posts every day with "only new comments", at about 50 new comments per post, is 1,000 comments a day: **$0.50 a day** on Starter, $0.35 on Business.
- A run also costs **$0.00005** to start. Replies count as comments; post details, the date filter and monitoring mode cost nothing extra. A post that fails or has no comments costs nothing.
- The Free plan's $5 monthly credit covers about **8,000 comments**.

### Input

```json
{
    "targets": [
        "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl",
        "https://www.facebook.com/reel/1397741784161219"
    ],
    "maxCommentsPerPost": 200,
    "maxRepliesPerComment": 10,
    "sortOrder": "ALL",
    "commentsAfter": "30 days",
    "includePostDetails": true,
    "maxItems": 5000
}
```

| Field | Default | Notes |
|---|---|---|
| Posts, videos or reels (`targets`) | an example post | Post, group post, video, watch, reel, photo, share or fb.watch links, or bare post IDs, one per line |
| Start URLs (`startUrls`) | | The same in the URL-list shape other Actors output, for chaining |
| Max comments in total (`maxItems`) | 1,000 | Across all posts, replies included: your cost cap |
| Comments per post (`maxCommentsPerPost`) | 100 | Top-level comments per post, up to 100,000 |
| Replies per comment (`maxRepliesPerComment`) | 0 | 0 = no replies. Replies to replies are included and counted here |
| Comment order (`sortOrder`) | All comments | `ALL`, `MOST_RELEVANT` (Facebook filters likely spam) or `NEWEST` |
| Only comments posted after (`commentsAfter`) | | A date (2026-01-31) or a span ("7 days"). Reads newest first and stops at the first older comment |
| Only comments new since the last run (`onlyNewComments`) | off | Remembers each post's newest comment in a key-value store in your account |
| Add post details (`includePostDetails`) | off | Post text, date, reaction and share counts on every row; one extra request per post |
| Concurrency, timeout, retries | 5, 30 s, 2 | Tuned already; no proxy settings needed |

Coming from Apify's Facebook Comments Scraper? Its input names work here too: `startUrls`, `resultsLimit` (comments per post), `includeNestedComments`, `viewOption` (`RANKED_UNFILTERED`, `RANKED_THREADED`, `RECENT_ACTIVITY`) and `onlyCommentsNewerThan`.

### Output

Each comment or reply is one row in the dataset. The **Overview** view shows the key columns, **Threads** shows replies under their parents, **Commenters** the people, **Reactions and media** the engagement and attachments, and **With post details** the post next to each comment. Every export includes all fields.

```json
{
    "recordType": "comment",
    "input": "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl",
    "commentId": "481627996424606",
    "text": "This is one of my favorite stories to date. Good nutrition is at the heart of so many solutions. 💚",
    "date": "2021-08-15T20:01:24.000Z",
    "reactionCount": 442,
    "reactions": { "like": 368, "love": 71, "care": 3, "haha": 0, "wow": 0, "sad": 0, "angry": 0 },
    "replyCount": 8,
    "depth": 0,
    "isReply": false,
    "parentCommentId": null,
    "position": 1,
    "commentUrl": "https://www.facebook.com/humansofnewyork/posts/pfbid0BL1HE3YtM89apXKJyRPMefnqjF5EiiDwVjBYhgpKDcoQFvhHF5jdrocKE3GgqYQzl?comment_id=481627996424606",
    "authorName": "Judie W.",
    "authorId": "pfbid06PSNkF8GJ...",
    "authorUrl": null,
    "authorPictureUrl": "https://scontent.xx.fbcdn.net/v/t39.30808-1/...jpg",
    "authorType": "User",
    "authorVerified": false,
    "authorBadges": [],
    "language": "en",
    "mentions": [],
    "mentionedIds": [],
    "links": [],
    "attachmentType": null,
    "attachmentUrl": null,
    "attachmentImageUrl": null,
    "attachmentTitle": null,
    "postId": "6375219342552112",
    "postUrl": "https://www.facebook.com/humansofnewyork/posts/pfbid0BL1HE3YtM89apXKJyRPMefnqjF5EiiDwVjBYhgpKDcoQFvhHF5jdrocKE3GgqYQzl",
    "postCommentCount": 2806,
    "postAuthorName": "Humans of New York",
    "postAuthorId": "100050429952420",
    "postText": "(2/3) “I knew nothing about gardening. But I knew how to google, so I looked up some easy stuff to plant...",
    "postDate": "2021-08-15T19:50:37.000Z",
    "postReactionCount": 181816,
    "postShareCount": 9183,
    "scrapedAt": "2026-10-29T15:23:54.000Z"
}
```

A post that cannot be read becomes a row with `"recordType": "error"` and an `errorCode` instead of failing the whole run:

| `errorCode` | Meaning |
|---|---|
| `NOT_FOUND` | The post does not exist, was deleted, or is not public (friends-only posts, private groups) |
| `RATE_LIMITED` / `BLOCKED` | Facebook refused this run's requests; run the post again later |
| `FACEBOOK_ERROR` | Facebook could not answer for this post |

Error rows are never charged. A post that exists but has no comments returns no rows and no error.

### Tips and limits

- **Public content only.** Comments on friends-only posts, closed groups and age- or country-restricted Pages are not visible without logging in, so they are not returned.
- **Post links, not Pages.** Give it the links of the posts you care about. To find a Page's posts first, use a posts scraper and feed its post URLs into **Start URLs**.
- **Fewer comments than Facebook's count?** Facebook's count includes comments it hides from visitors (deleted, filtered as spam, or from restricted accounts). "All comments" returns the most; "Most relevant" fewer.
- **Videos and reels** carry their comments on the post that published them; the scraper finds that post itself. Photos have comments of their own, separate from their post's; photo rows carry the post's author but no other post details.
- **Monitoring mode** picks up new comments on the post, not new replies under older comments.
- **Hit your spending limit?** The run stops cleanly at your maximum cost per run and keeps everything it collected. Raise the limit in the run options to get more.

### FAQ

#### Is it legal to scrape Facebook comments?

This Actor collects only data that Facebook shows publicly, without logging in. Comments are written by people, so results contain personal data (names, profile pictures, what they wrote), which laws such as the GDPR protect. Scrape personal data only for a legitimate purpose, keep only what you need, and ask a lawyer if you are unsure. Facebook is a trademark of Meta Platforms, Inc.; this Actor is not affiliated with or endorsed by Meta.

#### Do I need a Facebook account or cookies?

No. Nothing is logged in and you never share an account, so there is no account to get blocked.

#### Can I use it through the API or with Make, Zapier and n8n?

Yes. Every run can be started through the [Apify API](https://docs.apify.com/api/v2) and returns the dataset as JSON, CSV or Excel. Schedules, webhooks and integrations for Make, Zapier, n8n and Google Sheets are on the **Integrations** tab. For monitoring, schedule a run with "Only comments new since the last run" turned on.

#### Can AI agents use it?

Yes. Agents connected to [Apify's MCP server](https://mcp.apify.com) can find and run this Actor as a tool, with the same per-comment pricing. The output is ready for sentiment analysis, topic clustering or summaries.

#### Why did I get fewer comments than I asked for?

Either the post has fewer visible comments than your limit, the date filter or monitoring mode left older ones out, the run reached your maximum cost per run, or it reached its timeout. The log says which, and nothing collected before that is lost.

### Related scrapers

- [Facebook Pages Scraper - Emails, Phones & Followers](https://apify.com/eiv/facebook-pages-scraper): contact details, followers and ratings of the Pages whose posts you are reading.
- [Meta Ads Library Scraper](https://apify.com/eiv/meta-ads-library-scraper): the ads a Page runs on Facebook and Instagram.
- [TikTok Comments Scraper - Replies, Likes & Commenters](https://apify.com/eiv/tiktok-comments-scraper): the same comment data from TikTok videos.
- [YouTube Comments Scraper - Comment Replies & Threads](https://apify.com/eiv/youtube-comments-scraper): comments and reply threads from YouTube videos.

### Support

Missing a field, or found a post that does not work? Open an issue on the **Issues** tab with the link you used, and it will be looked at quickly.

# Actor input Schema

## `targets` (type: `array`):

One per line. Post URLs (facebook.com/<page>/posts/..., permalink.php?story_fbid=...), group posts, videos (/videos/, /watch/?v=), reels (/reel/...), photos (/photo/?fbid=...), share links (facebook.com/share/p/...), fb.watch links, or bare post ids.

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

The same posts in the URL-list shape other Actors output (and that apify/facebook-comments-scraper takes), so a previous Actor's results can be fed straight in. Use this or the field above.

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

Stop after this many comments and replies across all posts. You pay per comment, so this is also your cost cap for the run.

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

Top-level comments to collect from each post, in the order chosen below. Facebook serves 10 per request (about half a second), so 1,000 comments take about a minute per post. Large posts give their full list: 2,700+ comments were read from one post in tests.

## `maxRepliesPerComment` (type: `integer`):

Replies to collect under each comment, replies to replies included. 0 = no replies. Replies are charged as comments and carry their parent comment's ID; each comment with replies takes one more request per 10 replies.

## `sortOrder` (type: `string`):

The order of Facebook's own comment menu. "All comments" returns every comment, "Most relevant" lets Facebook filter out likely spam, "Newest" starts with the latest. A date limit below always reads newest first.

## `commentsAfter` (type: `string`):

Optional. Keep only comments posted on or after this date, e.g. 2026-01-31 or "7 days" for the last week. Comments are then read newest first and the run stops at the first older one, so old comments are neither fetched nor charged.

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

For monitoring: each run returns only the comments posted since the previous run of this Actor on the same post (the first run returns them as usual). Remembered per post in a key-value store in your account. Replies added to older comments are not picked up.

## `includePostDetails` (type: `boolean`):

Adds the post's full text, date, reaction count and share count to every comment row (the post's author is always included). One more request per post, about half a second. Posts, videos, reels and group posts; photos get their author only. If Facebook does not answer for a post, its comments are still delivered.

## `maxConcurrency` (type: `integer`):

How many posts are processed at the same time.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for one response before giving up on it.

## `maxRetries` (type: `integer`):

Retries for failed connections. Timeouts are not retried.

## Actor input object example

```json
{
  "targets": [
    "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl"
  ],
  "maxItems": 1000,
  "maxCommentsPerPost": 100,
  "maxRepliesPerComment": 0,
  "sortOrder": "ALL",
  "onlyNewComments": false,
  "includePostDetails": false,
  "maxConcurrency": 5,
  "requestTimeoutSecs": 30,
  "maxRetries": 2
}
```

# Actor output Schema

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

One row per comment or reply (recordType "comment"), plus one uncharged row per post that could not be read (recordType "error").

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

Totals for the run: comments, replies, posts, failures, why the run stopped, requests and megabytes.

# 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 = {
    "targets": [
        "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl"
    ]
};

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

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

```

## MCP server setup

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