Facebook Comments Scraper: Replies, No Login avatar

Facebook Comments Scraper: Replies, No Login

Pricing

from $0.19 / 1,000 comments

Go to Apify Store
Facebook Comments Scraper: Replies, No Login

Facebook Comments Scraper: Replies, No Login

Scrape the comments and replies of public Facebook posts, videos, reels and photos without a login: text, author, time, reactions by type, reply counts, attachments and language, plus a free coverage row per post with Facebook's own counts. JSON, CSV, Excel, API. Pay per comment.

Pricing

from $0.19 / 1,000 comments

Rating

0.0

(0)

Developer

Automation Craft

Automation Craft

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Facebook Comments Scraper: Replies, No Login

Facebook comments scraper for public posts, videos, reels and photos, with no login and no cookies. Paste post links and get every comment and reply Facebook shows a logged out visitor: text, author, time, reactions by type, reply counts, attachments and language, with the exact parent of each reply. Each post also gets a free coverage row with Facebook's own comment counts next to what was delivered, so you always know how complete a post is. Pay per comment, from $0.19 per 1,000.

What it is for

  • Brand and agency teams: export the comments under your posts, a competitor's posts or their ads' organic posts for sentiment, complaints and questions.
  • Researchers: collect the full public discussion of a post, with reply threads, into one table.
  • Monitoring: schedule it with a memory name and get only the new comments of each run, each comment billed once.
  • Automation users: one row per comment, ready for n8n, Make, Zapier, Google Sheets or a database.

Quick start

  1. Paste one or more post links into Post links (a page post, a pfbid link, a video, a reel, a photo, a share link or a public group post).
  2. Set Comments per post (20 by default in the form) or switch on Every comment of each post.
  3. Leave Include replies on to get the reply threads too (replies count against the same number).
  4. Click Start. Download the rows as JSON, CSV or Excel, or read them through the API.

What you get

One row per comment or reply (type: "comment"), the Comment event:

FieldWhat it holdsFilled on the platform runs (2026-10-14)
commentId, commentGraphId, feedbackIdFacebook's ids of the comment100 percent
postId, postUrl, inputUrlthe post the comment belongs to and the link you gave100 percent
depth, isReply, parentCommentId, threadCommentId, replyToAuthorName0 for a top level comment, 1 for a reply, 2 for a reply to a reply, with the exact comment it answers100 percent
textthe comment's text (empty for a sticker or photo only comment)96 percent
createdAt, createdAtUnixwhen it was written (UTC)100 percent
authorName, authorId, authorIdKindthe commenter as Facebook shows them logged out (a numeric id or a pfbid id)100 percent
authorUrlthe commenter's profile link where Facebook shows one58 percent
authorPictureUrlthe commenter's picture100 percent
authorIsVerified, authorIsPostAuthor, authorBadgesverified badge, whether the post's own page or profile wrote it, badges such as top fan2, 1 and 29 percent
reactionCount, reactionsall reactions, and like, love, care, haha, wow, sad, angry100 percent (a non zero breakdown on 31 percent)
replyCountFacebook's reply count of the comment100 percent (non zero on 6 percent)
attachmentsphoto, video, gif, sticker or link, with URLs (a link adds its title, source and target)4 percent
mentionspeople, pages and hashtags tagged in the text7 percent
language, textTranslationTypethe language Facebook detected (for example en_XX)76 percent
isEdited, writtenWhileLive, secondInVideoedited flag, and for comments on a live video, when in the video they were writtenwhere Facebook shows them
commentUrl, replyThreadTokenthe comment's own link, and Facebook's handle of its reply thread100 percent
postText, postCreatedAt, postAuthorNamethe post's own facts, with the Post details add-on (below)when the add-on is on
sortOrder, scrapedAtthe order the post was read in, and when the row was made100 percent

The fill rates are counted over the 2,094 comments and replies the platform runs of this build delivered (9 posts of brands, news, a public figure, a space agency, groups, a reel, a video and a photo).

A coverage row per post link (type: "coverage", free): facebookCommentCount (top level comments Facebook counts), facebookTotalCount (with replies), commentsDelivered, repliesDelivered, knownSkipped, filteredOut, outsideWindow, orderUsed, endReason, complete and a message. endReason is one of end_of_list (Facebook served its last page: complete is true), per_post_cap, date_window, known_reached (a monitor met the comments it delivered before), no_match_limit, thread_delivered (a comment link), work_allowance, charge_limit, post_not_found, post_not_available, post_unresolved, comment_not_found, duplicate_post, lookup_failed or unexpected_answer.

Status rows (type: "status", free) say which links could not be read and why: a page or profile link, a post Facebook does not show, a link whose page names no post. The summary row (type: "summary", free) closes every run with its counters and what was billed.

Facebook shows fewer comments than it counts

Facebook counts every comment, but shows a logged out visitor only the ones it serves publicly. On a NASA image post that was 177 of 217 top level comments, on a NASA video 1,545 of 1,659, and on one Nike post only 934 of 3,069, the same 934 under every order (shorter walks on residential exits met only comments among those 934). This Actor reads all of what Facebook serves, and the coverage row puts Facebook's counts next to what was delivered. Some reply threads are shortened the same way (Facebook notes that "some replies may have been filtered out").

LinkExampleRead how
Page or profile postfacebook.com/NASA/posts/1636988564463180, facebook.com/nike/posts/pfbid0Yzg...the post number directly; a pfbid link through its page (once per link under a memory name)
Video, watchfacebook.com/NASA/videos/1408202287429345/, facebook.com/watch/?v=..., video.php?v=...the video number
Reelfacebook.com/reel/1023344310547434/through the reel's page, which names the reel's post
Photo, photo albumfacebook.com/photo/?fbid=...&set=a...., photo.php?fbid=...the photo number, read oldest first
Public group postfacebook.com/groups/dogspotting/posts/..., /permalink/..., ?multi_permalinks=...the post number
Share and short linksfacebook.com/share/p/..., /share/v/..., /share/r/..., fb.watch/...the link's redirect, then the target
permalink.php, story.php, mobile linksfacebook.com/permalink.php?story_fbid=...&id=..., m.facebook.com/story.php?...the post number, or the owner's post address for a pfbid story
A commentany of the above with ?comment_id=...that comment and its reply thread; for a reply (its own comment_id, or reply_comment_id), that reply and the replies under it
A bare post number1636988564463180the post number

Page, profile and group home links are not posts: they get a free status row.

How much does it cost to scrape Facebook comments?

Pay per event: you pay for each comment or reply delivered, nothing for anything else.

EventFree planBronzeSilverGold
Comment (per 1,000 comments or replies)$0.27$0.24$0.22$0.19
Post details add-on (per 1,000 posts, off by default)$0.90$0.80$0.70$0.60
Actor start (per run)$0.008$0.008$0.008$0.008

Platinum and Diamond plans pay the Gold price. The Store pricing card shows these same prices per 1,000 events: "$0.19 / 1,000" on the Comment row means one comment costs $0.00019. The Actor start is charged once per run, by the platform, per GB of run memory (a 256 MB run pays one).

Examples at the Gold price:

  • 20 comments of one post: $0.008 + 20 x $0.00019 = $0.0118.
  • 1,000 comments: $0.008 + $0.19 = $0.198.
  • 10,000 comments and replies from 50 posts: $0.008 + $1.90 = $1.908.
  • A monitor run of 10 posts that finds nothing new: $0.008.

Free, always: comments your memory knows, repeats, comments a filter or the date window leaves out, coverage rows, status rows for links that cannot be read, posts not found, the summary, and the sample run of an empty input.

Input

FieldWhat it does
postUrlsthe post links (up to 500). startUrls with { "url": ... } objects is read too
maxCommentsPerPostthe most comments and replies per post (empty: 50)
collectAllevery comment Facebook shows of each post
maxTotalCommentsthe most comments in the whole run
includeRepliesread the reply threads (empty: on)
maxRepliesPerCommentthe most replies under each comment
sortOrdernewest (empty), oldest, all or relevant
commentsNewerThan, commentsOlderThana free date window: YYYY-MM-DD, YYYY-MM-DDTHH:MM (UTC), today, yesterday, "7 days", "24 hours"
keywords, excludeKeywordsonly comments with, or without, these words or phrases (whole words, any case)
authors, excludeAuthorsonly, or never, these authors (a name, an author id or a profile link)
excludePostAuthorleave out the post owner's own comments and replies
minReactionsonly comments with at least this many reactions
languagesonly comments in these languages (en, es, pt...)
includePostDetailsthe Post details add-on
memoryName, resetMemorythe cross run memory
proxyUrlsyour own proxies (optional, secret)
maxConcurrencyhow many posts and threads are read at once (empty: 4)

Example:

{
"postUrls": ["https://www.facebook.com/NASA/posts/pfbid0338pd1679MaCKkoVtCuNNfzmHfYWTg96j2LPcd2fGswyqJsWYs6wwHoSdYEBSLkXxl"],
"maxCommentsPerPost": 200,
"includeReplies": true,
"sortOrder": "newest",
"commentsNewerThan": "7 days",
"memoryName": "nasa-weekly"
}

Orders

newest and oldest are strict time orders: with a date window the walk ends at the window's edge, so a "last 7 days" run reads only the pages it needs. all is Facebook's own ranking of every comment, relevant is its "Most relevant" view, which lists fewer comments. A photo is always read oldest first, because Facebook's other orders list only a few comments of a photo, and when an order lists far fewer comments than Facebook counts and ends, the post is read oldest first instead (the coverage row says so in orderUsed).

Monitoring with a memory

Give a memoryName and schedule the run. Every comment and reply delivered under that name is remembered: later runs leave it out for free and deliver only new ones. Known comments take no slot of maxCommentsPerPost: with a cap, each run delivers up to that many comments it has not delivered before, so successive runs also work back through older comments. A known comment's reply thread is read again only when its reply count grew. Under the newest first order, without a date window or a filter, a later run ends a post's walk at the first page of comments it has all delivered before, once an earlier run read that post to its end. A memory also remembers which post a pfbid, reel or share link led to, so later runs load no page for it (the Post details add-on still reads each post's page once a run). When a run of a list of several links stops before the end of the list (the work allowance, a cap), the next run of the same list under the same memory starts at the first link it did not read, so a long list is covered over successive runs. A memory belongs to this Actor and holds up to 150,000 comments; two runs on one name at the same time do not share it (the second runs free and remembers nothing).

The work allowance

Reading pages that bill nothing (a post with no new comments, a filter that matches little, links that do not exist) is bounded per run: the allowance grows with every comment billed. A run that reads many pages without billing stops early with endReason: "work_allowance" on the coverage row and a free skipped row for the posts it did not reach; run it again (under a memory name it continues where it stopped) or narrow it. A long list with only a few comments asked of each post (5 or fewer) earns the least allowance, more so when its links are pfbid, reel or share links (each needs a page load): on a slow day such a run can stop after part of the list, so ask for more comments per post or use a memory name. Rows of several posts are delivered together, so a monitor of many posts with a few new comments each pays its storage writes once per batch.

API

curl -X POST "https://api.apify.com/v2/acts/automation_craft~facebook-comments-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"postUrls":["https://www.facebook.com/NASA/posts/1636988564463180"],"maxCommentsPerPost":50}'
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('automation_craft/facebook-comments-scraper').call({ postUrls: ['https://www.facebook.com/NASA/posts/1636988564463180'], maxCommentsPerPost: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.filter((x) => x.type === 'comment').length);
from apify_client import ApifyClient
client = ApifyClient("YOUR_TOKEN")
run = client.actor("automation_craft/facebook-comments-scraper").call(run_input={"postUrls": ["https://www.facebook.com/NASA/posts/1636988564463180"], "maxCommentsPerPost": 50})
comments = [x for x in client.dataset(run["defaultDatasetId"]).iterate_items() if x["type"] == "comment"]

What this Actor does not do

  • No login, no cookies, no private content: comments Facebook shows only to logged in users, private groups and private profiles are not read.
  • No commenter gender or work info: rows carry the commenter's name, id, profile link and picture as the logged out page shows them, nothing more.
  • Not every comment Facebook counts: only the comments it serves a logged out visitor (see "Facebook shows fewer comments than it counts").
  • No page, profile or group home links: give the links of single posts.
  • No reactor lists: who reacted to a comment is not read, only the counts.
  • Personal data: comment rows carry the names, ids, profile links and pictures of the people who wrote them, as Facebook shows them to any visitor. Use them under the data protection rules that apply to you.
  • Replies of older comments in a date window: under the newest first order a date window ends the walk at its start, so a reply written inside the window under a comment older than the window is not read. Use the all order with the window to read every thread.

FAQ

Can I scrape Facebook comments without logging in?

Yes. This Actor reads the comments Facebook serves to any visitor of a public post, with no login, no cookies and no account. Comments Facebook hides from logged out visitors are not reachable this way, and each post's coverage row shows Facebook's count next to what was delivered.

How do I export Facebook comments to Excel or CSV?

Run the Actor with your post links, open the run's dataset and download it as CSV, Excel or JSON. Each comment and reply is one row, with its parent comment's id on every reply.

Why do I get fewer comments than the number Facebook shows?

Facebook's number counts every comment and reply, but a logged out visitor is shown fewer: on the posts measured between 30 and 93 percent of the top level comments. The coverage row gives facebookCommentCount, facebookTotalCount and what was delivered.

Can it download the replies to comments too?

Yes. With Include replies on (the default) every reply thread is read, replies and replies to replies, each a row with parentCommentId, threadCommentId and depth. Replies are billed as comments and count against Comments per post.

Does it work on reels, videos, photos and group posts?

Yes: reels, videos, watch links, photos and photo albums, public group posts, share links, fb.watch links and comment links. A reel is read through its page, which names the reel's post.

Why does this Actor run with limited permissions?

It needs only its own storages: the run's dataset and key-value store, and the memory it creates for a memory name you give. Limited permissions keep it from reading or writing anything else in your account.

Changelog

See the Changelog tab.

More data tools by Automation Craft