Facebook Comments Scraper - Replies & Reactions avatar

Facebook Comments Scraper - Replies & Reactions

Pricing

from $1.20 / 1,000 facebook comment results

Go to Apify Store
Facebook Comments Scraper - Replies & Reactions

Facebook Comments Scraper - Replies & Reactions

Scrape public Facebook comments and replies from posts, Reels, photos, Watch URLs, and supported share links. Get text, authors, dates, reaction breakdowns, profile pictures, attachments, and threads. Sort and filter results, set exact maximums or remove the numeric cap—without login or cookies.

Pricing

from $1.20 / 1,000 facebook comment results

Rating

0.0

(0)

Developer

Chronometrica

Chronometrica

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

💬 What does Facebook Comments Scraper do?

Paste direct public Facebook post, Reel, video, Watch, photo, permalink, or supported share links. Get clean public comment and reply rows with text, authors, dates, reaction breakdowns, profile pictures, attachments, and thread links.

Use it for audience research, brand monitoring, customer feedback, creator research, social listening, comment analysis, spreadsheets, and automated data pipelines. Each saved result is one real public comment or reply, not a post summary.

The Actor uses public, logged-out Facebook pages. It does not require a Facebook login, API key, cookies, or copied browser session from you. Invalid, duplicate, unsupported, unavailable, and confirmed zero-comment inputs do not create paid result rows.

With Facebook Comments Scraper, you can:

  • 💬 Collect public comments from posts, Reels, videos, Watch pages, photos, permalinks, fb.watch, and supported share links.
  • 🧵 Rebuild reply threads with saved parent and root comment IDs.
  • ❤️ Analyze total reactions and Like, Love, Care, Haha, Wow, Sad, and Angry breakdowns when Facebook exposes them.
  • ↕️ Choose All comments, Newest, or Most relevant order.
  • 📅 Keep comments inside inclusive start and end dates.
  • 🎯 Set an exact per-content result limit, or remove the numeric cap.
  • 🧹 Receive clean unique rows after equivalent URLs and repeated comment IDs are removed.
  • 📦 Export JSON, JSONL, CSV, Excel, XML, RSS, or HTML, or use the Apify API, SDKs, webhooks, schedules, and integrations.
  • 💸 Pay only for public comments and replies saved to the dataset.

✨ Why use this Actor?

  • Clean and useful: one flat row for each public comment or reply.
  • Strict identity: every row stays tied to the requested Facebook content.
  • Connected threads: replies are saved only with their saved parent and root comment.
  • Exact controls: choose order, dates, replies, and the maximum saved rows for each content item.
  • Rich public context: get reaction types, profile pictures, attachments, and parent content details when Facebook exposes them.
  • Clear billing: empty and failed inputs do not become charged fake rows.
  • Honest limits: an uncapped run can still stop at source end, charge limit, timeout, or failure.

In a fixed production-style test, the Actor saved 500 unique comment and reply rows from one busy public post. All 500 rows had the requested content ID. All 155 replies had their saved parent and root comment. Live speed and public comment availability can change.

📦 What data do I get?

Each dataset row represents one real public Facebook comment or reply.

Data groupMain fields
🔗 Content identityinputUrl, postUrl, contentId, contentType
💬 Comment contentcommentId, commentUrl, text, publishedAt, attachments
🧵 Thread linksparentCommentId, rootCommentId, isReply
👤 Public authorauthorId, authorName, authorUrl, authorProfilePictureUrl
❤️ Public signalsreactionsCount, reactionCounts, replyCount
📝 Parent contentPublic post text, author, and publish time when exact target-bound values are available
🕐 Collection timescrapedAt

Public values that Facebook does not expose stay null. They are not guessed and they are not replaced with fake zeroes.

⚙️ Can I use this Actor through an API?

Yes. Run Facebook Comments Scraper manually in Apify Console or use it through:

  • 🔌 Apify API
  • 🐍 Python SDK
  • 🟢 JavaScript SDK
  • 🪝 Webhooks
  • ⏰ Scheduled runs
  • 🧩 Apify integrations

API example

Keep your Apify token in an environment variable or secret store.

curl -X POST \
"https://api.apify.com/v2/acts/chronometrica~facebook-comments-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"startUrls": ["https://www.facebook.com/reel/1733966934399341"],
"commentSortMode": "all",
"maxResultsPerPost": 25,
"collectAllAvailable": false,
"includeReplies": false
}'

🎯 Why scrape Facebook comments?

Use caseHow comment data helps
🔍 Audience researchFind common questions, opinions, needs, and language.
📣 Brand monitoringTrack public feedback around products and campaigns.
🧑‍🎨 Creator researchStudy public audience response and reply threads.
💡 Content planningFind ideas, objections, and recurring questions.
🤖 Sentiment and NLPFeed clean comment text into your own analysis workflow.
🧱 Data pipeline buildingLoad stable comment and reply rows into databases and apps.

The Actor collects source data. It does not add sentiment labels or guess a person's intent.

💵 Pricing: saved comments and replies only

Facebook Comments Scraper uses pay-per-result pricing. One result means one unique public comment or reply saved to the default dataset. Platform usage is included.

Apify planPrice per 1,000 saved rows
Free$2.15
Starter$1.70
Scale$1.45
Business$1.20

There is no paid row for an invalid or unsupported URL, an unavailable target, an explicit zero-comment target, a duplicate input, a duplicate comment, or a source-deleted placeholder.

Use maxResultsPerPost, collectAllAvailable, date filters, and includeReplies to control result volume. Replies are separate result rows and count toward the same per-content limit.

🚀 How do I use Facebook Comments Scraper?

  1. Open Facebook Comments Scraper in Apify Console.
  2. Add one or more known public Facebook content URLs.
  3. Choose the maximum total comment and reply rows for each content item.
  4. Turn on replies only when you need them.
  5. Click Start.
  6. Open Output to inspect the dataset and run summary.
  7. Download the data or send it to another tool through an integration.

⬇️ Input

Here is the exact first-run example used for the release smoke:

{
"startUrls": ["https://www.facebook.com/reel/1733966934399341"],
"commentSortMode": "all",
"maxResultsPerPost": 25,
"collectAllAvailable": false,
"includeReplies": false
}

🔗 Supported content inputs

  • Facebook post URLs with numeric or pfbid keys
  • Reel URLs
  • Watch URLs, owner video URLs, and video.php URLs
  • Modern, legacy, and owner photo URLs
  • story.php and permalink.php post URLs
  • fb.watch short links
  • Typed /share/p/, /share/v/, and /share/r/ links
  • www, m, mbasic, and mobile Facebook host variants

Equivalent inputs that resolve to the same content or comment rows are collected once in a run.

🎛️ Settings

SettingWhat it controls
startUrlsAdd 1–100 public Facebook post, Reel, video, Watch, photo, permalink, or supported share URLs.
maxResultsPerPostSet the maximum comment and reply rows for each URL. Use 1–10,000. Default: 500.
collectAllAvailableRemove the result limit. The run still stops at source end, charge limit, timeout, or failure. Off by default and may greatly increase cost.
includeRepliesSave replies as separate paid rows. They count toward the maximum above. Off by default.
commentSortModeChoose all, newest, or most_relevant. This changes order, not the result limit. Default: all.
commentsFromPick the first date to keep. Leave empty for no start date. API users may also send an ISO or relative date.
commentsUntilPick the last date to keep. Leave empty for no end date. Replies need an in-range saved parent.

⬆️ Output sample

{
"inputUrl": "https://www.facebook.com/reel/1733966934399341",
"postUrl": "https://www.facebook.com/reel/1733966934399341/",
"contentId": "1733966934399341",
"contentType": "reel",
"commentId": "1234567890123456",
"commentUrl": "https://www.facebook.com/reel/1733966934399341/?comment_id=1234567890123456",
"parentCommentId": null,
"rootCommentId": "1234567890123456",
"isReply": false,
"text": "Example public comment",
"publishedAt": null,
"attachments": [
{
"type": "Sticker",
"url": null,
"thumbnailUrl": "https://scontent.example/sticker.png",
"width": 240,
"height": 240
}
],
"reactionsCount": 12,
"reactionCounts": {
"like": 8,
"love": 2,
"care": 1,
"haha": 1,
"wow": null,
"sad": null,
"angry": null
},
"replyCount": 3,
"authorId": "100012345678901",
"authorName": "Example Author",
"authorUrl": "https://www.facebook.com/example.author",
"authorProfilePictureUrl": "https://scontent.example/profile.jpg",
"postTitle": null,
"postDescription": null,
"postPublishedAt": null,
"postAuthorId": null,
"postAuthorName": null,
"postAuthorUrl": null,
"scrapedAt": "2026-07-13T00:00:00.000Z"
}

reactionCounts uses the fixed keys like, love, care, haha, wow, sad, and angry. A key is null when Facebook does not expose that exact type count. attachments contains media bound to that exact comment. Every attachment has type, url, thumbnailUrl, width, and height; individual values can be null. Facebook media and profile-picture URLs can expire. Download needed media promptly and only when you have the right to store it.

🧵 Comment and reply relationships

Top-level comments have isReply: false and parentCommentId: null.

Replies have isReply: true. Their parentCommentId points to a saved parent row. Their rootCommentId points to the saved top-level root of the thread. The Actor does not save a reply when it cannot prove and save its parent.

📊 Run summary

The OUTPUT record includes:

  • the chosen comment sort mode;
  • inputs received and unique content items planned;
  • duplicate inputs skipped;
  • content items attempted and items that produced rows;
  • comments and replies saved;
  • duplicate results, date-filtered results, and results skipped because no exact date was available;
  • input status and stop-reason counts;
  • safe details for inputs that did not produce rows.

Input-level failures stay in the run summary because they do not create paid dataset rows.

🚦 Input outcomes

The dataset contains real comments and replies only. Invalid, unsupported, unavailable, zero-comment, and duplicate inputs are reported in OUTPUT. They do not become fake or paid dataset rows.

🔒 Public-source boundary

Facebook Comments Scraper uses logged-out public Facebook data only.

It does not use:

  • a Facebook account or API key supplied by you;
  • user login cookies or copied sessions;
  • private posts, private groups, or friends-only content;
  • Facebook Stories, profiles, Pages, feeds, or search as collection inputs;
  • challenge solving or access-control bypasses;
  • active Live broadcasts or collection pages.

⚠️ Limits and interpretation

  • Facebook can delete, hide, reorder, or limit comments at any time.
  • Public comment availability can differ by region and logged-out viewer state.
  • Exact publish timestamps, author links, reactions, and reply totals are not always public. Missing values stay null.
  • Reaction-type counts, profile pictures, and comment attachments are included only when Facebook exposes them on the exact public comment. Media URLs can expire.
  • A requested limit is a maximum, not a guarantee. Public rows can run out first.
  • Replies are saved only when their parent row is also saved.
  • Share and short links must resolve to one matching supported content type.
  • Albums, profiles, feeds, searches, groups, Stories, and collection pages do not identify one supported comment owner.

❓ FAQ

Does this Actor need a Facebook login, cookies, or API key?

No. It uses logged-out public Facebook data.

Why did I receive fewer rows than requested?

The public comment list may have ended, replies may have been turned off, rows may have been duplicates, or Facebook may not have exposed a verified public comment list. Check OUTPUT for the status and stop reason.

The Actor accepts direct public Reel URLs plus supported fb.watch, /share/p/, /share/v/, and /share/r/ links. It resolves a supported wrapper to one matching content item before collecting comments. Unsupported or ambiguous links are explained in OUTPUT and do not create paid rows.

Will I get replies?

Turn on includeReplies. Each saved reply has parentCommentId and rootCommentId, and is saved only when its parent is also saved. Replies count toward the same per-content result limit.

Can I remove the row limit?

Yes. Turn on collectAllAvailable to ignore the numeric limit. Collection then continues until the public source ends, the buyer charge limit is reached, the run times out, or the run fails.

What do I pay for?

You pay for unique public comments and replies saved to the default dataset. Invalid, unsupported, unavailable, duplicate, source-deleted, and confirmed zero-comment inputs do not create paid result rows.

Can I paste a Facebook Page or Group URL?

No. This Actor collects comments from direct supported public content URLs. It does not discover every post from a Page, Group, profile, feed, or search page.

What happens when a post has no public comments?

The input outcome appears in OUTPUT. It does not create a fake dataset row or a paid result.

How are duplicates removed?

Each Facebook content item is collected once per run. Each Facebook comment ID is saved once.

Does the Actor search Facebook for posts?

No. It collects comments from known public content URLs that you provide.

🛟 Support

For support, include the Apify run ID, one input URL, the expected public content, the observed dataset or OUTPUT result, and whether the issue affects one row or the whole run. Do not send Facebook login details or browser sessions.

Combine this Actor with our other social media scrapers for discovery, performance tracking, comment research, and transcript collection.

Facebook

Instagram

TikTok

YouTube