Facebook Reviews Scraper - Page Recommendations
Pricing
from $0.34 / 1,000 reviews
Facebook Reviews Scraper - Page Recommendations
Scrape reviews from public Facebook Pages. Facebook dropped stars: a Page shows Recommendations, yes or no, plus a percentage. One row per review: reviewer, recommends or not, text, date, reactions, tags and photos. Positive or negative filter, free. No login needed. $0.35 per 1,000 reviews.
Pricing
from $0.34 / 1,000 reviews
Rating
0.0
(0)
Developer
Dami's Studio
Maintained by CommunityActor stats
0
Bookmarked
7
Total users
3
Monthly active users
4 days ago
Last modified
Categories
Share
Give it public Facebook Page links and get the Page's recommendations, one row per review: who wrote it, whether they recommend the Page, the text, the date, the reactions, the tags and any photos.
Facebook dropped star ratings for Pages, so there is no 1 to 5 score here, only recommends or
doesn't. And the awkward part: Facebook hands reviews out two or three at a time, so a deep pull
from one Page takes minutes, not seconds. If it shows a Page's own posts where the reviews should
be, you get a free NO_REVIEWS row, never the posts passed off as reviews.
| Input | Page links or handles, up to 50 per run |
| Output | One row per review: reviewer, recommends or not, text, date, reactions, tags, photos, plus the Page's recommend percentage |
| Ceiling | 200 reviews per Page, 50 Pages per run |
| Account needed | None |
| Price | $0.35 per 1,000 reviews on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 14,000 |
🔍 What Facebook Reviews Scraper does
It reads a Page's public Recommendations and writes each review as its own flat row, with the Page it belongs to on it. Many Pages fit in one run, and the same Page written two ways is read once.
Positive and negative come from the recommendation marker Facebook attaches to each review, not from the wording, so the flag stays right on a Page that writes in another language. Every row also carries the Page-level summary: the share of reviewers who recommend it and how many reviews it has in total.
A high resultsLimit costs time rather than anything extra: past the first few, reviews arrive
three at a time.
📋 What data you get from each Facebook review
| What you get | Field |
|---|---|
| The review and its link | reviewId, reviewUrl, text, textLength |
| Recommends or not | isRecommended, recommendation |
| When it was written | date, timestamp |
| Who wrote it | reviewerName, reviewerId, reviewerUrl, reviewerProfilePicture |
| Tags and photos | tags, photos, photoCount |
| Reactions, comments and shares on the review | likesCount, commentsCount, sharesCount |
| The Page and its recommend percentage | pageName, pageId, pageUrl, pageIsVerified, pageRecommendPercent, pageReviewsCount, pageRatingSummary |
▶️ How to scrape Facebook reviews
- Open Facebook Reviews Scraper and click Try for free.
- Put your Pages into Facebook Page URLs, one per line.
- Set Reviews per Page, and Only keep if you want just the positive or just the negative ones.
- Click Start.
- Download the dataset as JSON, CSV or Excel, or pull it from the Apify API.
Run it with empty input and you get one labelled sample row, which is not charged, so you can see the shape before you spend anything.
💰 How much does it cost to scrape Facebook reviews?
$0.35 per 1,000 reviews on the Free plan. Paid plans pay a little less: $0.345 on Starter, $0.34 on Scale and $0.335 on Business. On the free plan, the $5 Apify gives you each month covers about 14,000 reviews.
You pay for review rows written to your dataset. The sample row, every diagnostic row, a Page with Recommendations switched off, and reviews dropped by your date or positive/negative filters are not charged.
📥 What you give it
{"startUrls": ["https://www.facebook.com/Dominos", "https://www.facebook.com/KFC"],"resultsLimit": 10,"recommendationType": "all"}
| Field | Default | What it is |
|---|---|---|
startUrls | none | Public Page links, one per line. A bare handle (Dominos), a Reviews-tab link, a /pg/ link, a /p/ link and a profile.php?id= link all work. Up to 50 Pages per run. |
resultsLimit | empty, runs as 10 | Reviews to take from each Page, in the order Facebook lists them. 1 to 200. Keep it low while testing, since you pay per review. |
recommendationType | empty, runs as all | all, positive to keep only "recommends", or negative to keep only "doesn't recommend". Filtering is free. |
onlyReviewsNewerThan | none | Drop reviews older than this. 2026-08-01, a full ISO timestamp, an epoch, or a window like 7 days. Anything it cannot read as a date switches the filter off, so check the format. |
onlyReviewsOlderThan | none | Drop reviews newer than this. Same formats, same caveat. |
proxyUrls | none | Optional. One URL per line if you want the traffic to leave through servers you already pay for. |
📤 What you get back
A real row from a run on 16 August 2026, with the picture links trimmed:
{"ok": true,"charged": true,"recordType": "review","inputUrl": "https://www.facebook.com/Dominos","pageName": "Domino's Pizza","pageId": "100064795448235","pageUrl": "https://www.facebook.com/Dominos/","pageIsVerified": true,"pageProfilePicture": "https://lookaside.fbsbx.com/...","pageRecommendPercent": 30,"pageReviewsCount": 12661,"pageRatingSummary": "30% recommend (12,661 Reviews)","reviewId": "10164211035477496","reviewUrl": "https://www.facebook.com/randyfgarciaLV/posts/pfbid05YabRqiEtRu7e4Lqm1uDpYtjWhzTAEJj4DCemp6BywqxnkyjDAh9aFXCKMKE3Aujl","isRecommended": true,"recommendation": "positive","text": "Nice place. I would come back for more of that sweet pizza anytime.","textLength": 67,"tags": ["Fast delivery", "Child-friendly"],"date": "2026-08-09T09:19:05.000Z","timestamp": 1786267145,"reviewerName": "Randy F Garcia","reviewerId": "562052495","reviewerUrl": "https://www.facebook.com/randyfgarciaLV","reviewerProfilePicture": "https://lookaside.fbsbx.com/...","likesCount": 0,"commentsCount": 1,"sharesCount": 0,"photos": [],"photoCount": 0,"scrapedAt": "2026-08-16T13:33:50.062Z"}
| Field | How to read it |
|---|---|
isRecommended, recommendation | The same fact twice: true or false, and "positive" or "negative" for spreadsheets and pivot tables. |
pageRecommendPercent | The figure Facebook shows in place of an average rating: the share of reviewers who recommend the Page. null on a Page Facebook labels "Not yet rated". |
pageReviewsCount | How many reviews the Page has in total, which is almost always far more than one run fetches. |
tags | The chips Facebook offers a reviewer, like "Fast delivery". Empty on most reviews, because most reviewers pick none. |
photos | Direct links to images and video stills attached to the review. Roughly one review in sixteen carries any. The signed scontent links expire after some hours, so download what you want to keep. |
likesCount | Reactions on the review itself, not on the Page. Most sit at zero. |
reviewerId | An opaque pfbid… identifier for most profiles and a numeric one for older accounts, always as a string. |
reviewUrl | The review's permalink. It sits on the reviewer's own profile, because a review is a post there. |
date, timestamp | ISO 8601 in UTC, and the same instant in epoch seconds. |
Tags and photos come back as an empty array rather than null when there are none.
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Billed |
|---|---|---|
| A review | charged: true and recordType: "review" | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
Filter on charged == true and you have your data. That flag is what separates real rows from the
sample and the diagnostics, not a receipt. Each diagnostic carries a plain-English details and the
inputUrl it belongs to.
errorCode | What happened |
|---|---|
REVIEWS_DISABLED | The Page has no public Recommendations tab. Its owner switched reviews off. |
NO_REVIEWS | No reviews to deliver: the tab was empty, everything fell outside your filters, or Facebook showed the Page's own posts where the reviews should be. details says which. |
NOT_FOUND | No Page lives at that link. |
BAD_INPUT | The link is not a Facebook Page. |
NOT_SERVED | This review was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED. |
NETWORK | Facebook could not be reached. |
TIME_BUDGET | The run ran out of time before reaching that Page, or before finishing it. Nothing was charged for it. The run ends as failed only when the time limit stopped it before any review came back. |
PROXY_INPUT_ADJUSTED | A connection setting this actor does not use was dropped. The run carried on. |
CHARGE_ERROR | A billing event could not be recorded. Told to you rather than hidden. |
UNEXPECTED_ERROR | Anything else, with the message attached. |
💡 What people use it for
- Reputation monitoring for a brand with many location Pages: run the same list daily, filter on
recommendation == "negative", and send the new ones to whoever answers complaints. - Comparing a set of Pages by
pageRecommendPercentand by the words people actually use. - Support triage. A negative review arrives with its permalink and the reviewer's name, so a reply can be written straight from the row.
To find the Pages worth reading closely first, in three steps:
- Run this on all your Pages with a small
resultsLimit. Each row carriespageRecommendPercentandpageReviewsCount. - Copy the
pageUrlof the Pages with the lowestpageRecommendPercent. - Run this on them with
recommendationTypeset tonegative.
🚧 What it does not do
- No 1 to 5 star rating. Facebook retired stars for Pages in 2018, and nothing is stored to
read. A
stars: 4column would be a number somebody made up. - Pages with Recommendations off return no reviews. Many large brand Pages have switched them
off. You get a free
REVIEWS_DISABLEDrow. - Only what a signed-out reader can see. Reviews hidden by the reviewer's own privacy settings do not appear.
- Depth is finite. Asking for 200 on a Page that has published forty publicly returns forty.
- The order is Facebook's. Rows come in the order Facebook lists them; nothing is re-sorted.
- Counts are a snapshot of reactions, comments and shares at read time.
- 50 Pages and 200 reviews per Page in one run. Very large runs can see more Pages come back
as
NOT_SERVED. - It is not an official Facebook tool. Dami's Studio is independent and is not affiliated with or endorsed by Facebook or Meta, or by any other company named on this page.
🧭 Which reviews scraper do you need?
| If you want | Use |
|---|---|
| Recommendations on a Facebook Page | This one |
| What the Page has been posting | Facebook Posts Scraper |
| Comments under a Facebook post or reel | Facebook Comments Scraper |
| Reviews of a place on Google Maps | Google Maps Reviews Scraper |
❓ Questions people ask
Do I need a Facebook account to scrape Page reviews?
No. You need no Facebook account of your own.
Why does my Page return no reviews?
Either its owner switched Recommendations off, which gives a REVIEWS_DISABLED row, or there was
nothing to deliver, which gives NO_REVIEWS with a details line saying why. Neither is charged.
Where is the star rating?
It does not exist any more. Every row carries isRecommended instead, and pageRecommendPercent
takes the place of an average. If a dashboard needs a star-shaped number, pageRecommendPercent / 20
gives you a 0 to 5 scale from a real figure.
Can I get only the bad reviews?
Yes. Set recommendationType to negative. The filter runs before billing, so the positive reviews
it drops cost nothing.
Can I call it from code or connect it to an AI assistant?
Yes. The API tab has ready-made
code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect
https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/facebook-reviews-scraper. Either way
the run happens on your Apify account at the same price.
Is scraping Facebook reviews legal?
This reads public recommendations only. Reviewer names and profiles are personal data under GDPR and similar laws, so have a reason for collecting them. Apify's write-up on the legality of web scraping is a good starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Paste the Page link you used and the run ID, and the log is enough for us to see what happened.

