π Facebook Page Posts & Comments Scraper
Pricing
$14.99/month + usage
π Facebook Page Posts & Comments Scraper
Extract posts from any public Facebook page, including captions, media links, engagement metrics, and posting dates. Perfect for marketers, analysts, and researchers.
Pricing
$14.99/month + usage
Rating
0.0
(0)
Developer
Scrapio
Maintained by CommunityActor stats
0
Bookmarked
14
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Facebook Scraper β Extract Page Posts, Comments and Replies
Facebook Page Posts & Comments Scraper pulls public posts from any Facebook Page β text, media, hashtags, mentions, and the full reaction breakdown β plus, optionally, every comment and reply on each post, delivered as typed JSON rows in your Apify dataset. Unlike scraping frameworks that hand back raw HTML, this actor returns ready-to-use records: one row per post, one row per comment or reply (linked to its parent via parentId), and a page-level summary row. No Facebook login and no Graph API app review β just a page URL or username and a post cap. This guide covers every input and output field, and how teams actually deploy it for monitoring, research, and AI pipelines.
π§ What Does Facebook Page Posts & Comments Scraper Do?
Facebook Page Posts & Comments Scraper is an Apify Actor that reproduces Facebook's own web client requests β the paginated ProfileCometTimelineFeedRefetchQuery for a Page's timeline, and, when comments are turned on, the CommentsListComponentsPaginationQuery and Depth1CommentsListPaginationQuery GraphQL operations Facebook's frontend uses to load a comment thread. It returns three entity types from a single run: posts, comments, and comment replies. No Facebook account or login is required β the actor requests the same public endpoints a logged-out browser would load.
- π Posts β text, post URL, media type (photo/video/album), hashtags, tagged mentions, full reaction breakdown (like/love/haha/wow/sad/angry/care), reaction total, comment count, share count, and page identity (id/name/url/verified badge)
- π¬ Comments β author identity (id/name/url/profile picture/verified badge), comment text, timestamp, reaction total, reply count, and a direct comment URL β each linked back to its post with
parentId - β©οΈ Replies β replies to a comment, collected as their own rows (
type = reply) and linked to the parent comment viaparentId - π’ Independent budgets β
maxPostsPerProfilecaps posts only;maxCommentsPerPostandmaxRepliesPerCommentare separate counters that never eat into the post budget - π Content filters β keep or drop posts by keyword, and set minimum reaction/comment/share thresholds, before a post counts toward the cap
- π
Date windows β absolute (
YYYY-MM-DD) or relative ("7 days","2 weeks")startDate/endDatebounds on post publish time - π Residential-first networking β Apify residential proxy by default, or your own proxy URLs tried first with automatic residential fallback
β‘ Features & Capabilities
Below is what the actor actually extracts, how it stacks up against the two most-documented competing Facebook scrapers, and where a different tool is the honest choice.
Core features
- Full post record with 30+ fields, including the exact reaction split (
reactions.like,reactions.love,reactions.haha,reactions.wow,reactions.sad,reactions.angry,reactions.care), not just a single like count hashtagsextracted from post text andmentions(tagged people/pages with id, name, url, type) parsed from Facebook's inline text ranges- Media capture across attachment types: single
image,video(id + playable URL),video_files(all resolution variants Facebook exposes),album_preview(multi-photo count + image list), andattached_postfor shared/reshared posts - Comment and reply rows share one schema (
recordType = comment,type = commentorreply), each carryingauthorProfilePicture,reactionsCount,replyCount, andthreadingDepth - Comment rows are pushed live to the default dataset and mirrored to a per-run
comments-<runId>dataset for isolated export - Three dataset views ship out of the box: All rows, Posts only, and Comments & replies only β pick the shape you want directly in the Apify Console without writing a query
How Facebook Page Posts & Comments Scraper compares to other Facebook scrapers
| Feature | Facebook Page Posts & Comments Scraper | lanky_quantifier/facebook-public-scraper | makework36/facebook-comments-scraper |
|---|---|---|---|
| Output format | Typed JSON dataset rows | Typed JSON; exports to JSON/CSV/Excel/XML (as observed on the Apify Store on 2026-07-26) | Typed JSON; exports to JSON/CSV/Excel/XML (as observed on the Apify Store on 2026-07-26) |
| Entity coverage | Posts + comments + replies | Posts + comments; replies not documented (as observed 2026-07-26) | Comments + optional post-summary row; no independent post listing (as observed 2026-07-26) |
| Reply-thread extraction | β
includeReplies / maxRepliesPerComment, linked via parentId | β not documented | β "Full reply-tree extraction is on the roadmap" per its own FAQ (as observed on the Apify Store on 2026-07-26) |
| Independent post/comment budgets | β
maxPostsPerProfile separate from maxCommentsPerPost and maxRepliesPerComment | Single shared maxComments setting (as observed 2026-07-26) | Single maxComments per post (as observed 2026-07-26) |
| Reaction breakdown per post | β
7-way split (like/love/haha/wow/sad/angry/care) | Sample output lists a 6-way reactionsCount object (as observed 2026-07-26) | N/A β comments-only actor |
| Access method | Public GraphQL requests over requests | Playwright browser automation (as observed 2026-07-26) | Browser backend with scroll automation and sort-order switching (as observed 2026-07-26) |
| Facebook login required | No | No (as observed 2026-07-26) | No (as observed 2026-07-26) |
If your use case is feeding structured data to an LLM, the output format row is the decision-maker β HTML parsing inside an agent loop is a reliability failure mode, not a feature. Every field above is a typed JSON primitive by the time it reaches your dataset; nothing needs a DOM parser downstream.
When another tool might suit you better
If you only need Facebook Group posts rather than Page posts, this actor won't reach them β use Scrapio's dedicated group scraper instead (see below). If your workload is comments-only and you don't care about the parent post's full field set, makework36/facebook-comments-scraper's dedicated includePostInfo toggle and its comment-focused field list may be a leaner fit for a comments-only pipeline, even though it doesn't yet extract replies (as observed on the Apify Store on 2026-07-26). And if you need Facebook data at a scale beyond Pages entirely β profiles, marketplace, or ad libraries β none of the actors compared here, including this one, cover that ground.
Facebook Page Posts & Comments Scraper within the Scrapio data stack
This actor covers Page posts, comments, and replies. For Facebook Group content, use Scrapio's Facebook Group Posts & Engagement Scraper. For keyword search across Facebook rather than a fixed page list, use the Facebook Posts Search Scraper With AI Enrichment. For Facebook Reels, use the Facebook Reels Scraper With Engagement Analytics. To convert a page URL or vanity name into a numeric Facebook ID before feeding it to another tool, use the Facebook URL to ID Extractor.
Why do developers and data teams scrape Facebook?
π’ Brand and marketing teams
Feed a list of your own and competitor Page URLs into startUrls, turn on includeComments, and set minReactions to skip low-engagement posts. The dataset gives you reactions_count, comments_count, reshare_count, and hashtags per post β enough to build a weekly content-performance report without touching Facebook's Ads Manager or Business Suite. Comment rows add sentiment-ready text (commentText) tied back to the post via parentId, so you can see which posts actually drove conversation, not just impressions.
π AI training data and RAG indexing
message (post text) and commentText (comment/reply text) are the highest-information text fields for embedding into a RAG index or fine-tuning set β they're the actual human-written content, not metadata. For RAG enrichment, chunk by post with its linked comment thread (parentId reconstructs the thread) so a retrieved passage carries its own conversational context. For training data, hashtags and mentions give you consistent, structured entity annotations across every record with no per-post variation in shape β every row returns the same typed keys whether the post has zero comments or five hundred.
π± Competitive and market intelligence
Run the actor on a schedule against competitor Pages and track reactions_count and reshare_count deltas between runs to spot which content format (photo, video, or link) is actually landing. publishedAt timestamps let you profile posting cadence, and hashtags reveal which campaign tags a competitor is actively pushing this week versus last.
π¬ Research and academic use
The actor returns only what a logged-out visitor to a public Page could see β no private groups, no gated content, no friends-only posts. Comment threads (linked via parentId through threadingDepth) support discourse-analysis and content-moderation research on public brand or public-figure Pages, within the bounds of the platform's own visibility settings.
π₯ Product and SaaS development
Because output is a stable, typed schema rather than scraped HTML, teams build monitoring dashboards, alerting tools, and enrichment APIs directly on top of the dataset β join pageId/pageName across multiple Page runs to build a directory product, or pipe commentsCollected and postsCollected summary rows into an internal health-check dashboard for a monitoring service.
π Input Parameters
All 14 parameters, exactly as defined in .actor/actor.json. Only startUrls is required.
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | One or more Facebook Page links (full URL) or just the page name. | ["https://www.facebook.com/RealMadrid/"] |
maxPostsPerProfile | No | integer | Cap on posts collected per page. Min 1, max 5000, default 20. Counts posts only β comments are additional. | 50 |
includeComments | No | boolean | When true, fetches comments on each post as separate rows (type = comment, isChild = true, parentId = <post id>). Default false. | true |
maxCommentsPerPost | No | integer | Cap on top-level comments per post. Min 0, max 5000, default 20. 0 = unlimited. Used only when includeComments is on. | 100 |
includeReplies | No | boolean | When true, each comment's replies are also collected (type = reply, parentId = <comment id>). Default false. Used only when includeComments is on. | true |
maxRepliesPerComment | No | integer | Cap on replies per comment. Min 0, max 1000, default 5. 0 = unlimited. Used only when includeReplies is on. | 10 |
searchKeywords | No | array | Keep only posts whose text contains at least one of these words/phrases (case-insensitive). Empty = keep all. | ["transfer", "signing"] |
excludeKeywords | No | array | Drop posts whose text contains any of these words/phrases (case-insensitive). | ["giveaway", "ad"] |
minReactions | No | integer | Keep only posts with at least this many total reactions. Min 0, default 0. | 100 |
minComments | No | integer | Keep only posts with at least this many comments. Min 0, default 0. | 10 |
minShares | No | integer | Keep only posts with at least this many shares. Min 0, default 0. | 5 |
startDate | No | string | Only posts on or after this moment β absolute date or relative ("7 days", "2 weeks"). Empty = no lower bound. | "7 days" |
endDate | No | string | Only posts on or before this moment β absolute date or relative ("0 days" = through end of today). Empty = no upper bound. | "2026-07-26" |
proxyConfiguration | No | object | Apify residential proxy by default (useApifyProxy: true); or supply your own proxyUrls, tried first with automatic residential fallback. | {"useApifyProxy": true} |
{"startUrls": ["https://www.facebook.com/RealMadrid/", "NASA"],"maxPostsPerProfile": 50,"includeComments": true,"maxCommentsPerPost": 100,"includeReplies": true,"maxRepliesPerComment": 10,"searchKeywords": [],"excludeKeywords": ["giveaway"],"minReactions": 0,"minComments": 0,"minShares": 0,"startDate": "7 days","endDate": "","proxyConfiguration": { "useApifyProxy": true }}
Supported URL types and input formats
startUrls accepts any of these, validated and normalized by the actor's own URL parser before a request is made:
- Full page URL:
https://www.facebook.com/RealMadrid/ - Bare page name/slug:
RealMadridβ expanded tohttps://www.facebook.com/RealMadrid/ profile.phpURL with a numeric ID:https://www.facebook.com/profile.php?id=100064860875397β the query string is preserved as-is
Any input that isn't a facebook.com URL, or a slug containing .., is rejected for that entry β the actor logs the error, writes an uncharged page_summary row for it with the error message, and continues with the remaining pages rather than failing the whole run.
Two undocumented compatibility aliases exist in the code but are not exposed in the input schema, so build against the documented names above: startUrl (singular) is read as a fallback if startUrls is empty, and max_posts_per_profile (snake_case) is read as a fallback if maxPostsPerProfile is absent. If maxPostsPerProfile is present but can't be parsed as a number at all, the actor silently falls back to 100 posts rather than the schema's documented default of 20 β a detail worth knowing if you're passing a templated or programmatically built value.
π¦ Output Format
Every row is typed JSON pushed live to the default dataset as it's collected β no post-run aggregation step. Export from the Apify Console or API in any of Apify's standard dataset formats (JSON, CSV, Excel, XML, RSS).
Output for posts
{"post_id": "1234567890123456","recordType": "post","isChild": false,"type": "photo","url": "https://www.facebook.com/RealMadrid/posts/pfbid02abc123","postUrl": "https://www.facebook.com/RealMadrid/posts/pfbid02abc123","message": "π₯ Matchday! See you at the BernabΓ©u. #RealMadrid #HalaMadrid","postCreatedAt": "2026-07-20T18:32:00Z","postCreatedAtUnix": 1784572320,"publishedAt": "2026-07-20T18:32:00Z","comments_count": 842,"reactions_count": 15320,"likeCount": 11890,"reshare_count": 310,"reactions": {"angry": 12, "care": 40, "haha": 8, "like": 11890, "love": 3200, "sad": 2, "wow": 168},"hashtags": ["RealMadrid", "HalaMadrid"],"mentions": [{"id": "111222333", "name": "Santiago BernabΓ©u Stadium", "url": "https://www.facebook.com/bernabeu/", "type": "Page"}],"isVerified": true,"pageId": "104958932870424","pageName": "Real Madrid C.F.","pageUrl": "https://www.facebook.com/RealMadrid/","feedbackId": "ZmVlZGJhY2s6MTIzNDU2Nzg5MA==","author": {"id": "104958932870424","name": "Real Madrid C.F.","url": "https://www.facebook.com/RealMadrid/","profile_picture_url": "https://scontent.fbcdn.net/v/t39.30808-1/realmadrid_profile.jpg","is_verified": true},"image": {"uri": "https://scontent.fbcdn.net/v/t39.30808-6/matchday.jpg", "height": 720, "width": 960},"video": {"id": "", "uri": ""},"album_preview": {"count": 1, "images": [{"uri": "https://scontent.fbcdn.net/v/t39.30808-6/matchday.jpg", "height": 720, "width": 960}]},"video_files": {},"video_thumbnail": {"uri": "https://scontent.fbcdn.net/v/t39.30808-6/matchday.jpg", "height": 720, "width": 960},"external_url": null,"attached_event": {"id": "", "name": "", "url": ""},"attached_post": {"post_id": "", "url": "", "message": ""},"attached_post_url": "","scrapedAt": "2026-07-26T09:14:02.331Z","profileUrl": "https://www.facebook.com/RealMadrid/"}
Output for comments and replies
Comments and replies share the same row shape; type and parentId distinguish them. A comment's parentId is the post id; a reply's parentId is the id of the comment it replies to.
{"recordType": "comment","type": "comment","isChild": true,"parentId": "1234567890123456","postId": "1234567890123456","id": "Y29tbWVudDo5ODc2NTQzMjE=","feedbackId": "ZmVlZGJhY2s6OTg3NjU0MzIx","commentUrl": "https://www.facebook.com/RealMadrid/posts/pfbid02abc123?comment_id=987654321","commentText": "Hala Madrid! Can't wait for kickoff π€","createdAt": "2026-07-20T18:41:12Z","publishedAt": "2026-07-20T18:41:12Z","authorId": "500600700","authorName": "Jorge Fernandez","authorUrl": "https://www.facebook.com/jorge.fernandez.9","authorProfilePicture": "https://scontent.fbcdn.net/v/t39.30808-1/jorge_profile.jpg","isVerified": false,"reactionsCount": 24,"likesCount": 24,"replyCount": 3,"threadingDepth": 0,"facebookId": "987654321","scrapedAt": "2026-07-26T09:14:05.118Z"}
The internal _expansionToken field β used only to paginate a comment's own replies mid-run β is stripped from every row before it's pushed; it never reaches your dataset.
Schema stability and export options
Field names are fixed by this actor's own row-building code (story_to_post for posts, comment_node_to_row for comments/replies), not passed through raw from Facebook. When Facebook changes its internal GraphQL response shape, the actor's output keys stay the same as long as the underlying data is still reachable β you build against message, reactions_count, commentText, and so on, not against Facebook's internal field names.
Beyond the default dataset, comment and reply rows are also mirrored β unmodified β to a per-run dataset named comments-<runId>, so you can export just the comment thread for one run without filtering the combined dataset. A page_summary row (recordType = page_summary) is written once per input page with postsCollected, commentsCollected, maxPostsPerProfile, startDate, endDate, and error; this accounting row is not charged β it's pushed with no charged event attached, unlike every post and comment row. Filter it out of downstream processing with item["recordType"] != "page_summary".
π‘ Facebook Page Posts & Comments Scraper Strategy Guide
π― Strategy 1: Real-time enrichment pipeline
Trigger a run whenever a new Page URL enters your system β a lead form, a CRM record, or a sales-intelligence workflow. Call the actor with that single URL in startUrls and a small maxPostsPerProfile (5β10) to keep the run fast. Read back pageName, reactions_count, comments_count, and hashtags from the most recent posts and write them onto the source record as enrichment fields β a marketing or sales team gets a freshness signal on a Page without opening Facebook.
π― Strategy 2: Scheduled monitoring and alerting
Attach an Apify Schedule to run the actor daily or hourly against a fixed list of competitor or brand Pages, with includeComments on. Diff each run's reactions_count and reshare_count per post_id against the previous run's values for the same post, and alert when the delta crosses a threshold you define β a sudden reshare spike is a stronger competitive signal than the raw count alone.
π― Strategy 3: Bulk dataset build
Feed a large startUrls list (research cohort, industry directory, client roster) with maxPostsPerProfile set to your target depth, and let the run push every accepted post and comment row live to one dataset. Export the finished dataset to CSV or load it into a database via the Apify API. The actor has no documented run-level concurrency setting of its own β pages within a single run are processed sequentially β so size your maxPostsPerProfile and page count to the depth you actually need rather than assuming parallel throughput.
Strategy comparison at a glance
| Strategy | Best for | Run pattern | Output format |
|---|---|---|---|
| Real-time enrichment | CRM/lead records needing a freshness check | Triggered, single page, small maxPostsPerProfile | Live dataset row β written back to source record |
| Scheduled monitoring | Competitive and brand tracking over time | Apify Schedule, recurring, includeComments on | Dataset diffed run-over-run on named fields |
| Bulk dataset build | Research cohorts, training/RAG datasets | One run, large startUrls list | Full dataset exported to CSV/database |
π΄ Related Facebook Scrapers & Tools
| Scraper | What it extracts |
|---|---|
| Facebook Group Posts & Engagement Scraper (Scrapio) | Posts and engagement from Facebook Groups |
| Facebook Posts Search Scraper With AI Enrichment (Scrapio) | Keyword-driven Facebook post search with AI enrichment |
| Facebook Reels Scraper With Engagement Analytics (Scrapio) | Facebook Reels and their engagement metrics |
| Facebook URL to ID Extractor (Scrapio) | Converts Facebook page URLs/usernames to numeric Facebook IDs |
| Twitter Profile & Tweets Scraper (Scrapio) | Tweets and profile data from public X/Twitter accounts |
| Reddit Comments and Replies Scraper (Scrapio) | Comment and reply threads from Reddit |
| Instagram Followers Scraper With Lead Enrichment (Scrapio) | Follower lists enriched for lead generation |
| Website Contact & Email Extractor (Scrapio) | Emails and contact details from a company's own website |
How to integrate Facebook Page Posts & Comments Scraper with your stack
Facebook Page Posts & Comments Scraper works with any language or tool that can make an HTTP request through the Apify API β you don't need to write Facebook-specific scraping code yourself.
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("facebook-page-posts-scraper-with-comments").call(run_input={"startUrls": ["https://www.facebook.com/RealMadrid/", "NASA"],"maxPostsPerProfile": 30,"includeComments": True,"maxCommentsPerPost": 50,})rows = []for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("recordType") == "post":rows.append({"page": item["pageName"],"message": item["message"][:80],"reactions": item["reactions_count"],"comments": item["comments_count"],})import csvwith open("facebook_posts.csv", "w", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=["page", "message", "reactions", "comments"])writer.writeheader()writer.writerows(rows)
Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('facebook-page-posts-scraper-with-comments').call({startUrls: ['https://www.facebook.com/RealMadrid/', 'NASA'],maxPostsPerProfile: 30,includeComments: true,});const { items } = await client.dataset(run.defaultDatasetId).listItems();const posts = items.filter((i) => i.recordType === 'post');console.table(posts.map((p) => ({page: p.pageName,reactions: p.reactions_count,comments: p.comments_count,})));
Async and scheduled pipelines
For fire-and-forget large jobs, call the actor via client.actor(...).start() instead of .call() and poll the run status, or read the dataset once the run reaches SUCCEEDED. As with any Apify Actor, you can attach an Apify Schedule to run this on a recurring cadence, or configure a platform-level Apify webhook on run events (for example ACTOR.RUN.SUCCEEDED) to trigger downstream processing β the actor itself doesn't call any webhook or notification API directly; it only pushes dataset rows and log lines during the run.
π― Who Needs Facebook Page Posts & Comments Scraper? (Use Cases & Industries)
π’ Brand and marketing teams
A social media manager tracking a product launch sets startUrls to their own Page and pulls reactions_count, comments_count, and hashtags per post to build a weekly performance report, without exporting anything manually from Meta Business Suite.
π Data and AI teams
A team building a RAG index over public brand conversations ingests message and commentText fields, using parentId to keep each comment thread attached to its source post as one retrievable unit.
π± Competitive intelligence analysts
An analyst tracking three competitor Pages runs the actor on a schedule with includeComments off (posts only, for speed), watching reshare_count and publishedAt to identify which content formats a competitor is currently prioritizing.
π¬ Researchers
An academic studying public discourse on a public-figure or brand Page collects comment threads (commentText, threadingDepth, replyCount) for content analysis, scoped to what that Page's posts already show a logged-out visitor.
π₯ Product and SaaS teams
A team building a social-monitoring product ingests pageId, postsCollected, and commentsCollected across many pages to power a customer-facing dashboard, rather than maintaining their own Facebook scraping code in-house.
Is it legal to scrape Facebook?
Scraping publicly accessible web data is broadly permitted in the United States β the Ninth Circuit's ruling in hiQ Labs, Inc. v. LinkedIn Corp. (9th Cir. 2019) held that accessing data a website makes publicly visible does not violate the Computer Fraud and Abuse Act. That precedent concerns U.S. federal computer-crime law specifically; it does not settle every jurisdiction or every legal theory a platform might raise.
Scraping Facebook may still violate Facebook's own Terms of Service, which is a separate, civil matter between you and Meta β not a criminal one β and is a risk you take on directly, not one this actor can absorb for you. Facebook Page posts are business/publisher content, but when includeComments is enabled, comment rows carry identifiable personal data about the people who wrote them (authorName, authorUrl, authorProfilePicture). If you collect and store that data, you take on data-protection obligations β GDPR in the EU/UK, CCPA in California, and equivalents elsewhere β for that portion of the output specifically.
Facebook Page Posts & Comments Scraper returns only publicly accessible data. What you do with that data is your responsibility β consult legal counsel for commercial applications involving personal data.
β Frequently asked questions
Does Facebook Page Posts & Comments Scraper work without a Facebook account?
Yes. The actor requests the same public GraphQL endpoints a logged-out browser sees; no Facebook account, cookies, or login flow are used anywhere in the code.
How does Facebook Page Posts & Comments Scraper handle Facebook's anti-scraping measures?
It routes every request through Apify residential proxies by default (or your own proxy URLs first, with automatic residential fallback), retries failed requests up to 3 times with a short backoff, and if a page returns zero posts on the first attempt, it retries on a fresh proxy IP up to 3 attempts total before giving up on that page.
Can I run Facebook Page Posts & Comments Scraper at scale without getting blocked?
The actor's real scaling behavior is: maxPostsPerProfile accepts up to 5,000, but the timeline pagination loop stops after 300 GraphQL requests per page regardless of that setting β since each request returns up to 8 posts, a single page's post collection realistically tops out well below 5,000 before the loop exits. There is no documented uptime or success-rate figure for this or any Actor to cite.
How fresh is the data Facebook Page Posts & Comments Scraper returns?
It's a live fetch on every run β the actor makes real-time requests to Facebook for each run, it does not read from a cache. scrapedAt on every row records the exact fetch time.
Which Facebook fields work best for AI training and RAG indexing?
For RAG, message and commentText are the high-information text fields, and parentId lets you reconstruct a full post-plus-comment-thread as one retrievable context unit. For training data, hashtags, mentions, and the reactions breakdown give you consistently structured entity and engagement annotations on every row. All fields return as typed JSON primitives β strings, integers, booleans, or nested objects β with no HTML or locale-formatted strings to normalize.
Is comment-author data covered by data protection law?
Yes, when includeComments is on. Comment rows carry authorName, authorUrl, and authorProfilePicture for real individuals, which is personal data under GDPR/CCPA-style frameworks. The actor returns only what's publicly visible on the Page; the lawful basis for storing and using that data for your specific purpose sits with you as the operator.
Does Facebook Page Posts & Comments Scraper work with Claude, ChatGPT, and other AI agent tools?
Yes, as an HTTP endpoint callable by any agent framework through the Apify API β start a run, poll for completion, and read the dataset. Every response is typed JSON, ready to drop into an LLM context window without a parsing step.
How does Facebook Page Posts & Comments Scraper compare to other Facebook scrapers?
Against lanky_quantifier/facebook-public-scraper (posts + comments via Playwright, as observed on the Apify Store on 2026-07-26): that actor documents export to JSON/CSV/Excel/XML directly in its README, which this actor's README does not claim beyond Apify's standard dataset export options; this actor adds reply-thread extraction and independent post/comment/reply budgets, which its comparison doesn't document. Against makework36/facebook-comments-scraper (comments-only, as observed on the Apify Store on 2026-07-26): that actor preserves Facebook's locale-formatted engagement numbers verbatim (e.g., "3,2 mil") rather than parsing them, which is a deliberate, defensible design choice for non-English-locale research; this actor instead returns pre-parsed integers for post-level counts, and β unlike makework36's own roadmap note β already supports reply extraction.
βΉοΈ Disclaimer
Facebook Page Posts & Comments Scraper extracts only publicly available data from Facebook. This tool is intended for lawful use cases only. Users are responsible for complying with Facebook's Terms of Service and applicable data protection laws in their jurisdiction.