Facebook Pages Scraper
Pricing
$1.00 / 1,000 results
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
Maintained by CommunityActor stats
2
Bookmarked
62
Total users
27
Monthly active users
5 days ago
Last modified
Categories
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:
| Scenario | Replaces this kind of actor | Included data |
|---|---|---|
| All-in-one Page scraper | A bundle of Pages + Posts + Comments + Media + Reviews + Events actors | Page details, posts, comments from recent Page posts, photos, videos, reels, reviews, future events, past events |
| Page info / lead list | Facebook Pages / page-info scraper | Page details only: contacts, website, address, phone, email, category, rating, likes/followers, photos, transparency signals |
| Posts scraper | Facebook Posts Scraper for Page URLs | Page details and recent Page posts |
| Comments from Page posts | Comment scraper for recent posts discovered from Page URLs | Page details, recent Page posts, public comments from inspected post permalinks |
| Media scraper: photos, videos, reels | Facebook photos/videos/reels actor | Page details, photos, videos, reels |
| Reviews scraper | Facebook Reviews Scraper for Page URLs | Page details, reviews/recommendations when Facebook exposes them publicly |
| Events scraper | Facebook Events Scraper for Page-hosted events | Page details, future events, past events |
| Content monitoring: posts + comments + media | Social listening / competitor-monitoring actor | Page details, posts, comments, photos, videos, reels |
| Auto-detect scenario from URL | API 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.
fullContentreplaces 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
scrapeModetopageDetailsOnlyfor 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_availablerow 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
startUrlsinput 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
- Open the Actor on Apify and switch to the Input tab.
- 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 likecopperkettleyqror numeric page IDs — both formats are merged. - 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.
- 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.
- (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. - (Optional) Adjust Page concurrency (
pageConcurrency) for large batches. The Actor defaults internally to8in both full-content and page-details modes; use1for sequential debugging, or raise it to12-16only when maximum throughput matters more than Facebook response stability. - (Optional) Paste your own Facebook session cookies into Facebook cookies if you need authenticated mode.
- 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
| Field | Type | Required | Description |
|---|---|---|---|
startUrls | array<{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. |
urls | array<string> | yes¹ | Alternative input — accepts handles (copperkettleyqr) or numeric IDs (100064027242849). |
url, pageUrls, handles, pageIds | string / array | yes¹ | 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, task | string | no | Actor-style scenario: fullContent (default all-in-one), leadEnrichment / page info, posts, comments, media, reputation / reviews, events, contentMonitoring, or auto. |
scrapeMode | string | no | Backward-compatible alias for older integrations: fullContent or pageDetailsOnly. Prefer dataPackage for new runs. |
sections, type | array<string> or comma string | no | API-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, resultsLimit | integer | no | How 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, endDate | string | no | Optional 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, onlyPostsOlderThan | string | no | Compatibility aliases for startDate / endDate, matching the high-traffic Facebook Posts actor input style. |
maxPosts, maxComments, maxPhotos, maxVideos, maxReels, maxReviews, maxEvents | integer | no | Optional per-section caps. Each one overrides maxResults only for that section. |
maxCommentPosts | integer | no | How many recent post permalinks to inspect for public comment bodies per page (default 2, max 100). |
maxCommentsPerPost | integer | no | How many public comments to keep from each inspected post permalink (default 5, max 100). |
parseAllResults | boolean | no | Paginate older section items when authenticated pagination tokens are available (default false). Anonymous runs are limited to the public initial HTML batch. |
pageConcurrency | integer | no | How many input pages to scrape at the same time (range 1-16). Defaults internally to 12 in both full-content and page-details modes. |
facebookCookies | string | no | Optional 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:
- Open the Actor on Apify.
- Go to the Input tab.
- Scroll to Facebook cookies (optional).
- Paste either a raw Cookie header value or a JSON export.
- Start the run.
How to copy a Cookie header from Chrome / Edge:
- Log in to
facebook.comin your browser. - Open a Facebook Page that your account can view.
- Press
F12and open the Network tab. - Reload the page.
- Click the first
facebook.comdocument request. - In Headers -> Request Headers, copy the value of
Cookie. - 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:
| Workload | Wall-clock |
|---|---|
1 page, default fullContent | usually 15-30 seconds with default section caps |
100 pages, default fullContent | ~3-7 minutes, depending on Facebook/proxy latency |
100 pages, scrapeMode=pageDetailsOnly | tuned for stable metadata runs with pageConcurrency=8 |
parseAllResults=true on a busy page | minutes 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)
- Resolve every input URL / handle / numeric id to a canonical Facebook page URL.
- Process multiple pages at once, capped by
pageConcurrency(default8for bothfullContentandpageDetailsOnly). - 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). - 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. - Parse the embedded GraphQL JSON inside the HTML, extract structured records, and merge per-page results into one aggregate record.
- Strip empty arrays and
nullfields, 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=autofor 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/endDateoronlyPostsNewerThan/onlyPostsOlderThanwith posts runs to keep only posts in a date range. Public comments are fetched only for posts that pass the date filter. - Use
pageDetailsOnlyfor high-volume lead/contact enrichment where content arrays are not needed. - Keep
maxResultssmall (the default 20 is usually enough) when first testing new page lists. - Avoid
parseAllResults=trueunless 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.