Facebook Page Recommendations Scraper
Pricing
from $0.02 / 1,000 recommendation extracteds
Facebook Page Recommendations Scraper
Extract public Facebook Page recommendations and review summary data for reputation monitoring.
Pricing
from $0.02 / 1,000 recommendation extracteds
Rating
0.0
(0)
Developer
Automation Lab
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
1
Monthly active users
12 days ago
Last modified
Categories
Share
Extract anonymous public recommendation records from Facebook Page Reviews tabs.
Provide one or more public Page URLs and receive normalized records containing the reviewer, recommendation decision, text, displayed time, public post URL, engagement counts when visible, and Page-level reputation summary.
The Actor is designed for recurring reputation monitoring. It does not ask for Facebook credentials, cookies, or private account access.
What does Facebook Page Recommendations Scraper do?
The Actor opens each supplied public Facebook Page in Chromium and reads recommendation cards that Facebook exposes to logged-out visitors.
It:
- normalizes Page and
/reviewsURLs; - extracts individual public recommendation records;
- attaches the Page recommendation percentage and review count to every record;
- captures available public recommendation post permalinks (does not navigate to them);
- removes duplicate records within a snapshot using the legacy review ID;
- stops at your global
maxItemslimit; - fails clearly when no useful public records are visible.
It does not scrape private profiles, authenticate as a user, or accept account cookies.
Who is it for?
Reputation-management agencies
Track fresh customer experiences across client Pages and load normalized records into reporting pipelines.
Multi-location and franchise brands
Snapshot Page reputation metrics and recommendation text for selected brand or location Pages.
Social-listening teams
Combine public Facebook recommendations with review feeds from other channels for triage or sentiment analysis.
Researchers
Collect reproducible public observations with source URLs and scrape timestamps.
Why use this Actor?
- Public-only workflow: no private Facebook session is required or accepted.
- Record-level output: this is not only a Page metadata scraper.
- Page context included: each row carries the recommendation percentage and Page review count.
- Explicit failures: login-only, unavailable, challenged, and zero-public-record pages do not silently become successful empty datasets.
- Bounded browser work: scrolling and result volume have strict limits.
- Pipeline-ready: use JSON, CSV, Excel, API, webhooks, Make, Zapier, or MCP.
What data can you extract?
| Field | Meaning |
|---|---|
reviewId | Legacy Facebook post ID or hash including displayed time; preserved for compatibility |
stableReviewKey | Versioned Page-scoped post identity or author/decision/text hash excluding displayed time |
reviewUrl | Public recommendation post permalink, or null |
reviewerName | Public display name |
reviewerProfileUrl | Public profile URL when Facebook exposes one, otherwise null |
recommends | true for recommends and false for does not recommend |
text | Recommendation text |
timestampText | Timestamp exactly as displayed, such as 1h |
publishedAt | Absolute time when available; currently null for relative-only public cards |
reactionsCount | Visible reaction count, or null |
commentsCount | Visible comment count, or null |
pageName | Facebook Page name |
pageUrl | Canonical Page URL |
reviewsUrl | Canonical Reviews tab URL |
recommendationPercent | Visible Page recommendation percentage, or null |
reviewCount | Visible Page review count, or null |
followersText | Public follower summary, or null |
sourceUrl | Normalized input URL processed for this record |
scrapedAt | UTC collection timestamp |
How to scrape Facebook Page recommendations
- Open the Actor on Apify.
- Add one or more canonical public Facebook Page URLs.
- Choose the maximum number of recommendations.
- Keep the default scroll settings for a normal snapshot.
- Click Start.
- Open the default dataset to download JSON, CSV, Excel, XML, or RSS.
A simple input is:
{"startUrls": [{ "url": "https://www.facebook.com/target/reviews" }],"maxItems": 20,"maxScrolls": 4,"scrollWaitMillis": 1500}
Input parameters
startUrls
Required array of public canonical Facebook Page URLs. URLs may end at the Page slug or include /reviews; the Actor normalizes both forms.
Supported:
https://www.facebook.com/targethttps://www.facebook.com/target/reviews
Supply 1–50 entries as strings or { "url": "..." } objects. facebook.com, www.facebook.com, and m.facebook.com are accepted; query strings and trailing slashes are removed and canonical duplicates are scanned once. Credentials, ports, private/profile identifiers, reserved routes (login, groups, watch, marketplace), post/detail paths, non-Facebook hosts, and non-HTTPS URLs are rejected before the start charge. A syntactically valid slug is not proof of an accessible Page.
maxItems
Maximum records across all Pages. Allowed range: 1–500. Default: 20.
maxScrolls
Maximum bounded scroll attempts per Page. Allowed range: 0–20. Default: 4. Use 0 for only initially rendered records.
scrollWaitMillis
Wait after a scroll so newly exposed public cards can render. Allowed range: 500–5,000 milliseconds. Default: 1,500.
Output example
This anonymized abbreviated record illustrates the output field shape:
{"reviewId": "123456789","stableReviewKey": "fbrec:v1:4039bff3c4b0fb8de28c343ec8b612a17b8ea99d7c83407ad6d2a2eb3c96b930","reviewUrl": "https://www.facebook.com/exampleuser/posts/123456789","reviewerName": "Example Reviewer","reviewerProfileUrl": null,"recommends": false,"text": "This is an example delivery complaint.","timestampText": "1h","publishedAt": null,"reactionsCount": null,"commentsCount": null,"pageName": "Example Page","pageUrl": "https://www.facebook.com/examplePage","reviewsUrl": "https://www.facebook.com/examplePage/reviews","recommendationPercent": 32,"reviewCount": 37834,"followersText": "82M followers","sourceUrl": "https://www.facebook.com/examplePage/reviews","scrapedAt": "2026-07-27T04:40:45.109Z"}
Relative timestamps and counts change on Facebook. Treat this as a field-shape example, not a promise that the same recommendation remains first.
How much does it cost to scrape Facebook Page recommendations?
Pay per event pricing has two parts on the FREE tier:
- $0.005 once per run, deferred until the first useful recommendation is stored;
- $0.000041071 per successfully emitted recommendation.
Entirely blocked, login-only, challenged, unavailable, and empty runs charge neither custom event. Mixed runs charge one deferred start plus only useful, nonempty recommendations delivered to the default dataset; duplicates, failed attempts, retries and skipped Pages add no charges. Full recommendation bodies are stored before either custom event is charged. All event prices and tiers are unchanged. Platform usage limits still apply. Higher Apify pricing tiers receive lower per-recommendation prices.
The Actor checks that the remaining charge budget covers the next row and any deferred start before writing it. Insufficient budget stops the run with a failure and preserves previous rows. Storage or billing errors also remain fatal: an accessible row can be left free or partially charged after an interrupted operation, but the Actor does not bill a body that was not stored. A run-owned BILLING_STATE checkpoint guards resurrection: completed rows are not appended or charged again, and start is not repeated. An incomplete checkpoint or mismatch with stored rows/current charge counts fails closed rather than retrying ambiguous writes or charges. Dataset writes and billing are not an atomic transaction; start a new run instead of repeatedly resurrecting an ambiguous one.
Examples at FREE-tier event prices:
| Useful output | Event price |
|---|---|
| 1 recommendation | $0.005041071 |
| 10 recommendations | $0.00541071 |
| 100 recommendations | $0.00910710 |
Actual availability and runtime vary because Facebook controls anonymous delivery.
Monitoring workflow examples
Daily reputation snapshot
Schedule the Actor daily, set a webhook on successful runs, and upsert rows by stableReviewKey in your warehouse. Preserve reviewId for existing joins; migrate upserts explicitly rather than replacing historical IDs. Keys start with fbrec:v1: and prefer public post identity. Without a permalink they hash canonical Page, normalized author, decision, and text—not relative time or engagement. Edited text changes fallback identity; distinct identical-content reviews may collide. This is not a universal Facebook ID.
Multi-location review triage
Supply several location Pages, filter new rows where recommends is false, and route them to a customer-experience queue.
Cross-channel analysis
Export recommendation text and Page summary fields to BigQuery, Snowflake, Google Sheets, or a sentiment-classification workflow.
Tips for reliable results
- Use canonical Page slugs rather than shared or shortened links.
- Start with a small
maxItemswhile validating a Page. - Keep
maxScrollsconservative; logged-out Facebook often exposes only a small public sample. - Schedule snapshots rather than expecting a complete historical archive from one anonymous visit.
- Deduplicate recurring snapshots by
stableReviewKey, respecting the fallback limitations above. - Preserve
scrapedAtandsourceUrlfor auditability.
Limitations and failure behavior
Facebook decides which recommendation cards are available to logged-out visitors. Availability varies by Page, country, time, and Facebook experiments.
The Actor does not promise every historical review. It only emits records visible on the public anonymous surface during the run.
A run fails rather than returning a misleading empty success when all requested Pages are unavailable, challenged, login-only, or expose zero public recommendation records.
If at least one Page succeeds, valid rows are preserved. Read Page coverage report in the Output tab or RUN_SUMMARY in the default key-value store to distinguish successful, failed, and unattempted skipped_item_limit Pages. The report is persisted even when all attempted Pages fail. A successful Page means a useful public sample, not complete history. Records are not guaranteed chronological or newest-first. Temporary HTTP 429/5xx and network failures receive at most one retry per navigation; deterministic 4xx and challenge/no-record outcomes do not receive repeated retries.
Example coverage (separate from dataset rows; no recommendation charge):
{"schema": "facebook-recommendations-run-summary/v1","requestedPageCount": 3,"normalizedPageCount": 3,"emittedCount": 1,"itemLimitReached": true,"pages": [{ "reviewsUrl": "https://www.facebook.com/exampleOne/reviews", "status": "failed", "emittedCount": 0, "reason": "no_public_records" },{ "reviewsUrl": "https://www.facebook.com/exampleTwo/reviews", "status": "successful", "emittedCount": 1, "reason": null },{ "reviewsUrl": "https://www.facebook.com/exampleThree/reviews", "status": "skipped_item_limit", "emittedCount": 0, "reason": "global_item_limit" }]}
Fetch it with client.keyValueStore(run.defaultKeyValueStoreId).getRecord('RUN_SUMMARY') after the JavaScript API call below. Failure reasons are safe categories (challenge, unavailable, no_public_records, transient_navigation_exhausted, http_error, page_error), not raw browser content. Invalid input or fatal startup/storage errors may prevent creation of a coverage report.
Images, videos, and fonts are blocked because they are unnecessary for textual recommendation extraction.
Use the Apify API with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~facebook-page-recommendations-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://www.facebook.com/target/reviews"}],"maxItems":10}'
To wait and retrieve dataset items:
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~facebook-page-recommendations-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"startUrls":[{"url":"https://www.facebook.com/target/reviews"}],"maxItems":10}'
Use the Apify API with JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/facebook-page-recommendations-scraper').call({startUrls: [{ url: 'https://www.facebook.com/target/reviews' }],maxItems: 10,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Use the Apify API with Python
import osfrom apify_client import ApifyClientclient = ApifyClient(os.environ["APIFY_TOKEN"])run = client.actor("automation-lab/facebook-page-recommendations-scraper").call(run_input={"startUrls": [{"url": "https://www.facebook.com/target/reviews"}],"maxItems": 10,})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(items)
Use Facebook recommendations through MCP
Add the Actor to Claude Code:
claude mcp add --transport http apify \"https://mcp.apify.com?tools=automation-lab/facebook-page-recommendations-scraper"
Use the same HTTP server configuration in Claude Desktop, Cursor, or VS Code MCP settings:
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=automation-lab/facebook-page-recommendations-scraper"}}}
Example prompts:
- “Collect up to 20 public recommendations from this Facebook Page and summarize recurring complaints.”
- “Compare public recommendation percentages across these three brand Pages.”
- “Return only new negative recommendations not present in this list of review IDs.”
Integrations
Use Apify webhooks to start downstream processing when a run succeeds. The default dataset works with Make, Zapier, Google Sheets, Slack, cloud storage, and database integrations.
For recurring monitoring, schedule runs in Apify Console and retain stableReviewKey for incremental processing plus reviewId for backward compatibility. Read RUN_SUMMARY to alert on missing locations, including successful runs with partial Page coverage.
Responsible use and legality
Scrape only public information and follow applicable laws, contracts, and Facebook terms. Do not use the output for harassment, discrimination, identity profiling, or attempts to access private accounts.
Reviewer names and profile links can be personal data. Establish a lawful purpose, collect only what you need, secure the output, honor deletion obligations, and apply appropriate retention limits.
This Actor is an independent automation tool and is not affiliated with or endorsed by Meta or Facebook.
Data handling, dependencies, and support
Runtime extraction is deterministic and uses no AI model or external AI service. References to MCP clients or downstream sentiment tools describe optional user integrations, not services called by this Actor.
Facebook receives the requested public Page URLs through Chromium. Apify hosts the run, logs, dataset, RUN_SUMMARY and the run-owned BILLING_STATE; no proxy or paid data API is used. Failed operations send sanitized diagnostic input, exceptions, and Actor/build/run IDs to our private GlitchTip service for repair. Secret fields and URL queries are removed; diagnostic reports are retained for 30 days. The publisher owns runtime dependencies and platform usage; users pay only the documented Store events subject to their Apify plan.
Public reviewer names, text, and available profile/post URLs are intentionally returned in the run's dataset, not logged or automatically published. Coverage reports contain canonical Page URLs and safe failure categories only. The browser session is ephemeral and closes after the run; this Actor creates no cross-run cache or named shared dataset. Dataset/KV/log retention follows your Apify account and storage settings, not an Actor-enforced deletion deadline. Keep runs private, restrict sharing, set a suitable retention period, and delete datasets/KV stores/runs in Apify Console or through its API when no longer needed. Deleting a run alone does not necessarily delete its storages or exported copies. You control downstream exports and deletion obligations.
For an Actor problem, open an issue on this Actor's Apify Store page with the sanitized input and a shareable run link. Never include credentials or private account data.
Troubleshooting
Why did the run say no public recommendation records were found?
The Page may not have a public Reviews tab, Facebook may be showing a login-only surface, the Page may be unavailable, or anonymous visibility may have changed. Confirm the canonical Page URL in a logged-out browser and retry later if the condition is temporary.
Why did I receive fewer rows than maxItems?
maxItems is a ceiling, not a guarantee. Logged-out Facebook frequently exposes a bounded public sample, and scrolling does not guarantee more records.
Why are engagement counts or profile URLs null?
Facebook does not show every field on every anonymous card. Nullable fields remain null rather than being guessed.
Can I provide my Facebook login or cookies?
No. The Actor intentionally supports public anonymous data only and has no credential input.
FAQ
Does the Actor scrape Facebook star ratings?
Facebook Page recommendations are generally expressed as recommends/does not recommend plus a Page recommendation percentage. The Actor reports those public fields; it does not invent star ratings.
Can I scrape multiple Pages?
Yes. Add up to 50 Page URLs. maxItems applies across the complete run.
Does it return old recommendations?
Only when Facebook exposes them to the anonymous rendered surface during the run. Use scheduled snapshots for ongoing monitoring.
Is each Page summary a separate charged row?
No. Page summary fields are attached to each recommendation. Only emitted recommendation records have the recommendation event charge.
Related automation-lab Actors
For broader public Facebook Page metadata rather than individual recommendation rows, use Facebook Pages Scraper.
Combine Page recommendations with other review-channel Actors in the automation-lab portfolio when your workflow needs cross-source reputation monitoring.
