Skip to content
    ↑↓ to choose · Enter to open

    · 14 min read

    Facebook Posts Scraper: 19 Data Fields, Up to 1,000 Free Results/Month

    By CrawlerBros Engineering Team

    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 ID
    • permalinkUrl - direct link to the post
    • postType - photo, video, reel, link, or text
    • text - the post's full message text
    • hashtags - hashtags found in the post text
    • mentions - tagged people/Pages found in the post text
    • externalLinks - external links shared in the post, as the real destination URL (not Facebook's l.facebook.com tracking redirect)
    • creationTime - Unix timestamp of when the post was published
    • author - {id, name, url, profileUrlIsFallback}; profileUrlIsFallback is true when Facebook didn't expose a direct profile URL and this actor constructed one from the author's numeric ID instead
    • attachments - media on the post:
    • reactionsTotal - total reaction count
    • reactionBreakdown - [{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 count
    • isAd - true if Facebook flags the post as sponsored
    • topComments - top-level comments (present when includeTopComments is on): {text, author, createdTime, reactionsTotal, replyCount}
    • allComments - up to 100 top-level comments per post (present when fetchAllComments is on, Page/Profile batches only), same shape as topComments
    • inputUrl - the original URL from your input
    • scrapedAt - 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.

    1. Populate startUrls with a single Page or Profile URL to test extraction before configuring multi-target jobs.
    2. Set maxItems to 5 and leave includeTopComments enabled while keeping fetchAllComments and fetchVideoCaptions false.
    3. Run the Actor and inspect the dataset to ensure postId, creationTime, text, and reactionBreakdown populate properly.
    4. If your analysis requires transcript text, enable fetchVideoCaptions and confirm videoTranscript populates with .srt data for video posts.
    5. If you require more comment depth on Page batches, toggle fetchAllComments to retrieve the allComments array capped at 100 entries.
    6. Apply onlyPostsNewerThan or onlyPostsOlderThan using ISO 8601 strings or relative offsets to limit the historical crawl window on Facebook's servers.
    7. 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:

    Other Actors we maintain for related data:

    Related guides:

    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.

    • Facebook Posts Scraper on Apify

    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 ↗