Facebook Page Posts Scraper With Engagement Analytics avatar

Facebook Page Posts Scraper With Engagement Analytics

Pricing

$19.99/month + usage

Go to Apify Store
Facebook Page Posts Scraper With Engagement Analytics

Facebook Page Posts Scraper With Engagement Analytics

Scrape Facebook page posts with text, images, reactions, comments, and timestamps. Ideal for research, analytics, content tracking, and competitor insights with clean structured output.

Pricing

$19.99/month + usage

Rating

0.0

(0)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

0

Bookmarked

45

Total users

1

Monthly active users

5 days ago

Last modified

Share

Facebook Page Posts Scraper — Reactions, Engagement and Virality

Facebook Page Posts Scraper With Engagement Analytics pulls public posts from any Facebook page and scores every one for engagement: reaction totals, a locale-independent 7-type reaction breakdown, a virality score (engagement per hour of age), and a rank/percentile within your sample. Results return as structured JSON — message, postCreatedAt, engagementTotal, topReaction, viralityScore — ready for a spreadsheet, dashboard, or LLM pipeline. Start a run below to benchmark your own pages.

What is Facebook Page Posts Scraper With Engagement Analytics?

Facebook Page Posts Scraper With Engagement Analytics is an Apify Actor that fetches a Facebook page's public post timeline over HTTP and layers derived engagement metrics on top of it — no browser, no Facebook login, and no session cookies required. It reads the same GraphQL timeline feed Facebook serves to a logged-out visitor, decodes reaction counts by their stable reaction ID rather than the locale-dependent label Facebook displays, and computes virality, rate, rank, and best-posting-hour figures per post. It's built for social media managers, competitive analysts, and developers who need page-post engagement data as clean JSON instead of manual screenshots or counting.

What Facebook page post data is publicly available to scrape?

Facebook page posts are visible to any logged-out visitor, and Facebook Page Posts Scraper With Engagement Analytics only reads what that visitor sees — no login, session cookie, or Page Admin token is used.

Data CategoryPublicly AvailableRestricted (needs Facebook login / Page Admin access)
Post text, timestamp, direct linkYes
Reaction / comment / share totalsYes, as shown on the public feedNative reach & impressions — Facebook Insights, Page Admin only
Reaction-type breakdown (like/love/haha/wow/sad/angry/care)Yes, decoded from the public feedback payloadIndividual reactor identity
Photo/video thumbnails, attached links, attached eventsYesOriginal uploaded media file / video download
Page name, profile URL, profile pictureYesPage roles / admin list
Audience-restricted posts (friends-only, age/geo gated)NoVisible only to a logged-in, permitted viewer

Facebook Page Posts Scraper With Engagement Analytics only returns publicly visible data — what any visitor sees. Nothing behind a login wall.

What data can I extract with Facebook Page Posts Scraper With Engagement Analytics?

Every run returns one row per post — identity/content fields, media/attachment fields, and computed engagement metrics — plus one small, uncharged summary row per page.

Field NameDescription
recordTypeRow type: post for a post row, page_summary for the per-page summary row
post_idFacebook's numeric post ID
typeAttachment type detected for the post: photo or video
urlDirect URL to the post
messageThe post's caption/body text
postCreatedAtPost publish time, ISO 8601 UTC
postCreatedAtUnixPost publish time, Unix seconds
profileUrlThe page URL you supplied, canonicalized
authorObject: id, name, url, profile_picture_url of the posting page/actor
scrapedAtWhen this row was collected, ISO 8601 UTC

Post identity & content fields

  • recordType, post_id, type, url, message
  • postCreatedAt, postCreatedAtUnix, profileUrl
  • author (id, name, url, profile_picture_url)
  • scrapedAt

Media & attachment fields

  • image — primary photo object (uri, height, width), null if the post has no photo
  • video — video object (id, uri), empty strings if no video
  • video_files — object of available video quality URLs (hd/sd/etc.), empty if none
  • video_thumbnail — thumbnail object (uri, height, width)
  • album_preview — multi-photo album preview (count, images[])
  • external_url — outbound link attached to the post, if any
  • attached_event — attached Facebook Event (id, name, url)
  • attached_post / attached_post_url — nested shared/reshared post (post_id, url, message) and its direct URL

Engagement & analytics fields

  • reactions_count, comments_count, reshare_count — raw totals from the public feed
  • reactions — legacy per-type reaction dict (like/love/haha/wow/sad/angry/care) decoded by Facebook's on-screen label; returns all zeros on non-English page locales
  • reactionBreakdown — accurate per-type reaction dict decoded by Facebook's stable reaction ID, so it works regardless of the page's language (dropped when includeReactionBreakdown is off)
  • topReaction — the dominant reaction type by count, from reactionBreakdown (dropped when includeReactionBreakdown is off)
  • engagementTotalreactions_count + comments_count + reshare_count (dropped when includeAnalytics is off)
  • ageHours — post age in hours at scrape time (dropped when includeAnalytics is off)
  • viralityScoreengagementTotal divided by age in hours, floored at 1 hour (dropped when includeAnalytics is off)
  • commentRate / shareRate / reactionRate — each channel's share of engagementTotal, 0–1 (dropped when includeAnalytics is off)
  • rankInResultSet — dense rank (1 = highest engagementTotal) within this page's collected sample for this run (dropped when includeAnalytics is off)
  • engagementPercentile — percentile (0–100) within this page's sample (dropped when includeAnalytics is off)
  • bestPostingHour — UTC hour (0–23) with the highest average engagementTotal in this page's sample, repeated on every row for that page (dropped when includeAnalytics is off)

Each page also ends with one page_summary row (recordType: page_summary) carrying postsCollected, maxPostsPerProfile, startDate, endDate, and error — see Output below. Summary rows are never charged.

🤖 Add-on: Need additional Facebook data?

Need photo-level engagement instead of full posts? facebook-photos-scraper-with-engagement-analytics scores individual photos the same way. Want posts discovered by keyword instead of by page? facebook-posts-search-scraper-top-engagement-posts searches Facebook directly and adds optional sentiment tagging and comment collection. For a broader post export at higher volume with video transcripts but no computed analytics, Facebook-Posts-Scraper covers the same page-post surface.

How does Facebook Page Posts Scraper With Engagement Analytics differ from the official Facebook API?

Meta's Graph API can read a Page's own feed with a Page Admin token, or another public Page's feed only through the "Page Public Content Access" feature, which requires Meta App Review approval (per Meta's Graph API page/feed documentation, checked 2026-07-25). Facebook Page Posts Scraper With Engagement Analytics reads the same publicly visible feed for any page or handle without that approval process.

FeatureFacebook Graph APIFacebook Page Posts Scraper With Engagement Analytics
Access to a page you don't manageOnly via Page Public Content Access, which requires Meta App ReviewAny public page URL or handle, no approval
Per-type reaction breakdownRequires a Page access token you administerComputed for any public page from the visible feedback payload
Rate limitBusiness-Use-Case limit: 4,800 calls/24h × engaged users of that page — near zero for a page you don't manageGoverned by your run's own proxy/session, not a per-app engaged-user quota
Posts per requestUp to 100 per call, paginatedUp to 5,000 posts per page per run (postsToAnalyze)
Derived metrics (virality, rank, percentile, best hour)Not provided — build it from raw counts yourselfComputed automatically every run
SetupCreate a Meta app, request permissions/App Review, manage tokensAdd a page URL and run

Use the Graph API when you manage the page and need first-party Insights data like reach or impressions. Use Facebook Page Posts Scraper With Engagement Analytics when you need engagement analytics for pages you don't manage — including competitors — without app review.

How to use Facebook Page Posts Scraper With Engagement Analytics

Facebook Page Posts Scraper With Engagement Analytics runs on Apify — there's no separate signup or API key beyond an Apify account.

  1. Open the Actor's page on Apify and click Try for free / Start.
  2. Add one or more Facebook page URLs or handles to Pages to benchmark (pagesToAnalyze) — nothing is required by the schema, but at least one page is needed to get results.
  3. Optionally set Sample size (postsToAnalyze) and an analysis window (analyzeFrom / analyzeUntil).
  4. Click Start.
  5. Download results as JSON, CSV, or Excel, or stream them via the Apify API once the run finishes.

How to scale to bulk Facebook page post extraction

pagesToAnalyze accepts an array, so one run can benchmark many pages in a single job — each page is scraped and scored in sequence, with its own rankInResultSet, engagementPercentile, and bestPostingHour computed independently from the others. There's no separate batch/bulk input beyond the array itself; for very large page lists, split them across a few runs so one slow or failing page doesn't hold up the rest.

What can you do with Facebook page post data?

  • A social media manager tracking a competitor's page uses topReaction and reactionBreakdown to see which posts trigger love versus anger, without opening each post manually.
  • A content strategist uses viralityScore and bestPostingHour to identify which post formats and posting times consistently outperform a page's baseline.
  • A brand analyst benchmarking multiple pages runs pagesToAnalyze across a client's page and its competitors, then compares rankInResultSet and engagementPercentile across pages.
  • A growth marketer building a content calendar uses commentRate and shareRate to tell which posts drive conversation versus which mainly get shared.
  • An AI agent building a competitive-intelligence brief pulls message, engagementTotal, and topReaction straight into an LLM prompt or RAG index — no HTML parsing needed to summarize what a page's audience responds to.

How does Facebook Page Posts Scraper With Engagement Analytics handle rate limits and blocking?

Facebook Page Posts Scraper With Engagement Analytics routes requests through Apify residential proxies by default; if you supply your own proxy URLs, the run tries those first and falls back to Apify residential automatically if they fail. Each page is attempted up to three times, and each individual HTTP/GraphQL request also retries up to three times with a short backoff between attempts.

If a page ultimately fails partway through, the Actor keeps whatever posts it already collected — it computes engagement analytics over that partial set and pushes those rows, rather than discarding them — and writes an error message onto that page's page_summary row. Only if zero posts were collected does a page produce no post rows at all. This is a plain HTTP/GraphQL client rather than a browser, so there's no CAPTCHA-solving or rendering step — reliability comes from residential IP rotation, retries, and graceful partial-result handling, not from bypassing Facebook's anti-bot systems outright.

⬇️ Input

ParameterRequiredTypeDescriptionExample Value
pagesToAnalyzeNoarrayFacebook page links or handles to benchmark; each page's recent posts become one analytics sample.["https://www.facebook.com/RealMadrid/"]
postsToAnalyzeNointegerHow many recent posts to score per page (1–5,000); the window rank/percentile/best-hour are computed over. Default 20.20
includeReactionBreakdownNobooleanDecode Facebook's opaque reaction ids into exact per-type totals (like/love/haha/wow/sad/angry/care) plus the dominant topReaction. Default true.true
includeAnalyticsNobooleanAdd computed metrics per post: engagementTotal, viralityScore, commentRate/shareRate/reactionRate, rankInResultSet, engagementPercentile, bestPostingHour. Default true.true
analyzeFromNostringRestrict the sample to posts on/after this date or relative window (e.g. "7 days"). Empty = no lower bound."7 days"
analyzeUntilNostringRestrict the sample to posts on/before this date or relative window (e.g. "0 days" = through today). Empty = no upper bound.""
proxyConfigurationNoobjectApify Proxy (residential) by default; your own proxy URLs are tried first with residential fallback.{"useApifyProxy": true}

Example input

{
"pagesToAnalyze": ["https://www.facebook.com/RealMadrid/", "nike"],
"postsToAnalyze": 30,
"includeReactionBreakdown": true,
"includeAnalytics": true,
"analyzeFrom": "30 days",
"analyzeUntil": "",
"proxyConfiguration": { "useApifyProxy": true }
}

⬆️ Output

Every run writes typed, normalized rows to an Apify dataset with a consistent schema across runs, exportable as JSON, CSV, Excel, or the other formats Apify's dataset export supports.

Example output

[
{
"recordType": "post",
"post_id": "1029384756102938",
"type": "photo",
"url": "https://www.facebook.com/RealMadrid/posts/1029384756102938",
"message": "Matchday! 💪⚽ #HalaMadrid",
"postCreatedAt": "2026-07-20T18:30:00Z",
"postCreatedAtUnix": 1784666200,
"profileUrl": "https://www.facebook.com/RealMadrid/",
"author": {
"id": "61550472837",
"name": "Real Madrid C.F.",
"url": "https://www.facebook.com/RealMadrid/",
"profile_picture_url": "https://scontent.fplu1-1.fna.fbcdn.net/v/example_profile.jpg"
},
"image": { "uri": "https://scontent.fplu1-1.fna.fbcdn.net/v/example_photo.jpg", "height": 1080, "width": 1080 },
"video": { "id": "", "uri": "" },
"video_files": {},
"video_thumbnail": { "uri": "https://scontent.fplu1-1.fna.fbcdn.net/v/example_photo.jpg", "height": 1080, "width": 1080 },
"album_preview": { "count": 1, "images": [{ "uri": "https://scontent.fplu1-1.fna.fbcdn.net/v/example_photo.jpg", "height": 1080, "width": 1080 }] },
"external_url": null,
"attached_event": { "id": "", "name": "", "url": "" },
"attached_post": { "post_id": "", "url": "", "message": "" },
"attached_post_url": "",
"reactions_count": 48213,
"comments_count": 1872,
"reshare_count": 963,
"reactions": { "like": 0, "love": 0, "haha": 0, "wow": 0, "sad": 0, "angry": 0, "care": 0 },
"reactionBreakdown": { "like": 31022, "love": 14290, "haha": 1801, "wow": 640, "sad": 220, "angry": 140, "care": 100 },
"topReaction": "like",
"engagementTotal": 51048,
"ageHours": 12.4,
"viralityScore": 4117.7419,
"commentRate": 0.0367,
"shareRate": 0.0189,
"reactionRate": 0.9445,
"rankInResultSet": 1,
"engagementPercentile": 100.0,
"bestPostingHour": 18,
"scrapedAt": "2026-07-25T06:12:41Z"
},
{
"recordType": "page_summary",
"profileUrl": "https://www.facebook.com/RealMadrid/",
"postsCollected": 30,
"maxPostsPerProfile": 30,
"startDate": "30 days",
"endDate": "",
"error": null
}
]

How does it work?

Facebook Page Posts Scraper With Engagement Analytics loads a page's public timeline the same way a logged-out browser does: it fetches the page HTML, extracts the page's numeric ID and the GraphQL query signature Facebook embeds in its JavaScript bundles, then pages through the timeline via Facebook's own GraphQL endpoint using cursor-based pagination. Requests go through Apify residential proxies by default, so runs look like ordinary browser traffic rather than a single scraping IP. Reaction, comment, and share counts come straight from the same feedback payload Facebook serves any visitor; reaction types are decoded by internal ID rather than on-screen label, so the breakdown works on non-English pages too. Analytics (virality, rank, percentile, best hour) are computed locally, with no extra requests. Only publicly visible data is returned, and the output schema stays stable even if Facebook changes its page layout.

Integrations

Facebook Page Posts Scraper With Engagement Analytics works like any other Apify Actor — call it from code, wire it into a no-code workflow, or hand it to an AI agent.

Calling Facebook Page Posts Scraper With Engagement Analytics programmatically

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("Scraper-Engine/facebook-page-posts-scraper-with-engagement-analytics").call(
run_input={
"pagesToAnalyze": ["https://www.facebook.com/RealMadrid/"],
"postsToAnalyze": 20,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["post_id"], item.get("engagementTotal"))

Works in Go, Ruby, Node.js, cURL — any language that can make an HTTP request.

MCP integration for AI agents

Facebook Page Posts Scraper With Engagement Analytics is callable through Apify's MCP Server — connect an MCP-compatible client (Claude Desktop, Cursor, VS Code with GitHub Copilot) to https://mcp.apify.com with your Apify API token, then let the agent use search-actors, fetch-actor-details, and call-actor on this Actor by name. No actor-specific registration step is required beyond that connection.

No-code tools (n8n, Make, LangChain)

In n8n, use the HTTP Request node (or the Apify node) pointed at this Actor's run-sync-get-dataset-items endpoint to trigger a run and pull results in one step. In Make, use the Apify app's "Run Actor and Get Dataset Items" module the same way. In LangChain, ApifyWrapper / the Apify Actors tool calls this Actor by ID and hands the returned JSON straight to a chain or agent as a document loader.

Scraping publicly available Facebook page posts is generally lawful — data visible to a logged-out visitor isn't shielded by anti-hacking statutes in most jurisdictions. Facebook Page Posts Scraper With Engagement Analytics only collects what a logged-out visitor already sees: post text, timestamps, engagement counts, and media. Because post authorship (the author object) can be linked to an identifiable person or organization, GDPR and CCPA still govern how you store, use, and retain any personal data extracted this way — you'll typically need a lawful basis for processing and a defined retention period. This isn't legal advice; consult legal counsel before bulk-storing personal data or using this data for profiling.

Frequently asked questions

What Facebook page post fields does Facebook Page Posts Scraper With Engagement Analytics return?

It returns message, postCreatedAt, reactions_count/comments_count/reshare_count, engagementTotal, and topReaction for every post, plus media and computed analytics fields — see What data can I extract above for the full list.

Does Facebook Page Posts Scraper With Engagement Analytics require a Facebook account or login?

No. It reads the same public GraphQL timeline feed a logged-out visitor's browser loads — no login, session cookie, or Page Admin token is used anywhere in the Actor.

How many posts can I analyze in one run?

Up to 5,000 posts per page via postsToAnalyze, across as many pages as you add to pagesToAnalyze in a single run.

What happens if a page has fewer posts than requested, can't be reached, or is private?

The Actor collects however many posts it can access — a page with fewer public posts than your sample size simply returns fewer rows. If a page fails partway through (network error, page unreachable), whatever posts were already collected are still scored and pushed, and the page's page_summary row carries a non-null error message describing what happened.

Can I scrape multiple Facebook pages at once?

Yes. pagesToAnalyze accepts an array of URLs or handles; pages are processed one after another within the same run, each with its own independently computed rank, percentile, and best-posting-hour.

Can I filter posts by a specific date range?

Yes. analyzeFrom and analyzeUntil accept an absolute date (e.g. 2026-06-01) or a relative window (e.g. "7 days"), and only posts published inside that window are collected and scored.

Does Facebook Page Posts Scraper With Engagement Analytics work with Claude, ChatGPT, and other AI agent tools?

Yes. It's reachable through Apify's MCP Server for MCP-compatible clients like Claude Desktop, and it's callable as a plain HTTP endpoint by any agent framework that can make a request.

How does the engagement analytics actually work?

engagementTotal sums reactions, comments, and shares; viralityScore divides that total by the post's age in hours (floored at one hour); commentRate/shareRate/reactionRate are each channel's share of the total; and rankInResultSet/engagementPercentile/bestPostingHour are computed by sorting the posts collected for that page in that run — they describe how a post performs relative to the sample you pulled, not a historical or platform-wide benchmark.

Does Facebook Page Posts Scraper With Engagement Analytics return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with consistent field names across runs — pass it directly to an LLM, index it into a vector store, or feed it to an agent tool without writing an HTML parser.

What happens when Facebook changes its layout or anti-bot system?

The Actor is maintained against Facebook's page structure and GraphQL query signatures, and the output schema stays stable across those updates. No specific fix turnaround time is published or guaranteed.

Which fields work best for AI training data and RAG indexing?

For RAG, index message alongside author.name, topReaction, and postCreatedAt for retrievable, human-readable context. For structured training features, engagementTotal, viralityScore, rankInResultSet, and engagementPercentile return as consistent typed numbers across every row.

ScraperWhat it extracts
Facebook-Posts-ScraperBroader Facebook page post export with media and video transcripts — no computed analytics
facebook-posts-search-scraper-top-engagement-postsPublic Facebook posts discovered by keyword search, with optional sentiment tagging and comment collection
facebook-photos-scraper-with-engagement-analyticsIndividual Facebook photos with reaction/comment/share engagement scoring
facebook-comments-scraper-reaction-breakdownFacebook comments with a per-type reaction breakdown
facebook-reels-scraperFacebook Reels (short-form video) metadata and engagement
Facebook-Group-Post-ScraperPosts from public Facebook Groups rather than Pages

Your feedback

Found a bug or a field that doesn't match your run? Let the Scraper Engine team know through the Issues tab on this Actor's Apify Store page, or via Apify's support chat. We actively maintain this Actor as Facebook's page structure and GraphQL queries change.