Facebook Page Posts Scraper: Reactions, Shares & Comments avatar

Facebook Page Posts Scraper: Reactions, Shares & Comments

Pricing

from $2.00 / 1,000 actor run starteds

Go to Apify Store
Facebook Page Posts Scraper: Reactions, Shares & Comments

Facebook Page Posts Scraper: Reactions, Shares & Comments

Get the recent posts of any public Facebook page as rows: text, posting date, exact and displayed reaction and share counts, comment totals, video views, hashtags, attachment type and sponsored flag. For competitor monitoring, engagement benchmarks and PR tracking. No login.

Pricing

from $2.00 / 1,000 actor run starteds

Rating

0.0

(0)

Developer

SR

SR

Maintained by Community

Actor stats

0

Bookmarked

8

Total users

5

Monthly active users

2 days ago

Last modified

Share

Facebook Posts Scraper for Public Pages

This Facebook posts scraper reads the recent posts on any public Facebook page and returns them as structured data, for competitor monitoring, engagement benchmarking and PR tracking: 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
  • fetched_at, comments_count, views, hashtags
  • position, plus source, platform, post_url, author_id, likes and shares (see the example below)

Output example from the Facebook posts scraper

One real row, as returned for the BBC News page (pages: ["bbcnews"]) on 2 October 2026:

{
"post_id": "1611928367637816",
"url": "https://www.facebook.com/bbcnews/posts/1611928367637816",
"page": "bbcnews",
"page_name": "BBC News",
"page_id": "100064620046507",
"text": "G7 country leaders have agreed to release up to 100 million barrels of diesel and crude oil in a bid to stop soaring prices.\n\nRead more: https://bbc.in/4hZ7IIT",
"posted_at": "2026-10-02T14:59:27Z",
"reaction_count": 407,
"reaction_count_display": "407",
"share_count": 37,
"share_count_display": "37",
"media_type": "Photo",
"link": null,
"is_sponsored": false,
"position": 1,
"fetched_at": "2026-10-02T15:50:39Z",
"comments_count": 152,
"views": null,
"hashtags": [],
"source": "facebook-pages",
"platform": "facebook",
"post_url": "https://www.facebook.com/bbcnews/posts/1611928367637816",
"author_id": "100064620046507",
"likes": 407,
"shares": 37
}

position is the row's place in the run, 1 to n across all pages. Each row also carries a few general social-post fields so it lines up with other social media datasets: source, platform, post_url (the same link as url), author_id (the same id as page_id), likes (the same total as reaction_count) and shares (the same total as share_count).

Exact and displayed reaction and share counts

Facebook publishes reaction and share counts 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.

Comments, views and hashtags per post

The output also includes comments_count from the post's own feedback data, views where Facebook publishes a video view total, and hashtags extracted from the post text. An unavailable count is null, not an invented zero. fetched_at records the UTC retrieval time, so snapshots can be compared. The run summary reports commentCountsAvailable: true. All existing output fields remain available with their original names and JSON types.

A page handle (nasa), a page link (https://www.facebook.com/nasa), or a numeric profile link all work. A numeric page ID also works as a string or a JSON number in pages, for example {"pages": [100064620046507], "max_posts": 5} for BBC News. Repeating that ID as text does not add a duplicate page.

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.

The total limit applies in page input order. Longer page lists are collected in consecutive parts automatically; each post is delivered and charged once.

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.

How this compares with other Facebook post scrapers

Most Facebook scrapers in the Apify Store aim wider: posts from pages, profiles and groups, with comments, images and transcripts. That breadth costs more per post. This actor does one thing, the recent posts of public pages, and keeps the per-post price low.

This actorapify/facebook-posts-scraperscraper_one/facebook-posts-scraper
Price per 1,000 posts$1.50$5.00 free plan, down to $0.80 on the highest plan$2.50 free plan, $2.00 from Gold
Fixed fee per run$0.002$0.001$0.0025 free plan, $0.00025 paid plans
What it readspublic pagespages and profilesprofiles, pages and groups

Prices are the published per-event prices of those actors on 2 October 2026; the scope is what their own Store descriptions say. If you need groups, comment text or a page's full history, one of those is the better tool. If you need the newest posts of a list of pages on a schedule, at the lowest price per post, this one is.

Pricing

Pay per event. post costs $0.0015 per post returned, $1.50 per 1,000, and run_start costs $0.002 once per run. You only pay for posts you receive, with no per-compute-unit charges.

What this does not do

No groups, comment text or private profiles. This reads public pages. Facebook groups are a different surface with a different payload; personal profiles are not public in the way pages are; and individual comment text is not collected here. Comment totals are included where available. 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.

Input: pages, limits and country

Give pages as a list of page handles or page URLs. API callers may also use comma-separated or newline-separated text. max_posts defaults to 50 across all pages, max_pages to 20 unique pages, attempts to 4 and region to us. Page deduplication preserves case. A numeric profile link uses its original numeric identifier in output post URLs. The maximum supported post total is 500 and the maximum page total is 100. The source feed usually contains only about twenty recent posts per page, so increasing the limit for one page does not retrieve its complete history.

Output, summary and empty results

Results go to the default dataset, with one item per post. The summary key-value record contains page totals, posts per page, text coverage, reaction coverage and total reactions. The errors record names invalid or unreadable pages. A page that cannot be read does not erase results from other pages. A fully empty or invalid request completes successfully with an empty dataset; no post event is charged, while the fixed run-start event still applies.

When a small public feed explicitly indicates further posts, summary.limitedFeeds names the affected pages and OUTPUT reports partial: true with a warning. Delivered posts remain in the dataset and only those posts are charged. This indication also remains visible when other requested pages succeed.

Users without a paid Apify plan receive at most ten posts per run. Paid users keep their requested limit. Export the dataset as JSON, CSV or Excel using the standard Apify dataset tools; identifiers remain strings in the JSON output.

FAQ

Does this require a Facebook account?

No. It reads the public page feed without signing in. Restricted pages may return no readable posts and are reported in the errors record.

Can I download all posts from a page?

No. This returns the recent posts supplied with the public page feed. The post limit controls the combined output from your named pages; it is not a historical feed pagination setting.

Are comments and reactions the same count?

No. comments_count is a comment total when available. reaction_count combines Facebook reactions and remains accompanied by the separately published display string. Video views are another independent, optional total.

Why did a page return only one or a few posts?

Not every page puts the same number of posts in its public feed. Most pages show about twenty recent posts, but some large brand pages show only one or two to a visitor who is not signed in at first. The Coca-Cola page, for example, sometimes answered with a single post when checked in October 2026. When that happens the scraper asks for the same page again, up to three more times, with a short pause between tries. In five consecutive checks this brought back the usual twenty posts four times; once the page still gave a single post. These pages can therefore take longer than others. You are charged only for the posts that are actually delivered, and postsPerPage in the summary shows which page came back short. When the feed itself indicated that more posts exist, that page is also listed in summary.limitedFeeds and the run is marked partial, so you can simply run it again later.

What happens if one page fails?

Readable pages still produce their posts, in your input order. The failed page appears in errors, and the summary shows how many pages were read and how many posts each contributed. You only pay the post event for delivered posts, plus the unchanged fixed run-start event.

Is this a Facebook API?

It can be used like one. Start a run through the Apify API with a list of pages, then read the dataset as JSON. You do not need a Facebook developer app or a Meta access token, and you only get what a public page shows to any visitor.

Can I schedule the Facebook posts scraper?

Yes. Save your page list as a task and add an Apify schedule, for example daily. Every row has posted_at and fetched_at, so you can drop posts you already have by post_id and see how counts change between runs.

Which countries does it work for?

Any public page, in any language. region (Search from country) defaults to us and only changes where the request appears to come from; the posts stay in the page's own language.