Facebook Reviews Scraper
Pricing
from $0.97 / 1,000 review extracteds
Facebook Reviews Scraper
Scrape public Facebook page recommendations and reviews into structured datasets for reputation monitoring.
Pricing
from $0.97 / 1,000 review extracteds
Rating
0.0
(0)
Developer
Hanna Nosova
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Collect public Facebook Page recommendations into structured review rows. The Actor uses only Facebook's logged-out public Page response—no account, cookies, access token, or private profile crawling.
What it does
- Accepts Page URLs,
/reviewsURLs, and numeric Page IDs. - Handles multiple Pages in one run and removes duplicate review stories.
- Follows Facebook's available logged-out continuation pages until the requested limit, the public feed ends, or a bounded safety limit is reached.
- Returns both recommended and not-recommended stories.
- Preserves exact public timestamps, stable story and post IDs, reviewer fields, Page score/count, engagement counts, tags, and optional attached-photo URLs when Facebook exposes them.
- Writes a per-input
RUN_SUMMARYrecord so unavailable, blocked, invalid, empty, and duplicate-only inputs are not hidden.
Who is it for
- Reputation monitoring: schedule a Page task and send new dataset rows to a spreadsheet, webhook, or alerting workflow.
- Competitor comparison: collect recommendation states, review text, Page score/count, and engagement for several local competitors.
- Customer research: export public review text and tags for topic analysis without handling a Facebook account.
- Data pipelines: consume normalized review rows through the Apify API, webhooks, integrations, or the official Apify MCP server.
Input
| Setting | JSON key | Description |
|---|---|---|
| Facebook Page URLs | startUrls | Public Page, /reviews, or numeric Page URLs. Post, group, reel, and video URLs are rejected. |
| Facebook Page IDs | pageIds | Optional numeric Page IDs. Can be combined with URLs. |
| Maximum reviews | maxItems | Global dataset-row limit, from 1 to 1,000. |
| Maximum per Page | maxReviewsPerPage | Per-input limit, from 1 to 250, across initial and continued public results. |
| Include photos | includeReviewPhotos | Include one best-resolution public URL per attached review photo. |
| Proxy | proxyConfiguration | Residential proxy is recommended; direct egress is useful for small diagnostics. |
Ready-to-run examples
Open a public example to inspect its input, run it, or reuse it as a task:
- Compare Facebook Reviews Across Multiple Pages
- Export Facebook Reviews by Page ID
- Download Facebook Reviews with Photos
- Export Facebook Page Reviews and Recommendations
Small direct test
{"startUrls": [{ "url": "https://www.facebook.com/copperkettleyqr/reviews" }],"maxItems": 5,"maxReviewsPerPage": 5,"includeReviewPhotos": false,"proxyConfiguration": { "useApifyProxy": false }}
Residential batch
{"startUrls": [{ "url": "https://www.facebook.com/copperkettleyqr" },{ "url": "https://www.facebook.com/Meta/reviews" }],"maxItems": 20,"maxReviewsPerPage": 10,"includeReviewPhotos": true,"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
Export Facebook reviews data
Each dataset item is one public recommendation story.
| Field | Description |
|---|---|
inputUrl, inputType | Original input and whether it was a URL or Page ID. |
facebookUrl | Normalized Page reviews URL. |
pageName, pageUsername | Public display name and vanity name. |
pageId, facebookId | Numeric Facebook Page ID. |
pageRecommendationPercent, pageReviewCount | Public Page-level recommendation score and displayed review count. |
id, reviewId, legacyId | Facebook story ID, permalink ID, and legacy post ID. |
url | Direct public review-story URL when exposed. |
user | Compatibility object with reviewer ID, name, profile URL, and profile picture. |
reviewerId, reviewerName | Flat reviewer fields for CSV and spreadsheet workflows. |
reviewerProfileUrl, reviewerProfilePic | Public reviewer links when exposed. |
isRecommended | true for recommends and false for doesn't recommend. |
date, dateText | Exact ISO timestamp and visible date label. |
text, tags | Review text and public recommendation tags. |
likesCount, commentsCount | Public engagement totals. |
reviewPhotos, photos | One best-resolution public URL per attached review photo when requested and exposed. |
status, stopReason, source, scrapedAt | Extraction provenance and run-time context. |
Example output
{"facebookUrl": "https://www.facebook.com/copperkettleyqr/reviews","pageName": "The Copper Kettle Restaurant","pageUsername": "copperkettleyqr","pageId": "100064027242849","pageRecommendationPercent": 94,"pageReviewCount": 201,"id": "UzpfSTEwMDAwODg0Mjg0MTAzMDozNDMzNTYyNDMzNjE1MTUxOjM0MzM1NjI0MzM2MTUxNTE=","reviewId": "pfbid02fESzT5d1xik5moNdXq4t4X6gPFvAs7PUEAq5hwYvyAnotwQTwuTBz2MmtzPkEjiFl","legacyId": "3433562433615151","reviewerId": "100008842841030","reviewerName": "Daniel Masih","isRecommended": true,"date": "2024-09-11T17:57:58.000Z","text": "They offers a cozy atmosphere, friendly service, and a menu of tasty comfort food at reasonable prices. It’s a great spot for casual dining.","tags": ["Child-friendly", "Fast delivery", "Cosy atmosphere"],"likesCount": 0,"commentsCount": 0,"photos": [],"source": "facebook-public-preloaded-review-feed"}
Run summary
The default key-value store contains RUN_SUMMARY. It reports one status per input:
ok— public reviews were extracted, or the second form of a duplicate Page produced no additional rows.no_public_reviews— the Page loaded but exposed no semantic public recommendation.unavailable— the Page/reviews surface is unavailable or disabled to logged-out visitors.blocked— Facebook returned a security/interstitial block.invalid— the input is not a supported Facebook Page input.error— navigation or parsing failed for that input.
RUN_CHECKPOINT records completed and pending Pages so a migrated or restarted run can resume without charging or saving the same review twice.
Pricing
This Actor uses pay-per-event pricing:
- The
startevent is charged once when a run starts. - The
itemevent is the primary event and applies to each saved review row. - Per-input statuses and diagnostics stored in
RUN_SUMMARYare not review rows.
See the live Pricing tab for current rates and plan discounts.
Tips for better results
- Begin with one Page and
maxItems: 5before creating a larger batch. - Keep the residential proxy default for scheduled or multi-Page work; direct egress is useful for low-cost diagnostics but can vary by location.
- Use both the dataset and
RUN_SUMMARYwhen reconciling a batch. A zero-row Page is not automatically an Actor failure. - Use numeric
pageIdswhen you already have them; otherwise Page and/reviewsURLs are normalized automatically.
Limits and public-data boundaries
- Facebook does not expose every review counted on a Page to logged-out visitors. The Actor returns the public stories present in Facebook's response and does not promise the full displayed total.
- The Actor follows Facebook's public continuation cursor when available, but the public feed can still end before the displayed Page review count.
- Facebook orders public recommendations by its own relevance logic, not necessarily chronologically.
- Reviewer fields and photos can be
nullor empty when Facebook does not expose them publicly. - The Actor does not accept account credentials, cookies, private sessions, access tokens, groups, profiles, messages, or other non-public surfaces.
- Process public reviewer data only for a legitimate purpose and with appropriate retention and access controls.
Facebook reviews API usage
Node.js:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('fetch_cat/facebook-reviews-scraper').call({startUrls: [{ url: 'https://www.facebook.com/copperkettleyqr/reviews' }],maxItems: 10,proxyConfiguration: {useApifyProxy: true,apifyProxyGroups: ['RESIDENTIAL'],},});console.log(run.defaultDatasetId);
Python:
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("fetch_cat/facebook-reviews-scraper").call(run_input={"startUrls": [{"url": "https://www.facebook.com/copperkettleyqr/reviews"}],"maxItems": 10,"proxyConfiguration": {"useApifyProxy": True,"apifyProxyGroups": ["RESIDENTIAL"],},})print(run["defaultDatasetId"])
cURL:
curl -X POST \"https://api.apify.com/v2/acts/fetch_cat~facebook-reviews-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://www.facebook.com/copperkettleyqr/reviews"}],"maxItems":10}'
MCP and AI agents
This Actor can be exposed through the official Apify MCP server.
claude mcp add --transport http apify \"https://mcp.apify.com?tools=fetch_cat/facebook-reviews-scraper"
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=fetch_cat/facebook-reviews-scraper"}}}
Example prompts:
- “Collect up to 10 public recommendations from this Facebook Page and summarize recurring service complaints.”
- “Compare recommendation states and Page scores for these three public Facebook Pages.”
- “Run this Facebook reviews task and return the dataset ID plus the per-Page run summary.”
Schedule review monitoring
Save a small input as an Apify Task, attach a daily or weekly schedule, and connect a webhook or integration to the finished run. Use reviewId or id as the downstream deduplication key and inspect RUN_SUMMARY for unavailable or blocked Pages.
FAQ
Does this require a Facebook login, cookies, or access token?
No. It reads only the Page data Facebook makes available to logged-out visitors.
Why is the dataset smaller than the Page's displayed review count?
Facebook can expose only a subset of the displayed total to logged-out visitors. The Actor reports the Page count for context but does not invent or bypass unavailable reviews.
Can I export to CSV, Excel, or JSON?
Yes. Apify datasets support CSV, Excel, JSON, JSONL, XML, RSS, and API access.
Why is a reviewer field or photo empty?
The public response does not always include every reviewer link, profile image, permalink, or attachment. Missing values remain empty instead of being guessed.
What should I check when a Page returns no rows?
Open RUN_SUMMARY first. It distinguishes no public recommendations, an unavailable reviews surface, a Facebook block, invalid input, and a processing error.
Related actors
- Facebook Comments Scraper
- Google Maps Reviews Scraper
- Trustpilot Reviews Scraper
- Booking Reviews Scraper
- Shopify App Reviews Scraper
Support
Open an issue from the Actor page and include the run ID, input JSON, expected result, actual result, and one reproducible public Page URL.