# Facebook Business Page Lead Scraper (`maximedupre/facebook-page-lead-scraper`) Actor

Find public Facebook Pages by keyword or business category, or enrich Page URLs. Get structured lead records with Page details, public contact fields, and discovery context.

- **URL**: https://apify.com/maximedupre/facebook-page-lead-scraper.md
- **Developed by:** [Maxime Dupré](https://apify.com/maximedupre) (community)
- **Categories:** Lead generation, Social media, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.40 / 1,000 page leads

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### 🔎 Find public Facebook Page leads

Sales teams, agencies, and market researchers can discover public Facebook Pages or enrich known Page URLs. The Actor returns structured lead records with Page identity, public contact fields, business details, and the first discovery context, so you can build focused lead lists with less manual copying.

**Use cases**

- Find a public Page email with **[Facebook Page Email Scraper](https://apify.com/maximedupre/facebook-page-lead-scraper/examples/facebook-page-email-scraper)** for a contact list.
- Discover a public business Page with **[Facebook Business Page Scraper](https://apify.com/maximedupre/facebook-page-lead-scraper/examples/facebook-business-page-scraper)** for local research.
- Build one structured lead with **[Facebook Page Lead Scraper](https://apify.com/maximedupre/facebook-page-lead-scraper/examples/facebook-page-lead-scraper)** from a keyword, category, or URL.
- Collect Page details with **[Facebook Page Scraper](https://apify.com/maximedupre/facebook-page-lead-scraper/examples/facebook-page-scraper)** for a business review.
- Find a Facebook lead with **[Facebook Lead Scraper](https://apify.com/maximedupre/facebook-page-lead-scraper/examples/facebook-lead-scraper)** for sales research.

#### 📋 Public Facebook Page lead records

Each saved row represents one public Facebook Page lead. Rows can include Page identity, business details, public contact fields, audience counts, ratings, hours, image links, and the value that first led to the saved Page when Facebook exposes those details.

#### ▶️ Find or enrich Pages in one run

Choose one target mode for each run. Discover Pages by keyword, discover Pages by business category, or enrich submitted public Page URLs. The Actor saves the first eligible occurrence of a Page and ignores later encounters for that Page during the run. Set **Maximum lead records** to shorten a first check. Leave it empty to return all available results until the source is exhausted.

#### ⚙️ Input

Choose one `target` mode per run. Fields for the other modes are ignored.

**Input fields**

| Field | Type | What it does |
| --- | --- | --- |
| `target` | string | Select `keywordDiscovery`, `categoryDiscovery`, or `pageUrlEnrichment`. |
| `keywords` | array of string | Words or phrases used to discover Pages. Required for `keywordDiscovery`. |
| `businessCategory` | string | One business category used to discover Pages. Required for `categoryDiscovery`. |
| `pageUrls` | array of object | Public Facebook Page URL objects to enrich. Required for `pageUrlEnrichment`. |
| `pageUrls[].url` | string | One public Facebook Page URL to enrich. |
| `location` | string | Optional city, region, or country for keyword and category discovery. It is ignored for Page URL enrichment. |
| `emailDomains` | array of string | Optional email domains to keep in lead records. An empty list keeps all public business email addresses. |
| `categoryFilters` | array of string | Optional categories to keep on returned Pages. For category discovery, this adds a filter after the selected category. |
| `minimumRating` | number | Optional minimum public Page rating from 0 to 5. Pages below it are not kept. |
| `maxItems` | integer | Optional maximum number of lead records. Leave it empty to return all available results until the source is exhausted. |

**Successful input example**

This small example is copied from a successful current-beta keyword run.

```json
{
  "target": "keywordDiscovery",
  "keywords": [
    "plumber"
  ],
  "maxItems": 1
}
```

#### 🧾 Output

The Actor saves one structured object for each first eligible Page lead. Required fields are `pageName`, `pageId`, `pageUrl`, `pageType`, `discoveryMethod`, `discoveryValue`, and `leadQualityScore`. Other fields are optional and may be omitted when Facebook does not expose them.

**Output fields**

| Field | Type | What it does |
| --- | --- | --- |
| `pageName` | string | Public name of the Facebook Page. |
| `pageId` | string | Public Facebook Page identifier. |
| `pageUrl` | string | Canonical public URL for the Page. |
| `pageType` | string | Public Facebook entity type, such as `PAGE`. |
| `description` | string | Public business description or Page introduction. |
| `category` | string | Public business category on the Page. |
| `location` | string | Public address or location listed on the Page. |
| `emails` | array of string | Public business email addresses listed on the Page. |
| `phones` | array of string | Public business phone numbers listed on the Page. |
| `website` | string | External website listed on the Page. |
| `followerCount` | integer | Public follower count for the Page. |
| `likeCount` | integer | Public like count for the Page. |
| `rating` | number | Public Page rating. |
| `reviewCount` | integer | Public review count for the Page. |
| `businessHours` | array of object | Public opening hours entries for the business. |
| `businessHours[].day` | string | Day or status label for one hours entry. |
| `businessHours[].hours` | string | Public hours for that entry. |
| `isVerified` | boolean | Whether Facebook shows the Page as verified. |
| `priceRange` | string | Public price range shown on the Page. |
| `profileImageUrl` | string | Public profile image URL for the Page. |
| `coverImageUrl` | string | Public cover image URL for the Page. |
| `discoveryMethod` | string | Target mode that first led to the saved Page. |
| `discoveryValue` | string | First keyword, category, or Page URL that led to the saved Page. |
| `discoveryLocation` | string | Location used for discovery when one was submitted. |
| `leadQualityScore` | integer | Score from 0 to 100 based on the public business and contact details found. |

**Example lead row**

This complete public row comes from the successful current-beta keyword run.

```json
{
  "pageName": "1-Tom-Plumber Cincinnati",
  "pageId": "100063653035619",
  "pageUrl": "https://www.facebook.com/1tomplumber",
  "pageType": "PAGE",
  "discoveryMethod": "keywordDiscovery",
  "discoveryValue": "plumber",
  "leadQualityScore": 95,
  "isVerified": false,
  "description": "1-Tom-Plumber Cincinnati, Milford. 862 likes · 2 talking about this · 8 were here. 1-Tom-Plumber provides homeowners and businesses with plumbing and drain services 24/7/365.",
  "category": "Plumbing Service",
  "location": "24 Whitney Dr Suite A, Milford, OH, United States, 45150",
  "emails": [
    "info@1tomplumber.com"
  ],
  "phones": [
    "(513) 285-3955"
  ],
  "website": "https://www.1tomplumber.com/greatercincinnati/",
  "followerCount": 862,
  "likeCount": 862,
  "rating": 4.8,
  "reviewCount": 41,
  "businessHours": [
    {
      "day": "Current status",
      "hours": "Always open"
    }
  ],
  "priceRange": "Price Range · $$",
  "profileImageUrl": "https://scontent-dfw5-1.xx.fbcdn.net/v/t39.30808-1/311095927_526721856126244_708388401626019355_n.jpg?stp=cp0_dst-jpg_tt6&cstp=mx1251x1251&ctp=s60x60&_nc_cat=106&ccb=1-7&_nc_sid=11a88f&_nc_ohc=meGh5xcFRY8Q7kNvwHQjw-_&_nc_oc=Adpu8dQIZLdrp7xhvKH1y_y4SQbqcRgnEIlv0T3O2In9wJ_t1-m7xednnHxwHTl9qXg&_nc_zt=24&_nc_ht=scontent-dfw5-1.xx&_nc_gid=H-lMyi9FLrf9KpYIZB8O6g&_nc_ss=73180&oh=00_AQExPEUItfaoFzwjSIisn2aqDqZvUQdadMaO1uft6RWhMA&oe=6A92A963",
  "coverImageUrl": "https://www.facebook.com/photo/?fbid=1616556227142796&set=a.500734542058309"
}
```

#### 💳 Pricing

This Actor uses pay-per-event pricing. The current price is $0.0054 for each lead saved to the dataset. There is no separate run-start charge in the current pricing setup.

#### 🔌 Integrations

Use Apify Console exports or the Apify API to read the dataset rows in your workflow. You can also use Apify schedules and webhooks for repeat runs and completion actions.

https://www.youtube.com/watch?v=bNACk1\_S\_6w\&list=PLObrtcm1Kw6MUrlLNDbK9QRg8VDJg0gOW\&index=4

#### ❓ FAQ

##### Which target should I choose?

Choose `keywordDiscovery` to find Pages from words or phrases, `categoryDiscovery` to find Pages by one business category, or `pageUrlEnrichment` when you already have public Page URLs.

##### What happens when a Page matches more than one submitted value?

The first eligible occurrence is saved. Later encounters for that Page are ignored, and the saved row keeps the first discovery value.

##### What if a Page has no email, phone, or rating?

The Actor keeps the fields that Facebook exposes and omits unavailable optional fields. It does not invent missing contact or business details.

##### Can I leave Maximum lead records empty?

Yes. An empty value returns all available results until the source is exhausted.

##### Does location apply to Page URL enrichment?

No. Location applies to keyword and category discovery. Page URL enrichment ignores it.

##### Can I mix keyword, category, and Page URL work in one run?

No. Choose one target mode per run. Fields for the other modes are ignored.

##### Does the Actor access private Pages or other Facebook content?

No. It extracts lead data from public Facebook Pages only. Private or restricted content, posts, comments, groups, events, and Marketplace listings are outside its scope.

##### What does the lead quality score mean?

It is a 0 to 100 assessment based on the public business and contact details found for the Page.

### 📝 Changelog

**0.0: Initial release**

### 🆘 Support

For issues, questions, or feature requests, [file a ticket](https://console.apify.com/actors/maximedupre~facebook-page-lead-scraper/issues) and I'll fix or implement it in less than 24h 🫡

### 🔗 Related Actors

- [Facebook Page Transparency Scraper](https://apify.com/maximedupre/facebook-page-transparency-scraper): Review Page ownership, management, and ad transparency after finding a Page.
- [Facebook Reviews Scraper](https://apify.com/maximedupre/facebook-reviews-scraper): Collect public Page recommendations and reviewer details to add feedback context.
- [Website Emails Scraper](https://apify.com/maximedupre/website-emails-scraper): Find public emails on the business websites listed in Page leads.
- [Google Maps Shared List Scraper](https://apify.com/maximedupre/google-maps-shared-list-scraper): Compare Page leads with public place, phone, website, and rating data from saved lists.
- [Google Maps Phone Number Scraper](https://apify.com/maximedupre/google-maps-phone-number-scraper): Build an adjacent local phone list from Google Maps categories and locations.

**Made with ❤️ by Maxime Dupré**

# Actor input Schema

## `target` (type: `string`):

Choose one way to discover or enrich public Facebook business Pages.

## `keywords` (type: `array`):

Enter one or more words or phrases to find Pages. Required for Discover Pages by keyword. The other targets ignore this field.

## `businessCategory` (type: `string`):

Enter one business category to find Pages, such as restaurants. Required for Discover Pages by business category. The other targets ignore this field.

## `pageUrls` (type: `array`):

Add one or more public Facebook Page URLs to enrich. Required for Enrich Page URLs. The other targets ignore this field.

## `location` (type: `string`):

Optional place for Page discovery, such as a city, region, or country. It applies to both discovery modes. Page URL enrichment ignores it.

## `emailDomains` (type: `array`):

Optional email domains to keep in lead records, such as example.com. Leave this empty to keep all public business email addresses.

## `categoryFilters` (type: `array`):

Optional business categories for returned Pages. For category discovery, this adds a filter after the selected target category. Leave it empty to keep all matching categories.

## `minimumRating` (type: `number`):

Optional minimum public Page rating from 0 to 5. Keep only Pages with a public rating at or above this value.

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

Optional maximum number of lead records to return. Leave it empty to return all available results until the source is exhausted.

## Actor input object example

```json
{
  "target": "keywordDiscovery",
  "keywords": [
    "plumber"
  ],
  "maxItems": 1
}
```

# Actor output Schema

## `pageName` (type: `string`):

The public name of the Facebook Page.

## `pageId` (type: `string`):

The public Facebook Page ID. Use it to join or verify records.

## `pageUrl` (type: `string`):

The public Facebook Page URL. Use it to open the source Page.

## `pageType` (type: `string`):

The public Facebook entity type for this record.

## `description` (type: `string`):

The public business description or introduction on the Page.

## `category` (type: `string`):

The public business category on the Page.

## `location` (type: `string`):

The public address or location listed on the Page.

## `emails` (type: `string`):

Public business email addresses listed on the Page.

## `phones` (type: `string`):

Public business phone numbers listed on the Page.

## `website` (type: `string`):

The external website listed on the Page.

## `followerCount` (type: `string`):

The public number of followers for the Page.

## `likeCount` (type: `string`):

The public number of likes for the Page.

## `rating` (type: `string`):

The public rating shown for the Page.

## `reviewCount` (type: `string`):

The public number of reviews for the Page.

## `businessHours` (type: `string`):

The public opening hours shown for the business.

## `isVerified` (type: `string`):

Whether Facebook shows the Page as verified.

## `priceRange` (type: `string`):

The public business price range shown on the Page.

## `profileImageUrl` (type: `string`):

The public profile image URL for the Page.

## `coverImageUrl` (type: `string`):

The public cover image URL for the Page.

## `discoveryMethod` (type: `string`):

The target type that led to this Page.

## `discoveryValue` (type: `string`):

The first keyword, category, or Page URL that led to this record.

## `discoveryLocation` (type: `string`):

The location used for discovery when one was submitted.

## `leadQualityScore` (type: `string`):

A score based on the public business and contact details found.

# 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 = {
    "target": "keywordDiscovery",
    "keywords": [
        "plumber"
    ],
    "maxItems": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("maximedupre/facebook-page-lead-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 = {
    "target": "keywordDiscovery",
    "keywords": ["plumber"],
    "maxItems": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("maximedupre/facebook-page-lead-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 '{
  "target": "keywordDiscovery",
  "keywords": [
    "plumber"
  ],
  "maxItems": 1
}' |
apify call maximedupre/facebook-page-lead-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,maximedupre/facebook-page-lead-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/OsR1IV7EGCpUfe91f/builds/bNf34uCk3DlXVA8na/openapi.json
