Facebook Comments Scraper avatar

Facebook Comments Scraper

Pricing

$0.75 / 1,000 comment results

Go to Apify Store
Facebook Comments Scraper

Facebook Comments Scraper

Scrape public Facebook comments and replies from posts, Reels, videos and photos. Extract comment text, authors, timestamps, likes and reply threads in clean JSON or CSV.

Pricing

$0.75 / 1,000 comment results

Rating

0.0

(0)

Developer

Delowar Munna

Delowar Munna

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Share

Facebook Comments Scraper — Comments, Replies, Authors & Engagement

Facebook Comments Scraper

Scrape public Facebook comments and replies from posts, Reels, videos and photos. Paste one or many Facebook content URLs and get every public comment as one clean row — comment text, author, timestamp, likes and reactions, and the reply-thread relationships — ready for JSON, CSV, Excel, SQL or an AI pipeline.

No Facebook login, no cookies, no access token. The Actor reads only what Facebook shows a logged-out visitor.

✨ What it does

  • 💬 Top-level comments and replies — every reply is its own row, with rootCommentId, parentCommentId and threadingDepth, so conversations can be rebuilt in a spreadsheet.
  • 🔗 Many URL types — posts (numeric or pfbid… links), Reels, videos, Watch, photos, permalink.php, share links (/share/p/…, fb.watch/…) and public-profile posts.
  • 🎯 Exact per-URL limits — resultsLimit is applied to each URL separately, replies included.
  • 🗓️ Date filter — keep only comments newer than a date or a period such as 7 days.
  • ↕️ Sort — Facebook's default order, newest first, or most relevant.
  • 🧹 Deduplicated — no comment is ever saved (or charged) twice, even if the same post is given as two different URLs.
  • 🩺 Honest status per URL — private, deleted, unsupported or blocked content is reported clearly instead of returning a silent empty dataset.
  • 📊 Flat, typed output — counts are numbers, missing values are null.

🔗 Supported Facebook URLs

ContentExample
Page or profile posthttps://www.facebook.com/{page}/posts/{id} or /posts/pfbid…
Videohttps://www.facebook.com/{page}/videos/{id}
Watchhttps://www.facebook.com/watch/?v={id} · https://fb.watch/{code}
Reelhttps://www.facebook.com/reel/{id}
Photohttps://www.facebook.com/photo/?fbid={id} · /{page}/photos/…/{id}
Permalinkhttps://www.facebook.com/permalink.php?story_fbid={id}&id={owner}
Share linkhttps://www.facebook.com/share/p/{code}/ (also /share/v/, /share/r/)
Public group posthttps://www.facebook.com/groups/{group}/posts/{id} — only if Facebook shows it logged out

m.facebook.com, web.facebook.com and tracking parameters are normalized automatically.

Not supported: Page/profile home URLs, search, hashtags and private content. These are rejected with a clear message. Need a page's posts first? Run Facebook Posts Scraper and pass the post URLs it returns into this Actor.

🚀 Quick start

Minimal input

{
"startUrls": [
{ "url": "https://www.facebook.com/zuck/posts/pfbid02tn9Ctpv9BCh3WRqFMZWBpAdqL4qCc2jsZ9qTZyy9w4WYY55JWsDW3GZ279ZVwbisl" }
],
"resultsLimit": 100
}

Full input — several URLs, replies, newest first, last 30 days

{
"startUrls": [
{ "url": "https://www.facebook.com/zuck/posts/pfbid02tn9Ctpv9BCh3WRqFMZWBpAdqL4qCc2jsZ9qTZyy9w4WYY55JWsDW3GZ279ZVwbisl" },
{ "url": "https://www.facebook.com/reel/1450137903652075" },
{ "url": "https://www.facebook.com/photo/?fbid=1663743535123070" }
],
"resultsLimit": 1000,
"includeReplies": true,
"maxReplyDepth": 2,
"sort": "NEWEST",
"commentsNewerThan": "30 days"
}

⚙️ Input

FieldDefaultWhat it does
startUrls— (required)Facebook content URLs. Plain strings or { "url": … } objects.
resultsLimit100Max comment + reply rows per URL. 0 = no limit.
includeRepliestrueSave replies as their own rows.
maxReplyDepth21 = replies to comments only; 2 = also replies to replies (the deepest level Facebook has).
sortALLALL (Facebook's default order), NEWEST, or MOST_RELEVANT.
commentsNewerThanemptyA date (2026-09-01) or a period (24 hours, 7 days, 1 month).
maxConcurrency5How many URLs run in parallel (1–10). Each URL's pages are read one after another.
proxyConfigurationApify ProxySee Proxy policy below.
debugfalseVerbose log for troubleshooting.

What does resultsLimit mean exactly?

It caps the number of rows saved for each input URL, and replies count toward it. With resultsLimit: 100 and 3 URLs you get up to 300 rows. Within a URL, the Actor reads one page of comments, saves those comments, then their replies, then moves to the next page — so a single very long reply thread cannot use up the whole limit on its own.

📤 Output

One dataset row per comment or reply. In the Apify Console the results open in the Comments table:

Comments table view

A full record — here a reply to a reply, from a real run on an ESPN post:

{
"type": "comment",
"commentId": "2959030571103151",
"commentUrl": "https://www.facebook.com/ESPN/posts/pfbid0gwea45YzsqACibJ7PRn5MdWkgRLtEtvmSLLtvzUBqz9sQn6ag3CH2ZAxAKBrUVFrl?comment_id=1079476544966010&reply_comment_id=2959030571103151",
"text": "Andrew Blackk we can literally beat every team over the next 4 games",
"date": "2026-10-05T05:08:17.000Z",
"likesCount": 1,
"reactionsCount": 2,
"reactions": { "like": 1, "love": 1 },
"repliesCount": 0,
"threadingDepth": 2,
"isReply": true,
"rootCommentId": "1079476544966010",
"parentCommentId": "1076504418343827",
"replyToCommentId": "1076504418343827",
"replyToAuthorName": "Andrew Blackk",
"authorId": "pfbid02f22znxxGVMkLJ8HoRVmknptWYGH3wPJPnyuRNwEBskVyZwmvNuhBrH8eJ7NcHjqql",
"authorName": "D-rock Zamora",
"authorUrl": "https://www.facebook.com/drock.zamora",
"authorProfilePicture": "https://scontent-lga3-3.xx.fbcdn.net/v/t1.6435-1/60880123_50…",
"authorType": "User",
"attachment": null,
"postId": "4942228743939357",
"postUrl": "https://www.facebook.com/ESPN/posts/pfbid0gwea45YzsqACibJ7PRn5MdWkgRLtEtvmSLLtvzUBqz9sQn6ag3CH2ZAxAKBrUVFrl",
"postType": "post",
"postText": "THE TETAIROA MCMILLAN GAME IN PRIMETIME 🔥\n\nA bounce-back win for the Carolina Panthers has them atop the NFC South 👀",
"pageId": "100044568393679",
"pageName": "ESPN",
"inputUrl": "https://www.facebook.com/ESPN/posts/pfbid0gwea45YzsqACibJ7PRn5MdWkgRLtEtvmSLLtvzUBqz9sQn6ag3CH2ZAxAKBrUVFrl",
"scrapedAt": "2026-10-05T11:48:57.333Z"
}
FieldNotes
commentIdStable Facebook comment ID; the dedupe key.
likesCount / reactionsCountNumbers. reactions breaks the total down by type (like, love, care, haha, wow, sad, angry).
repliesCountThe reply count Facebook displays for the comment.
threadingDepth0 = top-level comment, 1 = reply, 2 = reply to a reply.
rootCommentId / parentCommentIdThe thread's top comment and the comment this one directly answers.
authorIdA numeric ID, or an opaque pfbid… token when Facebook hides the numeric ID from logged-out visitors.
authorUrlnull when Facebook does not link the profile for logged-out visitors.
attachment{ type, url, mediaUrl } when the comment has a photo, GIF, sticker, video or link — type is photo, gif, sticker, video, link or other; url is the real target (Facebook's click-tracking wrapper is removed). Otherwise null.
postText, pageId, pageNameContext of the post the comment belongs to; null when Facebook doesn't show it.

Output tabs — one sample record each

The dataset has four views. Each sample below is a real record from a platform run, showing the fields that tab displays.

Comments — what was said, by whom, and how people reacted:

{
"date": "2026-10-05T04:00:33.000Z",
"authorName": "Gabriel Panther",
"text": "Do that Dab again, Copy Our Uniforms again 💯💯",
"likesCount": 112,
"reactionsCount": 116,
"repliesCount": 13,
"isReply": false,
"threadingDepth": 0,
"commentUrl": "https://www.facebook.com/ESPN/posts/pfbid0gwea45YzsqACibJ7PRn5MdWkgRLtEtvmSLLtvzUBqz9sQn6ag3CH2ZAxAKBrUVFrl?comment_id=1079476544966010",
"authorUrl": null,
"postUrl": "https://www.facebook.com/ESPN/posts/pfbid0gwea45YzsqACibJ7PRn5MdWkgRLtEtvmSLLtvzUBqz9sQn6ag3CH2ZAxAKBrUVFrl",
"inputUrl": "https://www.facebook.com/ESPN/posts/pfbid0gwea45YzsqACibJ7PRn5MdWkgRLtEtvmSLLtvzUBqz9sQn6ag3CH2ZAxAKBrUVFrl"
}

Threads — the IDs that rebuild a conversation. This reply-to-a-reply answers comment 1076504418343827, inside the thread started by the comment above:

{
"commentId": "2959030571103151",
"rootCommentId": "1079476544966010",
"parentCommentId": "1076504418343827",
"replyToCommentId": "1076504418343827",
"replyToAuthorName": "Andrew Blackk",
"threadingDepth": 2,
"isReply": true,
"authorName": "D-rock Zamora",
"text": "Andrew Blackk we can literally beat every team over the next 4 games",
"date": "2026-10-05T05:08:17.000Z",
"postId": "4942228743939357"
}

Authors — who commented, as Facebook shows them to a logged-out visitor (here on a National Geographic photo):

{
"authorName": "Maryellen Kmiec",
"authorId": "pfbid02fy5Rj7LgPXpSyEiF3Vmw16ZPgsR5FRt9ZaHw7KS4dWff6kMzRSAVRp31cmcQiAFGl",
"authorUrl": "https://www.facebook.com/maryellen.kmiec",
"authorType": "User",
"authorProfilePicture": "https://scontent-ord5-2.xx.fbcdn.net/v/t39.30808-1/433653100…",
"text": "This was just phenomenal!!! The cinematography was beyond belief and what a great story.\n\nIt brought back wonderful memories of our trip to South Africa. We can't wait to return.",
"date": "2026-09-17T18:25:24.000Z",
"commentUrl": "https://www.facebook.com/photo/?fbid=1663743535123070&set=a.528642308633204&comment_id=1863952161652407"
}

Post context — the post each comment belongs to:

{
"postId": "1724921635664471",
"postUrl": "https://www.facebook.com/nba/posts/pfbid02CK7D3HudauhFPKH1NNuBjq8kzCHCCqYFdcX2MPKJ7zhHGAGUzTExLVZWLX6S3BUXl",
"postType": "post",
"pageName": "NBA",
"pageId": "100044399530411",
"postText": "Keaton Wagler comes up clutch in crunch time in his NBA Preseason debut as the L.A. Clippers hold off a late rally for the victory!\n\nRui Hachimura: 21 PTS, 5 REB\nDarius Garland: 15 PTS, 3 REB, 6 AST",
"commentId": "1492802385994777",
"text": "Thought it was the WNBA post for a sec",
"inputUrl": "https://www.facebook.com/nba/posts/pfbid02CK7D3HudauhFPKH1NNuBjq8kzCHCCqYFdcX2MPKJ7zhHGAGUzTExLVZWLX6S3BUXl",
"scrapedAt": "2026-10-05T11:49:04.701Z"
}

A RUN_SUMMARY record in the run's key-value store lists every input URL with its status and number of comments saved.

🩺 Per-URL status

One URL failing never stops the others. Each URL ends with one of:

StatusMeaning
SUCCESSComments saved (or the thread was fully read).
NO_COMMENTSThe post is public but has no visible comments.
COMMENTS_DISABLEDCommenting is turned off and there are no comments.
PARTIAL_RESULTSome comments were saved, then Facebook stopped answering for that URL.
UNSUPPORTED_URLNot a Facebook content URL (page, profile, search…).
PRIVATE_OR_LOGIN_REQUIREDPrivate content, or a group Facebook only shows to members.
POST_NOT_FOUNDDeleted or never existed.
RATE_LIMITED / BLOCKEDFacebook refused the requests. Try again later or use a different proxy.
TEMPORARY_FACEBOOK_ERRORFacebook returned an error; retrying later usually works.

Failed URLs produce no dataset rows and no charge — they appear in the log and in RUN_SUMMARY.

💰 Pricing

Pay per result: you are charged once per comment or reply saved to your dataset (a reply counts as one comment). See the Pricing tab for the current rate.

You are not charged for: input URLs, pagination requests, retries, URLs that fail, comments removed by your date filter, duplicates, or the run summary. A run that saves nothing costs nothing in results.

Examples: 3 posts × resultsLimit: 100 = at most 300 charged results; 1 post with resultsLimit: 1000 and commentsNewerThan: "7 days" = only the comments from the last 7 days, up to 1,000.

This README deliberately doesn't quote prices — the Pricing tab always shows the live rate.

❓ FAQ

Do I need a Facebook account, login or cookies? No. The Actor never logs in and never asks for cookies or tokens. It reads what Facebook shows any logged-out visitor.

Why might I get fewer comments than Facebook displays? Facebook's counter includes comments a logged-out visitor cannot see — hidden or filtered as low quality, from restricted accounts, or deleted after the count was taken. A comment showing "2 replies" may deliver fewer for the same reason. MOST_RELEVANT order also hides comments Facebook considers low quality; use ALL for the most complete set.

Are replies included? Yes, by default — each one as its own row. Set includeReplies: false for top-level comments only.

How does the date filter work with sorting? With sort: "NEWEST" the run stops reading as soon as a whole page of comments is older than your date, which is the cheapest way to collect recent comments. Replies newer than the date that sit under comments older than it are not chased in that mode. With other orders, the whole thread is read and older comments are dropped before saving.

What about private posts and groups? Private posts, friends-only content and private groups are not accessible and are reported as PRIVATE_OR_LOGIN_REQUIRED. Public group posts work only where Facebook shows them to logged-out visitors.

Can I scrape many URLs at once? Yes — add as many as you like; they run in parallel (maxConcurrency).

Does it work through the Apify API, schedules and webhooks? Yes, like any Apify Actor. Call it via the API, run it on a schedule to archive comments, or chain it after Facebook Posts Scraper with a webhook or an integration.

Why does Facebook show the number of comments but the run returns none for one URL? Check that URL's status in the log or RUN_SUMMARY. RATE_LIMITED or BLOCKED means Facebook refused the requests at that moment; re-running later usually succeeds.

🚦 Proxy policy

Use Apify Datacenter proxy (the default) or no proxy for normal runs.

Apify Residential proxy is not supported. The Actor fails at startup if apifyProxyGroups includes RESIDENTIAL. Reason: in pay-per-event Actors, residential bandwidth is billed to the developer rather than to your run, so a single bandwidth-heavy run could cost more than all of its results.

If you genuinely need residential routing, supply your own residential provider in the proxy editor's Custom proxy URLs field — that traffic goes through your provider, not Apify, and is unaffected:

http://user:pass@proxy.iproyal.com:12321
http://user:pass@proxy.brightdata.com:22225
http://user:pass@proxy.oxylabs.io:7777

🔗 Works well with

⚖️ Limitations, privacy and compliance

  • This Actor is unofficial and not affiliated with, endorsed by or sponsored by Meta or Facebook.
  • It only processes information Facebook shows publicly to a logged-out visitor. It does not and cannot access private posts, friends-only content, private groups or messages.
  • Public comments can still contain personal data. You are responsible for having a legal basis (for example under GDPR) to collect, store and process it, and for complying with applicable laws and Facebook's terms.
  • Collect only what you need. The Actor returns the lightweight public author fields Facebook shows next to a comment — never full profiles.
  • Facebook changes its website frequently; results can change with it. The run summary reports each URL's status so changes are visible rather than silent.