Facebook Comments Scraper: Replies, No Login
Pricing
from $0.19 / 1,000 comments
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
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
4 days ago
Last modified
Categories
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
- 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).
- Set Comments per post (20 by default in the form) or switch on Every comment of each post.
- Leave Include replies on to get the reply threads too (replies count against the same number).
- 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:
| Field | What it holds | Filled on the platform runs (2026-10-14) |
|---|---|---|
commentId, commentGraphId, feedbackId | Facebook's ids of the comment | 100 percent |
postId, postUrl, inputUrl | the post the comment belongs to and the link you gave | 100 percent |
depth, isReply, parentCommentId, threadCommentId, replyToAuthorName | 0 for a top level comment, 1 for a reply, 2 for a reply to a reply, with the exact comment it answers | 100 percent |
text | the comment's text (empty for a sticker or photo only comment) | 96 percent |
createdAt, createdAtUnix | when it was written (UTC) | 100 percent |
authorName, authorId, authorIdKind | the commenter as Facebook shows them logged out (a numeric id or a pfbid id) | 100 percent |
authorUrl | the commenter's profile link where Facebook shows one | 58 percent |
authorPictureUrl | the commenter's picture | 100 percent |
authorIsVerified, authorIsPostAuthor, authorBadges | verified badge, whether the post's own page or profile wrote it, badges such as top fan | 2, 1 and 29 percent |
reactionCount, reactions | all reactions, and like, love, care, haha, wow, sad, angry | 100 percent (a non zero breakdown on 31 percent) |
replyCount | Facebook's reply count of the comment | 100 percent (non zero on 6 percent) |
attachments | photo, video, gif, sticker or link, with URLs (a link adds its title, source and target) | 4 percent |
mentions | people, pages and hashtags tagged in the text | 7 percent |
language, textTranslationType | the language Facebook detected (for example en_XX) | 76 percent |
isEdited, writtenWhileLive, secondInVideo | edited flag, and for comments on a live video, when in the video they were written | where Facebook shows them |
commentUrl, replyThreadToken | the comment's own link, and Facebook's handle of its reply thread | 100 percent |
postText, postCreatedAt, postAuthorName | the post's own facts, with the Post details add-on (below) | when the add-on is on |
sortOrder, scrapedAt | the order the post was read in, and when the row was made | 100 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").
Links it reads
| Link | Example | Read how |
|---|---|---|
| Page or profile post | facebook.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, watch | facebook.com/NASA/videos/1408202287429345/, facebook.com/watch/?v=..., video.php?v=... | the video number |
| Reel | facebook.com/reel/1023344310547434/ | through the reel's page, which names the reel's post |
| Photo, photo album | facebook.com/photo/?fbid=...&set=a...., photo.php?fbid=... | the photo number, read oldest first |
| Public group post | facebook.com/groups/dogspotting/posts/..., /permalink/..., ?multi_permalinks=... | the post number |
| Share and short links | facebook.com/share/p/..., /share/v/..., /share/r/..., fb.watch/... | the link's redirect, then the target |
| permalink.php, story.php, mobile links | facebook.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 comment | any 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 number | 1636988564463180 | the 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.
| Event | Free plan | Bronze | Silver | Gold |
|---|---|---|---|---|
| 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
| Field | What it does |
|---|---|
postUrls | the post links (up to 500). startUrls with { "url": ... } objects is read too |
maxCommentsPerPost | the most comments and replies per post (empty: 50) |
collectAll | every comment Facebook shows of each post |
maxTotalComments | the most comments in the whole run |
includeReplies | read the reply threads (empty: on) |
maxRepliesPerComment | the most replies under each comment |
sortOrder | newest (empty), oldest, all or relevant |
commentsNewerThan, commentsOlderThan | a free date window: YYYY-MM-DD, YYYY-MM-DDTHH:MM (UTC), today, yesterday, "7 days", "24 hours" |
keywords, excludeKeywords | only comments with, or without, these words or phrases (whole words, any case) |
authors, excludeAuthors | only, or never, these authors (a name, an author id or a profile link) |
excludePostAuthor | leave out the post owner's own comments and replies |
minReactions | only comments with at least this many reactions |
languages | only comments in these languages (en, es, pt...) |
includePostDetails | the Post details add-on |
memoryName, resetMemory | the cross run memory |
proxyUrls | your own proxies (optional, secret) |
maxConcurrency | how 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 ApifyClientclient = 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
allorder 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
- Facebook Posts Scraper - Page Posts, No Login
- Facebook Page ID Finder: Names to Page IDs
- Facebook Marketplace Scraper with Sold Tracker
- Facebook Ads Library Scraper - Ad Library & Spy
- Meta Ads Library Scraper - Ad Library, All Filters
- Instagram Posts Scraper: Profiles, Reels, No Login
- Threads Replies Scraper: Comments of Any Post
- TikTok Video Scraper: Post Stats, Transcripts