Facebook Page Posts Scraper avatar

Facebook Page Posts Scraper

Pricing

Pay per event

Go to Apify Store
Facebook Page Posts Scraper

Facebook Page Posts Scraper

Read the posts on any public Facebook page: text, posting date, exact and displayed reaction and share counts, attachment type and whether the post is sponsored. Paste page handles or links. No login.

Pricing

Pay per event

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Share

Read the posts on any public Facebook page as structured data: the text, when it was posted, how many reactions and shares it got, what kind of attachment it carries, and whether it was a paid placement.

Paste page handles or links. No login, no API key, no browser.

What you get per post

  • text — the post as written
  • posted_at — a UTC timestamp
  • reaction_count and reaction_count_display
  • share_count and share_count_display
  • media_type — Photo, Video, or whatever Facebook calls the attachment
  • link — where the post points, when it points somewhere
  • is_sponsored — true for paid placements
  • page, page_name, page_id, url, post_id

Two numbers for every count, on purpose

Facebook publishes each count twice: 4715 and "4.7K". They are not alternatives and neither is derived from the other.

The rounded one is what a visitor sees on the page, so it is the honest answer to "what does this post say it got". The exact one is the only one you can add up, average, or sort reliably: parse "4.7K" into 4700 and you have silently replaced a real figure with a guess, and lost the real one.

So both are returned, named for what they are. reaction_count for arithmetic, reaction_count_display for quoting.

There is no comment column, and that is deliberate

Reactions and shares are in the page's data. Comment counts are not — they are rendered separately and never appear as a number.

Rather than ship a comment_count column full of zeroes, there is no such column. A post with 190 comments reported as 0 is worse than one that never claims to know, because a zero survives into a spreadsheet, gets averaged, and nobody questions it. The run summary states the absence once, with commentCountsAvailable: false.

A page handle (nasa), a page link (https://www.facebook.com/nasa), or a numeric profile link all work.

Groups, events, Watch and Marketplace links are refused by name. They are different surfaces with different payloads, and attempting them would spend a page budget to produce an unhelpful error. A rejected line is reported with the line in it, so a run of fifty tells you exactly which one was wrong.

How much you get

A page returns roughly 20 posts in one request, newest first. Maximum posts is a ceiling across all the pages in the run, so three pages at 45 posts gives you the newest 20, 20 and 5 rather than a third of each.

postsPerPage in the summary breaks it down, which is the quick way to spot a page that returned less than it should have.

Three pages and 45 posts took twelve seconds in testing, and every page tested came back on the first attempt.

About the country you search from

Facebook localises what a page shows. The Search from country input pins where the request appears to come from and is recorded with every run, so two runs a week apart are comparable rather than accidentally different.

What people use this for

Competitor monitoring. Run a set of pages on a schedule and keep the rows. Because posted_at and both counts are on every row, posting frequency and engagement per post fall straight out of the table.

Engagement benchmarking. Reactions against shares, by attachment type, across many pages, is the comparison that tells you what actually travels on Facebook rather than what gets a passive like.

Brand and PR tracking. New posts mentioning a topic, with the page they came from and how far they spread.

Content research. media_type next to the counts answers whether photos or videos work better for a given page, on that page's own audience rather than in the abstract.

Ad detection. is_sponsored separates what a page paid to show from what it posted, which changes how you read every other number on the row.

What this does not do

No groups, no comments, no profiles. This reads pages. Facebook groups are a different surface with a different payload; personal profiles are not public in the way pages are; and comments are not published as text or as a count here. Each of those is a separate problem rather than a switch on this one.

No search. There is no keyword search over Facebook posts without an account. You name the pages you care about, and that is the honest shape of what is reachable.

Reactions are not broken down by type. Facebook publishes the total and, in this payload, not the split between like, love, angry and the rest. The total is what you get.

Notes

Only public pages can be read. A page that is restricted, age-gated or removed is reported by name rather than returned as an empty result you would have to interpret.

Counts move constantly on popular posts, so a run is a snapshot. That is why the posting date is on every row.

Posts come from the page's own feed, so this returns what the page published, not what it was tagged in and not its comments.