# Facebook Page Contacts & Ad Status Scraper: Email & Phone (`neverempty/facebook-page-contacts-ad-status`) Actor

For agency lead lists and sales prospecting: paste Facebook Page URLs, get one row per Page with email, phone, address, website, Instagram, rating, exact followers, creation date and whether it is running ads. 16 of 25 local business Pages had an email on 2026-10-15. Export CSV or Excel.

- **URL**: https://apify.com/neverempty/facebook-page-contacts-ad-status.md
- **Developed by:** [NeverEmpty](https://apify.com/neverempty) (community)
- **Categories:** Lead generation, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.40 / 1,000 page returneds

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

## Facebook Page Contacts & Ad Status Scraper

Get the email, phone number, address and website of Facebook business Pages in bulk: paste a list of Page URLs and get one row per Page, ready to export as CSV, Excel or JSON. Each row also shows whether the Page is running ads right now (with its Ad Library link), when the Page was created, its rating and review count, and its exact follower count.

**Built for lead generation, agency prospecting and sales research**: you already have Page URLs from a spreadsheet, a directory or a search, and you need the contact details and a quick "is this business active and advertising?" signal next to each one. No Facebook account or cookies needed.

### What you get for each Page

| Column | Example (Katz's Delicatessen, run on 2026-10-15) |
|---|---|
| `title`, `category`, `categories` | Katz's Delicatessen · Deli · \["Page", "Deli"] |
| `email` | cs@katzsdelicatessen.com |
| `phone` | (212) 254-2246 |
| `address`, `addressMapUrl` | 205 E Houston St, New York, NY, United States … · Google Maps link |
| `website`, `websites` | http://katzsdelicatessen.com/ (the business's own address, ready to click) |
| `socialMedia`, `alternativeSocialMedia` | https://www.instagram.com/katzsdeli |
| `rating`, `ratingOverall`, `ratingCount` | 98% recommend (52,493 reviews) · 98 · 52493 |
| `priceRange`, `services`, `hoursStatus` | $$ · Dine-in, Outdoor seating, In-store pickup · Closed now |
| `followers`, `talkingAbout`, `wereHere` | 956812 · 39625 · 529903 (exact numbers, ready to sort and filter) |
| `creationDate`, `isRunningAds`, `adLibraryUrl` | 2009-06-12 · true · Ad Library link for the Page |
| `CONFIRMED_OWNER_LABEL` | KATZ DELICATESSEN OF HOUSTON STREET INC |
| `intro`, `isVerified`, `profilePictureUrl`, `coverPhotoUrl` | bio text, badge, images |
| `pageId`, `adLibraryPageId`, `pageUrl`, `pageName` | IDs and the Page address as Facebook names it |
| `redirectedFrom` | the URL you pasted, when the Page has moved to a new name |

In a run of 25 restaurant, bakery, bookstore and roofing Pages on 2026-10-15, 16 had an email, 13 a phone number, 11 a street address, 25 a website and 19 a rating; all 25 had a creation date and ad status.

### Why this one

- **Contacts and ad status in one row.** Email, phone, address, website, rating, hours and services sit next to the creation date, ad status, responsible organization and Ad Library link, so one export answers "how do I reach them?" and "are they spending on ads?".
- **Every row is the Page you asked for.** When a Page has moved to a new name, you get that Page with your original URL kept in `redirectedFrom`, so every row matches a line in your list.
- **Every URL you paste gets a row.** A Page row with the data, or a free row with a `status` and a `note` that says what happened, so you always know which entries to check.
- **Exact numbers.** Followers, talking-about and check-ins are the exact counts Facebook publishes for the Page, ready to sort and filter in a spreadsheet.
- **You pay only for Page rows.** Missing Pages, personal profiles and entries Facebook refused are free rows.
- **Any address format works.** Full URLs go in `startUrls`: `https://www.facebook.com/katzsdeli`, `https://m.facebook.com/katzsdeli/about`, `https://www.facebook.com/profile.php?id=…`, `https://www.facebook.com/people/Name/1000…/`, `https://www.facebook.com/p/Name-1000…/`, `https://www.facebook.com/<numeric ID>`. Usernames (`katzsdeli`), numeric Page IDs and addresses without `https://` go in `pageNamesOrIds`. The same Page entered twice, in any of these forms, is charged once; the repeat gets a free `already-returned` row that names the entry holding the data.
- **Fits your existing sheet.** Column names such as `facebookUrl`, `pageId`, `title`, `categories`, `info`, `likes`, `followers`, `rating`, `ratingOverall`, `ratingCount`, `email`, `phone`, `address`, `website`, `websites`, `intro`, `priceRange`, `services`, `alternativeSocialMedia`, `creation_date`, `ad_status`, `confirmed_owner`, `pageAdLibrary`, `profilePictureUrl` and `coverPhotoUrl` follow the names most Facebook Page datasets already use, so an existing sheet or pipeline keeps working.

### Input

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/katzsdeli" },
    { "url": "https://www.facebook.com/CollinsRoofing" }
  ],
  "pageNamesOrIds": ["NASA", "100064806517961"],
  "includeTransparency": true
}
```

- `startUrls`: full Page URLs starting with `https://`.
- `pageNamesOrIds`: usernames, numeric Page IDs, or addresses without `https://`. Both lists are read together, up to 2,000 Pages per run.
- `includeTransparency` (on by default): adds creation date, ad status, Ad Library ID and responsible organization. Turn it off for faster runs with the contact fields only.

### FAQ

#### How do I get the email and phone number from a list of Facebook business Pages?

Paste the Page URLs into `startUrls` and run. Each Page comes back as one row with `email`, `phone`, `address` and `website` filled wherever the Page lists them.

#### How can I check whether a Facebook Page is running ads?

Keep `includeTransparency` on. `isRunningAds` is `true` or `false` for each Page (empty when the Page shows no ad status), and `adLibraryUrl` opens the Page's ads in the Ad Library.

#### How do I find out when a Facebook Page was created?

With `includeTransparency` on, each row has `creationDate` (for example 2009-06-12), which helps tell long-running businesses from new ones.

#### Can I export the results to CSV or Excel?

Yes. Open the run's dataset and download it as CSV, Excel, JSON or XML, or read it from the API in your own tools.

#### Do I need a Facebook account, cookies or proxies?

No. Paste the URLs and run.

#### What happens if a Page was renamed or removed?

A renamed Page that Facebook forwards comes back as that Page, with the URL you pasted in `redirectedFrom`. A removed Page comes back as a free `not-found` row.

### Rows that are not Pages (free)

| `status` | Meaning |
|---|---|
| `not-found` | Facebook says the Page is not available (removed, renamed without a forward, or restricted). |
| `not-a-page` | The address is a personal profile. Nothing is collected from personal profiles. |
| `different-page` | Facebook answered with another Page. Nothing from it is returned. |
| `blocked` / `unreadable` | Facebook refused or did not answer for this entry. Run it again later. |
| `bad-input` | The entry is not a Facebook Page address (a group, an event, another site). |
| `budget-reached` | The run hit the maximum charge you set; the rest were not read or charged. |
| `already-returned` | The same Page as an earlier entry of the run; `sameAs` names the entry whose row has the data. |

Every free row has a `note` with the reason. The run log ends with a count of Page rows, which equals the number of charged events.

### Limitations

- Only the public information anyone can see without logging in is returned. Fields that need a logged-in account (posts, the full weekly opening hours, Messenger links, Wi-Fi and payment details from the old Page layout, people who like the Page) are not included.
- Personal profiles are skipped on purpose.
- Many Pages list only some contact fields, and large brand Pages list contacts less often (see the 25-Page run above).
- `likes` is filled only for Pages where Facebook still shows a like count; most Pages now show followers only.
- `hoursStatus` is the open/closed state at the time of the run.
- Image URLs are signed by Facebook and expire after some days; download them if you need to keep them.
- A Page that Facebook restricts by country or age can come back as `not-found`.

### Thanks for using this Actor

We build these tools for people who run them every day, and we improve them from what users tell us.

- **Missing a field, or need another filter?** Tell us in the **Issues** tab. If the data is there, we add it.
- **Found a bug or a wrong value?** Post the run ID in the **Issues** tab. Wrong data is the thing we fix first.

If this Actor saved you time, a short review helps other people find it.

# Actor input Schema

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

Full Page URLs starting with https://, one per line, for example https://www.facebook.com/katzsdeli or https://www.facebook.com/profile.php?id=100064806517961. Business, brand and organization Pages work; personal profiles come back as free not-a-page rows. If this and the field below are both empty, the run reads the example Page.

## `pageNamesOrIds` (type: `array`):

Pages given without a full URL, one per line: a username such as katzsdeli, a numeric Page ID such as 100064806517961, or an address without https:// such as facebook.com/katzsdeli. Read together with the URLs above; empty adds nothing.

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

Also read each Page's transparency section: the date the Page was created, whether it is running ads right now, the Page ID used by the Ad Library and the organization responsible for it. Off makes runs faster and returns the contact fields only.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/katzsdeli"
    }
  ],
  "includeTransparency": true
}
```

# Actor output Schema

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

One row per Facebook Page: name, URL, username and ID, categories, intro, email, phone, address, website, other social accounts, rating and review count, price range, services, open-now status, exact followers, talking about and check-ins, verified badge, creation date, ad status and Ad Library link, profile and cover photo. A Page that does not exist, a personal profile or a Page Facebook refused comes back as a free row that says why.

# 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"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("neverempty/facebook-page-contacts-ad-status").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" }] }

# Run the Actor and wait for it to finish
run = client.actor("neverempty/facebook-page-contacts-ad-status").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"
    }
  ]
}' |
apify call neverempty/facebook-page-contacts-ad-status --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neverempty/facebook-page-contacts-ad-status"
        }
    }
}
```

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/tpuRcLN9rx7BMOiN7/builds/bikLA8DKrIyM0N8Pz/openapi.json
