# Facebook Post Comments Scraper – Posts & Reels (`scrapingmonkey/facebook-post-comments-scraper`) Actor

Collect public Facebook post, photo, video, and Reel comments with pagination. Export text, authors, reactions, embedded replies, and parent-post context in one row per returned comment.

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

## Pricing

from $1.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.
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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — 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

Collect public comments from selected Facebook posts, photos, videos, and Reels. **Facebook Post Comments Scraper** returns comment text, authors, reactions, timestamps, available state flags, and embedded replies, with parent-post context attached to every comment row.

Choose how many comment pages to request for each URL. The output stays in one table, with the same flat keys in JSON and ordered lists for returned replies and attachments. No Facebook login or cookies are required.

| At a glance | Details |
|---|---|
| 📥 Input | Public Facebook post, photo, video, or Reel URLs |
| 📤 Output | Comments, authors, reactions, embedded replies, and post context |
| 📄 Pagination | 1–100 pages per post; default `1` |
| 🔐 Login required | No |
| 💾 Delivery | One table, one row per returned comment |

### What the Facebook post comments scraper collects 💬

Each comment includes its ID, URL, text, publication time, author, reaction count and breakdown, and available hidden, pinned, spam, or post-author flags. Attached media is retained when Facebook supplies it.

The Actor includes one level of replies embedded in the returned comment response, with reply text, authors, reactions, and media. It does not separately paginate every reply thread. Parent-post fields preserve the message, author, engagement, and attachments so the discussion stays connected to its source.

### How to scrape Facebook post comments 🚀

1. Add public post, photo, video, or Reel URLs to `inputList`.
2. Set `pagesPerPost` to the number of comment pages to attempt.
3. Run the Actor and review rows by `status` and `post.url`.
4. Export the dataset or connect it to an analysis workflow.

```json
{
  "inputList": [
    "https://www.facebook.com/photo.php?fbid=1100421822647027"
  ],
  "pagesPerPost": 2
}
```

More pages can return more comments, but the setting does not guarantee an exact count or a complete discussion.

### Comment data fields and output 📦

| Field group | Included data |
|---|---|
| Comment | ID, URL, text, timestamps, reactions, reply count, state flags |
| Author | IDs, username, name, profile URL, picture, verification flag |
| Comment media | Ordered URLs, types, dimensions, duration, caption and playback references |
| Embedded replies | Reply text, authors, timestamps, reactions, flags, and media in aligned lists |
| Parent post | Message, author, type, publication time, engagement, reactions, attachments |

Complete illustrative success row. Harbor Workshop and the media URLs below are examples, not a live run.

```json
{
  "input": "https://www.facebook.com/harborworkshop/posts/123456789012345/",
  "status": "success",
  "id": "123456789099001",
  "url": "https://www.facebook.com/harborworkshop/posts/123456789012345/?comment_id=123456789099001",
  "text": "Can beginners join the woodworking session?",
  "timestamp": 1788260400,
  "published_at": "2026-09-01T11:00:00Z",
  "reactions_count": 3,
  "replies_count": 1,
  "is_author": false,
  "is_hidden": false,
  "is_pinned": false,
  "is_spam": false,
  "author.id": "100098765432101",
  "author.page_id": "",
  "author.username": "alex.morgan.example",
  "author.name": "Alex Morgan",
  "author.url": "https://www.facebook.com/alex.morgan.example/",
  "author.profile_picture_url": "https://example.com/media/alex-morgan.jpg",
  "author.is_verified": false,
  "reactions.id": [
    "1635855486666999"
  ],
  "reactions.type": [
    "Like"
  ],
  "reactions.count": [
    3
  ],
  "media.id": [],
  "media.type": [],
  "media.url": [],
  "media.image_url": [],
  "media.thumbnail_url": [],
  "media.video_url_hd": [],
  "media.video_url_sd": [],
  "media.dash_manifest_url": [],
  "media.dash_manifest": [],
  "media.duration_ms": [],
  "media.width": [],
  "media.height": [],
  "media.alt_text": [],
  "media.captions_url": [],
  "replies.id": [
    "123456789099002"
  ],
  "replies.url": [
    "https://www.facebook.com/harborworkshop/posts/123456789012345/?comment_id=123456789099001&reply_comment_id=123456789099002"
  ],
  "replies.text": [
    "Yes, beginners are welcome. We provide the tools."
  ],
  "replies.timestamp": [
    1788264000
  ],
  "replies.published_at": [
    "2026-09-01T12:00:00Z"
  ],
  "replies.reactions_count": [
    2
  ],
  "replies.replies_count": [
    0
  ],
  "replies.is_author": [
    true
  ],
  "replies.is_hidden": [
    false
  ],
  "replies.is_pinned": [
    false
  ],
  "replies.is_spam": [
    false
  ],
  "replies.author.id": [
    "100012345678901"
  ],
  "replies.author.page_id": [
    "100012345678901"
  ],
  "replies.author.username": [
    "harborworkshop"
  ],
  "replies.author.name": [
    "Harbor Workshop"
  ],
  "replies.author.url": [
    "https://www.facebook.com/harborworkshop/"
  ],
  "replies.author.profile_picture_url": [
    "https://example.com/media/harbor-workshop.jpg"
  ],
  "replies.author.is_verified": [
    false
  ],
  "replies.reactions.id": [
    [
      "1635855486666999"
    ]
  ],
  "replies.reactions.type": [
    [
      "Like"
    ]
  ],
  "replies.reactions.count": [
    [
      2
    ]
  ],
  "replies.media.id": [
    []
  ],
  "replies.media.type": [
    []
  ],
  "replies.media.url": [
    []
  ],
  "replies.media.image_url": [
    []
  ],
  "replies.media.thumbnail_url": [
    []
  ],
  "replies.media.video_url_hd": [
    []
  ],
  "replies.media.video_url_sd": [
    []
  ],
  "replies.media.dash_manifest_url": [
    []
  ],
  "replies.media.dash_manifest": [
    []
  ],
  "replies.media.duration_ms": [
    []
  ],
  "replies.media.width": [
    []
  ],
  "replies.media.height": [
    []
  ],
  "replies.media.alt_text": [
    []
  ],
  "replies.media.captions_url": [
    []
  ],
  "replies.replies": [
    []
  ],
  "post.id": "123456789012345",
  "post.story_id": "S:100012345678901:123456789012345",
  "post.url": "https://www.facebook.com/harborworkshop/posts/123456789012345/",
  "post.type": "carousel",
  "post.message": "Join our Saturday open day for a tour and a hands-on woodworking session.",
  "post.timestamp": 1788256800,
  "post.published_at": "2026-09-01T10:00:00Z",
  "post.reactions_count": 24,
  "post.comments_count": 7,
  "post.shares_count": 3,
  "post.views_count": 0,
  "post.image_url": "https://example.com/media/workshop-open-day.jpg",
  "post.thumbnail_url": "https://example.com/media/workshop-open-day-thumb.jpg",
  "post.video_url": "",
  "post.feedback_id": "ZmVlZGJhY2s6MTIzNDU2Nzg5MDEyMzQ1",
  "post.is_sponsored": false,
  "post.is_pinned": true,
  "post.author.id": "100012345678901",
  "post.author.page_id": "100012345678901",
  "post.author.username": "harborworkshop",
  "post.author.name": "Harbor Workshop",
  "post.author.url": "https://www.facebook.com/harborworkshop/",
  "post.author.profile_picture_url": "https://example.com/media/harbor-workshop.jpg",
  "post.author.is_verified": false,
  "post.reactions.id": [
    "1635855486666999",
    "1678524932434102"
  ],
  "post.reactions.type": [
    "Like",
    "Love"
  ],
  "post.reactions.count": [
    18,
    6
  ],
  "post.media.id": [
    "123456789012346",
    "123456789012347"
  ],
  "post.media.type": [
    "photo",
    "video"
  ],
  "post.media.url": [
    "https://www.facebook.com/photo/?fbid=123456789012346",
    "https://www.facebook.com/harborworkshop/videos/123456789012347/"
  ],
  "post.media.image_url": [
    "https://example.com/media/workshop-open-day.jpg",
    "https://example.com/media/workshop-tour-cover.jpg"
  ],
  "post.media.thumbnail_url": [
    "https://example.com/media/workshop-open-day-thumb.jpg",
    "https://example.com/media/workshop-tour-thumb.jpg"
  ],
  "post.media.video_url_hd": [
    "",
    "https://example.com/media/workshop-tour-hd.mp4"
  ],
  "post.media.video_url_sd": [
    "",
    "https://example.com/media/workshop-tour-sd.mp4"
  ],
  "post.media.dash_manifest_url": [
    "",
    ""
  ],
  "post.media.dash_manifest": [
    "",
    ""
  ],
  "post.media.duration_ms": [
    0,
    15000
  ],
  "post.media.width": [
    1200,
    1920
  ],
  "post.media.height": [
    800,
    1080
  ],
  "post.media.alt_text": [
    "Visitors making a wooden stool at the workshop open day.",
    "A short tour of the workshop."
  ],
  "post.media.captions_url": [
    "",
    "https://example.com/media/workshop-tour.vtt"
  ]
}
```

Each returned comment occupies one row. JSON and the table use the same literal dotted keys, including `author.name`, `replies.text`, and `post.message`. Reply lists align by position. Nested lists such as `replies.reactions.count` keep a separate list for each reply; empty positions remain in place. Embedded replies do not create additional rows.

Optional values may be empty strings, zero, false, or null. A failed row retains `input`, sets `status` to `failed`, and makes all comment-data columns null. Counts and flags can be defaulted when Facebook does not expose a value.

### Input requirements and coverage ⚙️

| Parameter | Type | Required | Default | Rules |
|---|---|---|---|---|
| `inputList` | Array of strings | Yes | None | At least one Facebook content URL with an identifiable target |
| `pagesPerPost` | Integer | No | `1` | From `1` to `100` |

Supported forms include `/PAGE/posts/ID`, `/PAGE/videos/ID`, `/reel/ID`, `story.php?story_fbid=ID`, and photo links with `fbid`. Post paths using `pfbid` identifiers are accepted. Use a full content permalink rather than a Page username, bare ID, or shortened share URL without a target identifier.

The initial response counts as page 1. Later requests ask for up to 20 comments each and continue while Facebook supplies a usable next page. Duplicate comment IDs are removed within each post's collection. Facebook controls comment ordering and visibility; there is no separate sorting or full-reply-crawl setting.

### Facebook comment scraping use cases 🎯

#### Customer question analysis

Group recurring questions by post and retain available author replies for customer-support review.

#### Campaign response reporting

Compare public comment themes, reactions, and discussion activity across a selected set of campaign links.

#### Moderation review queues

Send visible text, source URLs, and available state flags to an authorized human review workflow.

#### Public discussion research

Keep comment and reply text tied to the original post message, author, and publication data in a research dataset.

### Pricing and billable comment rows 💰

Check the Actor's **Pricing** tab for the current model and rate. Under dataset-item pricing, each saved success or failed row can be billable. One returned comment is one success row; embedded replies and parent-post fields remain in that row.

Invalid inputs, unavailable posts, an initial response with no comments, or a page that fails after retries can produce a failed row. Retry attempts do not independently add rows. More pages can produce more saved comments.

### Facebook post comments API and integrations 🔌

Replace `$ACTOR_ID` with the ID from the Actor's API tab and `$APIFY_TOKEN` with your Apify token.

```bash
curl -X POST "https://api.apify.com/v2/acts/$ACTOR_ID/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"inputList":["https://www.facebook.com/photo.php?fbid=1100421822647027"],"pagesPerPost":2}'
```

Use Apify schedules for periodic collection, webhooks for completion events, and integrations for Google Sheets, Make, Zapier, cloud storage, or a text-analysis pipeline.

### Reliability and limits ⚠️

Temporary failures are retried, and comments already saved remain available if a later page fails. Deleted, hidden, private, restricted, or login-gated discussions may not be retrievable even when the post URL is valid.

Facebook can return fewer comments than its displayed total. Embedded replies are a limited snapshot, not a complete reply history. Media URLs can expire. Missing counts and flags are not verified facts about the full discussion.

### Frequently asked questions ❓

#### Does it work with Reel comments?

Yes. Public `/reel/` URLs are accepted alongside supported post, photo, and video links.

#### Does it retrieve every reply?

No. It includes one level of embedded replies and does not separately paginate reply threads.

#### Is each reply a separate dataset row?

Embedded replies remain in aligned `replies.*` lists inside their parent comment row.

#### Can I request an exact number of comments?

You choose pages. Facebook controls how many comments are returned and whether another page is available.

#### What happens if a later page fails?

Previously saved comments remain available. The failed page can add a failed row after retries are exhausted.

### Support, responsible use, and related actors 🛟

For support, share the run ID, a safe public content URL, `pagesPerPost`, and the observed issue. Keep credentials private.

Use public discussion data lawfully and respect privacy, copyright, and applicable platform terms.

# Actor input Schema

## `inputList` (type: `array`):

Add one full Facebook post, video or Reel URL per item. Every input produces success or failed output.

## `pagesPerPost` (type: `integer`):

Maximum number of result pages to request for each input.

## Actor input object example

```json
{
  "inputList": [
    "https://www.facebook.com/Meta/posts/pfbid02ncFBnDd4ghMFJVWsfRxaC4Zn6T8YoWTTkUHkGx7fz6WAvy4WGPpDt2VbzgK3jqb8l"
  ],
  "pagesPerPost": 1
}
```

# Actor output Schema

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

Actor dataset results with input and status columns.

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

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

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

```

## MCP server setup

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