Facebook Reviews Scraper: Recommends, Text, Replies, Rating avatar

Facebook Reviews Scraper: Recommends, Text, Replies, Rating

Pricing

from $1.26 / 1,000 reviews

Go to Apify Store
Facebook Reviews Scraper: Recommends, Text, Replies, Rating

Facebook Reviews Scraper: Recommends, Text, Replies, Rating

Scrape reviews of public Facebook Pages: reviewer, recommends or not, text, tags, date, reactions, comments, Page replies and the Page rating. Page links in, one row per review. No login.

Pricing

from $1.26 / 1,000 reviews

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Facebook Reviews Scraper: Recommends, Text, Page Replies, Rating

30 Facebook reviews with Page replies and the Page rating in 23 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors.

Why choose this actor?

  • Every field a review has, in columns. Reviewer, the recommend or not recommend verdict as true or false, the review text, the tags the reviewer picked, the exact date, reactions with their split, the comment count, and whether the Page replied, with the reply text and date. Each row also carries the Page's overall rating line, for example 94% recommend (201 reviews), split into page_recommend_percent and page_review_count.
  • Honest about depth. Facebook shows a logged out visitor only part of a Page's reviews. In our test on 23 October 2026 that was 62 of the 201 a small restaurant advertises, 88 of 603 for a Page with more, and 113 of 1,955 for a busy venue. The run summary tells you, per Page, how many were reachable next to the number Facebook advertises. You pay only for rows you receive.
  • No Facebook account. No login, no cookies of yours, no browser and no CAPTCHA solving. Pages that do not exist, personal profiles and Pages with no reviews get a free error row with the reason and are never charged.

Run it on Apify

Part of The Mine Works Marketing, SEO and reviews family: Facebook Ad Library Scraper, Google Ads Transparency Scraper, Similarweb Scraper, Google News Scraper, Trustpilot Reviews Scraper, Google Trends Scraper.

Try it in one minute

Paste this into the JSON tab of the input page. It returns 30 reviews of one restaurant Page, with the Page's replies. It took 23 seconds in our test.

{
"startUrls": [{ "url": "https://www.facebook.com/copperkettleyqr/reviews" }],
"maxReviewsPerPage": 30
}

Apify's free plan includes $5 of credit every month, which covers about 2,100 reviews at this actor's price.

Copy to your AI assistant

themineworks/facebook-reviews-scraper on Apify. Reads reviews of public Facebook Pages as a logged out visitor and returns one flat row per review: reviewer_name, reviewer_id, reviewer_url, recommends (true or false), verdict_text, text, tags, created_at, reactions_count, likes_count, reactions, comments_count, owner_replied, owner_reply_text, owner_reply_date, owner_replies, comments, photo_urls, review_id, review_url and the Page: page_name, page_id, page_url, page_rating_text, page_recommend_percent, page_review_count. Call ApifyClient("TOKEN").actor("themineworks/facebook-reviews-scraper").call(run_input={"startUrls": [{"url": "https://www.facebook.com/copperkettleyqr/reviews"}], "maxReviewsPerPage": 100}), then client.dataset(run["defaultDatasetId"]).list_items().items. Give startUrls (Page or /reviews links) and or pages (usernames or numeric ids). Optional: maxReviewsPerPage (default 50, applies to each Page, 0 means all that Facebook shows), onlyReviewsNewerThan (YYYY-MM-DD), includeComments (default true). Skip rows with a _type field (summary, info, error: never charged). Facebook shows a logged out visitor only part of a Page's reviews, so fewer rows than page_review_count is normal; the summary row (and the OUTPUT record) lists reviews_delivered and advertised_reviews per Page. Full spec: GET https://api.apify.com/v2/acts/themineworks~facebook-reviews-scraper/builds/default (Bearer TOKEN). Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • Recommend verdict as a boolean. Facebook replaced star ratings with recommend or not recommend in 2018. recommends is true or false; verdict_text keeps Facebook's own sentence ("Jay Enn doesn't recommend The Copper Kettle Restaurant.").
  • Page replies marked. A comment under a review is the Page's reply when its author is the Page. owner_replied, owner_reply_text and owner_reply_date give the first reply; owner_replies lists all of them; comments holds the whole visible thread with replies nested and is_page_owner on each comment.
  • Review tags and photos. Tags such as Child-friendly or Fast delivery when the reviewer picked any, and the links of photos attached to the review.
  • Reactions with their split. reactions_count is every reaction; reactions lists type and count (Like, Love, Haha, Wow and so on), and likes_count is Likes only.
  • Stop at a date. onlyReviewsNewerThan ends paging at the first older review.
  • Many Pages, one run. Up to 5,000 Pages; four are read at the same time. The input accepts Page links, /reviews links, m.facebook.com links, profile.php?id= links, usernames and numeric ids.
  • Stops cleanly. The run stops before its time limit, on your max cost, after repeated refusals by Facebook, or when two answers in a row bring nothing new, and it keeps every row it read.

How to use it

Reputation monitoring

Schedule a weekly run with onlyReviewsNewerThan set to a week ago. Rows with recommends: false and owner_replied: false are the unanswered complaints.

{
"startUrls": [{ "url": "https://www.facebook.com/copperkettleyqr" }],
"maxReviewsPerPage": 0,
"onlyReviewsNewerThan": "2026-10-01"
}

Compare competitors

Put several Pages in one run and sort the rows by page_name. page_recommend_percent and page_review_count repeat on every row, so a combined sheet needs no second lookup.

{
"startUrls": [
{ "url": "https://www.facebook.com/copperkettleyqr" },
{ "url": "https://www.facebook.com/kissatanto" }
],
"maxReviewsPerPage": 100
}

Sentiment datasets

text with the binary recommends label, tags and created_at make a labelled set. Many rows have no text (the reviewer only gave a verdict); filter on text if you need words.

Light export

{
"pages": ["copperkettleyqr", "kissatanto"],
"maxReviewsPerPage": 200,
"includeComments": false
}

Off, rows carry comments_count and the first Page reply but not the comments and owner_replies lists. Same price either way.

Input parameters

ParameterTypeDefaultWhat it does
startUrlsarraythe sample PageFacebook Page or /reviews links.
pagesarray of stringsemptyUsernames (copperkettleyqr, @copperkettleyqr) or numeric Page ids.
maxReviewsPerPageinteger50Most reviews from each Page (not the run total). 0 means every review Facebook shows.
onlyReviewsNewerThanstringemptyYYYY-MM-DD. Paging stops at the first older review.
includeCommentsbooleantrueInclude the comments thread and owner_replies list.
proxyConfigurationobject{"useApifyProxy": true}Apify datacenter proxy, which is all this actor needs. Residential is not used, even if selected.

Give startUrls, pages or both. Up to 5,000 Pages per run. List each Page once; two links to the same Page give one set of rows.

What data do you get?

One row per review. Fields that a review does not have are left out of that row.

FieldWhat it is
review_id, review_urlFacebook's id of the review post and its permalink
reviewer_name, reviewer_id, reviewer_urlThe reviewer. The URL is present when the profile is public
recommends, verdict_texttrue or false, and Facebook's sentence
textThe review; absent when the reviewer gave only a verdict
tagsReview tags the reviewer picked
created_atISO 8601 UTC
reactions_count, likes_count, reactionsAll reactions, Likes only, and the split by type
comments_countComments and replies Facebook counts under the review
owner_replied, owner_reply_text, owner_reply_dateThe Page's first reply
owner_repliesEvery reply by the Page: text, created_at, reactions_count
commentsThe comments Facebook includes, replies nested: id, author_name, author_id, author_url, text, created_at, reactions_count, is_page_owner, replies
photo_urlsPhotos attached to the review (signed links that expire within hours)
page_name, page_id, page_urlThe Page
page_rating_text, page_recommend_percent, page_review_countThe Page's overall rating line and its parts
input, scraped_atThe entry you gave, and when the row was written

Summary row (_type: "summary", never charged, also saved as the OUTPUT record): pages_requested, pages_read, pages_failed, pages_without_reviews, reviews_delivered, charged_for, transport (requests, megabytes, block_rate) and per_page, one entry per Page with advertised_reviews, reviews_delivered, reached_end and status (all_reachable_delivered, max_reviews_reached, older_than_cutoff, partial, not_available, personal_profile, no_reviews, blocked).

Error rows (_type: "error", never charged): one per entry that gave no reviews, with error_type, identifier and reason.

Output examples

A review with a Page reply (test run, 23 Oct 2026, trimmed):

{
"review_id": "10159367163365044",
"review_url": "https://www.facebook.com/jayna.nicholson/posts/pfbid0FSQcQb26G1WcLGW2AmuuogpjgEatGc8rodR2qSD8HoP1moQG5cG3sMYtHPDEZ4sul",
"reviewer_name": "Jay Enn",
"recommends": false,
"verdict_text": "Jay Enn doesn't recommend The Copper Kettle Restaurant.",
"text": "Normally the food from here is really good but we got pizza last night and it was somewhere in the range of sub par to just really not good. ...",
"tags": [],
"created_at": "2024-04-11T17:40:55.000Z",
"reactions_count": 1,
"reactions": [{ "type": "Haha", "count": 1 }],
"comments_count": 1,
"owner_replied": true,
"owner_reply_text": "Thank you for sharing your feedback with us, Jay. We're sorry to hear that your recent experience with our pizza was disappointing. ...",
"owner_reply_date": "2024-04-15T14:44:58.000Z",
"page_name": "The Copper Kettle Restaurant",
"page_rating_text": "94% recommend (201 reviews)",
"page_recommend_percent": 94,
"page_review_count": 201
}

A review with tags:

{
"review_id": "10163596241145646",
"reviewer_name": "Jill Schmidt",
"recommends": true,
"text": "We had the Christmas platter and it was fantastic! Enough food for easily 2 meals. ...",
"tags": ["Large menu"],
"created_at": "2020-05-24T02:15:54.000Z",
"comments_count": 1,
"owner_replied": true,
"owner_reply_date": "2020-05-25T23:02:07.000Z"
}

The per Page entry of the summary for a full run on that Page:

{ "page_name": "The Copper Kettle Restaurant", "status": "all_reachable_delivered", "advertised_reviews": 201, "reviews_delivered": 62, "reached_end": true }

Pricing

Pay per event: you pay for the reviews you receive, plus a flat $0.003 per run, whatever memory you choose.

EventWhen it is chargedFree planBronze (Starter)Silver (Scale)Gold (Business)
review-scrapedOnce per review row stored in your dataset$2.25 per 1,000$1.80 per 1,000$1.53 per 1,000$1.26 per 1,000
run-startOnce per run, when the first reviews are stored$0.003$0.003$0.003$0.003

The price of one review is the price per 1,000 divided by 1,000.

Never charged:

  • Pages that do not exist, personal profiles, Pages without reviews, and entries that are not Pages (each gets an error row);
  • the summary, info and error rows;
  • reviews past maxReviewsPerPage or older than onlyReviewsNewerThan;
  • a run with no valid input or whose Pages returned no reviews: the start fee is charged only when the first reviews are stored;
  • anything past your "Max cost per run". The actor checks the budget before each batch and stops while the total is still below your limit, so the run ends SUCCEEDED with a partial result and a status message saying so.

Run it on a schedule

  1. Open the actor in Apify Console, set your input and click Save as a new task.
  2. In the task, open Schedules, click Add schedule and pick how often.
  3. Compare runs on review_id to find new reviews, or use onlyReviewsNewerThan so each run reads only recent ones.
  4. Optional: add an integration (Google Sheets, Slack, a webhook) so new complaints reach your team.

FAQ

Do I need a Facebook account or cookies?

No. The actor reads each Page's public Reviews tab as a visitor who is not logged in.

How many reviews can I get per Page?

Fewer than the Page advertises. Facebook gives a logged out visitor a limited list: 62 of 201, 88 of 603 and 113 of 1,955 on the three Pages we tried, the same on datacenter and residential proxy. The list reaches back years (2016 on the first Page), and includes reviews with no text. The summary row shows advertised_reviews and reviews_delivered for every Page, so you know what you got.

Why is there no star rating?

Facebook removed star ratings in 2018. A review is a recommend or a do not recommend, which is recommends. The Page level equivalent is page_recommend_percent.

Are the Page's replies included?

Yes, when Facebook includes the comments under a review. For some reviews Facebook reports a comment count but sends no comment text; comments_count is then higher than the number of items in comments. On the three Pages we tried, 34 of 36 reviews with comments on one Page carried them, 16 of 57 on another and none on the third.

Why do some rows have no text?

A recommendation can be a verdict alone. About one review in five in our test had no text. Filter on text if you only want written reviews.

Is the language fixed?

The verdict is read from Facebook's English sentence, requested in English. Review text is returned in whatever language the reviewer used.

How fast is it and what does a run cost me?

Facebook sends three reviews per request, so a full Page of 60 reviews takes 20 requests and about 50 seconds. Four Pages are read at the same time. In our tests none of about 300 requests was refused.

Which formats can I download?

JSON, CSV, Excel, XML, RSS and HTML from the run's Storage tab or through the API. In CSV and Excel the nested comments and owner_replies are flattened into columns such as comments/0/text; use JSON to keep the thread.

Can I use it from Claude, ChatGPT or Cursor (MCP)?

Yes, through Apify's MCP server. Connector URL: https://mcp.apify.com/?tools=themineworks/facebook-reviews-scraper

  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: turn on developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http facebook-reviews-scraper "https://mcp.apify.com/?tools=themineworks/facebook-reviews-scraper"

The actor reads only reviews that anyone can see without logging in. Reviews are their authors' words and contain personal data (names, profile links). You are responsible for how you use the data, including Facebook's terms and data protection law such as GDPR and CCPA. This is general information, not legal advice.

Integrations

  • Google Sheets: send each run's reviews to a sheet with Apify's Google Sheets integration; one row per review fits a sheet as is.
  • Make, Zapier and n8n: start a run and read its dataset, for example "new negative reviews without a reply every Monday to Slack".
  • Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
  • API and SDKs: run it from Python or JavaScript with the Apify client (see "Copy to your AI assistant" above).
  • MCP clients: Claude, ChatGPT, Cursor and VS Code can run it as a tool through the connector URL in the FAQ.

More from The Mine Works

Marketing, SEO and reviews

Social media and video

Leads and business directories

LinkedIn

Real estate

Science, health and government data

Jobs and hiring

Company and business data

E-commerce and marketplaces

Food and local services

Developer and AI tools

More tools