September 23, 2026 · 15 min read
Facebook Comments Scraper: 123 of 129 Runs Succeeded (2026)
The README documents 24 output fields per comment record, capturing author profiles, ISO 8601 timestamps, nested reply IDs, and itemized reaction breakdowns. At $5.00 per 1,000 results on Apify's free plan, this Actor processes public post, photo, and Watch video URLs without requiring user credentials or local browser session cookies. It serves social media analytics teams, market researchers, and brand managers auditing audience reactions on public Facebook content. It is not for teams targeting private groups or Reels, which require authenticated user sessions that this scraper does not provide.
Try it before you read further. Apify's free plan includes $5.00 of usage every month with no credit card, enough for up to 1,000 results at $0.005 each before platform usage. Open Facebook Comments Scraper on Apify and run the prefilled example.
How reliable is Facebook Comments Scraper in production?
Across the last 30 days of public runs on the Apify platform, Facebook Comments Scraper recorded 129 runs with the following outcomes.
| Outcome | Runs | Share |
|---|---|---|
| Succeeded | 123 | 95.3% |
| Failed | 0 | 0.0% |
| Aborted by the user | 6 | 4.7% |
| Timed out | 0 | 0.0% |
| Total | 129 | 100.0% |
In the last 30 days, no run failed or timed out across 129 public runs. The 6 aborted runs were stopped manually by users and do not represent platform or scraping errors. Plan minimal automated retry overhead, but configure basic alerting if target URLs return zero records.
What does it cost to run Facebook Comments Scraper?
Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Starting a run is charged separately at $0.05 per GB of Actor memory. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00367 | $3.67 |
| SILVER | $0.00233 | $2.33 |
| GOLD | $0.001 | $1.00 |
| PLATINUM | $0.001 | $1.00 |
| DIAMOND | $0.001 | $1.00 |
Worked example: collecting 10,000 results costs $50.00 in result charges before run-start fees and platform usage. No run failed or timed out in the last 30 days, so the list price is a fair budget; keep a retry in place all the same.
The primary cost driver is maxItems multiplied by the length of startUrls, as this directly controls how many items write to the dataset. Modifying boolean parameters like includeNestedComments changes the mix of rows collected, but every item written still incurs the result fee. The cheapest way to test your schema mapping is to run the prefilled configuration, which caps maxItems at 5 and costs at most $0.03 in result charges.
How do you run Facebook Comments Scraper from the API?
The schema marks 1 of its 7 controls as required: startUrls. Every value in the payload below comes from the published schema's own prefills, which means you can paste it, swap the token, and get a real result.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~facebook-comments-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.facebook.com/NASA/posts/pfbid025kwyoBjhFGUC22fC4Sies56D5xvd65ZHR5PYjHhc7XSzqGsxuWq2uDVriZNxWbeol"}],"maxItems":5,"commentsMode":"MOST_RELEVANT","includeNestedComments":true,"maxReplyDepth":1,"proxy":{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"startUrls": [
{
"url": "https://www.facebook.com/NASA/posts/pfbid025kwyoBjhFGUC22fC4Sies56D5xvd65ZHR5PYjHhc7XSzqGsxuWq2uDVriZNxWbeol"
}
],
"maxItems": 5,
"commentsMode": "MOST_RELEVANT",
"includeNestedComments": True,
"maxReplyDepth": 1,
"proxy": {
"useApifyProxy": True,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
}
run = client.actor("crawlerbros~facebook-comments-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"startUrls": [
{
"url": "https://www.facebook.com/NASA/posts/pfbid025kwyoBjhFGUC22fC4Sies56D5xvd65ZHR5PYjHhc7XSzqGsxuWq2uDVriZNxWbeol"
}
],
"maxItems": 5,
"commentsMode": "MOST_RELEVANT",
"includeNestedComments": true,
"maxReplyDepth": 1,
"proxy": {
"useApifyProxy": true,
"apifyProxyGroups": [
"RESIDENTIAL"
]
}
}
const run = await client.actor('crawlerbros~facebook-comments-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
That endpoint blocks until the run completes. Fine while you are testing a handful of records, risky once a run takes minutes: a dropped connection loses the response even though the run itself finished. Switch to an asynchronous start with polling or a webhook before you schedule anything.
Which Facebook Comments Scraper inputs matter, and which can you skip?
startUrls is the only required parameter out of 7 controls, accepting an array of public post, Watch, or photo URLs. Control result volume per target with maxItems and filter time windows using onlyCommentsNewerThan. For initial verification runs, leave maxReplyDepth at 1 and keep includeNestedComments set to default rather than toggling deep traversal.
startUrls(array): Facebook post, Reel, Watch, or photo URLs to scrape comments from. Supports /posts/, /reel/, /watch?v=, /photo?fbid=, /groups/.../permalink/, and /share/p/ URLs.maxItems(integer): Maximum number of comment rows to collect per start URL (not global across all URLs). Default:100.onlyCommentsNewerThan(string): Limit results to comments posted after this date. Accepts YYYY-MM-DD, a full ISO 8601 timestamp (e.g. 2024-06-15T12:00:00Z), or a relative value like '1 day', '2 weeks', '3 months', '1 year'. When set, comments are always fetched newest-first so the filter can stop as soon as an older comment is reached. Leave blank to disable date filtering.commentsMode(string): Which comment view to scrape: ALL (Facebook's unfiltered "All comments" view, in Facebook's own ranked ordering), NEWEST (newest first), or MOST_RELEVANT (Facebook's ranked "Most relevant" view). Default:"ALL".includeNestedComments(boolean): If true, also scrape reply rows under top-level comments (with parentComment/parentReply metadata). If false, only top-level comments are collected (faster). Default:true.maxReplyDepth(integer): How many levels of nested replies to follow when 'Include nested comments' is enabled. 1 = only direct replies to top-level comments (Facebook's most reliably available level). Higher values are attempted but may return no additional data if Facebook's reply API doesn't support deeper nesting for a given post. Default:1.proxy(object): Residential proxy recommended for reliable results, especially at higher volume or concurrency. Not required for occasional/low-volume runs against posts or videos. Default:{"useApifyProxy":true,"apifyProxyGroups":["RESIDENTIAL"]}.
Fixed-choice controls: commentsMode accepts ALL, NEWEST, MOST_RELEVANT.
What does Facebook Comments Scraper return?
Output records supply clean text, profile details, reply threading links, and granular reaction breakdowns for public post engagement. They conspicuously omit private user profile contact data, private group discussions, and content behind authentication walls. You can evaluate conversation volume and sentiment, but you will not receive buyer email addresses or telephone numbers.
facebookUrl: string - Canonical URL of the postcommentUrl: string - Direct permalink to the commentcommentId: string - Legacy numeric comment IDid: string - Internal relay IDfeedbackId: string - Feedback ID for the commentdate: string - Comment timestamp (ISO 8601)text: string - Full comment textprofilePicture: string - Author's profile picture URLprofileId: string - Author's numeric profile IDprofileName: string - Author's display nameprofileUrl: string - Author's profile URLlikesCount: integer - Number of reactions on the commentthreadingDepth: integer - 0 = top-level comment, 1+ = reply depthcommentsCount: integer - Number of replies (0 for replies themselves)facebookId: string - Post/story IDinputUrl: string - Original URL provided in inputreplyToCommentId: string - Parent comment legacy ID (empty string for top-level comments)postTitle: string - Post title extracted from page metadata (empty if not available)- gender: string - Author's gender if Facebook exposes it (empty if not available)
- spamDisplayMode: string - Facebook's own spam classification for the comment (e.g. "none")
- isDisabled: boolean - Whether the comment has been hidden/removed by moderation
- isHiddenByViewer: boolean - Whether the comment is hidden specifically from the current viewer
- reactionBreakdown: object - Per-reaction-type counts (like/love/care/haha/wow/sad/angry/other), omitted for comments with zero reactions
- groupCommentInfo: object - Group post metadata (groupId, isAuthorAnonymous, isAuthorNickname, isAuthorWithMemberProfile) - present only on group-post comments
These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.
How do you build the workflow end to end?
Open Facebook Comments Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Populate startUrls with 1 or 2 public post URLs using standard permalink or pfbid formats, avoiding private groups and reel paths.
- Set maxItems to 5 and keep commentsMode on ALL to execute a cheap baseline run.
- Confirm the returned dataset records populate commentId, text, and date without returning empty moderation placeholders.
- Verify whether reply tracking is required; if deeper discussions matter, leave includeNestedComments as true and keep maxReplyDepth at 1.
- If tracking ongoing discussions, configure onlyCommentsNewerThan with an ISO 8601 date or relative string to bound ingestion to new records.
- Ensure proxy is configured with residential IP groups enabled before increasing startUrls to production volume or expanding maxItems toward the 10000 maximum.
How do you apply it? Three worked playbooks
These are Facebook Comments Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Brand monitoring
Outcome: Track what people say about your brand on Facebook posts
Configure: startUrls set to target brand post URLs, commentsMode set to NEWEST, onlyCommentsNewerThan set to '1 day', maxItems set to 200, includeNestedComments set to true, maxReplyDepth set to 1.
Working method: Run on a recurring schedule against the brand post URL list, filtering for new interactions created since the last run cycle. Check that returned items populate author details in profileName and text for immediate sentiment triage.
Deliverable: A daily normalized JSON feed of new customer comments and direct replies mapped by postTitle and date.
Stop condition: The run yields zero items despite known new comments, or text attributes return empty across consecutive updates.
Use case 2: Market research
Outcome: Analyze audience sentiment and topics in post comments
Configure: startUrls set to target industry or topic post URLs, commentsMode set to MOST_RELEVANT, maxItems set to 500, includeNestedComments set to false, proxy set to residential.
Working method: Execute across a curated set of popular topic posts to retrieve top-ranked discussion threads. Aggregate text and reactionBreakdown metrics to identify common consumer praise, complaints, and engagement themes.
Deliverable: A tabular CSV extract containing ranked top-level comments, user text, and complete reaction tallies across key industry topics.
Stop condition: Output datasets lack reactionBreakdown objects across all items or fail to return top-ranked comments.
Use case 3: Content analysis
Outcome: Study engagement patterns across different types of posts
Configure: startUrls set to an array of mixed video, photo, and standard post URLs, commentsMode set to ALL, maxItems set to 300, includeNestedComments set to true, maxReplyDepth set to 1.
Working method: Compare engagement depth by calculating the ratio of top-level items (threadingDepth 0) against nested replies across different media types. Evaluate commentsCount and likesCount against postTitle to determine which content formats spark conversation.
Deliverable: A structured benchmark report comparing average reply counts, depth distributions, and reaction volumes across post formats.
Stop condition: Post metadata fails to return or threadingDepth consistently registers 0 despite known active reply threads on the source post.
What breaks, and how do you design around it?
- Only public posts are supported. Private, friends-only, or restricted posts cannot be accessed
- Reels require Facebook login - Reels (
/reel/URLs) are not accessible without a Facebook session. Use post or video URLs instead - Facebook may occasionally block requests at higher volume - use residential proxies and keep request rate low if you hit blocks
- Comment ordering depends on Facebook's API. The
MOST_RELEVANTmode uses Facebook's own ranking algorithm - Some older posts may have limited data availability
- Nested reply depth is limited to what Facebook's API returns (typically 1-2 levels)
Facebook restricts reply tree access via public views, so expect maxReplyDepth above 1 to yield diminishing returns. Because Reels URLs strictly require authentication, swap any /reel/ links for canonical video or post URLs before launching. When running wide URL batches, always route through residential proxy groups to avoid upstream rate-limiting and temporary IP blocks.
When should you not use Facebook Comments Scraper?
Do not use this Actor if your objective is post-level performance tracking rather than comment sentiment. If you only need top-level publication metrics, caption text, and aggregated engagement totals across profiles, run Facebook Posts Scraper instead to save significant per-result dataset costs. Do not run this Actor if your target URLs consist of Facebook Reels, because Reels enforce an authentication gate that public scrapers cannot bypass; you must collect those manually or via authenticated internal sessions. If you manage a verified Facebook Page, using the official Meta Graph API offers real-time webhooks, private comment visibility, and direct moderation features without proxy requirements or public scraping fees.
What should you check before trusting the output?
- Discard or isolate records where isDisabled or isHiddenByViewer evaluates to true, as the comment body may be redacted or hidden by moderation.
- Check that date matches an ISO 8601 formatted timestamp rather than empty values, which indicates structural layout changes.
- Validate that replies (threadingDepth greater than 0) correctly populate replyToCommentId matching an existing top-level commentId.
- Abort scheduled processing if more than 20% of returned items contain an empty string in the text field.
- Verify reactionBreakdown contains valid sub-keys (like, love, haha) when likesCount is greater than 0.
None of this proves a record is correct. It gives a scheduled Facebook Comments Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What happens if a Facebook post URL is private or restricted?
The Actor only extracts comments from publicly visible Facebook posts, photos, and Watch videos. If a URL points to a private group, a friends-only post, or an account with geographic restrictions, the scraper cannot access the page without authentication. It will finish without writing records for that specific URL.
Can I scrape comments from Facebook Reels with this tool?
No. Facebook Reels require an authenticated user login session to display comments, which this scraper does not support. You must supply standard public post URLs, page video URLs, or Watch links instead of reel endpoints.
How do result fees and platform usage work together on Apify?
Billing includes the run-start fee charged every time an execution starts, plus $5.00 per 1,000 results on the free plan for items added to the dataset. Apify also bills platform compute usage consumed by the run on top of these event charges.
How reliable is this Actor for unattended scheduling?
Telemetry shows 123 of 129 runs succeeded over 30 days, with 0 failed and 0 timed out runs, representing a 95.3% success rate. The remaining 4.7% were user aborts. This track record makes it safe to trigger on automated schedules with minimal retry logic.
What is the difference between ALL, NEWEST, and MOST_RELEVANT modes?
NEWEST fetches comments in reverse chronological order, which works alongside date filters. MOST_RELEVANT returns Facebook's algorithmically ranked view prioritizing popular comments. ALL fetches the full unfiltered collection in Facebook's default ranked order.
Where to go next
When you are ready to run it, open Facebook Comments Scraper on Apify; the free plan covers up to 1,000 results a month.
Start with the Facebook Comments Scraper Actor page for the current input schema, pricing tier, and run history.
It is part of the Facebook Scraping Suite, which puts every related Actor on one page with its price and run history.
If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:
- Comment scrapers covers 37 Actors in this family.
Readers running Facebook Comments Scraper commonly pair it with:
- Facebook Posts Scraper: Scrape public Facebook Page and Profile posts and Reels - text, reactions, comments, shares, photos, videos with captions, and hashtag/link entities.
- Facebook Group Posts Scraper: Scrape public Facebook group posts without login or cookies.
- Facebook Photos Scraper: Extract data from one or multiple Facebook images.
- Facebook Ads Library Scraper: Scrape ads from Facebook Ad Library without cookies or authentication.
- Facebook Pages Scraper: Discover Facebook pages through search engines and extract structured page data including IDs, names, categories, addresses, follower counts, phone numbers, emails, websites, business hours, ratings, and media.
- Facebook Reviews Scraper: Scrape public Facebook business page reviews by URL, business name search, or Page ID.
- Facebook Followers & Following Scraper: Scrape Facebook Page and Profile followers, following, and friends previews plus aggregate follower/following counts, with structured location/workplace/school parsing.
- LinkedIn Comments Scraper: Scrape comments and replies from any LinkedIn post.
Related guides:
- Facebook Events Scraper: Practical Use Cases and Workflows
- Facebook Followers Scraper: Get 8-Row Previews and Total Counts (2026)
- TikTok Comments Scraper: 3 Practical Use Cases
- Instagram Comment Scraper: 396 of 441 Runs Succeeded (2026)
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-23.
Actor last updated by its maintainers on 2026-09-01.
Run outcome figures cover the 30 day public window ending 2026-09-23.
● Featured actors
Facebook Comments Scraper
Scrape public comments from Facebook posts, Watch videos, and photo stories. Extract comment text, author info, reactions, timestamps, and nested replies via GraphQL pagination.
Run on Apify ↗