· 14 min read
Facebook Posts Scraper: 19 Data Fields, Up to 1,000 Free Results/Month
Each record carries 19 output fields, returning text, full reaction breakdowns, direct video download URLs, top comments, and parsed entities at $5.00 per 1,000 results on the free plan. The extraction operates across public Pages, Profiles, and single post permalinks without requiring accounts, browser session cookies, or proxy configurations. It is designed for practitioners who need structured post engagement metrics and raw captions from public brand walls. It is not for anyone who needs private group posts or buyer contact details, which the records do not include.
Try it: open Facebook Posts Scraper on Apify, sign in on the free plan and run the prefilled example.
Can you try Facebook Posts Scraper before paying?
Yes. Apify's free plan includes $5.00 of prepaid usage every month and asks for no credit card. At $0.005 per result, that covers up to 1,000 results of Facebook Posts Scraper a month, before run-start charges and platform usage.
The example request further down caps maxItems at 20, so a first run returns at most 20 results and costs at most $0.10 in result charges. That is enough to see the real shape of the data before deciding anything.
Facebook Posts Scraper was last updated on 2026-09-19. It is one of 1,725 Actors CrawlerBros publishes on Apify, which together have 680,173 lifetime public runs and an average rating of 4.63 out of 5 across 416 reviews.
What does it cost to run Facebook Posts Scraper?
Each result costs $0.005 on Apify's free plan, which is $5.00 per 1,000 results. Apify also bills the platform usage each run consumes, at the rates of your Apify plan, on top of these charges.
| Apify plan | Per result | Per 1,000 results |
|---|---|---|
| FREE | $0.005 | $5.00 |
| BRONZE | $0.00367 | $3.67 |
| SILVER | $0.00233 | $2.33 |
| GOLD | $0.001 | $1.00 |
| PLATINUM | $0.001 | $1.00 |
| DIAMOND | $0.001 | $1.00 |
The primary billing driver is startUrls combined with maxItems on Page and Profile targets, as every post emitted into the dataset adds to your result charges. Single-post permalink lookups ignore maxItems and write exactly one record per URL without browser overhead. To validate your schema mapping at minimal expense, run a single post permalink or keep maxItems set to 1.
How do you run Facebook Posts Scraper from the API?
The schema marks 1 of its 7 controls as required: startUrls. Nothing in the payload below is illustrative. Those are the schema's prefilled defaults for Facebook Posts Scraper, so the request works once your token is in place.
Call the synchronous endpoint to start a run and receive dataset items in one request:
curl -X POST "https://api.apify.com/v2/acts/crawlerbros~facebook-posts-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"startUrls":[{"url":"https://www.facebook.com/nike"}],"maxItems":20,"includeTopComments":true,"fetchVideoCaptions":false,"fetchAllComments":false}'
The same run from Python, using the official client:
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"startUrls": [
{
"url": "https://www.facebook.com/nike"
}
],
"maxItems": 20,
"includeTopComments": True,
"fetchVideoCaptions": False,
"fetchAllComments": False
}
run = client.actor("crawlerbros~facebook-posts-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)
And from Node.js:
import { ApifyClient } from 'apify-client'
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' })
const input = {
"startUrls": [
{
"url": "https://www.facebook.com/nike"
}
],
"maxItems": 20,
"includeTopComments": true,
"fetchVideoCaptions": false,
"fetchAllComments": false
}
const run = await client.actor('crawlerbros~facebook-posts-scraper').call(input)
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)
Because the call is synchronous, your client waits for the whole run. Keep it for exploration. For scheduled work, start the run without waiting and collect the dataset afterwards, so network trouble costs you a retry rather than the results.
Which Facebook Posts Scraper inputs matter, and which can you skip?
The schema provides 7 controls, requiring only startUrls. The key settings controlling volume and execution mode are startUrls and maxItems, while date boundary parameters allow server-side window filtering. For standard data collection, leave fetchAllComments and fetchVideoCaptions disabled to prevent additional downstream network requests per post.
startUrls(array): Mix any of: a Page/Profile URL (e.g. https://www.facebook.com/nike) to scrape its recent posts, or a single post/reel permalink (e.g. https://www.facebook.com/nike/posts/123..., https://www.facebook.com/reel/456...) to fetch just that one post. Single-post URLs are cheaper and faster since they don't need a browser.maxItems(integer): How many recent posts to fetch per Page/Profile URL. Ignored for single-post/reel URLs, which always return exactly one result. Default:20.onlyPostsNewerThan(string): Only fetch posts published after this date. Accepts an absolute date ("2026-01-01"), a full ISO 8601 timestamp, or a relative value ("1 day", "2 weeks", "3 months"). Applied as a real server-side filter for Page/Profile batches, not just a post-fetch discard.onlyPostsOlderThan(string): Only fetch posts published before this date. Same accepted formats as "Only posts newer than".includeTopComments(boolean): Attach each post's top-level comments (already included in the same fetch - no extra request). Up to 10 comments for single-post/reel URLs, or Facebook's inline preview count for Page/Profile batches. Default:true.fetchVideoCaptions(boolean): For video/reel posts, download the actual .srt caption file content as a transcript. This is Facebook's own auto-generated captions, not independent AI transcription. Adds one extra request per video post. Default:false.fetchAllComments(boolean): For Page/Profile batches only, fetch up to 100 top-level comments per post (beyond the small free preview in "Include top comments") as an allComments field. Adds one extra request per post - only enable for smaller batches. Default:false.
What does Facebook Posts Scraper return?
Returned items provide structural data for monitoring engagement, including 7 possible reaction categories, direct MP4 media links, and clean outbound links stripped of Facebook redirects. The records conspicuously omit private timeline updates, restricted audience posts, and video view counts, which Facebook does not expose on public post surfaces.
postId- the post's numeric Facebook IDpermalinkUrl- direct link to the postpostType-photo,video,reel,link, ortexttext- the post's full message texthashtags- hashtags found in the post textmentions- tagged people/Pages found in the post textexternalLinks- external links shared in the post, as the real destination URL (not Facebook'sl.facebook.comtracking redirect)creationTime- Unix timestamp of when the post was publishedauthor-{id, name, url, profileUrlIsFallback};profileUrlIsFallbackistruewhen Facebook didn't expose a direct profile URL and this actor constructed one from the author's numeric ID insteadattachments- media on the post:reactionsTotal- total reaction countreactionBreakdown-[{type, count}, ...]covering all reaction types Facebook returns for the post (not capped at a fixed set)commentsCount- total comment count (including replies)sharesCount- total share countisAd-trueif Facebook flags the post as sponsoredtopComments- top-level comments (present whenincludeTopCommentsis on):{text, author, createdTime, reactionsTotal, replyCount}allComments- up to 100 top-level comments per post (present whenfetchAllCommentsis on, Page/Profile batches only), same shape astopCommentsinputUrl- the original URL from your inputscrapedAt- ISO 8601 timestamp of when this record was scraped
These are the documented fields. Optional ones can be empty on a given record, so measure how often each field your deliverable depends on is populated across a real sample before automating the handoff.
How do you build the workflow end to end?
Open Facebook Posts Scraper and work through these in order. Each step ends with something to check, so a bad configuration surfaces on a small run rather than a scheduled one.
- Populate startUrls with a single Page or Profile URL to test extraction before configuring multi-target jobs.
- Set maxItems to 5 and leave includeTopComments enabled while keeping fetchAllComments and fetchVideoCaptions false.
- Run the Actor and inspect the dataset to ensure postId, creationTime, text, and reactionBreakdown populate properly.
- If your analysis requires transcript text, enable fetchVideoCaptions and confirm videoTranscript populates with .srt data for video posts.
- If you require more comment depth on Page batches, toggle fetchAllComments to retrieve the allComments array capped at 100 entries.
- Apply onlyPostsNewerThan or onlyPostsOlderThan using ISO 8601 strings or relative offsets to limit the historical crawl window on Facebook's servers.
- Expand startUrls to your full target list once output structure and record fields match your pipeline needs.
How do you apply it? Three worked playbooks
These are Facebook Posts Scraper's own documented use cases, each worked through as an operating pattern rather than a description.
Use case 1: Social media monitoring
Outcome: Track a brand or competitor Page's recent posts and engagement
Configure: Set startUrls to the brand's Page URL, maxItems to 20, onlyPostsNewerThan to "1 day", and includeTopComments to true.
Working method: Execute a scheduled run once per day against the target Page URL. Filter dataset records against previously seen postId values. Aggregate reactionsTotal, sharesCount, and commentsCount to track daily engagement spikes.
Deliverable: A daily refreshed dataset of recent posts featuring aggregate counts, top-level comments, and reactionBreakdown arrays.
Stop condition: The returned dataset returns zero items across consecutive runs despite new visible posts appearing on the Page timeline.
Use case 2: Content research
Outcome: Pull a Page's or Profile's post history for analysis
Configure: Set startUrls to the target Profile or Page URL, maxItems to 200, onlyPostsNewerThan to "2026-01-01", onlyPostsOlderThan to "2026-06-01", and fetchVideoCaptions to true.
Working method: Begin by running an initial crawl bounded by six-month date windows. Validate that videoTranscript contains .srt caption records for video types, and export post text alongside externalLinks and hashtags to map messaging themes.
Deliverable: A historical multi-month archive containing post copy, parsed link entities, media links, and associated SRT transcripts.
Stop condition: Facebook stops returning records earlier than a specific creationTime boundary before maxItems is fulfilled.
Use case 3: Fact-checking and journalism
Outcome: Fetch a specific viral post by URL with its exact text, reactions, and comments
Configure: Set startUrls to the exact post permalink URL, keep maxItems at default, and set includeTopComments to true.
Working method: Submit a single post permalink to avoid browser emulation and fetch the raw rendered payload directly. Verify the exact message string under text and check author fields to record verifiable provenance data.
Deliverable: A single validated JSON record containing exact post text, creationTime, reactionBreakdown, and topComments.
Stop condition: The run yields an empty dataset due to the target permalink being deleted, set to private, or restricted.
What breaks, and how do you design around it?
Standalone reel permalinks can encounter aggressive platform anti-bot blocks when accessed directly. When standalone reel lookups fail, supply the parent Page or Profile URL in startUrls instead to extract the Reels through timeline traversal. If you need complete comment threads beyond the 100-comment limit of fetchAllComments, direct your post URLs to a dedicated comment extraction pipeline.
When should you not use Facebook Posts Scraper?
Do not use this Actor if your target posts live inside closed or public Facebook groups. In that situation, run Facebook Group Posts Scraper instead, which extracts group-level author metadata, reshares, and post reactions. You should also look elsewhere if you need exhaustive comment trees; this Actor caps top-level comment retrieval at 100 items per post. For comprehensive comment conversations across large threads, rely on Facebook Comments Scraper, which handles nested replies via paginated GraphQL queries. Finally, skip this Actor if you require video view or play counts, as public post surfaces do not provide them.
What should you check before trusting the output?
- Halt downstream ingestion if postId is missing or null across any returned post records.
- Verify that reactionBreakdown is present as a non-empty array when reactionsTotal is greater than zero.
- Check that author contains a populated id and name, noting if profileUrlIsFallback is true.
- Ensure externalLinks entries contain cleaned destination URLs rather than Facebook tracking redirects.
- Alert if attachments includes video entries where durationMs is present but both videoUrlHd and videoUrlSd are omitted.
None of this proves a record is correct. It gives a scheduled Facebook Posts Scraper run defined points where it should stop instead of quietly passing bad data downstream.
Frequently asked questions
What does scraping Facebook posts cost on Apify's free plan?
Billing is $0.005 per result written to the dataset, which equals $5.00 per 1,000 results on the free plan. Apify provides $5.00 of prepaid usage monthly without a credit card, allowing you to extract up to 1,000 post records each month at no cost. Paid Apify plans pay less per result.
Why does a single post permalink run faster than a Page URL?
A post permalink is rendered directly by Facebook as a complete document, allowing the Actor to fetch it via a direct HTTP request without launching a browser. In contrast, Page and Profile timelines only show one post upfront and require browser scrolling to trigger pagination for larger batches.
Why are video view counts missing from the output records?
Facebook does not expose video view or play counts on the public post surface that this Actor reads. The Actor only records verified fields returned by the platform, avoiding estimated or fabricated metrics, so view count properties are completely omitted from the attachments payload.
How are video captions generated in the dataset output?
When fetchVideoCaptions is enabled, the Actor downloads Facebook's own auto-generated .srt caption file directly from the video assets. It attaches this raw caption file under videoTranscript rather than running third-party speech-to-text models or independent artificial intelligence transcription.
Why does reactionBreakdown sometimes contain fewer than 7 reaction types?
Facebook supports 7 distinct reaction types: Like, Love, Care, Haha, Wow, Sad, and Angry. The Actor omits reaction types that have a count of zero rather than returning empty values. You will only see types that users actually clicked on that specific post.
Where to go next
When you are ready to run it, open Facebook Posts Scraper on Apify; the free plan covers up to 1,000 results a month.
Start with the Facebook Posts Scraper Actor page for the current input schema, pricing tier, and run history.
It is part of the Facebook Scraping Suite, which puts every related Actor on one page with its price and run history.
If you are comparing approaches rather than committing to one Actor, these category pages list every option we publish:
- Comment scrapers covers 34 Actors in this family.
Other Actors we maintain for related data:
- Facebook Group Posts Scraper: Scrape public Facebook group posts without login or cookies.
- Facebook Comments Scraper: Scrape public comments from Facebook posts, Watch videos, and photo stories.
- Facebook Ads Library Scraper: Scrape ads from Facebook Ad Library without cookies or authentication.
- Facebook Photos Scraper: Extract data from one or multiple Facebook images.
- Facebook Marketplace Scraper: Extract data from Facebook Marketplace listings.
- Facebook Pages Scraper: Discover Facebook pages through search engines and extract structured page data including IDs, names, categories, addresses, follower counts, phone numbers, emails, websites, business hours, ratings, and media.
- Facebook Reviews Scraper: Scrape public Facebook business page reviews by URL, business name search, or Page ID.
- Facebook Ads Scraper Pro: Extract Facebook ads data from the Ad Library.
Related guides:
- Facebook Comments Scraper: 24 Data Fields per Record (2026)
- Facebook Events Scraper: Practical Use Cases and Workflows
- Facebook Followers Scraper: Get 8-Row Previews and Total Counts (2026)
- Facebook Pages Scraper: Up to 1,000 Free Results a Month (2026)
Resources
Actor documentation, input schema, and pricing: verified against the published Actor on 2026-09-26.
Actor last updated by its maintainers on 2026-09-19.
Run outcome figures cover the 30 day public window ending 2026-09-26.
Featured actors
Facebook Posts Scraper
Scrape public Facebook Page and Profile posts and Reels - text, reactions, comments, shares, photos, videos with captions, and hashtag/link entities. Also fetches a single post or Reel by its URL. No login, cookies, or proxy setup required.
Run on Apify ↗