# Facebook Pages Email Scraper: Business Leads & Phones (`scrape-lads/facebook-pages-scraper`) Actor

Facebook business email scraper. Get emails, phone numbers, websites and addresses from public Facebook Pages without login, plus followers, ads status and social links. Lead lists for agencies and sales. $4 per 1,000 Pages.

- **URL**: https://apify.com/scrape-lads/facebook-pages-scraper.md
- **Developed by:** [Scrape Lads](https://apify.com/scrape-lads) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.20 / 1,000 page results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
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 does Facebook Pages Email Scraper do?

**Facebook Pages Scraper** extracts **public business contact details from Facebook Pages without login**: **emails, phone numbers, websites, addresses**, categories, followers, "% recommend" ratings and review counts, verified badge, Page creation date, whether the Page is **currently running ads**, and linked **Instagram, TikTok, YouTube, X, LinkedIn, WhatsApp and Pinterest** profiles. Paste [Facebook](https://www.facebook.com) Page URLs, usernames or IDs and get one clean row per Page.

It can also open each Page's website to find **extra business emails** that are not on Facebook. No Facebook account, cookies or browser extension needed. It runs on the Apify platform, so you get API access, scheduling, integrations (Google Sheets, Zapier, Make, webhooks), residential proxy rotation and run monitoring out of the box.

### Why use this Facebook business email and leads scraper?

- **Lead generation**: build lists of local businesses (restaurants, salons, clinics, shops, agencies) with a contact email and phone number.
- **Sales prospecting**: see which Pages are **running Facebook ads right now**, a strong sign of marketing budget.
- **Enrich a CRM**: turn a column of Facebook links into emails, phones, websites, addresses and social profiles.
- **Competitor and brand research**: followers, talking-about counts, check-ins, recommendation rate and review counts.
- **Cheap and predictable**: **$4 per 1,000 Pages**, flat. Unavailable Pages are never charged.

### How to scrape Facebook Pages for emails and phone numbers

1. Click **Try for free** and open the **Input** tab.
2. Paste Facebook Page URLs (any tab of the Page works) or add usernames or numeric Page IDs.
3. Keep **Find more emails on the Page's website** on if you want the most emails.
4. Click **Start** and wait a few seconds per Page.
5. Download your leads as **Excel, CSV, JSON or HTML**, or send them to Google Sheets through an integration.

### Input

Everything is on the **Input** tab. Example:

```json
{
    "startUrls": [{ "url": "https://www.facebook.com/katzsdeli" }, { "url": "https://www.facebook.com/LevainBakery" }],
    "pages": ["glossier", "https://www.facebook.com/profile.php?id=100064806517961"],
    "maxResults": 100,
    "enrichWebsite": true,
    "includeTransparency": true,
    "includeUnavailable": false,
    "maxConcurrency": 5
}
```

| Field                 | Description                                                                                                                                         |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`           | Facebook Page URLs. `facebook.com/name`, `m.facebook.com/name`, `/about` tabs, `profile.php?id=`, `/pages/Name/ID` and `/p/Name-ID` links all work. |
| `pages`               | Usernames (`nasa`, `@cocacola`), numeric Page IDs or URLs. Merged with `startUrls` and de-duplicated.                                               |
| `maxResults`          | Stop after this many Page rows.                                                                                                                     |
| `enrichWebsite`       | Open the Page's website (and one contact page) for extra emails and social links.                                                                   |
| `includeTransparency` | Read creation date, "running ads" status and confirmed owner.                                                                                       |
| `includeUnavailable`  | Add a free `unavailable` row for inputs that are not public Pages, so your output lines up with your input list.                                    |
| `maxConcurrency`      | Pages processed in parallel (1 to 20).                                                                                                              |

### Output

One row per public Page. You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

```json
{
    "resultType": "page",
    "pageId": "89033874836",
    "pageUrl": "https://www.facebook.com/katzsdeli",
    "username": "katzsdeli",
    "name": "Katz's Delicatessen",
    "categories": ["Deli"],
    "intro": "New York City's most iconic deli.",
    "followers": 947387,
    "talkingAbout": 72561,
    "checkins": 529471,
    "recommendPercent": 98,
    "reviewsCount": 52501,
    "verified": false,
    "website": "http://katzsdelicatessen.com/",
    "email": "cs@katzsdelicatessen.com",
    "phone": "+1 212-254-2246",
    "address": "205 E Houston St, New York, NY, United States, 10002",
    "city": "New York",
    "country": "United States",
    "hoursStatus": "Open now",
    "services": ["Dine in", "Outdoor seating", "In-store collection"],
    "createdAt": "2009-06-12",
    "adsRunning": true,
    "pageOwner": "KATZ DELICATESSEN OF HOUSTON STREET INC",
    "instagramUrl": "https://www.instagram.com/katzsdeli",
    "xUrl": "https://x.com/KatzsDeli",
    "contactEmail": "cs@katzsdelicatessen.com",
    "contactEmailSource": "page",
    "websiteEmails": ["press@katzsdelicatessen.com"],
    "sourceInput": "https://www.facebook.com/katzsdeli",
    "scrapedAt": "2026-09-30T23:24:22.590Z"
}
```

### Facebook Page data fields

| Field                                                                                                               | Description                                                              |
| ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| `contactEmail`, `contactEmailSource`                                                                                | Best email for outreach and where it came from (`page` or `website`)     |
| `email`, `phone`, `website`, `websites`                                                                             | Contact details listed on the Facebook Page                              |
| `websiteEmails`                                                                                                     | Other emails found on the Page's website                                 |
| `address`, `city`, `country`, `mapUrl`                                                                              | Business address when the Page has a location                            |
| `name`, `username`, `pageId`, `profileId`, `pageUrl`                                                                | Page identity                                                            |
| `categories`, `intro`                                                                                               | Page categories and intro text                                           |
| `followers`, `likes`, `talkingAbout`, `checkins`                                                                    | Exact counts                                                             |
| `recommendPercent`, `reviewsCount`, `rating`, `ratingText`                                                          | Reviews ("98% recommend (52,501 reviews)")                               |
| `verified`                                                                                                          | Blue verified badge                                                      |
| `createdAt`, `adsRunning`, `pageOwner`                                                                              | Page transparency: creation date, currently running ads, confirmed owner |
| `hoursStatus`, `priceRange`, `services`                                                                             | Open/closed now, price range, services (dine in, delivery...)            |
| `instagramUrl`, `tiktokUrl`, `youtubeUrl`, `xUrl`, `linkedinUrl`, `whatsappUrl`, `pinterestUrl`, `otherSocialLinks` | Linked social profiles from the Page and its website                     |
| `profilePictureUrl`, `coverPhotoUrl`                                                                                | Images                                                                   |

### How much does it cost to scrape Facebook Pages?

Pay per result, no subscription:

- **$4 per 1,000 Pages** (`page-result`, $0.004 each)
- **$2 per 1,000** extra, only for Pages whose contact email was found on their **website** because the Facebook Page had none (`website-email-result`)
- $0.003 per run start

Pages that are not found, personal profiles and duplicates are free. 1,000 local business Pages with website enrichment typically cost $4 to $5. The Apify free plan's monthly credit covers roughly 1,000 Pages. Set **Maximum cost per run** and the Actor stops cleanly at that budget.

### Tips for better Facebook lead lists

- **Local businesses list emails and phones far more often than big brands.** In our tests 7 of 7 local businesses had a contact email, against about half of global brands.
- Keep website enrichment on: it finds emails on the business site when the Page has none.
- Turn off `includeTransparency` for a faster run when you do not need creation date or ads status.
- Paste links in any form; duplicates (the same Page as a username and as an ID) are merged and billed once.
- Lower `maxConcurrency` if you see many retries in the log.

### FAQ, disclaimers and support

**Do I need a Facebook account or cookies?** No. The Actor reads only what Facebook shows to logged-out visitors. It never logs in.

**Why is a field empty?** The Page did not publish it, or Facebook hides it from logged-out visitors. Weekly opening hours, for example, are only shown as "Open now" or "Closed now".

**Why was a Page marked unavailable?** It was removed or renamed, it is a personal profile, or it is age- or country-restricted (common for alcohol brands), which hides it from logged-out visitors.

**Can it scrape Facebook groups, posts, events or personal profiles?** No, it is built for public business and brand Pages.

**Is scraping Facebook legal?** This Actor collects only publicly available business information shown without login. You are responsible for how you use the data: follow Facebook's terms, GDPR, CAN-SPAM and other laws that apply to you, and do not use the data for spam. If you are unsure, ask a lawyer.

**Found a bug or need another field?** Open an issue on the **Issues** tab. Need a custom Facebook scraper or a bigger data pipeline? Get in touch through the Issues tab as well.

# Actor input Schema

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

Links to public Facebook Pages, for example https://www.facebook.com/nasa or https://www.facebook.com/profile.php?id=100064806517961. Any tab of the Page works.

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

Optional extra list: usernames (nasa, @cocacola), numeric Page IDs, or URLs. Combined with the URLs above and de-duplicated.

## `maxResults` (type: `integer`):

Stop after this many Page rows. Start small on your first run.

## `enrichWebsite` (type: `boolean`):

Open the website listed on each Page (and its contact page when needed) to collect extra emails and social profiles. A Page whose only email comes from its website is billed an extra website-email-result event.

## `includeTransparency` (type: `boolean`):

Read the Page transparency tab for the creation date, whether the Page is currently running ads, and the confirmed owner. Turn off for a faster run.

## `includeUnavailable` (type: `boolean`):

Add an "unavailable" row (not charged) for every input that was not a Page, was not found, or stayed blocked, so you can match the output back to your list.

## `maxConcurrency` (type: `integer`):

Pages processed in parallel. The default suits most runs; lower it if you see many retries.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/katzsdeli"
    },
    {
      "url": "https://www.facebook.com/LevainBakery"
    },
    {
      "url": "https://www.facebook.com/glossier"
    }
  ],
  "maxResults": 100,
  "enrichWebsite": true,
  "includeTransparency": true,
  "includeUnavailable": false,
  "maxConcurrency": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

# 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": [
        {
            "url": "https://www.facebook.com/katzsdeli"
        },
        {
            "url": "https://www.facebook.com/LevainBakery"
        },
        {
            "url": "https://www.facebook.com/glossier"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrape-lads/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": [
        { "url": "https://www.facebook.com/katzsdeli" },
        { "url": "https://www.facebook.com/LevainBakery" },
        { "url": "https://www.facebook.com/glossier" },
    ] }

# Run the Actor and wait for it to finish
run = client.actor("scrape-lads/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": [
    {
      "url": "https://www.facebook.com/katzsdeli"
    },
    {
      "url": "https://www.facebook.com/LevainBakery"
    },
    {
      "url": "https://www.facebook.com/glossier"
    }
  ]
}' |
apify call scrape-lads/facebook-pages-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,scrape-lads/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/CpSJXajchZDufX03s/builds/XereSbSC9yuLuGVOD/openapi.json
