Request a tool
All toolsAutomationsGuidesMCP serverRequest a toolPlatformsCategories
Facebook Comments Scraper icon

Facebook Comments Scraper

Scrape comments from any public Facebook post or reel: author, text, date, likes and replies. No login needed from you. $0.25 per 1,000 comments.

5 from 2 reviews on Apify 14,055 runs on Apify $0.00025 per comment ($0.25 / 1,000)
Run this in the cloudRun on Apify →

Social Media Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust startUrls, resultsLimit, includeNestedComments (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Pricing

$0.00025 per comment = $0.25 per 1,000

You are charged forWhenPrice
Comment scrapedOne Facebook comment or reply written to the dataset. Sample rows and diagnostic rows are never charged.$0.00025

Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-08-15, and they are what you are actually charged.

Inputs

FieldWhat it doesType
startUrlsPublic Facebook post, video, reel, photo or group-post permalinks. You get one row per comment for each of them.array
resultsLimitStop after this many comments for each post URL. Keep it low while you are testing - you pay per comment.integer
includeNestedCommentsAlso fetch the replies underneath each comment. Every reply is returned as its own row and counts towards the limit.boolean
viewOptionHow Facebook should order the comments before they are read.string
onlyCommentsNewerThanOptional cut-off. Absolute (2026-01-31 or a full ISO timestamp) or relative (3 days, 2 months). Comments older than this are dropped and never charged. There is no add-on fee for using it.string
proxyUrlsLeave this empty for a normal run. Fill it in only if you want the traffic to leave through proxy servers you already pay for, as a list with one entry per server, for example ["http://user:pass@host:port"]. Stored as a secret, so the addresses and passwords stay hidden in the run input.array
sessionCookiesLeave this empty unless you need it. Runs are logged out by default and that is enough for public Facebook content. Facebook shows some things only to a signed-in account, and it limits how fast any one account may read; supplying your own cookie uses your account and your own rate limit, shared with nobody. In Chrome: open facebook.com while signed in, press F12, then Application > Cookies > https://www.facebook.com, and paste the values as "c_user=…; xs=…". One line per account. Treat these like a password: anyone with them can act as that account, and Facebook may sign the session out or restrict the account for automated use.array

What you get

A structured dataset — each result includes fields like:

profileNametextdatelikesCountcommentsCountthreadingDepthcommentUrlfacebookUrl

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

1 ready-to-run use cases

Facebook Post Comments Scraper

Get comments on a public Facebook post: author, text, time and reactions. Replies optional. No login needed.

Related tools in Social Media Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Facebook Groups Scraper iconSocial Media Scrapers

Facebook Groups Scraper

Scrape public Facebook group posts: author, text, time, permalink, photos, videos and engagement counts. No login needed. $0.70 per 1,000 posts.

Ready to run — no setup

Facebook Reels Scraper iconSocial Media Scrapers

Facebook Reels Scraper

Scrape public Facebook Page Reels: views, reactions, comments, shares, captions, hashtags, duration and MP4 links. No login needed. $0.35/1k.

1 use cases

Instagram Post Scraper iconSocial Media Scrapers

Instagram Post Scraper

Scrape Instagram posts and reels by link or shortcode. Rows carry caption, likes, comments, publish time, carousel media, hashtags. No login. $0.18 per 1,000.

1 use cases

Instagram Profile Scraper iconSocial Media Scrapers

Instagram Profile Scraper

Scrape Instagram profiles from handles or URLs. Get the bio, exact follower and post counts, verified flag, category and bio links. $0.70 per 1,000.

1 use cases

Instagram Reel Scraper iconSocial Media Scrapers

Instagram Reel Scraper

Scrape reels from any public Instagram profile. Play counts, likes, comments, captions, duration, MP4 and cover links, audio. $0.35 per 1,000 reels.

Ready to run — no setup

LinkedIn Post Search Scraper iconSocial Media Scrapers

LinkedIn Post Search Scraper

Scrape public LinkedIn posts by keyword: author, text, exact date, reactions, comments and post URL. No login or cookies. $0.90 per 1,000 posts.

1 use cases

See all Social Media Scrapers →

Facebook Comments Scraper: every comment under a public post, video or reel

Paste post links, get the comments underneath them. One row per comment, with the author, the text, the exact time it was written, the like count and how many replies it drew.

The part worth knowing before you start: this reads posts, not Pages. A bare Page link like facebook.com/natgeo comes back rejected, because a Page is not a post and has no single comment thread. Reaction counts above roughly a thousand arrive rounded, because the rounded figure is the only one Facebook publishes.

InputPost, video, reel, photo or group-post links, up to 100 per run
OutputOne row per comment, plus one per reply if you ask for them
Ceiling5,000 comments per post link
Account neededNone from you
Price$0.25 per 1,000 comments, flat on every plan

🔍 What Facebook Comments Scraper does

It opens the post the way a signed-out visitor sees it, then walks the comment thread to the end or to your limit, whichever comes first. Facebook hands comments out ten at a time and quietly ignores any request for a bigger page, so a hundred comments is ten round trips. That is the pace of the source, not a setting you can turn up.

Links in the permalink.php?story_fbid=...&id=... and story.php shapes are rewritten to the equivalent /posts/ link before the run starts. Facebook serves a signed-out reader the login screen for those two shapes and the real post for the other, so the rewrite is what makes them work. Paste whichever form you have.

Two URL fields come back on every row for that reason. inputUrl is your link exactly as you pasted it, so you can join the results back onto your own list. facebookUrl is the canonical link Facebook itself uses for that post, which is often a different pfbid string.

📥 What you give it

{
  "startUrls": [
    { "url": "https://www.facebook.com/natgeo/posts/pfbid02rAK2eMyfVYDZbESKoNVuwWjcFr5BgRBfjp27nhgQToSiQD9NF3ypNdXpQuwSp7qnl" }
  ],
  "resultsLimit": 50,
  "includeNestedComments": false
}
FieldDefaultWhat it is
startUrlsnonePublic post, video, reel, photo or group-post links. First 100 per run, duplicates dropped.
resultsLimit50Comments per post link, 1 to 5,000. Multiply by your number of links to get the ceiling on the run and on the spend.
includeNestedCommentsoffAlso pull the replies under each comment. Each reply is its own row and counts towards the limit.
viewOptionAll commentsHow Facebook orders the thread before it is read: all comments, most relevant, or newest first.
onlyCommentsNewerThannoneCut-off date. 2026-01-31, a full ISO timestamp, or relative like 3 days or 2 months. Older comments are dropped before they are billed. Anything it cannot read as a date turns the filter off.
proxyUrlsnoneOptional. A list such as ["http://user:pass@host:port"], one entry per server, if you want the traffic to leave through servers you already pay for. Stored as a secret.
sessionCookiesnoneOptional, and most runs never touch it. Your own c_user and xs pair, so heavy runs use your account's own rate limit. Treat the values like a password.

Run it with empty input and you get one labelled sample row, free, so you can look at the shape before you spend anything.

📤 What you get back

A real row from a real run. The post text and the comment text are both cut short here, and the links are trimmed:

{
  "ok": true,
  "charged": true,
  "recordType": "comment",
  "inputUrl": "https://www.facebook.com/natgeo/posts/pfbid02rAK2eMyfVYDZbESKoNV...",
  "facebookUrl": "https://www.facebook.com/natgeo/posts/pfbid0nMcunWuEpusFmY7mj...",
  "postId": "1634927484671342",
  "postTitle": "National Geographic",
  "postDescription": "A punishing heat wave has left much of Europe in drought, causing rivers to run at record-low levels. ...",
  "pageName": "National Geographic",
  "commentUrl": "https://www.facebook.com/natgeo/posts/pfbid0nMcunWu...?comment_id=27860828630277533",
  "commentId": "27860828630277533",
  "date": "2026-08-15T06:07:03.000Z",
  "timestamp": 1786774023,
  "text": "Perfect opportunity to clean our waters!!! Bring this history to the musuem for our kids. ...",
  "likesCount": 107,
  "likesCountText": "107",
  "commentsCount": 6,
  "threadingDepth": 0,
  "replyToCommentId": null,
  "profileName": "Maggie Dalkowska",
  "profileUrl": "https://www.facebook.com/maggie.dalkowska",
  "attachments": [],
  "scrapedAt": "2026-09-21T01:45:48.038Z"
}
FieldWhat it is
commentId, id, feedbackIdThe numeric comment id, Facebook's base64 node id, and its feedback id. Use commentId as your key.
likesCount, likesCountTextFacebook publishes reactions as a display string ("28", "1.2K"). likesCountText keeps it, likesCount is that string as a number, so 1.2K reads as 1200.
commentsCountReplies under this comment, not the post's total.
threadingDepth, replyToCommentId0 for a top-level comment, 1 for a reply, with the parent's id on the reply.
profileName, profileId, profileUrl, profilePicture, authorWho wrote it. profileId is a number on some accounts and an opaque pfbid string on others, and the pfbid form rotates over time.
postTitle, postDescription, pageName, postIdThe post the comment sits under, repeated on every row so one row stands on its own.
attachments{type, url} for photo, video and sticker comments. Empty on ordinary text ones.
date, timestamp, scrapedAtWhen it was written, as ISO and as epoch seconds, and when this row was read.

profileUrl is null for commenters whose profile Facebook renders without a public link.

🧾 Reading the output

Three kinds of row can land in your dataset.

RowHow to spot itBilled
A comment or a replyok: true and charged: trueyes
The sample row_sample: trueno
A diagnosticok: false, _diagnostic: true and a codeno

Filter on ok == true and you have your data. The charged flag is what separates real rows from the sample and the diagnostics, not a receipt.

codeWhat happened
BAD_INPUTThat link is not a post link. The row says which part failed.
NOT_FOUNDThe post is private, deleted, or has no comment thread to read.
NO_COMMENTSThe post is readable but has no comments, or none newer than your cut-off.
BLOCKEDFacebook would not serve that post on this run. Re-running usually clears it.
RATE_LIMITEDFacebook asked for a slower pace on that post.
TARGET_ERRORFacebook answered with something the run could not read.
NETWORKA request did not finish.
DEAD_BATCHFifteen links in a row came back empty before anything had been delivered, so the run stopped instead of working through a list of dead links. The rest were not read and not charged.
PROXY_INPUT_ADJUSTEDA proxyConfiguration setting this Actor does not use was dropped. The run carried on.
CHARGE_ERRORA billing event could not be recorded. Told to you rather than hidden.

▶️ How to run it

1. Open Facebook Comments Scraper and click Try for free. 2. Paste your links into Facebook post URLs, one per line. 3. Set Max comments per post. Start at 50 while you look at the shape of the output. 4. Click Start. 5. Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.

💰 How much does it cost?

$0.25 per 1,000 comments. The same rate on every Apify plan, no volume tiers.

A reply costs the same as a top-level comment. You pay for comments that come back with data, so the sample row, every diagnostic row, comments dropped by your date filter and duplicates inside a run are not charged. Nor is a post that turns out to have no comments.

💡 What people use it for

  • Reading what people actually said under a campaign post, instead of the reaction total.
  • Watching a competitor's announcement thread for complaints and feature requests.
  • Pulling the commenters on a giveaway post to check who entered.
  • Tracking a thread over days by re-running the same link and keying on commentId.

🚧 What it does not do

  • Posts, not Pages. There is no Page-wide crawl here. Give it the links to the posts you care

about, or use the Posts scraper below to find them first.

  • Public content only. A private group, a friends-only post or a Page restricted by age or

country comes back as an uncharged diagnostic row saying so.

  • No reactions breakdown. You get the total, not how many were love, haha or angry. The public

page does not carry it.

  • No commenter email or phone. Not published, not inferable, not returned.
  • One level of replies. Facebook collapses replies-to-replies into that same level, so that is

as deep as the public thread goes.

  • Reply counts can exceed the rows you get. A comment may say six replies and return four when

some were written by accounts that have since gone.

  • Counts above about a thousand are rounded, because Facebook rounds the display string the

number is read from.

  • 5,000 comments per link. Past that Facebook starts repeating pages rather than continuing, and

repeats are dropped rather than charged.

🧭 Which Facebook scraper do you need?

If you wantUse
The comments under posts you already have links forThis one
Recent posts from a Page, with their linksFacebook Posts Scraper
Posts from a public groupFacebook Groups Scraper
Reels from a PageFacebook Reels Scraper
The reviews and recommendations on a PageFacebook Reviews Scraper

❓ Questions people ask

Do I need a Facebook account? No. Public posts read fine without one. sessionCookies exists only for people running heavily who would rather use their own account's rate limit.

Is the limit per post or per run? Per post link. Ten links at 500 each is up to 5,000 rows, so keep an eye on it when you paste a long list.

Why did I get fewer comments than the post shows? Either your cut-off date dropped them, or Facebook served fewer than the counter claims, which happens when commenters delete or deactivate.

Can I get replies to replies? No, and neither can anyone else from the public thread. Facebook folds them into the one reply level that includeNestedComments returns.

Is scraping Facebook legal? This reads public posts only, never private content or messages. Comments are personal data, which GDPR and similar laws cover, so have a reason for collecting them. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.

Can I run it on a schedule? Yes, on Apify's scheduler, or start it from the API and read the dataset when it finishes.

🆘 If something breaks

Open the Issues tab on the actor page. Paste the link you used and the run ID, and the log is enough for us to see what happened.