Facebook Pages Scraper avatar

Facebook Pages Scraper

Pricing

$1.00 / 1,000 results

Go to Apify Store
Facebook Pages Scraper

Facebook Pages Scraper

All-in-one Facebook Pages scraper organized by scenarios: Page info, Posts, Comments from Page posts, Media, Reviews, Events, Content monitoring, or All-in-one. Works anonymously by default; optional cookies are only for pages your own account can view.

Pricing

$1.00 / 1,000 results

Rating

5.0

(2)

Developer

VortexData

VortexData

Maintained by Community

Actor stats

2

Bookmarked

62

Total users

27

Monthly active users

5 days ago

Last modified

Share

📘 Facebook Pages Scraper

Extract Facebook Page data from one or more pages in a single run. The Actor is organized as a set of concrete Facebook scraping scenarios: Page info, Posts, Comments from Page posts, Media, Reviews, Events, Content monitoring, or All-in-one. By default it collects everything most users expect: page details plus public posts, comments, photos, videos, reels, reviews, and events in one row per page. It works anonymously by default, and can optionally use cookies from your own Facebook session for pages your account is allowed to view.

You give the Actor a list of Facebook page URLs. It returns a simple one-row-per-page dataset, plus useful status, recovery, and authenticated-mode fields.


What does Facebook Pages Scraper do?

For every Facebook page you provide, the Actor collects the selected Page surfaces once. The Scraping scenario input decides which actor-style task to run:

ScenarioReplaces this kind of actorIncluded data
All-in-one Page scraperA bundle of Pages + Posts + Comments + Media + Reviews + Events actorsPage details, posts, comments from recent Page posts, photos, videos, reels, reviews, future events, past events
Page info / lead listFacebook Pages / page-info scraperPage details only: contacts, website, address, phone, email, category, rating, likes/followers, photos, transparency signals
Posts scraperFacebook Posts Scraper for Page URLsPage details and recent Page posts
Comments from Page postsComment scraper for recent posts discovered from Page URLsPage details, recent Page posts, public comments from inspected post permalinks
Media scraper: photos, videos, reelsFacebook photos/videos/reels actorPage details, photos, videos, reels
Reviews scraperFacebook Reviews Scraper for Page URLsPage details, reviews/recommendations when Facebook exposes them publicly
Events scraperFacebook Events Scraper for Page-hosted eventsPage details, future events, past events
Content monitoring: posts + comments + mediaSocial listening / competitor-monitoring actorPage details, posts, comments, photos, videos, reels
Auto-detect scenario from URLAPI migration from section URLs/posts/, /reviews/, /videos/, /reels/, or /events/ URLs choose the matching scenario; plain Page URLs fall back to All-in-one

Depending on the scenario, the row can contain:

  • 🏷️ Page details — title, page ID, handle, categories, intro, about text, confirmed owner, address, phone, email, website, WhatsApp, hours, rating (% recommend + review count), follower / likes / following counts, profile photo, cover photo, page creation date, linked Instagram, ad status, and more.
  • 📝 Recent posts — text, URL, publish timestamp, reactions / comments / shares counts, author, attached media.
  • Public comments - comment text, URL, timestamp, likes/replies counts, depth, author, and parent/post references from inspected post permalinks.
  • 🖼️ Photos — IDs and CDN URLs for the most recent uploads.
  • 🎥 Videos — title-less videos with description, play count, publish time, permalink.
  • 🎞️ Reels — short-form video URLs with timestamps.
  • Reviews — public recommendations (when the page has any).
  • 📅 Events — upcoming and past events with names, URLs, and venues.

By default each section is a nested array inside the main page record, so the dataset stays one row per URL and is easy to export to CSV/Excel.


Why use this Actor?

  • Anonymous by default. It works without Facebook cookies for ordinary public pages.
  • Optional authenticated mode. Paste cookies from your own logged-in Facebook browser session to collect pages that your account can view. Cookie values are treated as secret input and are never written to logs, dataset rows, or OUTPUT.
  • Compatible page rows by default. Compatible with the popular community Facebook Pages Scraper's page-centric result format, with extra status and diagnostics fields.
  • All-in-one by default for Facebook Pages. fullContent replaces multiple separate Page-focused Facebook actors in one run, including a capped public-comments pass, without making extra Facebook requests for repeated exports.
  • Fast metadata when needed. Set scrapeMode to pageDetailsOnly for lead/contact enrichment without content-section fetches.
  • Cheap unavailable handling. When Facebook says a page is missing or refuses to render it, the Actor returns a clear not_available row and reason instead of spending extra proxy traffic on partial fallback sources such as Ad Library, Wayback, or embeddable widgets.
  • Apify-native. Works with the standard startUrls input format, dataset views, schedules, integrations, and REST API.

Common use cases

  • Lead enrichment — pull contacts and rating signals for local-business pages.
  • Reputation monitoring — track review counts and overall rating over time.
  • Social-media tracking — collect recent posts, videos, and reels across competitor pages.
  • Event monitoring — list upcoming and past events for venues, restaurants, or brands.

How to use it

  1. Open the Actor on Apify and switch to the Input tab.
  2. Paste one or more Facebook page URLs into Start URLs (each entry is a {"url": "https://www.facebook.com/<handle>/"} object). You can also use the Page handles or IDs field with bare handles like copperkettleyqr or numeric page IDs — both formats are merged.
  3. Keep Scraping scenario as All-in-one Page scraper for a first run. Choose Page info / lead list for fast CRM enrichment, or choose a focused scenario such as Posts scraper, Comments from Page posts, Media scraper, Reviews scraper, or Events scraper when you know exactly which separate actor you are replacing.
  4. Pick Max items to collect (default 20) to cap how many content items are kept per Page. Business/contact info is collected once when Facebook exposes it.
  5. (Optional) Toggle Paginate available items (parseAllResults) to paginate older items when Facebook provides authenticated pagination tokens. In anonymous mode, the Actor keeps what the public initial HTML exposes but cannot force logged-out deep pagination.
  6. (Optional) Adjust Page concurrency (pageConcurrency) for large batches. The Actor defaults internally to 8 in both full-content and page-details modes; use 1 for sequential debugging, or raise it to 12-16 only when maximum throughput matters more than Facebook response stability.
  7. (Optional) Paste your own Facebook session cookies into Facebook cookies if you need authenticated mode.
  8. Click Save & Start.

The Actor manages proxies internally — no configuration is needed. Anonymous Page details use Residential US Proxy for the critical /about/ request, while posts, comments, media, reviews, events, and supplemental Page-detail routes use Datacenter US Proxy. This keeps Page metadata reliable without sending every large Facebook response through the more expensive residential pool.

When the run finishes, open Storage → Dataset to view, filter, or export the results as JSON / CSV / Excel / XML / HTML.


Input

FieldTypeRequiredDescription
startUrlsarray<{url}>yes¹List of full Facebook Page URLs. Each entry is {"url": "https://www.facebook.com/<handle>/"}. Groups are not supported. Numeric profile.php?id=... URLs and legacy /p/, /pages/, /people/, or slug-with-ID URLs are accepted as possible Page IDs, but personal profiles may return unavailable.
urlsarray<string>yes¹Alternative input — accepts handles (copperkettleyqr) or numeric IDs (100064027242849).
url, pageUrls, handles, pageIdsstring / arrayyes¹API-friendly aliases. Use these when migrating from another Actor or integration that sends a single URL, handles, or numeric page IDs under different key names.
dataPackage, scenario, taskstringnoActor-style scenario: fullContent (default all-in-one), leadEnrichment / page info, posts, comments, media, reputation / reviews, events, contentMonitoring, or auto.
scrapeModestringnoBackward-compatible alias for older integrations: fullContent or pageDetailsOnly. Prefer dataPackage for new runs.
sections, typearray<string> or comma stringnoAPI-only advanced override. Select a subset such as posts, comments, reviews, photos, videos, reels, or events; page details are always included. type is accepted for compatibility with focused Facebook actors.
maxResults, resultsLimitintegernoHow many items per section to keep (default 20, max 10000). resultsLimit is accepted for compatibility with Apify's focused Facebook Posts / Comments / Reels actors and takes precedence when both are sent.
startDate, endDatestringnoOptional inclusive posts date filter. Accepts YYYY-MM-DD, ISO timestamp, or relative values such as 7 days. Comments are fetched only for posts that remain after this filter.
onlyPostsNewerThan, onlyPostsOlderThanstringnoCompatibility aliases for startDate / endDate, matching the high-traffic Facebook Posts actor input style.
maxPosts, maxComments, maxPhotos, maxVideos, maxReels, maxReviews, maxEventsintegernoOptional per-section caps. Each one overrides maxResults only for that section.
maxCommentPostsintegernoHow many recent post permalinks to inspect for public comment bodies per page (default 2, max 100).
maxCommentsPerPostintegernoHow many public comments to keep from each inspected post permalink (default 5, max 100).
parseAllResultsbooleannoPaginate older section items when authenticated pagination tokens are available (default false). Anonymous runs are limited to the public initial HTML batch.
pageConcurrencyintegernoHow many input pages to scrape at the same time (range 1-16). Defaults internally to 12 in both full-content and page-details modes.
facebookCookiesstringnoOptional secret field for authenticated mode. Paste a Cookie header (c_user=...; xs=...) or a JSON cookie export. Must include c_user and xs.

¹ At least one of startUrls or urls must contain a value.

Example — minimal input

{
"startUrls": [
{ "url": "https://www.facebook.com/copperkettleyqr/" }
]
}

Example — multiple pages with a tighter cap

{
"startUrls": [
{ "url": "https://www.facebook.com/copperkettleyqr/" },
{ "url": "https://www.facebook.com/Microsoft/" }
],
"urls": [
"100064027242849"
],
"dataPackage": "contentMonitoring",
"maxResults": 20
}

Example - auto-detect a section URL

{
"dataPackage": "auto",
"startUrls": [
{ "url": "https://www.facebook.com/copperkettleyqr/reviews/" }
],
"maxResults": 25
}

Example - posts in a date range

{
"urls": ["Microsoft"],
"type": "posts",
"startDate": "2026-01-01",
"endDate": "2026-06-30",
"maxResults": 50
}

Optional authenticated mode with cookies

Use this only with a Facebook account you control or are authorized to use. Cookies act like a temporary session key; do not paste passwords, 2FA codes, or cookies from someone else's account.

Where to paste them:

  1. Open the Actor on Apify.
  2. Go to the Input tab.
  3. Scroll to Facebook cookies (optional).
  4. Paste either a raw Cookie header value or a JSON export.
  5. Start the run.

How to copy a Cookie header from Chrome / Edge:

  1. Log in to facebook.com in your browser.
  2. Open a Facebook Page that your account can view.
  3. Press F12 and open the Network tab.
  4. Reload the page.
  5. Click the first facebook.com document request.
  6. In Headers -> Request Headers, copy the value of Cookie.
  7. Paste that value into Facebook cookies (optional).

Expected format:

c_user=123456789; xs=...; fr=...; datr=...; sb=...

JSON exports from cookie extensions are also accepted:

[
{"domain": ".facebook.com", "name": "c_user", "value": "123456789"},
{"domain": ".facebook.com", "name": "xs", "value": "..."}
]

If the cookies are valid, the run log says Authenticated mode enabled, and dataset rows show resultStatus: "authenticated" when the main data came from that session. Cookies are sent only to facebook.com hosts. If Facebook logs the account out, rotates the session, or the account cannot view the target page, the Actor returns a not_available row and explains the result in resultSummary, nextAction, and OUTPUT.skippedPages.


Output

One record per input URL is pushed to the default Apify dataset. Each row starts with a readable status block (resultStatus, dataQuality, resultSummary, sourceSummary, contentCounts, nextAction) before the raw page fields. Per-section content lives in nested arrays.

Sample (truncated)

{
"resultStatus": "full_public",
"dataQuality": "Full",
"accessLevel": "public",
"resultSummary": "Full public page data collected: 22 posts, 8 photos, 6 videos, 3 reels.",
"sourceSummary": "Facebook public page",
"contentCounts": "22 posts, 8 photos, 6 videos, 3 reels",
"nextAction": "Ready to use.",
"url": "https://www.facebook.com/copperkettleyqr/",
"type": "page",
"facebookUrl": "https://www.facebook.com/copperkettleyqr/",
"pageUrl": "https://www.facebook.com/copperkettleyqr/",
"pageId": "100064027242849",
"facebookId": "100064027242849",
"pageName": "copperkettleyqr",
"displayName": "The Copper Kettle Restaurant",
"title": "The Copper Kettle Restaurant | Regina SK",
"intro": "Longstanding local restaurant. Mediterranean specialties...",
"info": [
"The Copper Kettle Restaurant, Regina. 3,212 likes",
"39 talking about this",
"1,136 were here. Longstanding local restaurant..."
],
"categories": ["Page", "Pizza place"],
"category": "Pizza place",
"likes": 3212,
"followers": 3212,
"followings": 341,
"talking_about": 39,
"were_here": 1136,
"rating": "94% recommend (202 Reviews)",
"ratings": "94% recommend (202 Reviews)",
"ratingOverall": 94,
"ratingCount": 202,
"phone": "+1 306-525-3545",
"email": "copperkettle.events@gmail.com",
"website": "http://www.thecopperkettle.online/",
"websites": [
"https://www.bing.com/maps/...",
"https://www.instagram.com/copperkettleyqr",
"http://www.thecopperkettle.online/"
],
"alternativeSocialMedia": "https://www.instagram.com/copperkettleyqr",
"instagram": [
{"username": "copperkettleyqr", "url": "https://www.instagram.com/copperkettleyqr"}
],
"address": "1953 Scarth Street, Regina, SK, Canada, S4P 2H1",
"addressUrl": "https://www.bing.com/maps/...",
"services": "Outdoor seating",
"business_services": "Outdoor seating",
"priceRange": "$$",
"business_price": "Price Range · $$",
"business_hours": "Open now",
"creation_date": "October 29, 2014",
"ad_status": "This Page is currently running ads.",
"confirmed_owner": "Example Organization is responsible for this Page.",
"CONFIRMED_OWNER_LABEL": "Example Organization",
"about_me": {
"text": "Long public About text when Facebook exposes it.",
"urls": []
},
"profilePictureUrl": "https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=100064027242849",
"profilePhoto": "https://www.facebook.com/photo/?fbid=...&set=a....",
"coverPhotoUrl": "https://lookaside.fbsbx.com/lookaside/crawler/media/?media_id=...",
"verified": false,
"posts": [
{
"type": "post",
"post_id": "1259602942850602",
"url": "https://www.facebook.com/copperkettleyqr/posts/...",
"message": "THE SASKATCHEWAN ROUGHRIDERS WIN THE 112TH GREY CUP! 🏆",
"timestamp": 1763349499,
"reactions_count": 10,
"comments_count": 0,
"reshare_count": 1,
"author": {"id": "100064027242849", "name": "...", "url": "..."},
"media": ["https://lookaside.fbsbx.com/..."]
}
],
"photos": [ /* … */ ],
"videos": [ /* … */ ],
"reels": [ /* … */ ],
"past_events":[ /* … */ ],
"scraped_at": "2026-05-09T08:12:34.567+00:00"
}

If a section has zero records (e.g. the page has no public reviews), that key is omitted from the record entirely — keeping the JSON tight.


Pricing and runtime

The Actor uses simple Pay Per Event pricing. One Facebook Page result event covers the complete dataset row and every section selected by the scenario; posts, comments, media, reviews, and events inside that row are not charged as separate events. From July 27, 2026, the flat price is $0.0055 per Page result ($5.50 per 1,000) plus Apify's minimum synthetic Actor-start event of $0.00005. Until that effective date, the previous $0.001 result price remains active during Apify's required notification period.

Most traffic uses Datacenter US Proxy. Only the critical anonymous Page-details /about/ request uses Residential US Proxy; large content and supplemental metadata responses remain on datacenter transport.

Typical runtime per URL:

WorkloadWall-clock
1 page, default fullContentusually 15-30 seconds with default section caps
100 pages, default fullContent~3-7 minutes, depending on Facebook/proxy latency
100 pages, scrapeMode=pageDetailsOnlytuned for stable metadata runs with pageConcurrency=8
parseAllResults=true on a busy pageminutes per page when authenticated pagination is available

Each request rotates through a fresh exit IP, so you don't have to pre-provision sticky sessions.


How it works (under the hood)

  1. Resolve every input URL / handle / numeric id to a canonical Facebook page URL.
  2. Process multiple pages at once, capped by pageConcurrency (default 8 for both fullContent and pageDetailsOnly).
  3. For each page, fetch Facebook page-details routes concurrently: /about/ (contact/category/rating metadata), /about_profile_transparency/ (creation date, ad status, confirmed owner), /about_details/ (long about text when present), and the page root / (profile photo viewer URL).
  4. In fullContent, fetch listing sections (posts, photos, videos, reels, reviews, future events, past events) in parallel. Low-yield public sections such as reels, reviews, and events use a shorter retry budget so empty tabs do not hold up large runs.
  5. Parse the embedded GraphQL JSON inside the HTML, extract structured records, and merge per-page results into one aggregate record.
  6. Strip empty arrays and null fields, then write one polished Page row with the selected scenario data nested inside it.

The Actor uses curl_cffi with Chrome TLS impersonation. In anonymous mode it uses the facebookexternalhit/1.1 user-agent — the same combination Facebook uses internally for link-preview crawling — to pull rich public page data without authentication. When facebookCookies is provided, it switches to a normal browser user-agent and sends those cookies only with Facebook requests so Facebook can render whatever that account is allowed to view.


Tips and best practices

  • Use default fullContent / All-in-one Page scraper when you want one Actor to replace separate page-info/posts/comments/media/reviews/events actors.
  • Use dataPackage=auto for API calls that already contain a section URL such as /posts/, /reviews/, /videos/, /reels/, or /events/; the Actor will collect only that Page surface plus page details.
  • Use startDate / endDate or onlyPostsNewerThan / onlyPostsOlderThan with posts runs to keep only posts in a date range. Public comments are fetched only for posts that pass the date filter.
  • Use pageDetailsOnly for high-volume lead/contact enrichment where content arrays are not needed.
  • Keep maxResults small (the default 20 is usually enough) when first testing new page lists.
  • Avoid parseAllResults=true unless you really need older items and are using cookies that expose pagination — busy pages with thousands of items can run for many minutes per page.
  • Run on a schedule for monitoring: the Apify Console lets you trigger this Actor every X hours and pipe new dataset items into webhooks, integrations, or your own infrastructure.

FAQ

Does this Actor scrape personal Facebook profiles or Groups? No. It is for Facebook Pages only. /groups/ URLs are rejected. Numeric profile.php?id=... URLs and older page URL shapes such as /p/<name>-<id>/, /pages/<name>/<id>/, and /people/<name>/<id>/ are accepted as possible Page IDs, but personal profiles are unsupported and will usually return an unavailable row rather than profile data.

Why are some fields like past_events[*].timestamp null? Facebook's bundle does not ship every field for every record. We fill what FB serves; missing fields are omitted entirely from the output to keep records clean. Authenticated mode can expose more data when your account is allowed to view it, but it still cannot create fields Facebook does not send.

When Facebook's /about/ route redirects to login but the already-fetched root Page bundle contains safe identity fields, the Actor keeps the row as partial_public and sets pageDetailsRecoveredFromRoot=true. That means no external fallback was used; the row simply preserves page ID/display name/category data Facebook already returned in the main Page document.

Can I provide just a page handle without the full URL? Yes. Use the Page handles or IDs input field for bare handles (copperkettleyqr) or numeric IDs (100064027242849).

Why do some Facebook-rendered labels look localised? Facebook can localise individual cards by edge node or route. The Actor normalises compatibility fields where locale would otherwise change meaning, for example priceRange is always a stable dollar-style tier such as $$, while business_price keeps Facebook's raw rendered text.

Can it scrape pages with limited access? In anonymous mode it cannot read content that Facebook only shows after login or to a specific audience. To avoid extra proxy and compute cost, the Actor does not query Ad Library, Wayback, Page Plugin, or other partial fallback sources for those unavailable pages. For fuller access, paste cookies from a Facebook account that is allowed to view the page into Facebook cookies (optional). If that account cannot view the page either, the Actor returns a not_available row plus a detailed reason in OUTPUT.skippedPages.

What if a large run is close to timeout? The Actor writes progress checkpoints to OUTPUT while it runs. Use OUTPUT.sectionStats to see which sections took the most time in a bulk run. When Apify provides a platform timeout timestamp, the Actor stops starting new pages before that deadline (about 150 seconds on long runs, less on short smoke tests), saves partial results, and lists the remaining inputs in OUTPUT.notStartedPages. Increase the run timeout, increase memory if needed, or split the remaining URLs into a smaller batch.

Are cookies stored or printed anywhere? No. The raw cookie value is only used as request input. Logs and OUTPUT include only a safe summary such as 3 cookie(s): c_user, xs, fr; dataset rows only say whether cookies were used.

Is this legal? You are responsible for using this Actor in compliance with applicable laws, Facebook's terms, and the rules of your specific use case. Only collect and use data you are allowed to process.


Run programmatically

The Apify Console auto-generates ready-to-copy code samples for every language (Python, JavaScript, cURL, etc.) on the Actor's API tab. Open the Actor page, switch to API → Run Actor synchronously / asynchronously and copy the snippet pre-filled with your token and Actor name — no manual setup required.


Support

Open an Issue on the Actor's Apify page if you spot a bug, want a new field added, or have a custom-version request.