Facebook Page Posts Scraper avatar

Facebook Page Posts Scraper

Pricing

from $4.99 / 1,000 results

Go to Apify Store
Facebook Page Posts Scraper

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

API Empire

Maintained by Community

Actor stats

2

Bookmarked

182

Total users

85

Monthly active users

9 days ago

Last modified

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 TypeKey FieldsJSON Field Names
Postspost ID, post type, permalink, message text, created timestamppost_id, type, url, message, postCreatedAt, postCreatedAtUnix
Engagement & reactionstotal reactions, per-type reaction breakdown, comment count, share countreactions_count, reactions, comments_count, reshare_count
Media & attachmentsphoto/video URLs, video file variants, thumbnails, albums, linked posts/eventsimage, video, video_files, video_thumbnail, album_preview, external_url, attached_post, attached_event, attached_post_url
Authorpage/actor ID, name, profile URL, profile pictureauthor
Page run summaryposts collected for the page, run parameters, per-page errorrecordType, 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.

FeatureFacebook Graph APIFacebook Page Posts Scraper
SetupRegister a Meta App, request permissionsAdd a page URL and start the run
CredentialsOAuth access token per appNone
Access to pages you don't manageRequires Meta App Review approval for most page-content permissionsWorks on any public page immediately
Engagement & media fieldsAvailable per documented Graph API fields, subject to granted permissionsReactions breakdown, media, and attachments included by default
OutputJSON per Graph API's own schemaTyped, 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)

  1. Open Facebook Page Posts Scraper in Apify Console (or from its Apify Store listing).
  2. Add one or more Facebook page URLs or bare page names to startUrls — this is the only required input.
  3. Set maxPostsPerProfile and, if you only need a specific window, startDate / endDate.
  4. Start the run — no Facebook login, cookies, or API token needed.
  5. 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

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayOne or more Facebook page URLs or bare page names/usernames["https://www.facebook.com/RealMadrid/"]
maxPostsPerProfileNointegerMax posts to collect per page (1–5000). Default 2050
startDateNostringOnly include posts on/after this date — absolute (YYYY-MM-DD) or relative ("7 days", "2 weeks")"2024-01-01"
endDateNostringOnly include posts on/before this date — same formats as startDate"2024-12-31"
proxyConfigurationNoobjectApify 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 ApifyClient
client = 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.

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.