# Facebook Pages Scraper (`data_minds/facebook-pages-scraper`) Actor

Facebook Pages Scraper extracts emails, phones, likes, followers, business hours, social links and Ad Library data — scrape Facebook page details in bulk for lead generation, local business data and competitor research

- **URL**: https://apify.com/data_minds/facebook-pages-scraper.md
- **Developed by:** [Data Minds](https://apify.com/data_minds) (community)
- **Features:** Limited permissions
- **Stats:** 4 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

### What is Facebook Pages Scraper?

**Facebook Pages Scraper** is an Apify Actor for Facebook lead generation, competitor monitoring and influencer research. Paste public page links or usernames and it returns one row per page with name, category, likes, followers, rating, email, phone, website, address, business hours and social links, with no Facebook login. Export JSON, CSV or Excel. Pricing starts at $0.0035 per page result on the Gold plan, or $0.007 on the Free plan. [Try it free](https://apify.com/data_minds/facebook-pages-scraper)

Facebook Pages Scraper turns a list of public [Facebook](https://www.facebook.com) page links, usernames or numeric page IDs into a clean table of page details. You give it the pages; it gives you one row per page that you can download, schedule, or pull into your own tools through the Apify API.

Typical ways to use it:

- 🎯 **Facebook lead generation.** Build a local business lead list with email, phone, website and address for every page you scrape.
- 🔍 **Competitor monitoring on Facebook.** Re-run the same list on a schedule and compare followers, likes and rating between runs.
- 🤝 **Influencer research.** Shortlist pages by followers, verified badge, creation date and linked social profiles.
- 📊 **Market research data.** Group pages by category and compare audience size and price range across a niche.
- 🗂 **Business directory enrichment.** Add missing contact details and hours to a list of businesses you already have.
- 📢 **Ad Library link lookup.** Get the ad status and a ready-to-open Ad Library link for each page.

Because it runs on Apify, you also get the API, scheduling, webhooks, integrations with other apps and exports to JSON, CSV, Excel, XML and HTML.

#### What can Facebook Pages Scraper do?

- 📧 **Contact details in one row.** Use it as a Facebook page email scraper and contact info scraper: extract emails and phone numbers from Facebook business pages, together with website, address, map link and Messenger link. Get the Facebook page phone number and website in the same row.
- 📈 **Audience numbers.** Facebook page followers and likes count, plus following, talking-about count and check-ins, as plain integers with the display text kept next to them.
- ⭐ **Rating and reviews.** Facebook page rating and review count, with the recommendation percentage, when the page shows them.
- 🕐 **Business info.** Facebook page business hours and price range, plus category, intro text and listed services.
- 🔗 **Social links.** Facebook page social media links to Instagram, TikTok, X, YouTube, LinkedIn, Pinterest, Telegram, WhatsApp, Threads and Snapchat links when the page lists them.
- 📢 **Ad status and transparency.** Facebook page creation date and page transparency, confirmed owner, plus the ad status and Ad Library link. You can switch this off.
- ✅ **Verified badge.** A simple Facebook page verified badge checker through `isVerified`.
- 🧩 **Same fields for every page type.** Use it as a Facebook company page scraper for brand pages. It also works as a Facebook page data extractor and bulk scraper: the same fields come back for each page.
- ⚡ **Bulk and live.** Scrape Facebook pages in bulk. Each page is saved to the dataset as soon as it is ready, and duplicates are removed by default.

### What data can Facebook Pages Scraper extract?

Each run returns one JSON object per page. A field is `null`, an empty list or an empty object when the page does not publish it.

| Data | Fields |
|---|---|
| 🔎 Page identity (Facebook page username and page ID lookup) | `facebookUrl`, `url`, `pageUrl`, `pageName`, `pageId`, `page_id`, `facebookId`, `userId`, `type` |
| 🏷 Name and text | `title`, `name`, `category`, `categories`, `intro`, `bio`, `description`, `info` |
| 📈 Audience | `likes`, `likesCount`, `likesText`, `likesDisplay`, `followers`, `followersCount`, `followersText`, `followersDisplay`, `followings`, `followingCount`, `followingDisplay`, `talkingAboutCount`, `checkins` |
| ⭐ Rating | `rating`, `ratings`, `ratingOverall`, `ratingCount`, `ratingPercentage`, `ratingReviewCount` |
| 📇 Contact and location | `email`, `emails`, `phone`, `phones`, `website`, `websites`, `messenger`, `address`, `addressUrl`, `mapsAddress` |
| 🕐 Business info | `businessHours`, `business_hours`, `businessHoursRaw`, `priceRange`, `price_range`, `priceRangeText`, `priceRangeSymbol`, `business_price`, `businessPrice`, `services`, `business_services`, `businessServices` |
| 🖼 Media (Facebook page profile picture and cover photo URLs) | `profilePictureUrl`, `image`, `imageAlt`, `coverPhotoUrl`, `coverPhoto`, `cover_image`, `profilePhoto`, `profilePhotoUrl` |
| 🔗 Social links | `instagram`, `tiktok`, `twitter`, `youtube`, `linkedin`, `pinterest`, `telegram`, `whatsapp`, `threads`, `snapchat`, `alternativeSocialMedia`, `socialLinks` |
| 🏆 Status and transparency | `isVerified`, `verified`, `status`, `confirmedOwnerLabel`, `confirmed_owner`, `isBusinessPageActive`, `creation_date`, `pageCreatedYear`, `ad_status`, `pageTransparency`, `delegate_page_id` |
| 📢 Ad Library | `adPageId`, `pageAdLibrary`, `pageAdLibraryUrl` |
| ✅ Run status | `success`, `error`, `scrapedAt`, `additionalProperties` |

> **Note:** Many fields exist under more than one name so older exports keep working. `email`, `phone`, `website`, `address`, hours, price range and rating appear only when the page shows them. Turning off `fetchAboutSubpages` leaves most of the contact and transparency fields empty. Turning off `includeAdLibrary` empties the Ad Library fields and `ad_status`. Turning off `showVerifiedBadge` empties `isVerified` and `verified`.

#### What data can't Facebook Pages Scraper extract?

It does not collect posts, comments, review texts, photos beyond the profile and cover images, follower lists, or private and login-only pages. It does not search Facebook by keyword: you supply the pages.

### How to scrape Facebook page contact information

1. Create a free [Apify account](https://console.apify.com/sign-up) or log in.
2. Open [Facebook Pages Scraper](https://apify.com/data_minds/facebook-pages-scraper) in Apify Console.
3. Add page links in `startUrls`, or usernames and page IDs in `pages`. Use Bulk edit to paste a long list.
4. Optionally set `maxItems` for a quick test, pick a `language`, and switch the About details, Ad Library and verified badge options on or off.
5. Click Start and watch rows appear in the Output tab while the run is still going.
6. Open the Overview, Contact and Location or Business Info view, then download the dataset as JSON, CSV or Excel.

### How much does Facebook Pages Scraper cost?

Facebook Pages Scraper uses pay-per-event pricing: you pay for each page result, and the price per result drops on higher Apify plans. Apify platform usage is billed in addition.

| Apify plan | Price per page result | Price per 1,000 results |
|---|---|---|
| Free | $0.007 | $7.00 |
| Bronze | $0.00595 | $5.95 |
| Silver | $0.0049 | $4.90 |
| Gold | $0.0035 | $3.50 |

Each run also pays one Actor start event of $0.00005 per GB of memory, with a minimum of one. The default memory is 1,024 MB (1 GB), so a start costs $0.00005.

Worked example: scraping 1,000 pages on the Gold plan costs 1,000 x $0.0035 = $3.50 plus the $0.00005 start event, with platform usage billed in addition. On the Free plan, 100 pages cost 100 x $0.007 = $0.70.

Each page row saved to the dataset counts as one result, including a row marked `success: false`. If you set a maximum spend for the run in Apify, the run stops when it is reached and the results saved so far are kept.

#### Is scraping Facebook pages free?

You can try it for free: the $5 monthly credit on the Free plan covers about 714 page results at $0.007 each ($5 / $0.007), before platform usage. Beyond that you pay per result, and the price falls on Bronze, Silver and Gold. See the [pricing page](https://apify.com/data_minds/facebook-pages-scraper/pricing).

### Input

Facebook Pages Scraper needs only one input: at least one page in `startUrls` or `pages`. Everything else has a default. The default input below is valid as it is and returns data:

```json
{
  "startUrls": [
    "https://www.facebook.com/MrBean",
    "https://www.facebook.com/humansofnewyork"
  ],
  "pages": [],
  "language": "en-US",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

The full list of options is on the [input schema page](https://apify.com/data_minds/facebook-pages-scraper/input-schema).

| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| `startUrls` | array of strings | Yes | two example pages | Facebook page links. Also accepts `facebook.com/<username>`, `profile.php?id=`, `facebook.com/people/`, `facebook.com/pages/`, app share links (`facebook.com/share/<code>/`), `fb.me` short links and tab links such as `/<page>/posts/`. |
| `pages` | array of strings | No | empty | Extra pages as usernames, numeric page IDs or full links. Merged with `startUrls`. |
| `maxItems` | integer | No | `0` | Maximum number of pages to scrape. `0` means no limit. Range 0 to 100000. |
| `language` | string | No | `en-US` | Language of category names, ad status, dates and other labels. |
| `fetchAboutSubpages` | boolean | No | `true` | Also collect the About details: contact info, hours, price range, rating, creation date, ad status and owner. |
| `includeAdLibrary` | boolean | No | `true` | Add `pageAdLibrary`, `pageAdLibraryUrl` and `ad_status`. |
| `showVerifiedBadge` | boolean | No | `true` | Fill `isVerified` and `verified`. When off they stay empty. |
| `normalizeNumbers` | boolean | No | `true` | Return likes and followers as integers. When off they keep the display text. |
| `deduplicate` | boolean | No | `true` | Skip a page that appears more than once across your lists. |
| `proxyConfiguration` | object | No | `{"useApifyProxy": false}` | Optional proxy configuration. Leave the default unless pages repeatedly fail to load. |
| `concurrency` | integer | No | `5` | Pages fetched at the same time. Range 1 to 20. |
| `requestDelay` | number | No | `0.3` | Minimum pause in seconds between requests. Range 0 to 10. |
| `maxRetries` | integer | No | `3` | How many times a failed request is retried. Range 1 to 10. |
| `requestTimeoutSecs` | integer | No | `45` | Seconds before a single request is abandoned. Range 5 to 180. |

#### Pages and limits

- ✅ Good: `https://www.facebook.com/MrBean`, `humansofnewyork` or `100044139564343` (a numeric page ID).
- ✅ Good: a share link copied from the Facebook app, such as `https://www.facebook.com/share/1GozcyE5pW/?mibextid=wwXlfr`. It is followed to the page it points at.
- ❌ Bad: a link to a single post, reel, video or photo (`/share/r/…`, `/share/v/…`, `/reel/…`, `/watch/?v=…`), or to a group or event. These do not name a page and are saved as a failed row with an error message that says so.
- ❌ Bad: a link to another website, or text that is not a Facebook page. Such entries are saved as a failed row with an error message.
- ✅ Good: `maxItems` set to `10` for a quick test of a long list.
- ❌ Bad: expecting `maxItems` to cap spend. It limits how many pages are scraped; use the maximum spend setting in Apify to cap cost.

> **Warning:** A higher `concurrency` finishes faster but makes failed pages more likely. If you see warnings in the log, lower `concurrency` or raise `requestDelay`.

#### Language

Use it as a Facebook page scraper in multiple languages: `language` changes the text Facebook shows, so category names, ad status wording and date labels in the output follow it. Numeric counters are still parsed into integers when `normalizeNumbers` is on.

### Output

Results appear in the run's Output tab as they are scraped, and in the default dataset. Download them as JSON, CSV, Excel, XML or HTML, or read them through the API. The Output tab has these views: Overview, Contact and Location, Engagement and Stats, Business Info, Media, Social Links, Transparency and Ads, and Issues. When the run finishes, a combined JSON file with every row in input order is also saved to the key-value store under the key `OUTPUT`.

#### JSON example

This example continues the input above and lists every field name the Actor writes, with sample values. In a real row, fields the page does not publish are `null` or empty.

```json
{
  "facebookUrl": "https://www.facebook.com/example-page",
  "url": "https://www.facebook.com/example-page",
  "pageUrl": "https://www.facebook.com/example-page",
  "pageId": "100000000000001",
  "page_id": "100000000000001",
  "facebookId": "100000000000001",
  "userId": "100000000000001",
  "adPageId": "100000000000002",
  "delegate_page_id": "100000000000002",
  "pageName": "example-page",
  "name": "Example Page",
  "title": "Example Page",
  "type": "page",
  "categories": [
    "Local business",
    "Coffee shop"
  ],
  "category": "Local business",
  "info": [
    "12,345 likes",
    "12,900 followers"
  ],
  "intro": "Example intro text.",
  "description": "Example intro text.",
  "bio": "Example intro text.",
  "likes": 12345,
  "likesCount": 12345,
  "likesDisplay": "12K",
  "likesText": "12,345 likes",
  "followers": 12900,
  "followersCount": 12900,
  "followersDisplay": "12K",
  "followersText": "12,900 followers",
  "followings": 10,
  "followingCount": 10,
  "followingDisplay": "10",
  "talkingAboutCount": 210,
  "checkins": 530,
  "rating": "95% recommend (80 Reviews)",
  "ratings": "95% recommend (80 Reviews)",
  "ratingOverall": 4.8,
  "ratingCount": 80,
  "ratingPercentage": 95,
  "ratingReviewCount": 80,
  "address": "1 Example Street, Example City",
  "addressUrl": "https://example.com/map",
  "mapsAddress": "1 Example Street, Example City",
  "phone": "+1 555 0100",
  "phones": [
    "+1 555 0100"
  ],
  "email": "hello@example.com",
  "emails": [
    "hello@example.com"
  ],
  "messenger": "https://example.com/messenger",
  "website": "https://example.com",
  "websites": [
    "https://example.com"
  ],
  "alternativeSocialMedia": "https://example.com/social",
  "priceRange": "$$",
  "price_range": "$$",
  "priceRangeText": "Price range $$",
  "priceRangeSymbol": "$$",
  "services": "Example services",
  "business_hours": "Mon-Fri 09:00-17:00",
  "businessHours": "Mon-Fri 09:00-17:00",
  "businessHoursRaw": "Mon-Fri 09:00-17:00",
  "business_price": "$$",
  "businessPrice": "$$",
  "business_services": "Example services",
  "businessServices": "Example services",
  "profilePictureUrl": "https://example.com/profile.jpg",
  "image": "https://example.com/profile.jpg",
  "imageAlt": "Example Page profile picture",
  "coverPhotoUrl": "https://example.com/cover.jpg",
  "coverPhoto": "https://example.com/cover.jpg",
  "cover_image": "https://example.com/cover.jpg",
  "profilePhoto": "https://example.com/profile",
  "profilePhotoUrl": "https://example.com/profile",
  "isVerified": true,
  "verified": true,
  "status": "Active",
  "confirmedOwnerLabel": "Example Company",
  "confirmed_owner": "Example Company",
  "isBusinessPageActive": false,
  "creation_date": "January 1, 2015",
  "pageCreatedYear": 2015,
  "ad_status": "This Page is not currently running ads.",
  "pageTransparency": {
    "creation_date": "January 1, 2015",
    "ad_status": "This Page is not currently running ads.",
    "is_business_page_active": false,
    "confirmed_owner": "Example Company",
    "page_id": "100000000000002",
    "admin_country_count": null
  },
  "instagram": [
    {
      "username": "example",
      "url": "https://example.com/instagram"
    }
  ],
  "tiktok": [],
  "socialLinks": {
    "instagram": [
      "https://example.com/instagram"
    ]
  },
  "linkedin": "https://example.com/linkedin",
  "pinterest": null,
  "telegram": null,
  "twitter": "https://example.com/x",
  "youtube": "https://example.com/youtube",
  "whatsapp": null,
  "threads": null,
  "snapchat": null,
  "pageAdLibrary": {
    "id": "100000000000002",
    "is_business_page_active": false,
    "pamv_comms_data": null,
    "url": "https://example.com/ad-library"
  },
  "pageAdLibraryUrl": "https://example.com/ad-library",
  "additionalProperties": {
    "messenger": "https://example.com/messenger",
    "priceRange": "$$",
    "address": "1 Example Street, Example City",
    "category": "Local business"
  },
  "scrapedAt": "2026-01-01T12:00:00.000Z"
}
```

#### Notes and limitations

- A page that cannot be loaded still produces a row with `success` set to `false` and a short `error` message. Use the Issues view to find them.
- The run saves one row per page, not per post or review.
- Likes, followers and ratings are only returned when the page shows them. Facebook no longer shows a likes count to signed-out visitors on most pages, so `likes` is often `null` while `followers` is filled.
- Pages that need a login to view cannot be scraped. When Facebook shows the login form for the main page only, the Actor reads the page's About section instead and the row is still complete.
- Use the Contact and Location view to find the email address of a Facebook business page, when the page lists one.

### Tips and advanced usage

- Test first. Set `maxItems` to 5 or 10, check the Overview view, then run the full list.
- For faster runs on long lists, switch `fetchAboutSubpages` off if you only need names, likes, followers and photos. You then lose most contact and transparency fields.
- To schedule Facebook page scraping and monitor competitors, save a Task with your page list and run it daily or weekly, then compare `followers`, `likes` and `rating` between datasets.
- If many rows come back with `success: false`, run only those pages again later with a lower `concurrency`.
- The default of 5 pages in parallel is a good starting point (allowed range 1 to 20). Lower it if pages fail.

### Integrations and API

#### Can I use Facebook Pages Scraper as an API?

Yes. Start runs and read results with the [Apify API](https://docs.apify.com/api/v2) or the official apify-client libraries for Node.js and Python. Open the [API tab](https://apify.com/data_minds/facebook-pages-scraper/api) of the Actor for ready-made calls.

#### How to scrape Facebook pages with Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")

run = client.actor("data_minds/facebook-pages-scraper").call(run_input={
    "startUrls": [
        "https://www.facebook.com/MrBean",
        "https://www.facebook.com/humansofnewyork",
    ],
    "pages": [],
    "language": "en-US",
    "proxyConfiguration": {"useApifyProxy": False},
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item["title"], item["followers"], item["email"])
```

#### Can I integrate Facebook Pages Scraper with other apps?

Yes. Connect it to Make, Zapier, Google Sheets, Slack and other apps through Apify integrations, or trigger your own endpoint with [webhooks](https://docs.apify.com/integrations/webhooks). You can also run it on a schedule from Apify Console.

#### Can I use Facebook Pages Scraper with AI agents (MCP)?

Yes. Apify Actors can be used as tools by AI agents through the Apify MCP server. See the [MCP tab](https://apify.com/data_minds/facebook-pages-scraper/api/mcp) of this Actor for the connection details.

### Other Facebook and social media scrapers

| Actor | What it does |
|---|---|
| [Facebook Ads Library Scraper](https://apify.com/data_minds/facebook-ads-library-scraper) | Scrapes public ads from the Meta Ad Library by keyword, page or link: ad copy, creatives, landing pages and run dates. |
| [Facebook Event Scraper](https://apify.com/data_minds/facebook-event-scraper) | Scrapes public Facebook events in bulk: dates, places, attendance, tickets and organizers. |
| [Facebook Reels Scraper](https://apify.com/data_minds/facebook-reels-scraper) | Scrapes Facebook Reels from public pages, profiles or reel links: captions, play counts, reactions, comments and shares. |
| [Instagram Scraper](https://apify.com/data_minds/instagram-scraper) | Scrapes public Instagram profiles, posts, reels, comments and hashtags. |
| 🔗 [Facebook Page Contact Info Scraper](https://apify.com/data_minds/facebook-page-contact-info-scraper) | Scrape emails, phone numbers, websites, address, social links and follower counts from public Facebook pages. |

### FAQ

#### Is it legal to scrape Facebook pages?

Collecting public data is permitted in many places, but the rules depend on your country, the data and how you use it. Personal data such as emails and phone numbers may fall under privacy laws. This is not legal advice. Read [Is web scraping legal?](https://blog.apify.com/is-web-scraping-legal/) and consult a lawyer for your case.

#### How does Facebook Pages Scraper work?

You supply public page links, usernames or page IDs, choose the options you want, and start the run. The Actor reads each public page, collects the fields it shows, and saves one row per page to the dataset while the run is still going. You then download or fetch the results.

#### Can I scrape Facebook pages without a Facebook account?

Yes. You do not provide a Facebook account, password or cookies. Facebook Pages Scraper returns what a visitor can see on a public page without logging in. Pages that require a login to view, such as restricted or private ones, are saved as failed rows with an error message instead of data.

#### Why scrape Facebook page data?

Teams extract emails and phone numbers from Facebook business pages to build local business lead lists, monitor competitors, shortlist influencers, enrich business directories and gather market research data. Pages publish contact details, hours, categories, follower counts and linked social profiles in one place, which is faster to collect in bulk than by copying each page by hand.

#### Why does a Facebook page have no email in the results?

A field stays empty when the page does not publish that detail. Many pages show no email or phone at all. Check that `fetchAboutSubpages` is on, because contact details come from the About details. If the page shows an email in your browser but the row is empty, rerun it and report it in the Issues tab.

#### Why did I get fewer results than I expected?

The most common reasons are duplicate entries removed by `deduplicate`, a `maxItems` limit, a maximum spend setting that stopped the run, or pages that failed. Failed pages are still saved as rows with `success` set to `false` and an `error` message, so filter the dataset on `success` first.

#### How to download Facebook page data to Excel or CSV?

Open the finished run, go to the Output or Storage tab, choose Export, and export Facebook page data to CSV or Excel (JSON is also available). You can pick a view such as Contact and Location to download only those columns. You can also fetch the same data through the API or send it to Google Sheets with an integration.

#### Facebook Pages Scraper is not working. What should I do?

First check the run log and the `error` field of the failed rows. Then try a lower `concurrency` or a higher `requestDelay`, and rerun the failed pages later. If the problem continues, open a ticket in the [Issues tab](https://apify.com/data_minds/facebook-pages-scraper/issues/open) with the run link and a sample page.

### Support and feedback

- Found a bug or need a field added? Open a ticket in the [Issues tab](https://apify.com/data_minds/facebook-pages-scraper/issues/open).
- Need a custom solution or have a question? Email hello.dataminds@gmail.com.
- Built and maintained by the [data_minds](https://apify.com/data_minds) team on Apify.

Facebook Pages Scraper is an independent tool and is not affiliated with, endorsed by or sponsored by Meta or Facebook. You are responsible for using the data in line with the law and the terms of the platforms involved.

# Changelog

This Actor's version history is a separate document: https://apify.com/data_minds/facebook-pages-scraper/changelog.md

# Actor input Schema

## `startUrls` (type: `array`):

✨ One or more Facebook Page URLs — e.g. <code>https://www.facebook.com/MrBean</code>. Bulk input supported: click <strong>Bulk edit</strong> to paste a whole list (one per line) or link a text file. Works with <code>facebook.com/\<username></code>, <code>profile.php?id=…</code>, <code>facebook.com/people/…</code>, <code>facebook.com/pages/…</code>, app share links (<code>facebook.com/share/…</code>) and <code>fb.me</code> short links. Links to a single post, reel, video, photo, group or event are not pages and are reported as failed rows.

## `pages` (type: `array`):

Optional extra list — one entry per line, bulk-paste friendly. Accepts bare usernames (<code>humansofnewyork</code>), numeric page IDs (<code>100044139564343</code>) or full URLs. Merged with the URLs above.

## `maxItems` (type: `integer`):

Stop after this many pages (handy for a quick test run). <code>0</code> = no limit — scrape every page you provided.

## `language` (type: `string`):

Language Facebook renders the page in — changes the text of category names, ad status, dates and other labels in the output. Default: English (US).

## `fetchAboutSubpages` (type: `boolean`):

ON (recommended): also collects the page's About sections — email, phone, website, address, business hours, price range, services, rating, page creation date, ad status and confirmed owner. OFF: only the basic profile card (name, likes, followers, bio, photos) — roughly 3× faster per page.

## `includeAdLibrary` (type: `boolean`):

Adds the page's Ad Library ID, a ready-to-open Ad Library URL and the current ad-running status (<code>pageAdLibrary</code>, <code>pageAdLibraryUrl</code>, <code>ad_status</code>).

## `showVerifiedBadge` (type: `boolean`):

Report whether the page carries Facebook's blue verified badge (<code>isVerified</code> / <code>verified</code>). Turn OFF to leave those fields empty.

## `normalizeNumbers` (type: `boolean`):

ON: likes/followers are returned as plain integers (<code>141854789</code>) with the display text kept alongside (<code>likesText</code>: "141,854,789 likes"). OFF: the counters keep their original display text.

## `deduplicate` (type: `boolean`):

Skip a page that appears more than once across your URL and username lists (e.g. <code>facebook.com/MrBean</code> and <code>MrBean</code>). Recommended.

## `proxyConfiguration` (type: `object`):

🚦 Optional connection settings. The default works for most runs. Change it only if pages repeatedly fail to load; the run log tells you when that happens.

## `concurrency` (type: `integer`):

How many pages are fetched at the same time. Higher = faster, but more likely to trip Facebook's rate limits. 3–8 is a good range.

## `requestDelay` (type: `number`):

Minimum pause between any two requests across the whole run. Raise it if you see rate-limit warnings in the log.

## `maxRetries` (type: `integer`):

How many times a failed request is retried (with backoff) before giving up.

## `requestTimeoutSecs` (type: `integer`):

Give up on a single request after this many seconds.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/MrBean",
    "https://www.facebook.com/humansofnewyork"
  ],
  "pages": [
    "humansofnewyork",
    "nasaearth",
    "https://www.facebook.com/UNclimatechange"
  ],
  "maxItems": 0,
  "language": "en-US",
  "fetchAboutSubpages": true,
  "includeAdLibrary": true,
  "showVerifiedBadge": true,
  "normalizeNumbers": true,
  "deduplicate": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "concurrency": 5,
  "requestDelay": 0.3,
  "maxRetries": 3,
  "requestTimeoutSecs": 45
}
```

# Actor output Schema

## `pages` (type: `string`):

Every scraped Facebook Page, one JSON object per page with every field.

## `overview` (type: `string`):

Headline fields per page — name, category, likes, followers, rating, contact, ad status.

## `contact` (type: `string`):

Emails, phones, websites, Messenger, address and map link per page.

## `engagement` (type: `string`):

Likes, followers, following, talking-about, check-ins and rating per page.

## `business` (type: `string`):

Category, intro, business hours, price range and services per page.

## `media` (type: `string`):

Profile picture, cover photo and profile-photo permalink per page.

## `social` (type: `string`):

Instagram, TikTok, X, YouTube, LinkedIn and other linked profiles per page.

## `transparency` (type: `string`):

Page IDs, creation date, confirmed owner, ad status and Ad Library link per page.

## `issues` (type: `string`):

Scrape status and error message per page.

## `outputJson` (type: `string`):

Every page record from this run in one JSON array, in input order — the classic output.json shape — saved to the run's key-value store under the 'OUTPUT' key.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        "https://www.facebook.com/MrBean",
        "https://www.facebook.com/humansofnewyork"
    ],
    "pages": [],
    "language": "en-US",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("data_minds/facebook-pages-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "startUrls": [
        "https://www.facebook.com/MrBean",
        "https://www.facebook.com/humansofnewyork",
    ],
    "pages": [],
    "language": "en-US",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("data_minds/facebook-pages-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    "https://www.facebook.com/MrBean",
    "https://www.facebook.com/humansofnewyork"
  ],
  "pages": [],
  "language": "en-US",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call data_minds/facebook-pages-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,data_minds/facebook-pages-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Rt3Dxmg1wUSUa9hV2/builds/gX1fIl55GrtSjG56Z/openapi.json
