Facebook Page Recommendations Scraper avatar

Facebook Page Recommendations Scraper

Pricing

from $0.02 / 1,000 recommendation extracteds

Go to Apify Store
Facebook Page Recommendations Scraper

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

Automation Lab

Maintained by Community

Actor 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 /reviews URLs;
  • 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 maxItems limit;
  • 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?

FieldMeaning
reviewIdLegacy Facebook post ID or hash including displayed time; preserved for compatibility
stableReviewKeyVersioned Page-scoped post identity or author/decision/text hash excluding displayed time
reviewUrlPublic recommendation post permalink, or null
reviewerNamePublic display name
reviewerProfileUrlPublic profile URL when Facebook exposes one, otherwise null
recommendstrue for recommends and false for does not recommend
textRecommendation text
timestampTextTimestamp exactly as displayed, such as 1h
publishedAtAbsolute time when available; currently null for relative-only public cards
reactionsCountVisible reaction count, or null
commentsCountVisible comment count, or null
pageNameFacebook Page name
pageUrlCanonical Page URL
reviewsUrlCanonical Reviews tab URL
recommendationPercentVisible Page recommendation percentage, or null
reviewCountVisible Page review count, or null
followersTextPublic follower summary, or null
sourceUrlNormalized input URL processed for this record
scrapedAtUTC collection timestamp

How to scrape Facebook Page recommendations

  1. Open the Actor on Apify.
  2. Add one or more canonical public Facebook Page URLs.
  3. Choose the maximum number of recommendations.
  4. Keep the default scroll settings for a normal snapshot.
  5. Click Start.
  6. 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/target
https://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 outputEvent 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 maxItems while validating a Page.
  • Keep maxScrolls conservative; 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 scrapedAt and sourceUrl for 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 os
from apify_client import ApifyClient
client = 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().items
print(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.

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.