Facebook Comments Scraper: Posts, Reels, Videos, Replies avatar

Facebook Comments Scraper: Posts, Reels, Videos, Replies

Pricing

from $1.26 / 1,000 comments

Go to Apify Store
Facebook Comments Scraper: Posts, Reels, Videos, Replies

Facebook Comments Scraper: Posts, Reels, Videos, Replies

Scrape comments of public Facebook posts, videos and reels: text, author, profile link, time, reactions, reply count, replies and parent comment id. Post links in, one row per comment. No login.

Pricing

from $1.26 / 1,000 comments

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

30 Facebook comments with reactions and reply counts in 5 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Why choose this actor?

  • Every field a comment has, in columns. Comment text, author name and profile link, exact time, reactions with their split, reply count, and for replies the parent_comment_id and depth. Each row also names the post it came from: post_id, post_url, the Page that posted and the post's comment total.
  • Posts, videos and reels. Paste the link of a post, a /videos/ link, a /watch/?v= link or a /reel/ link. Share links and m.facebook.com links work too.
  • Replies on a switch. Turn on includeReplies and every reply becomes its own row, billed like a comment, linked to its parent. Replies to replies come back at depth 2.
  • Honest about depth. Facebook shows a logged out visitor the comment list of a post in pages of 10. On a post with 3,215 comments and replies we read all 2,725 top level comments, no login. The run summary lists, per post, how many comments Facebook counts next to how many were delivered. You pay only for rows you receive.
  • No Facebook account. No login, no cookies of yours, no browser and no CAPTCHA solving. Links that are private, removed or login walled get a free error row with the reason and are never charged.

Run it on Apify

Part of The Mine Works Social media and video family: Threads Scraper, Reddit Scraper, Threads Search Scraper, Instagram Profile Scraper, Instagram Followers & Following, Reddit Search Scraper.

Try it in one minute

Paste this into the JSON tab of the input page. It returns 30 comments of one public post. It took 5 seconds in our test.

{
"startUrls": [{ "url": "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl" }],
"maxCommentsPerPost": 30
}

Apify's free plan includes $5 of credit every month, which covers about 2,200 comments at this actor's price.

Copy to your AI assistant

themineworks/facebook-comments-scraper on Apify. Reads comments of public Facebook posts, videos and reels as a logged out visitor and returns one flat row per comment or reply: comment_id, comment_url, text, author_name, author_id, author_url, author_url_is_vanity, author_picture_url, created_at, reactions_count, reactions, replies_count, depth, is_reply, parent_comment_id, attachment_urls, and the post: post_id, post_url, post_owner_name, post_owner_id, post_comments_total. Call ApifyClient("TOKEN").actor("themineworks/facebook-comments-scraper").call(run_input={"startUrls": [{"url": "https://www.facebook.com/reel/1803909017420449/"}], "maxCommentsPerPost": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give startUrls (post, video or reel links). Optional: maxCommentsPerPost (default 50, applies to each post, 0 means all that Facebook shows), sortBy (relevant, newest, oldest, all), includeReplies (default false), maxRepliesPerComment (default 20), onlyCommentsNewerThan (YYYY-MM-DD). Skip rows with a _type field (summary, info, error: never charged). Page and profile links are rejected; photo and group posts usually ask for a login. Full spec: GET https://api.apify.com/v2/acts/themineworks~facebook-comments-scraper/builds/default (Bearer TOKEN). Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • Four orders. relevant is Facebook's default, newest starts with the latest comment, oldest with the first, all adds the comments Facebook filters out as likely spam.
  • Stop at a date. onlyCommentsNewerThan switches to newest first and ends paging at the first older comment, so a weekly run reads only the new ones.
  • Reply threads. parent_comment_id ties each reply to the comment it answers; replies_count tells you which comments have threads.
  • Reactions with their split. reactions_count is every reaction; reactions lists type and count (Like, Love, Haha, Wow, Sad, Angry, Care).
  • Photos and stickers. attachment_urls holds the links of images, stickers and GIFs in a comment. Comments that are only a sticker have no text.
  • Many posts, one run. Up to 2,000 links; three posts are read at the same time. Two links to the same post give one set of rows.
  • Stops cleanly. The run stops before its time limit, on your max cost, after repeated refusals by Facebook, or when two answers in a row bring nothing new, and it keeps every row it read.

How to use it

Brand and campaign monitoring

Schedule a daily run on your latest posts with sortBy set to newest and onlyCommentsNewerThan set to yesterday. Rows with a question in text and replies_count of 0 are the comments nobody answered.

{
"startUrls": [{ "url": "https://www.facebook.com/reel/1803909017420449/" }],
"sortBy": "newest",
"maxCommentsPerPost": 0,
"onlyCommentsNewerThan": "2026-10-24"
}

Giveaways and contests

Export every comment of the giveaway post with maxCommentsPerPost set to 0 and draw winners from author_id. Each commenter appears once per comment, so de-duplicate on author_id if one entry per person is the rule.

Sentiment and topic datasets

Pull 500 comments from each of 20 competitor posts with includeReplies off, then run your own classifier on text. The reactions_count column is a ready made weight.

Conversation threads

Turn on includeReplies. Group the rows by parent_comment_id to rebuild each thread; a row with depth 0 is the start of one.

{
"startUrls": [{ "url": "https://www.facebook.com/humansofnewyork/posts/pfbid0BbKbkisExKGSKuhee9a7i86RwRuMKFC8NSkKStB7CsM3uXJuAAfZLrkcJMXxhH4Yl" }],
"maxCommentsPerPost": 200,
"includeReplies": true,
"maxRepliesPerComment": 20
}

Input parameters

ParameterTypeDefaultWhat it does
startUrlsarraythe sample postLinks of public Facebook posts, videos and reels.
maxCommentsPerPostinteger50Most comments from each post (not the run total). Replies count toward it. 0 means every comment Facebook shows.
sortBystringrelevantrelevant, newest, oldest or all (includes comments Facebook filters).
includeRepliesbooleanfalseReturn replies as their own rows with parent_comment_id.
maxRepliesPerCommentinteger20Most replies read under one comment, when replies are on.
onlyCommentsNewerThanstringemptyYYYY-MM-DD. Uses newest first and stops at the first older comment.
proxyConfigurationobject{"useApifyProxy": true}Apify datacenter proxy, which is all this actor needs. Residential is not used, even if selected.

Up to 2,000 links per run. A Page or profile link is not a post: it gets a free error row that asks for a post link.

What data do you get?

One row per comment or reply. Fields that a comment does not have are left out of that row.

FieldWhat it is
comment_id, comment_urlFacebook's id of the comment and its permalink
textThe comment; absent for a photo, sticker or GIF only
author_name, author_idThe commenter. Most ids are pfbid tokens
author_url, author_url_is_vanityProfile link. Facebook's own link when the profile has a username (true); otherwise facebook.com/ plus the id (false), which opens when you are signed in to Facebook
author_picture_urlProfile picture link (expires after a few days)
created_atISO 8601 UTC
reactions_count, reactionsAll reactions and the split by type
replies_count, replies_visibleReplies Facebook counts under the comment, and how many of them it shows a logged out visitor
depth, is_reply, parent_comment_id0 for a comment, 1 for a reply, 2 for a reply to a reply; the id of the comment answered
attachment_urlsImages, stickers and GIFs in the comment
post_id, post_urlThe post, video or reel
post_owner_name, post_owner_idThe Page or profile that posted (the name is empty for reels)
post_comments_totalComments and replies Facebook counts on the post
input, scraped_atThe link you gave, and when the row was written

Summary row (_type: "summary", never charged, also saved as the OUTPUT record): posts_requested, posts_read, posts_failed, posts_without_comments, comments_delivered, charged_for, transport (requests, megabytes, block_rate) and per_post, one entry per post with advertised_comments, comments_delivered, top_level, replies, reached_end and status (all_reachable_delivered, max_comments_reached, older_than_cutoff, partial, max_cost, no_comments, not_available, blocked).

Error rows (_type: "error", never charged): one per link that gave no comments, with error_type, identifier and reason.

Output examples

A top level comment (test run, 25 Oct 2026, trimmed):

{
"comment_id": "354937476306913",
"comment_url": "https://www.facebook.com/humansofnewyork/posts/pfbid02FDxUjViiqP6bhiBCRxbrj3qyz6PaKjdRRDGq8GXGH6Q4irYqPEsxx6rmCkjfken6l?comment_id=354937476306913",
"text": "This is so inspiring and an example of one drop turning into a wave.",
"author_name": "Linda Josey",
"author_id": "pfbid06jRPBvQRAGv9nscgT9kHJSmqBRUcW5GTr8FcTmw1zNEtLFuiJYtqN9cdWQTU2mo2l",
"author_url": "https://www.facebook.com/pfbid06jRPBvQRAGv9nscgT9kHJSmqBRUcW5GTr8FcTmw1zNEtLFuiJYtqN9cdWQTU2mo2l",
"author_url_is_vanity": false,
"created_at": "2021-08-15T20:16:39.000Z",
"reactions_count": 8,
"reactions": [{ "type": "Like", "count": 6 }, { "type": "Love", "count": 2 }],
"replies_count": 0,
"depth": 0,
"is_reply": false,
"post_id": "6375219342552112",
"post_owner_name": "Humans of New York",
"post_comments_total": 3215
}

A reply:

{
"comment_id": "387509826375077",
"text": "Debra Reed I can't stop crying. I love this so much",
"author_name": "Rejane Davis",
"created_at": "2021-09-04T21:38:17.000Z",
"reactions_count": 0,
"depth": 1,
"is_reply": true,
"parent_comment_id": "642502280106374",
"post_id": "6375219342552112"
}

The per post entry of the summary for a run on a reel:

{ "owner": null, "status": "all_reachable_delivered", "advertised_comments": 82, "comments_delivered": 10, "top_level": 10, "reached_end": true }

Pricing

Pay per event: you pay for the comments you receive, plus a flat $0.003 per run, whatever memory you choose.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
comment-scrapedOnce per comment or reply row stored in your dataset$2.25 per 1,000$1.80 per 1,000$1.53 per 1,000$1.26 per 1,000
run-startOnce per run, when the first comments are stored$0.003$0.003$0.003$0.003

The price of one comment is the price per 1,000 divided by 1,000. Replies cost the same as comments. There is no extra charge for sorting, dates or replies.

Never charged:

  • links that are not posts, private or removed posts, login walled posts and posts without comments (each gets an error row);
  • the summary, info and error rows;
  • comments past maxCommentsPerPost or older than onlyCommentsNewerThan;
  • a run with no valid input or whose posts returned no comments: the start fee is charged only when the first comments are stored;
  • anything past your "Max cost per run". The actor checks the budget before each batch and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

Run it on a schedule

  1. Open the actor in Apify Console, set your input and click Save as a new task.
  2. In the task, open Schedules, click Add schedule and pick how often.
  3. Compare runs on comment_id to find new comments, or use sortBy: "newest" with onlyCommentsNewerThan so each run reads only recent ones.
  4. Optional: add an integration (Google Sheets, Slack, a webhook) so new comments reach your team.

FAQ

Do I need a Facebook account or cookies?

No. The actor reads each post as a visitor who is not logged in.

How many comments can I get per post?

Facebook gives a logged out visitor most of a post's comment list, not all of it. Test runs on 25 Oct 2026: a post Facebook counts at 3,215 comments and replies gave all 2,725 top level comments in 272 requests (about 5 minutes); a post counted at 313 gave 153 top level comments and a reel counted at 82 gave 39. Facebook's count includes replies, hidden comments and replies it does not show to visitors who are not logged in. The summary shows advertised_comments and comments_delivered for every post, so you know what you got.

Why do I get fewer rows than the number on the post?

Facebook's count includes replies, and from other kinds of hidden comments. The summary shows advertised_comments next to comments_delivered and top_level for every post. With includeReplies on, the gap closes further.

Posts (/<page>/posts/..., permalink.php, story.php), videos (/<page>/videos/<id>, /watch/?v=, fb.watch), reels (/reel/<id>) and /share/p|v|r/ links. Photo links, group posts and posts that Facebook limits by age or country usually send a visitor to the login page; those get a free error row. A Page link is not a post and is rejected.

Facebook gives a profile link only when the person has a username. For the rest the row carries facebook.com/ plus Facebook's own id for the profile (author_url_is_vanity is false). That link opens when you are signed in to Facebook.

Are replies included?

Only when includeReplies is on. Each reply is a row with parent_comment_id and depth, and it is billed like a comment. Replies are read 10 per request. Facebook hides many replies from visitors who are not logged in (replies_visible is lower than replies_count), and the actor only asks for replies that are visible, so those hidden ones are not in the data.

How fast is it and what does a run cost me?

Facebook sends 10 comments per request, roughly one request per second. A post of 100 comments takes about 12 seconds, and 800 comments with replies took 143 seconds. Three posts are read at the same time. In our tests none of about 1,000 post and comment requests was refused.

Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. In CSV and Excel the nested reactions and attachment_urls are flattened into columns such as reactions/0/type; use JSON to keep them whole.

Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/facebook-comments-scraper

  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http facebook-comments-scraper "https://mcp.apify.com/?tools=themineworks/facebook-comments-scraper"

The actor reads only comments that anyone can see without logging in. Comments are their authors' words and contain personal data (names, profile links). You are responsible for how you use the data, including Facebook's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice.

Integrations

  • Google Sheets: send each run's comments to a sheet with Apify's Google Sheets integration; one row per comment fits a sheet as is.
  • Make, Zapier and n8n: start a run and read its dataset, for example "new comments on our latest post every morning to Slack".
  • Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
  • API and SDKs: run it from Python or JavaScript with the Apify client (see "Copy to your AI assistant" above).
  • MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

More from The Mine Works

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

Company and business data

E-commerce and marketplaces

Food and local services

Developer and AI tools

More tools

Support

Found a post that returns fewer comments than you can see, or a field that comes back empty? Open an issue in the Issues tab with the input and the run ID, and we will look at it. For a field you need or a new source, email dmineworks@gmail.com.

Paste the link of a public Facebook post, video or reel and get every comment back as one row, with author, profile link, time, reactions, reply count and replies, no login.