Facebook Reviews Scraper - Page Recommendations avatar

Facebook Reviews Scraper - Page Recommendations

Pricing

from $0.34 / 1,000 reviews

Go to Apify Store
Facebook Reviews Scraper - Page Recommendations

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

Dami's Studio

Maintained by Community

Actor 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.

InputPage links or handles, up to 50 per run
OutputOne row per review: reviewer, recommends or not, text, date, reactions, tags, photos, plus the Page's recommend percentage
Ceiling200 reviews per Page, 50 Pages per run
Account neededNone
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 getField
The review and its linkreviewId, reviewUrl, text, textLength
Recommends or notisRecommended, recommendation
When it was writtendate, timestamp
Who wrote itreviewerName, reviewerId, reviewerUrl, reviewerProfilePicture
Tags and photostags, photos, photoCount
Reactions, comments and shares on the reviewlikesCount, commentsCount, sharesCount
The Page and its recommend percentagepageName, pageId, pageUrl, pageIsVerified, pageRecommendPercent, pageReviewsCount, pageRatingSummary

▶️ How to scrape Facebook reviews

  1. Open Facebook Reviews Scraper and click Try for free.
  2. Put your Pages into Facebook Page URLs, one per line.
  3. Set Reviews per Page, and Only keep if you want just the positive or just the negative ones.
  4. Click Start.
  5. 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"
}
FieldDefaultWhat it is
startUrlsnonePublic 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.
resultsLimitempty, runs as 10Reviews to take from each Page, in the order Facebook lists them. 1 to 200. Keep it low while testing, since you pay per review.
recommendationTypeempty, runs as allall, positive to keep only "recommends", or negative to keep only "doesn't recommend". Filtering is free.
onlyReviewsNewerThannoneDrop 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.
onlyReviewsOlderThannoneDrop reviews newer than this. Same formats, same caveat.
proxyUrlsnoneOptional. 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"
}
FieldHow to read it
isRecommended, recommendationThe same fact twice: true or false, and "positive" or "negative" for spreadsheets and pivot tables.
pageRecommendPercentThe 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".
pageReviewsCountHow many reviews the Page has in total, which is almost always far more than one run fetches.
tagsThe chips Facebook offers a reviewer, like "Fast delivery". Empty on most reviews, because most reviewers pick none.
photosDirect 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.
likesCountReactions on the review itself, not on the Page. Most sit at zero.
reviewerIdAn opaque pfbid… identifier for most profiles and a numeric one for older accounts, always as a string.
reviewUrlThe review's permalink. It sits on the reviewer's own profile, because a review is a post there.
date, timestampISO 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.

RowHow to spot itBilled
A reviewcharged: true and recordType: "review"yes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno

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.

errorCodeWhat happened
REVIEWS_DISABLEDThe Page has no public Recommendations tab. Its owner switched reviews off.
NO_REVIEWSNo 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_FOUNDNo Page lives at that link.
BAD_INPUTThe link is not a Facebook Page.
NOT_SERVEDThis review was not served this run. Re-run it later. Until 12 October 2026 this code was called BLOCKED.
NETWORKFacebook could not be reached.
TIME_BUDGETThe 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_ADJUSTEDA connection setting this actor does not use was dropped. The run carried on.
CHARGE_ERRORA billing event could not be recorded. Told to you rather than hidden.
UNEXPECTED_ERRORAnything 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 pageRecommendPercent and 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:

  1. Run this on all your Pages with a small resultsLimit. Each row carries pageRecommendPercent and pageReviewsCount.
  2. Copy the pageUrl of the Pages with the lowest pageRecommendPercent.
  3. Run this on them with recommendationType set to negative.

🚧 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: 4 column 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_DISABLED row.
  • 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 wantUse
Recommendations on a Facebook PageThis one
What the Page has been postingFacebook Posts Scraper
Comments under a Facebook post or reelFacebook Comments Scraper
Reviews of a place on Google MapsGoogle 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.

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.