Export public Facebook post comments into a structured dataset for social listening, creator intelligence, moderation review, campaign reporting, and brand monitoring.
Use this Actor when you need a repeatable way to collect visible public comments from one or more Facebook post URLs, download them as CSV/JSON/Excel, or call them from a workflow as a Facebook comments API alternative.
At a glance
- Primary job: Export Facebook comments data from public post URLs.
- Input: One or more public Facebook post URLs plus a per-post comment limit.
- Output: One dataset row per saved comment with author name, comment text, relative date, likes, source post URL, raw visible text, and scrape timestamp.
- Best for: Social listening, engagement analysis, moderation triage, creator intelligence, dashboards, alerts, and research exports.
Who is it for?
- Social listening teams tracking public reactions to brand, creator, media, or campaign posts.
- Moderation and community teams reviewing public comment text, authors, and source URLs in downstream tools.
- Analysts and researchers building repeatable Facebook comments exports for dashboards, notebooks, alerts, or archives.
Common workflows
- Brand monitoring: Schedule repeat runs for campaign or announcement posts and compare newly visible comments over time.
- Creator intelligence: Export audience replies from public creator posts for topic, sentiment, or engagement analysis.
- Moderation review: Send comment text, author names, and source URLs to review queues or BI tools.
- Automation: Use the Apify API, webhooks, MCP, or dataset exports to feed alerts, warehouses, notebooks, and reporting workflows.
What data can you extract?
| Field | Description |
|---|---|
commentId |
Stable ID generated for the source post/comment row. |
sourcePostUrl |
Facebook post URL that produced the comment. |
postTitle |
Visible post/page label or title captured from the public page. |
authorName |
Publicly visible comment author name. |
authorUrl |
Public author/profile URL when Facebook exposes it in the logged-out view. |
commentText |
Cleaned visible comment text. |
relativeDate |
Visible Facebook relative date label, such as 2w or 1y. |
likeCount |
Visible comment-like count when present. |
replyDiagnostics |
Visible reply count/label when present. |
commentPermalink |
Comment permalink when Facebook exposes it publicly. |
rawText |
Raw visible row text used for audit and parser diagnostics. |
scrapedAt |
ISO timestamp when the row was saved. |
Example input
{
"startUrls": [
{
"url": "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl"
}
],
"maxCommentsPerPost": 20
}
Example output
{
"commentId": "a1b2c3d4e5f6",
"sourcePostUrl": "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl",
"postTitle": "Humans of New York",
"authorName": "Jane Doe",
"authorUrl": null,
"commentText": "This story is beautiful.",
"relativeDate": "2w",
"likeCount": 12,
"replyDiagnostics": "1 reply",
"commentPermalink": null,
"rawText": "Jane Doe 2w This story is beautiful. 12 1 reply",
"scrapedAt": "2026-07-31T18:42:04.000Z"
}
Tips for best results
- Use public Facebook post URLs that load without being logged in.
- Start with a low
maxCommentsPerPostvalue, review the dataset, then scale scheduled runs. - Split very large monitoring jobs into smaller batches so one blocked or private post does not delay unrelated posts.
- Keep source post URLs in your downstream database so repeat exports can be deduplicated by
commentIdandsourcePostUrl.
API usage
Node.js:
import { ApifyClient } from "apify-client";
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/facebook-comments-scraper").call({
startUrls: [
{ url: "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl" }
],
maxCommentsPerPost: 20
});
console.log(run.defaultDatasetId);
Python:
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/facebook-comments-scraper").call(run_input={
"startUrls": [
{"url": "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl"}
],
"maxCommentsPerPost": 20,
})
print(run["defaultDatasetId"])
cURL:
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~facebook-comments-scraper/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl"}],"maxCommentsPerPost":20}'
MCP and AI agents
Use this Actor from MCP-compatible tools through the official Apify MCP Server.
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/facebook-comments-scraper"
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=fetch_cat/facebook-comments-scraper"
}
}
}
Example prompt: "Run Facebook Comments Scraper for this public post URL and summarize the most common customer complaints in the exported comments."
Limits and caveats
- The Actor runs against public, visible Facebook post pages. It does not log in, bypass privacy settings, or return private comments.
- Facebook can hide, reorder, or limit comments in public views; the dataset reflects what was visible during the run.
- Some optional fields, especially author URLs and comment permalinks, are only saved when Facebook exposes them publicly.
- Relative dates are captured as displayed by Facebook. Use
scrapedAtwithrelativeDatefor freshness analysis. - Process only public data you are allowed to access, and follow applicable terms and laws.
Support
Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID or run URL, input JSON, expected output, actual output, and one reproducible public Facebook post URL.