Facebook Page Posts Scraper
Pricing
from $4.99 / 1,000 results
Facebook Page Posts Scraper
Collect Facebook page posts at scale. Get post text, images, reactions, shares, and comment counts. Great for monitoring brand activity, trends, and audience engagement
Pricing
from $4.99 / 1,000 results
Rating
1.0
(1)
Developer
API Empire
Maintained by CommunityActor stats
2
Bookmarked
182
Total users
85
Monthly active users
9 days ago
Last modified
Categories
Share
Facebook Page Scraper — Extract Posts, Reactions and Media as JSON
Facebook Page Posts Scraper pulls public posts from any Facebook page and returns them as structured JSON — no HTML, no selectors, no manual parsing. Each run collects post text and timestamps, engagement data (reactions by type, comments, shares), media objects (images, videos, albums), and attached content (shared posts, events, external links), plus a per-page summary row. Add a page URL or bare page name, set how many posts you want, and start pulling a page's public post history straight into your dataset, spreadsheet, or LLM pipeline.
What is Facebook Page Posts Scraper?
Facebook Page Posts Scraper is an Apify Actor that reads a Facebook page's public timeline and returns every post as a structured JSON row, along with engagement counts, media, and attachment data for each post. It works on the same publicly visible timeline a logged-out browser sees, so no Facebook account, login, or Graph API access token is required. Give it one or more page URLs or usernames and it streams results live as they're collected.
- Scrape public page posts by full URL or bare page name
- Capture reactions (by type), comments, and share counts per post
- Pull post media — images, videos, video file variants, thumbnails, and multi-image albums
- Collect attachments — external links, shared/attached posts, and attached events
- Filter posts by date range and export as JSON, CSV, or any other Apify dataset format
What data does Facebook Page Posts Scraper collect?
Every run returns individual post records plus a per-page run summary, covering post content, engagement, media, and authorship in one row per post.
| Data Type | Key Fields | JSON Field Names |
|---|---|---|
| Posts | post ID, post type, permalink, message text, created timestamp | post_id, type, url, message, postCreatedAt, postCreatedAtUnix |
| Engagement & reactions | total reactions, per-type reaction breakdown, comment count, share count | reactions_count, reactions, comments_count, reshare_count |
| Media & attachments | photo/video URLs, video file variants, thumbnails, albums, linked posts/events | image, video, video_files, video_thumbnail, album_preview, external_url, attached_post, attached_event, attached_post_url |
| Author | page/actor ID, name, profile URL, profile picture | author |
| Page run summary | posts collected for the page, run parameters, per-page error | recordType, postsCollected, maxPostsPerProfile, startDate, endDate, error |
Need more Facebook data?
If you also need posts from Facebook Groups instead of Pages, Facebook Groups Posts Scraper collects public group posts with the same JSON-first approach. If you're tracking a brand's paid activity rather than its organic posts, Facebook Ads Library Scraper pulls ad creatives, timing, and page context from Meta's public Ad Library. Both sit alongside this Actor under the same account and share its no-login, public-data-only design.
How does Facebook Page Posts Scraper differ from the official Facebook API?
Meta's Graph API is Facebook's own interface for page data, but reading another Page's public post content generally requires a registered Meta App and, for most page-level read permissions, Meta's App Review process before the app can request that data at scale. Facebook Page Posts Scraper reads the same public timeline a logged-out browser sees, so it works on any public page without an App Review submission, OAuth token, or registered Facebook App.
| Feature | Facebook Graph API | Facebook Page Posts Scraper |
|---|---|---|
| Setup | Register a Meta App, request permissions | Add a page URL and start the run |
| Credentials | OAuth access token per app | None |
| Access to pages you don't manage | Requires Meta App Review approval for most page-content permissions | Works on any public page immediately |
| Engagement & media fields | Available per documented Graph API fields, subject to granted permissions | Reactions breakdown, media, and attachments included by default |
| Output | JSON per Graph API's own schema | Typed, normalized JSON dataset row per post |
The Graph API is the right choice when you manage the Page yourself inside Meta Business tools and only need your own Page's data inside an app you control. Facebook Page Posts Scraper fits better when you need public post data from pages you don't manage, without going through App Review.
Why do developers and teams scrape Facebook pages?
Facebook page data is used well beyond social media teams — the same public post fields support monitoring, research, and AI pipelines built around brand and public-page activity.
For marketers and brand teams
Marketers use page scraping to track what competitor or partner brands post and how audiences respond. A typical workflow runs startUrls against a set of competitor pages weekly, capturing message, postCreatedAt, reactions_count, and the reactions breakdown to compare posting cadence and engagement mix over time. Because reactions are broken out by type (love, haha, wow, and so on), teams can distinguish genuine positive engagement from generic reach, without manually opening each competitor's page. The same fields feed weekly reports comparing which formats — photo, video, or link posts — drive the most shares (reshare_count) for a given brand or campaign.
For AI engineers and agent builders
Page posts are a natural source for retrieval-augmented generation and brand-monitoring agents. An engineer can index message text alongside postCreatedAt, author, and reactions_count into a vector store, then let an agent tool query "what has this page said about X and how did people react." Because every field is typed JSON rather than scraped HTML, it can be piped directly into an embedding or agent-tool step without a parsing layer in between. The same structure lets a scheduled run refresh the index automatically, so an agent's answers stay current with a page's latest posts.
For researchers and analysts
Academic and market researchers use public page timelines to study posting patterns, message framing, or engagement trends over time — for example, comparing reaction breakdowns across public health or news pages during a specific period. The scraper only returns what a logged-out visitor could already see on the page, keeping this within the bounds of public-data research rather than private or gated content. Date filters (startDate/endDate) make it straightforward to isolate a single news cycle or campaign window without manually scrolling through months of unrelated posts first.
For developers building data products
Developers building dashboards, media-monitoring tools, or client-facing reports use scheduled Actor runs to keep a rolling dataset of page posts current, then serve reactions_count, comments_count, and reshare_count trends through their own product. Because each run appends fresh dataset rows, the same pipeline can be scheduled on Apify and queried through the Apify API without custom scraping infrastructure. The per-page page_summary row also makes it easy to monitor run health across many pages at once, since postsCollected and error surface failures without inspecting every post row.
How to scrape Facebook (step by step)
- Open Facebook Page Posts Scraper in Apify Console (or from its Apify Store listing).
- Add one or more Facebook page URLs or bare page names to
startUrls— this is the only required input. - Set
maxPostsPerProfileand, if you only need a specific window,startDate/endDate. - Start the run — no Facebook login, cookies, or API token needed.
- Open the Dataset tab and export results as JSON, CSV, Excel, or another supported format, or pull them through the Apify API.
What to do when Facebook changes its structure
Facebook Page Posts Scraper is actively maintained, and its output schema is kept stable so existing integrations keep working even when Facebook changes its internal page markup. No specific fix turnaround is guaranteed, but field names and types on your end don't change as a result of Facebook-side updates.
⬇️ Input
| Parameter | Required | Type | Description | Example Value |
|---|---|---|---|---|
startUrls | Yes | array | One or more Facebook page URLs or bare page names/usernames | ["https://www.facebook.com/RealMadrid/"] |
maxPostsPerProfile | No | integer | Max posts to collect per page (1–5000). Default 20 | 50 |
startDate | No | string | Only include posts on/after this date — absolute (YYYY-MM-DD) or relative ("7 days", "2 weeks") | "2024-01-01" |
endDate | No | string | Only include posts on/before this date — same formats as startDate | "2024-12-31" |
proxyConfiguration | No | object | Apify residential proxy by default; your own proxy URLs are tried first with residential fallback | {"useApifyProxy": true} |
Example input
{"startUrls": ["https://www.facebook.com/RealMadrid/", "NASA"],"maxPostsPerProfile": 50,"startDate": "2024-01-01","endDate": "2024-12-31","proxyConfiguration": { "useApifyProxy": true }}
The most common input mistake is typing startDate or endDate in a format the Actor doesn't recognize — only an absolute YYYY-MM-DD date or a relative expression like "7 days" or "2 weeks" is accepted, and anything else stops the run with a validation error before it scrapes a single page.
⬆️ Output
Results are written as typed, normalized JSON dataset rows — one row per post, streamed live as posts are collected, plus one summary row per page when that page finishes. Export from the Dataset tab as JSON, CSV, Excel, XML, or via the Apify API. Only post rows (recordType: "post") are billed as a row_result event; page summary rows are pushed uncharged, so they don't add to run cost.
Scraped post
{"recordType": "post","post_id": "1234567890123456","type": "photo","url": "https://www.facebook.com/RealMadrid/posts/1234567890123456","message": "¡Hala Madrid! Back to winning ways tonight.","postCreatedAt": "2024-06-01T20:15:00Z","postCreatedAtUnix": 1717272900,"comments_count": 1204,"reactions_count": 48210,"reshare_count": 860,"reactions": { "like": 30120, "love": 15980, "haha": 210, "wow": 900, "sad": 300, "angry": 200, "care": 500 },"author": {"id": "87304173210","name": "Real Madrid C.F.","url": "https://www.facebook.com/RealMadrid/","profile_picture_url": "https://scontent.xx.fbcdn.net/v/author_pic.jpg"},"image": { "uri": "https://scontent.xx.fbcdn.net/v/photo.jpg", "height": 720, "width": 720 },"video": { "id": "", "uri": "" },"album_preview": { "count": 1, "images": [{ "uri": "https://scontent.xx.fbcdn.net/v/photo.jpg", "height": 720, "width": 720 }] },"video_files": {},"video_thumbnail": { "uri": "https://scontent.xx.fbcdn.net/v/photo.jpg", "height": 720, "width": 720 },"external_url": null,"attached_event": { "id": "", "name": "", "url": "" },"attached_post": { "post_id": "", "url": "", "message": "" },"attached_post_url": "","scrapedAt": "2024-06-02T09:15:00Z","profileUrl": "https://www.facebook.com/RealMadrid/"}
Page summary
{"recordType": "page_summary","profileUrl": "https://www.facebook.com/RealMadrid/","postsCollected": 50,"maxPostsPerProfile": 50,"startDate": "2024-01-01","endDate": "2024-12-31","error": null}
How many results can you scrape with Facebook Page Posts Scraper?
maxPostsPerProfile accepts any value from 1 to 5000 per page, applied separately to each page you list in startUrls — there's no combined cap across pages. Posts are fetched in small batches through Facebook's own timeline pagination, and collection for a page stops when that cap is reached, when the page's timeline runs out of further posts to page through, or when an active date filter rules out the remaining posts. Very high maxPostsPerProfile values are not guaranteed to be fully reached — a page's public timeline may simply run out of pageable posts before the requested count is hit, in which case the page summary row's postsCollected reflects what was actually retrieved. There is no separate benchmark for how long a full 5000-post run takes, since that depends on the target page's own post history.
Integrate Facebook Page Posts Scraper and automate your workflow
Facebook Page Posts Scraper works with any language or tool that can send an HTTP request, since it runs as a standard Apify Actor.
REST API integration
from apify_client import ApifyClientclient = ApifyClient("<APIFY_API_TOKEN>")run = client.actor("<owner>/facebook-page-posts-scraper").call(run_input={"startUrls": ["https://www.facebook.com/RealMadrid/"],"maxPostsPerProfile": 50,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():if item.get("recordType") == "post":print(item["post_id"], item["reactions_count"])
Works in Python, Node.js, Go, Ruby, cURL — any client that can call the Apify API with your token.
MCP for AI agents
Apify's MCP server (mcp.apify.com) exposes Apify Actors — including this one — as callable tools for MCP-compatible clients such as Claude Desktop, Cursor, and Windsurf. Add the Actor's name (as shown on its Apify Store page) to the server's actor list to make it callable as an agent tool without writing custom integration code.
Automation platforms (n8n, Make, LangChain)
In n8n, the community Apify node's "Run Actor" operation can call Facebook Page Posts Scraper by Actor ID and pass startUrls/maxPostsPerProfile as JSON, then feed the resulting dataset items into downstream nodes. In Make, the Apify app's "Run an Actor or Task" module runs the same Actor and lets you map each returned post row (message, reactions, media) into another scenario step, such as a spreadsheet row or a Slack message. Any LangChain agent that can call an HTTP tool can invoke the Actor through the Apify API and consume its dataset items directly as typed JSON, without a parsing step.
Is it legal to scrape Facebook?
Scraping publicly accessible Facebook page data is generally lawful, and Facebook Page Posts Scraper only returns posts and page information that are visible to a logged-out visitor — no private profiles, no gated content, and no commenter or reactor identities. The author field reflects the page itself (typically a business or public-figure Page), so most output is business/organizational data governed primarily by Facebook's Terms of Service rather than personal-data law. If a page's public author details are treated as personal data in your jurisdiction, GDPR/CCPA-style rules on lawful basis for storage and use may still apply. Consult legal counsel for commercial use cases involving bulk personal data.
Frequently asked questions
Does Facebook Page Posts Scraper work without a Facebook account?
Yes. No Facebook login, cookies, or Graph API access token are required — the Actor reads the same public timeline a logged-out browser can see.
How often is the scraped data updated?
Each run fetches live data directly from Facebook's timeline at run time; nothing is served from a cache, so results reflect whatever is publicly visible at the moment the run executes.
What happens if a page has no posts, is deleted, or can't be loaded?
The Actor still writes a page_summary row for that page with postsCollected: 0 and an error message describing what went wrong (for example, the timeline couldn't be read), while any other pages in the same run continue normally.
Can I scrape private or restricted Facebook content?
No. Only publicly visible page posts are returned — private profiles, content restricted to logged-in Facebook users, and personal (non-Page) timelines are not accessible through this Actor.
Which dataset rows count toward usage?
Only post rows (recordType: "post") are billed, as a row_result charged event. Page summary rows (recordType: "page_summary") are pushed with no charged event, so they don't add to run cost.
Does Facebook Page Posts Scraper work for AI agent workflows and LLM pipelines?
Yes. It's callable as an HTTP endpoint through the Apify API from any agent framework, and every response is typed JSON with stable field names — no HTML and no parsing step before passing results to an LLM.
How does Facebook Page Posts Scraper handle Facebook's anti-bot defenses?
It routes requests through Apify's residential proxies by default (with automatic fallback if your own proxy URLs are used first), retries failed requests, and reads Facebook's public GraphQL timeline endpoint the same way a real browser session would, rather than scraping rendered HTML pages.
Does Facebook Page Posts Scraper return data in a format LLMs can use directly?
Yes. Output is typed, normalized JSON with stable field names, so it can be passed directly into an LLM context window, indexed into a vector store, or routed through an agent tool without extra parsing.
Can I use Facebook Page Posts Scraper without managing proxies?
Yes. Apify residential proxy is used by default and requires no setup on your part; supplying your own proxy URLs is optional, with automatic residential fallback if a page can't be reached that way.
What happens when Facebook changes its structure or blocks the scraper?
The Actor is actively maintained, and its output schema stays stable — field names and types don't change on your end because of a Facebook-side update. No specific turnaround time is guaranteed for fixes.
Your feedback
Found a bug, or a field that's missing from your results? We want to know. Report it through the Issues tab on this Actor's Apify Store page, or reach out to API-Empire through Apify Console — active reports directly shape what gets fixed and maintained next.