# Facebook Page Contact Info Scraper (`automation-lab/facebook-page-contact-info-scraper`) Actor

Extract public Facebook Page names, categories, websites, emails, phone numbers, addresses, social links, and Messenger links from supplied Page URLs.

- **URL**: https://apify.com/automation-lab/facebook-page-contact-info-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Social media
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.62 / 1,000 result extracteds

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/platform/actors/running/actors-in-store#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

## Facebook Page Contact Info Scraper

Build and refresh public business contact lists from Facebook Page URLs.
This Facebook scraper returns one clean record per Page with its public name,
category, website, email, phone, address, social profiles, and Messenger link.

It is designed for repeatable lead enrichment and contact audits, not for
personal profiles, private content, posts, groups, or Facebook contacts stored
inside a user account.

### What does Facebook Page Contact Info Scraper do?

Provide one or more public Facebook Page URLs and the Actor will:

1. validate and deduplicate the URLs;
2. open each public Page through Apify's shared proxy;
3. read public identity and About/contact surfaces;
4. normalize external website and social links;
5. save one typed dataset row for each successfully extracted Page;
6. timestamp each row so later runs can be compared.

Only fields publicly exposed by the Page are returned.
A missing email or phone is returned as `null`, not guessed or inferred.

### Who is it for?

#### Sales and lead-generation teams

Enrich a list of known business Facebook Pages with websites and public contact
channels before CRM import or outreach qualification.

#### Market researchers

Audit how brands publish contact information and compare category, description,
and linked channels across a defined set of Pages.

#### Agencies

Refresh client and prospect contact lists on an Apify schedule, then export the
results to a spreadsheet or data pipeline.

#### Data engineers

Call the Actor through the API, receive stable JSON fields, and connect the
default dataset to downstream enrichment or change-detection jobs.

### What data can it extract?

| Field | Type | Meaning |
| --- | --- | --- |
| `sourceUrl` | string | URL exactly as supplied |
| `url` | string | Canonical public Facebook Page URL |
| `pageId` | string or null | Numeric Page ID when exposed |
| `name` | string | Public Page display name |
| `category` | string or null | Public Page category |
| `description` | string or null | Public Page summary |
| `website` | string or null | External business website |
| `email` | string or null | Publicly listed email |
| `phone` | string or null | Publicly listed phone number |
| `address` | string or null | Publicly listed address |
| `socialLinks` | array | Instagram, X, YouTube, LinkedIn, or TikTok links |
| `facebookMessengerUrl` | string or null | Public Messenger contact link |
| `contactFieldsFound` | integer | Count of contact values found |
| `scrapedAt` | string | Extraction timestamp in ISO 8601 format |

Facebook Pages vary widely.
The Actor preserves null values so your workflow can distinguish unavailable
fields from extraction errors.

### How to extract Facebook Page contact info

1. Open the Actor input page.
2. Paste public Facebook Page URLs into **Facebook Page URLs**.
3. Set **Maximum Pages** to bound the run.
4. Start the run.
5. Open the **Dataset** tab and export JSON, CSV, Excel, XML, or RSS.

#### Small input example

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/cocacola" },
    { "url": "https://www.facebook.com/Starbucks" }
  ],
  "maxItems": 2
}
```

The Actor processes each unique URL once and stops after `maxItems` Pages.

### Input reference

#### `startUrls`

Required array of public `facebook.com` Page URLs.
Named Pages and `profile.php?id=...` Page URLs are accepted.
Personal profiles, posts, groups, Marketplace listings, and non-Facebook URLs
are rejected because they are outside this Actor's contract.

#### `maxItems`

Maximum number of unique Pages to process.
The allowed range is 1 to 1,000 and the default is 50.
Use a small value during workflow setup to bound runtime and charges.

### Output example

A current extraction of a public brand Page produces this shape:

```json
{
  "sourceUrl": "https://www.facebook.com/cocacola",
  "url": "https://www.facebook.com/Coca-Cola",
  "pageId": "100064277875532",
  "name": "Coca-Cola",
  "category": null,
  "description": "Coca-Cola. Public Page description…",
  "website": "https://www.coca-cola.com/",
  "email": null,
  "phone": null,
  "address": null,
  "socialLinks": [],
  "facebookMessengerUrl": null,
  "contactFieldsFound": 1,
  "scrapedAt": "2026-08-06T06:05:51.887Z"
}
```

This example demonstrates nullability: the Page exposed a website but did not
expose an email, phone, or address in the rendered public surface.

### How much does it cost to extract Facebook Page contacts?

The Actor uses pay-per-event pricing.
There is one run-start charge and one result charge for each dataset row.
Failed Pages do not create result charges.

| Event | FREE | BRONZE | SILVER | GOLD | PLATINUM | DIAMOND |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| Run start | $0.005 | $0.005 | $0.005 | $0.005 | $0.005 | $0.005 |
| Page contact result | $0.008846 | $0.0076921 | $0.0059999 | $0.0046153 | $0.0030769 | $0.0021538 |

At the BRONZE tier:

- 1 result costs about **$0.0127** including the start event;
- 10 results cost about **$0.0819**;
- 100 results cost about **$0.7742**.

Apify platform usage and proxy transfer are included in the Actor's execution
economics; your effective event tier depends on your Apify plan.

### Build a business contact list

Use the Actor when you already have a list of Facebook Page URLs from research,
a directory, a CRM, or another dataset.
Export `name`, `website`, `email`, `phone`, and `address` to your lead table.
Use `sourceUrl`, `pageId`, or canonical `url` as the stable join key.

The Actor does not search Facebook by keyword.
For broad Page discovery, use a dedicated Facebook search workflow first and
pass the resulting Page URLs into this Actor.

### Refresh and monitor public contacts

Apify schedules can rerun the same input daily, weekly, or monthly.
Keep each run's `scrapedAt` value and compare the latest dataset with the prior
snapshot.
This supports change detection for websites, phone numbers, addresses, and
linked social profiles without claiming that the Actor itself sends alerts.

A common workflow is:

1. store the canonical Page URL in a CRM;
2. schedule this Actor weekly;
3. export each dataset to cloud storage;
4. compare current and previous rows;
5. review changed public details before updating CRM records.

### Export to spreadsheets and data pipelines

Dataset results can be downloaded as JSON, CSV, Excel, XML, or RSS.
Use Apify integrations to send rows to Google Sheets, Make, Zapier, Slack,
webhooks, or cloud storage.

For reliable joins, prefer `pageId` when available and fall back to `url`.
Do not use the display name as a unique identifier because Page names can change.

### Run through the Apify API

Replace `YOUR_TOKEN` with your Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~facebook-page-contact-info-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url":"https://www.facebook.com/cocacola"}],
    "maxItems": 1
  }'
```

#### JavaScript

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor(
  'automation-lab/facebook-page-contact-info-scraper'
).call({
  startUrls: [{ url: 'https://www.facebook.com/cocacola' }],
  maxItems: 1,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")
run = client.actor(
    "automation-lab/facebook-page-contact-info-scraper"
).call(run_input={
    "startUrls": [{"url": "https://www.facebook.com/cocacola"}],
    "maxItems": 1,
})

items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

### Use with MCP and AI agents

Add the Actor as an Apify MCP tool in Claude Code:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/facebook-page-contact-info-scraper"
```

#### Claude Desktop, Cursor, and VS Code setup

Claude Desktop, Cursor, and VS Code can use this MCP configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/facebook-page-contact-info-scraper"
    }
  }
}
```

#### Example prompts for MCP

After connecting the Apify MCP server, use prompts such as:

- “Extract the public contact details from these Facebook Page URLs.”
- “Refresh this brand list and return Pages whose website is present.”
- “Run the Facebook Page contact extractor for these three URLs and summarize
  which public contact fields are missing.”

The MCP client still needs authorization to run Actors in your Apify account.

### Reliability and retry behavior

Facebook is a dynamic and protected source.
The Actor uses Apify's shared proxy, transfers only the server-rendered document,
and keeps browser work sequential to reduce challenge rates and proxy transfer.

A failed Page is retried up to three times with a new bounded proxy session.
If at least one Page succeeds, successful rows are returned and failed URLs are
reported in the log.
If every Page fails, the run exits with a failure instead of silently returning
an empty dataset.

### Limitations

- Only public Facebook Pages are supported.
- The Actor does not log in and cannot access private or age-gated content.
- It does not discover Pages from names or search queries.
- Public fields differ by Page and viewer geography.
- Emails and phone numbers are never inferred or validated beyond extraction.
- A Page redesign can temporarily affect individual fields.
- The Actor does not scrape posts, comments, followers, ads, or personal contact
  lists.
- `contactFieldsFound` counts extracted values; it is not a quality or
  verification score.

### Troubleshooting

#### The result contains null contact fields

The Page may not publish those values to logged-out visitors.
Open the public Page while logged out and verify what is visible.
The Actor intentionally does not guess missing details.

#### A URL is rejected before the run starts

Check that it uses `facebook.com` and identifies a public Page.
Instagram links, Facebook posts, groups, and arbitrary websites are rejected.

#### Some Pages failed but others succeeded

Inspect the run log for each failed URL.
A Page may be unavailable, renamed, private, age-gated, region-restricted, or
temporarily challenged.
Retry only after verifying the URL and geography.

#### The whole run failed with no results

Confirm the URLs identify public Pages.
Use a small one-Page input to isolate the failing source before retrying a bulk
list.

### Responsible use and legality

Use this Actor only for lawful purposes and public business information you are
permitted to process.
Follow Facebook's terms, applicable privacy and marketing laws, data-minimization
principles, and opt-out obligations.

Do not use extracted contact details for spam, harassment, discrimination,
identity resolution, or decisions with legal or similarly significant effects.
Store only the fields needed for your legitimate workflow and remove stale data.

### Related Automation Lab Actors

- [Facebook Pages Scraper](https://apify.com/automation-lab/facebook-pages-scraper)
  adds follower, like, description, and optional recent-post fields when you need
  broader Page intelligence rather than a focused contact dataset.
- [Facebook Reviews Scraper](https://apify.com/automation-lab/facebook-reviews-scraper)
  is useful when your workflow needs public review records instead of Page
  contact details.

Choose this Actor for a compact, contact-focused record that is convenient to
join into a lead or business directory.

### Frequently asked questions

#### Does it require a Facebook login?

No. It extracts only data exposed by public Pages to logged-out visitors.

#### Can it find a Page from a company name?

No. Supply the Page URL explicitly.
Use a search or discovery product before this Actor if you do not have URLs.

#### Does it verify emails or phone numbers?

No. It reports the values publicly listed by the Page.
Validation and deliverability checks should be a separate workflow.

#### Can I schedule recurring runs?

Yes. Use Apify schedules with the same input and compare timestamped datasets.
The Actor performs extraction; comparison and alert delivery belong in your
connected workflow.

#### Why is Apify Proxy used?

Direct requests from the workspace IP returned an error page. A bounded Apify
shared-proxy session provides the public Page document without residential
transfer or login.

#### Are empty fields charged separately?

No. One `result` event covers the complete Page record, including nullable
fields. There is no separate charge per email, phone number, or social link.

# Actor input Schema

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

Public facebook.com Page URLs. Profiles, groups, posts, and private Pages are not supported.

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

Maximum number of unique Page contact records to process. Use this to bound runtime and cost.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/cocacola"
    },
    {
      "url": "https://www.facebook.com/Starbucks"
    }
  ],
  "maxItems": 2
}
```

# Actor output Schema

## `dataset` (type: `string`):

Facebook Page contact records saved by this run.

# 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/cocacola"
        },
        {
            "url": "https://www.facebook.com/Starbucks"
        }
    ],
    "maxItems": 2
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/facebook-page-contact-info-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/cocacola" },
        { "url": "https://www.facebook.com/Starbucks" },
    ],
    "maxItems": 2,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/facebook-page-contact-info-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/cocacola"
    },
    {
      "url": "https://www.facebook.com/Starbucks"
    }
  ],
  "maxItems": 2
}' |
apify call automation-lab/facebook-page-contact-info-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,automation-lab/facebook-page-contact-info-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/AxwMM5Q3UiKJ0ceLv/builds/EXiUYF6Wv9xMjJcFr/openapi.json
