Facebook Posts Scraper avatar

Facebook Posts Scraper

Pricing

$19.99/month + usage

Go to Apify Store
Facebook Posts Scraper

Facebook Posts Scraper

Scrape publicly available Facebook posts at scale, including text, images, videos, timestamps, reactions, comments, and post URLs. Perfect for research, marketing analysis, sentiment tracking, and dataset creation. Fast, reliable, and ideal for automated Facebook insights.

Pricing

$19.99/month + usage

Rating

5.0

(4)

Developer

Scraper Engine

Scraper Engine

Maintained by Community

Actor stats

2

Bookmarked

160

Total users

4

Monthly active users

5 days ago

Last modified

Share

Facebook Posts Scraper — Post Text, Reactions and Media

The Facebook Posts Scraper pulls posts from any public Facebook Page — post text, publish timestamps, like/comment/share counts, and a full Like/Love/Haha/Care/Sad/Wow/Angry reaction breakdown — and returns everything as clean, structured JSON with no login, cookies, or browser session required. Point it at a Page URL or username, set how many posts you want, and start the run below to get every post ready for your pipeline.

What is Facebook Posts Scraper?

Facebook Posts Scraper is an Apify Actor that collects timeline posts from public Facebook Pages and outputs them as typed JSON records — post content, engagement counts, per-reaction breakdowns, media attachments, and canonical URLs. It does not use a Facebook account, login session, or cookies; it discovers the page ID and the timeline's GraphQL document ID directly from the public page and paginates through posts with cursor-based requests. It's built for marketers tracking page performance, researchers and journalists monitoring public page activity, and developers or AI engineers who need structured Facebook post data for analysis or downstream pipelines.

What Facebook post data is publicly available to scrape?

Anyone visiting a public Facebook Page without logging in can see its posts, reaction counts, and media — that's the data this Actor collects. Full comment threads, commenter identities, and anything inside a group or a private profile sit behind Facebook's login wall.

Data CategoryPublicly AvailableRestricted behind Facebook login
Post text, timestamps, permalinksYes
Like / comment / share countsYes
Top reaction-type breakdownYesFull list of who reacted — login
Photo/video attachments and thumbnailsYes
Page name, profile picture, page IDYes
Full comment threads with commenter namesNoYes — login required
Group-only postsNoYes — group membership + login
Private-profile or restricted-audience postsNoYes — login + audience permission

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

What data can I extract with Facebook Posts Scraper?

Facebook Posts Scraper returns post content and identity fields, engagement metrics, and media/authorship data for every post it collects.

Field NameDescription
facebookUrlNormalized URL of the target Facebook Page for this run.
postIdUnique identifier of the post.
pageNamePage name/username derived from the target URL.
urlDirect URL to the post.
timePost creation time in ISO 8601 format (YYYY-MM-DDTHH:MM:SS.000Z).
timestampPost creation time as a Unix timestamp.
textPost caption/message text.
captionTextVideo/reel transcript text — only populated when includeVideoTranscript is true and a transcript exists.
topLevelUrlCanonical facebook.com/<pageId>/posts/<postId> permalink.
facebookIdNumeric Facebook ID of the page or profile that owns the post.
feedbackIdFacebook's internal feedback-object ID for the post.
inputUrlNormalized target URL used for this run.

Post content & identity

Covered in the table above — the fields that identify the post and the page it belongs to.

Engagement metrics

Field NameDescription
likesTotal reaction/like count on the post.
commentsTotal comment count.
sharesShare count.
topReactionsCountNumber of distinct top reaction types recorded on the post.
reactionLikeCountCount of Like reactions.
reactionLoveCountCount of Love reactions.
reactionHahaCountCount of Haha reactions.
reactionCareCountCount of Care reactions.
reactionSadCountCount of Sad reactions.
reactionWowCountCount of Wow reactions.
reactionAngryCountCount of Angry reactions.

Media & authorship

Field NameDescription
userObject with the owning page/profile's id, name, profileUrl, and profilePic.
collaboratorsArray of collaborating profiles on the post, when the post has co-authors.
mediaArray of photo/video attachments — thumbnails, image dimensions, media URLs, video IDs, and OCR/accessibility captions when present.
pageAdLibraryReference object { "id": "<pageId>" } pointing to the page's Ad Library ID (not the ad content itself).

🤖 Add-on: Need additional Facebook data?

Facebook Posts Scraper covers public Page timelines. For posts made inside Facebook Groups, pair it with Facebook Group Post Scraper. To find groups worth monitoring in the first place, run Facebook Groups Search Scraper. And if you're tracking commerce activity rather than page content, Facebook Marketplace Scraper pulls listings instead of posts.

How does Facebook Posts Scraper differ from the official Facebook API?

Meta's Graph API only returns Page posts through an access token issued by that Page's own admin, after your app passes Facebook's App Review for the relevant permissions — it isn't built for reading posts from Pages you don't manage. Facebook Posts Scraper reads any public Page from just its URL or username.

FeatureFacebook Graph APIFacebook Posts Scraper
Access requirementPage access token from the Page's own admin, via Facebook Login + App ReviewNone — no token, login, or app review
Which Pages you can readOnly Pages you manage or that granted your app accessAny public Facebook Page
Setup before first requestCreate a Meta app, request permissions, pass App ReviewAdd a URL to startUrls and start the run
Reaction-type breakdownNot exposed as a single field on standard post endpointsLike/Love/Haha/Care/Sad/Wow/Angry counts per post
Video transcriptsNot returned by standard Page post fieldsOptional transcript extraction toggle
Output shapeGoverned by the fields and permissions your app was grantedOne consistent JSON schema across every run

Use the Graph API when you manage the Page yourself and want an officially supported, permissioned integration. Use Facebook Posts Scraper when you need structured post data from Pages you don't manage and can't get App Review access to.

How to use Facebook Posts Scraper

Facebook Posts Scraper runs on the Apify platform — no separate signup or API key beyond your Apify account is needed to start a run from the Actor's page.

  1. Open Facebook Posts Scraper on Apify and click Start.
  2. Add one or more targets to startUrls — full Page URLs or bare usernames (required).
  3. Set maxPosts to control how many posts to collect per Page, and optionally set oldestPostDateUnified / newestPostDate to scope a date range.
  4. Turn on includeVideoTranscript if you need video/reel captions.
  5. Start the run and download results as JSON, CSV, or Excel, or pull them via the Apify API once the run finishes.

How to scale to bulk Facebook post extraction

startUrls accepts an array, so a single run can scrape many Pages in one go — each target is processed in sequence, one Page after another, which is also what keeps the request pattern from looking like a burst against any one Page. For very large Page lists, split them across a few runs rather than one giant array so each run finishes inside its per-target timeout.

What can you do with Facebook post data?

  • A social media manager tracking page performance uses likes, comments, shares, and the per-reaction counts to identify which posts are outperforming the rest.
  • A brand monitoring team uses text and reactionAngryCount/reactionSadCount spikes to catch negative sentiment on recent posts early.
  • A researcher or journalist uses time, text, and topLevelUrl to build a timestamped, citable archive of a public page's activity.
  • A content strategist uses media and time across a page's history to study posting cadence and format mix.
  • An AI engineer feeds text and captionText into a RAG pipeline or LLM summarizer, using postId and topLevelUrl as stable source references for citations.

How does Facebook Posts Scraper handle rate limits and blocking?

The Actor fetches pages and GraphQL responses using impit's Chrome-like TLS/HTTP fingerprinting (falling back to plain requests if that fails), and routes traffic through Apify's Residential proxy when available, falling back to Datacenter proxy, then any custom proxy URLs supplied in proxyConfiguration. Targets are scraped one at a time, not in parallel, with a short pause between them, to avoid bursting requests at Facebook.

When a request returns a 403, 429, or 999 status, or comes back empty, the Actor backs off exponentially (capped at 10 seconds, plus jitter) and retries; after 5 consecutive failed attempts on a target it stops that target and moves to the next one rather than retrying indefinitely. A per-target timeout — auto-calculated from maxPosts, or set manually via targetTimeoutSecs — also cuts off a target that's taking too long. If a target fails entirely, it simply contributes zero rows to the dataset rather than partial or fabricated data.

⬇️ Input

Facebook Posts Scraper takes one required parameter and seven optional ones.

ParameterRequiredTypeDescriptionExample Value
startUrlsYesarrayFacebook Page URLs or bare usernames to scrape. Mix full URLs and usernames freely.["iamsrk", "https://www.facebook.com/nytimes/"]
maxPostsNointegerMaximum posts to collect per target Page. Default 10, minimum 1, maximum 1000000.50
includeVideoTranscriptNobooleanExtract closed-caption transcripts from video/reel posts into captionText. Default false.false
timeoutModeNostringauto scales the per-target timeout from maxPosts; manual uses targetTimeoutSecs. Default "auto"."auto"
targetTimeoutSecsNointegerPer-target timeout in seconds, used only when timeoutMode is manual. Default 1200, minimum 60, maximum 72000.1200
oldestPostDateUnifiedNostringOnly include posts newer than this date — absolute (2024-01-01) or relative (7 days, 2 months, 1 year)."30 days"
newestPostDateNostringOnly include posts older than this date — absolute or relative."2024-12-31"
proxyConfigurationNoobjectProxy settings. Apify Residential proxy is preferred automatically, falling back to Datacenter, then any custom proxy URLs given here.{"useApifyProxy": true}

Example input

{
"startUrls": [
"nytimes",
"https://www.facebook.com/Cristiano/"
],
"maxPosts": 50,
"includeVideoTranscript": true,
"timeoutMode": "auto",
"targetTimeoutSecs": 1200,
"oldestPostDateUnified": "30 days",
"newestPostDate": "",
"proxyConfiguration": {
"useApifyProxy": true
}
}

⬆️ Output

Every scraped post is pushed to the Actor's dataset as one typed JSON record, in the same schema on every run. Download results as JSON, CSV, or Excel, or stream them out through the Apify API.

Example output

{
"facebookUrl": "https://www.facebook.com/nytimes/",
"postId": "1024788851694949",
"pageName": "nytimes",
"url": "https://www.facebook.com/5281959998/posts/1024788851694949",
"time": "2026-07-20T14:32:05.000Z",
"timestamp": 1784643125,
"user": {
"id": "5281959998",
"name": "The New York Times",
"profileUrl": "https://www.facebook.com/5281959998",
"profilePic": "https://scontent.xx.fbcdn.net/v/t39.30808-1/nytimes-profile.jpg"
},
"collaborators": [],
"text": "Scientists have discovered a new detail about the migration patterns of monarch butterflies.",
"captionText": null,
"likes": 8421,
"comments": 632,
"shares": 1140,
"topReactionsCount": 4,
"reactionLikeCount": 6100,
"reactionLoveCount": 900,
"reactionHahaCount": 40,
"reactionCareCount": 220,
"reactionSadCount": 950,
"reactionWowCount": 180,
"reactionAngryCount": 31,
"media": [
{
"thumbnail": "https://scontent.xx.fbcdn.net/v/t39.30808-6/monarch-thumb.jpg",
"__typename": "Photo",
"__isMedia": "Photo",
"accent_color": "FFFFFFFF",
"photo_product_tags": [],
"photo_image": {
"uri": "https://scontent.xx.fbcdn.net/v/t39.30808-6/monarch-full.jpg",
"height": 1080,
"width": 1350
},
"url": "https://www.facebook.com/photo/?fbid=1024788851694949",
"id": "1024788800001234"
}
],
"feedbackId": "ZmVlZGJhY2s6MTAyNDc4ODg1MTY5NDk0OQ==",
"topLevelUrl": "https://www.facebook.com/5281959998/posts/1024788851694949",
"facebookId": "5281959998",
"pageAdLibrary": {
"id": "5281959998"
},
"inputUrl": "https://www.facebook.com/nytimes/"
}

How does it work?

Facebook Posts Scraper first normalizes each startUrls entry — a bare username or a full URL — into a canonical Page URL. It fetches that Page's public HTML using impit's Chrome-like TLS/HTTP fingerprinting (with a plain HTTP fallback), and reads the numeric Page ID and the timeline's GraphQL document ID straight out of Facebook's own page bundle — the same identifiers Facebook's own front end uses. It then sends cursor-paginated GraphQL requests to Facebook's timeline feed endpoint, parsing each batch of story data into the post fields documented above.

All requests route through Apify's proxy network (Residential preferred, Datacenter as fallback) rather than a direct connection. No login session or cookies are used at any point, so only what a signed-out visitor to that Page could see is ever returned. Because the output is rebuilt field-by-field from the parsed response rather than scraped from rendered page text, the schema stays the same run to run even as Facebook's front-end layout changes.

Integrations

Facebook Posts Scraper runs on Apify, so it works the same way every other Apify Actor does — call it from your own code, or wire it into no-code automation tools you already use.

Calling Facebook Posts Scraper programmatically

from apify_client import ApifyClient
client = ApifyClient("<APIFY_API_TOKEN>")
run = client.actor("YOUR_USERNAME/facebook-posts-scraper").call(
run_input={
"startUrls": ["nytimes"],
"maxPosts": 50,
}
)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)

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

No-code tools (n8n, Make, LangChain)

In n8n, use the HTTP Request node pointed at the Actor's Apify run endpoint with your API token, then parse the returned dataset items downstream. In Make, use the Apify app's "Run Actor" module (or a generic HTTP module against the same endpoint) to trigger a run and fetch its dataset. In LangChain, load a finished run's dataset with Apify's dataset loader integration to turn scraped posts into documents for a retrieval pipeline.

Scraping publicly available data — content anyone can view without logging in — is generally lawful, though the rules depend on what you do with it afterward. Facebook Posts Scraper only returns posts and metadata visible to a signed-out visitor of a public Page; it does not access private profiles, group-only content, or anything behind Facebook's login wall. Because post output includes personal data — names, profile IDs, and public post text tied to identifiable people — GDPR and CCPA principles around lawful basis, storage limitation, and data subject rights can apply once you collect and store it. Consult legal counsel if your use case involves bulk storage of personal data.

Frequently asked questions

What Facebook post fields does Facebook Posts Scraper return?

It returns post text, timestamps, engagement counts (likes, comments, shares), a full reaction-type breakdown, and media attachments, among the other fields listed in the data fields section above.

Does Facebook Posts Scraper require a Facebook account or login?

No. The Actor discovers each Page's ID and GraphQL query ID directly from the public page and never authenticates as a Facebook user — no cookies, session, or account credentials are used.

How many Facebook posts can I extract in one run?

maxPosts controls how many posts are collected per target Page, up to 1,000,000, and startUrls can hold multiple Pages in the same run — so total output scales with both settings together.

What happens if a Facebook Page is private, deleted, or has no posts?

If the Actor can't resolve a Page's ID and GraphQL document ID from the target URL — because the Page is private, deleted, or the URL is wrong — that target simply returns zero posts and the run logs it before moving to the next target; it does not fail the whole run.

Can I scrape multiple Facebook Pages at once?

Yes. startUrls accepts an array of Page URLs or usernames, and each one is scraped in the same run, one after another.

Does Facebook Posts Scraper work with Claude, ChatGPT, and other AI agent tools?

Yes, as an HTTP endpoint — any agent framework that can call the Apify API can start a run and read back the resulting dataset as JSON.

How does Facebook Posts Scraper compare to other Facebook post scrapers?

It returns a full per-reaction-type breakdown (Like/Love/Haha/Care/Sad/Wow/Angry) and an optional video-transcript extraction toggle alongside the usual post text, engagement counts, and media — both driven directly from Facebook's own timeline GraphQL response rather than parsed page HTML.

Does Facebook Posts Scraper return data in a format LLMs can use directly?

Yes. Output is typed, normalized JSON with consistent field names across runs — no HTML parsing or CSS selectors needed. Pass it directly to an LLM, index it into a vector store, or feed it to an agent tool.

What happens when Facebook changes its layout or GraphQL structure?

The Actor is maintained and its output schema is designed to stay stable across Facebook front-end changes, since fields are rebuilt from the parsed GraphQL response rather than from page text. No specific update turnaround time is guaranteed.

Can I use Facebook Posts Scraper without managing proxies or browser infrastructure?

Yes. The Actor handles proxy selection itself — Apify Residential proxy by default, Datacenter as a fallback — and fetches pages over HTTP with browser-like TLS fingerprinting rather than requiring you to run or configure a headless browser.

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

For RAG, index text and captionText — the high-information text fields — alongside topLevelUrl and postId as stable citation references. For structured training data, likes, comments, shares, and the per-reaction counts return as consistent typed integers across every record.

Scraper NameWhat it extracts
Facebook Group Post ScraperPosts made inside Facebook Groups
Facebook Groups Search ScraperPublic Facebook Groups matching a keyword or link
Facebook Marketplace ScraperMarketplace listings
Facebook Comments Scraper: Reaction BreakdownComments and their reaction breakdown on a post
Facebook Reels ScraperFacebook Reels video content
LinkedIn Post ScraperPosts from LinkedIn profiles and pages

Your feedback

Found a bug or missing a field? Let us know so we can fix it — accurate, complete data is the whole point of this Actor. Reach out through Scraper Engine's Apify Store support channel with your run ID and we'll take a look.