Request a tool
All toolsGuidesMCP serverRequest a toolPlatformsCategories
Facebook Posts Scraper icon

Facebook Posts Scraper

Scrape posts from any public Facebook Page: text, time, permalink, media, reactions, comments and shares. No login, no cookies. $0.60 per 1,000 posts.

26 runs on Apify
Run this in the cloudRun on Apify →

Social Media Scrapers

How it works

  1. 1
    Open it on Apify

    Hit Run on Apify — it opens the tool in the cloud, no install.

  2. 2
    Set the inputs

    Adjust startUrls, resultsLimit, onlyPostsNewerThan (sensible defaults are pre-filled).

  3. 3
    Click Run

    The tool runs on Apify’s cloud and collects the data for you.

  4. 4
    Export the results

    Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.

Inputs

FieldWhat it doesType
startUrlsPublic Facebook Page URLs, one per line. Public Pages only — personal profiles and private groups need a login and are not supported.array
resultsLimitHow many recent posts to return for each Page URL. Charged per post actually returned.integer
onlyPostsNewerThanOptional. Skip posts older than this date. Accepts 2026-01-31, a full ISO timestamp, or a relative value like "3 days", "2 months", "1 year".string
onlyPostsOlderThanOptional. Skip posts newer than this date. Same absolute or relative format as the field above.string

What you get

A structured dataset — each result includes fields like:

pageNametimetextlikescommentssharespostTypemediaCountlinkUrlurlpostId

Export every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.

Related tools in Social Media Scrapers

Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.

Facebook Reels Scraper iconSocial Media Scrapers

Facebook Reels Scraper

Scrape public Facebook Page Reels - up to 200 per Page: views, reactions, comments, shares, captions, hashtags, duration, MP4 and thumbnail links. No login.

Ready to run — no setup

Instagram Post Scraper iconSocial Media Scrapers

Instagram Post Scraper

Scrape Instagram posts and reels by link or shortcode for $0.18 per 1,000, flat at every volume.

Ready to run — no setup

Instagram Post Scraper iconSocial Media Scrapers

Instagram Post Scraper

Scrape Instagram posts and reels with no login: caption, like and comment counts, publish date, every carousel image and video URL, owner and hashtags.

Ready to run — no setup

Instagram Profile Scraper iconSocial Media Scrapers

Instagram Profile Scraper

Bulk Instagram profile scraper. Usernames or profile URLs in, one row out: bio, exact follower, following and post counts, verified flag, category, e-mail.

Ready to run — no setup

Instagram Profile Scraper iconSocial Media Scrapers

Instagram Profile Scraper

Scrape Instagram profiles by username: bio, followers, following, posts count, verified flag, business category, bio links and HD avatar. No login.

Ready to run — no setup

Instagram Reel Scraper iconSocial Media Scrapers

Instagram Reel Scraper

Scrape any public Instagram profile's reels: play counts, likes, comments, captions, duration, MP4 and cover links, audio track. No login or API key.

Ready to run — no setup

See all Social Media Scrapers →

Facebook Posts Scraper

Give it a public Facebook Page URL, get that Page's recent posts back as rows: the post text, when it was posted, the permalink, the photos and videos attached to it, and the reaction, comment and share counts — plus who posted it.

No Facebook account. No cookies to paste. No login, no session token, no captcha to solve, and no proxy of your own. Paste a URL, press start.

This is the cheapest Facebook posts scraper on the market: $0.60 per 1,000 posts. Flat on every plan, one billable event, and date filtering costs nothing extra.

Price

$0.60 per 1,000 posts, plus $0.0000125 per GB of run memory to start a run (a hundredth of a cent on the default 1 GB).

You are charged once per post row that actually comes back. Nothing else bills:

  • the sample row you get from an empty run is free
  • diagnostic rows (page is private, page has no public posts, Facebook refused) are free
  • a run that finds nothing costs only the start fee
  • date filtering is free — no per-post surcharge
PostsCost
20$0.012
100$0.060
1,000$0.60
10,000$6.00

One event, flat on every plan

$0.60 per 1,000 is the rate on the free plan and on every paid plan alike — no volume tiers to climb, no minimum spend, no plan gates. There is exactly one billable result event, so nothing in the row is metered separately: the full reaction breakdown, the media list, the Page identity block and both date filters are all part of the same post row.

What that means in practice:

JobPostsCost
One Page, latest 20 posts20$0.012
10 competitor Pages, daily, 20 posts each200/day$0.12/day, about $3.60/month
100 Pages, 100 posts each, one-off backfill10,000$6.00
Date-filtered window on 50 Pagesonly what matchesfiltered-out posts are never charged

Add the $0.0000125-per-GB start fee once per run and that is the whole bill.

Input

FieldWhat it does
startUrlsPublic Facebook Page URLs. https://www.facebook.com/NASA, facebook.com/pg/cocacola/posts/, profile.php?id=… and bare handles all work.
resultsLimitHow many recent posts per Page. Default 20, maximum 500.
onlyPostsNewerThanOptional. 2026-06-01, a full ISO timestamp, or 3 days / 2 months / 1 year.
onlyPostsOlderThanOptional. Same formats. Combine the two to pull a specific window.
proxyConfigurationOptional. Leave it alone unless you want the run to go through your own proxy servers.
{
  "startUrls": [
    { "url": "https://www.facebook.com/NASA" },
    { "url": "https://www.facebook.com/natgeo" }
  ],
  "resultsLimit": 50,
  "onlyPostsNewerThan": "3 months"
}

Run it with no input at all and you get one clearly labelled sample row, uncharged, so you can see the shape before spending anything.

Output

A real row from a real run on https://www.facebook.com/NASA:

{
  "facebookUrl": "https://www.facebook.com/NASA",
  "pageName": "NASA - National Aeronautics and Space Administration",
  "pageId": "100044561550831",
  "pageUrl": "https://www.facebook.com/NASA",
  "pageIsVerified": true,
  "pageLikes": 28694568,
  "pageProfilePicture": "https://scontent.fagc3-2.fna.fbcdn.net/v/t39.30808-1/243095782_416661036495945_…png",
  "postId": "1602283071267063",
  "url": "https://www.facebook.com/NASA/posts/pfbid0zJ6mq7LDUr5ZxqeqrrPDCWnv87PJXe1qg9YoKpQNyULieuLXMdJjXJ2DEUAcTwfyl",
  "text": "Our photographers were on hand in Maine and Spain to capture the Aug. 12 solar eclipse. Check out a few of their photos here and see the rest on Flickr: https://www.flickr.com/photos/nasahqphoto/",
  "textLength": 195,
  "time": "2026-08-13T18:17:19.000Z",
  "timestamp": 1786645039,
  "likes": 23950,
  "reactionsCount": 23950,
  "topReactions": [
    { "type": "Like",  "count": 16618 },
    { "type": "Love",  "count": 6669 },
    { "type": "Wow",   "count": 328 },
    { "type": "Care",  "count": 303 },
    { "type": "Haha",  "count": 20 },
    { "type": "Sad",   "count": 9 },
    { "type": "Angry", "count": 3 }
  ],
  "comments": 321,
  "shares": 2616,
  "media": [
    {
      "type": "photo",
      "id": "1602282937933743",
      "url": "https://www.facebook.com/photo.php?fbid=1602282937933743&set=a.416661013162614&type=3",
      "thumbnailUrl": "https://scontent-ord5-1.xx.fbcdn.net/v/t39.99422-6/774600070_2460024401176674_…png"
    }
  ],
  "mediaCount": 4,
  "postType": "photo",
  "isReel": false,
  "isSponsored": false,
  "linkUrl": null,
  "linkTitle": null,
  "requestedUrl": "https://www.facebook.com/NASA",
  "scrapedAt": "2026-08-15T01:12:44.108Z"
}

That post is a 4-photo album, so mediaCount is 4 and media holds four entries — only the first is shown above to keep the example readable.

topReactions is the per-emoji breakdown Facebook shows when you hover the reaction bar, so you can separate 6,669 Loves from 3 Angrys instead of only seeing one lump total.

Field coverage

Measured across a real 20-post run on NASA, not estimated:

FieldPresent
postId, url, time, timestamp, likes, comments, shares, topReactions20/20
pageName, pageId, pageUrl, pageIsVerified, pageLikes, pageProfilePicture20/20
text19/20
media15/20

The one row without text is a photo post with no caption, and the five without media are text-only posts. Missing values are null or an empty array — never a guess.

Limits — read this before you build on it

  • Public Pages only. Personal profiles, private groups and anything behind a login are out of

scope. The whole design is logged-out; there is no cookie to paste and no account to create.

  • Comments themselves are not returned, only the comment *count*. Pulling comment threads needs

a separate request per post, which would change the price.

  • View counts are not returned. Facebook does not put a view count on logged-out timeline

units, so there is no honest number to report and none is invented.

  • pageFollowers is often null. Facebook's public page description gives either a like count

or a follower count depending on the Page. Whichever it gives is what you get.

  • linkUrl / linkTitle are only filled for link-share posts. On photo, video and plain text

posts they are null.

  • Some Pages return nothing and it is not a bug. A minority of Pages serve a logged-out visitor

no timeline at all — facebook.com/cocacola is a real, reproducible example: the Page itself resolves (name, id, likes all come back) but Facebook refuses its feed to every logged-out address. Age-restricted, country-restricted and brand-new Pages behave the same way. You get a free diagnostic row explaining it, and you are charged nothing for that page.

  • Depth. 500 posts per Page is the ceiling here. Very deep runs need the run timeout raised

above the 300 s default, because posts arrive 20 at a time.

  • Reaction counts are Facebook's own rounded totals for the moment the post was read. They move.

FAQ

Do I need a Facebook account, cookies or a login? No. Nothing to log in to, nothing to paste, nothing to keep alive.

Do I need to bring my own proxy? No. Exit addresses are included in the per-post price.

Can I scrape a personal profile? No — Pages only. A personal profile's timeline is not public to logged-out visitors.

Can I get the comments on each post? Not here. You get the comment count. Comment text needs a per-post fetch and belongs in a separate Actor with its own price.

How do I only get posts from the last month? Set onlyPostsNewerThan to 1 month. It costs nothing extra, and posts that fall outside the window are fetched and discarded without ever being charged to you.

What does 1,000 posts cost? $0.60, plus the fraction-of-a-cent start fee.

What happens if the Page has no public posts? You get one free diagnostic row explaining why, and you are charged nothing for it.

Can I export to CSV or Excel? Yes. Apify exports the dataset as JSON, CSV, Excel or XML, and the same data is available over the REST API.

Is this affiliated with Facebook or Meta? No. It reads publicly visible Page content. Check Facebook's terms and your own local rules before using the output commercially.

How it works

Facebook's Page HTML and Facebook's GraphQL endpoint are two different gates, and that distinction is the whole reason this can be cheap.

The rendered Page HTML answers from ordinary datacenter addresses, and it carries the numeric Page id, the Page's public identity, and the exact persisted GraphQL query Facebook's own web client uses for the timeline — query id and variables both. So the query is lifted verbatim rather than guessed at, and reading it costs nothing.

POST /api/graphql/ is a different story: it answers Rate limit exceeded from every datacenter address tried, fresh session or not, warmed up or not. That is a network-class refusal, not a real rate limit. Only residential-grade addresses get through, and only while carrying a lsd token and datr cookie minted on that same address.

So the run splits its traffic: Page resolution goes over cheap addresses, and only the feed calls go over metered ones. Then the pagination trick — Facebook's own "load more" refetch returns 3 posts per call no matter what you ask for, but the timeline fragment also accepts beforeTime, and the cheap first-page query honours it. Stepping beforeTime back to just before the oldest post seen returns the next 20. That is roughly six times less bandwidth per post, and it is what makes $0.60 per 1,000 a price this Actor can actually sustain.

No browser is launched at any point.