# Facebook Page Profile Scraper — Contact Info, Transparency (`foxlabs/facebook-page-profile-scraper`) Actor

Records of public Facebook Pages in bulk: name, category, verification, followers, phone, e-mail, website, address, open-now status, price range, rating and review count, social links, page transparency (created on, running ads, confirmed owner), optional contacts from the Page's website. No login.

- **URL**: https://apify.com/foxlabs/facebook-page-profile-scraper.md
- **Developed by:** [Berkan Kaplan](https://apify.com/foxlabs) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$8.00 / 1,000 page records

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?

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 Profile Scraper — Contact Info, Transparency 🚀

**foXLabs Facebook series:** [Page Posts](https://apify.com/foxlabs/facebook-page-posts-scraper) · [Post Comments](https://apify.com/foxlabs/facebook-post-comments-scraper) · [Page Reviews](https://apify.com/foxlabs/facebook-page-reviews-scraper) · [Page Videos](https://apify.com/foxlabs/facebook-page-videos-scraper) · [Page Events](https://apify.com/foxlabs/facebook-page-events-scraper)

🎉 Records of public Facebook Pages in bulk, exactly as Facebook shows them to a signed-out visitor — one row per Page with **name, category, verification, followers, phone, e-mail, every website, address, open-now status, price range, recommendation rate and review count, social links, pictures**, the **Page transparency** fields (created on, running ads now, who's responsible) and, optionally, **e-mails and phone numbers from the Page's own website**. No login, no cookies, no account of anyone. Built for contact lists and brand monitoring.

### 🔍 What is the Facebook Page Profile Scraper — and when should you use it?

Give this Actor a list of public Facebook Pages and it returns one clean firmographic row each — the contact section, the transparency tab and (optionally) contact details pulled from the Page's own website.

**Use it when you need:** B2B contact lists from Facebook Pages (phone, e-mail, website, address); brand monitoring (followers, verification, running-ads status); or who's behind a Page (transparency owner + creation date).

**Use something else when:** you need the Page's posts → [Page Posts](https://apify.com/foxlabs/facebook-page-posts-scraper); its reviews → [Reviews](https://apify.com/foxlabs/facebook-page-reviews-scraper); its videos → [Videos](https://apify.com/foxlabs/facebook-page-videos-scraper); its events → [Events](https://apify.com/foxlabs/facebook-page-events-scraper).

### 🤖 Use with AI agents

**Already on the Apify MCP server?** Ask for this Actor by name: `foxlabs/facebook-page-profile-scraper`. An agent can discover it, run it and read the dataset over MCP.

**Real-time Standby API.** This Actor ships a Standby endpoint so an agent can fetch a Page's record on demand — `GET /page?page=NASA&transparency=1&website=0` returns the row immediately, billed with the same `page` event.

Otherwise paste this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

```
I want public Facebook Page profiles & contacts using the Apify Actor
`foxlabs/facebook-page-profile-scraper`.

Input: `pages` is a list of Pages (name, @handle, numeric id or URL); `includeTransparency`
adds the transparency tab; `enrichFromWebsite` pulls e-mails/phones from the Page's own site.
Each row has name, category, phone, email, website(s), address, followers, isRunningAds.

Start with:
{ "pages": ["NASA", "themet"], "includeTransparency": true }

Ask me which Pages to profile, run the Actor, then summarise them as a contact table.
```

The machine-readable API, MCP config and OpenAPI definition live at `apify.com/foxlabs/facebook-page-profile-scraper.md`.

### 📋 Overview

Everything you need to turn public Facebook Pages into clean firmographic + contact rows — in one Actor, with no login, cookies or account.

**Why teams pick this Actor:**

- ✅ **Contact-ready** — phone, e-mail, every website and address in one row.
- 🔎 **Transparency** — created-on date, running-ads status, the organisation Facebook names as responsible.
- 🌐 **Website enrichment** — optionally pull e-mails and phone numbers from the Page's own site.
- 🎯 **Honest nulls** — a value Facebook does not give is `null`, never `0`/`""` for "unknown".
- 💰 **Pay only for results** — one `page` event per delivered row; status rows and unreadable Pages are free.
- 🤖 **Agent-ready** — MCP + a real-time Standby API.

### ✨ Features

- 🔍 **Full Page record** — name, @username, category (all), verification, followers/following.
- 📞 **Contact section** — phone, e-mail, every website, address, open-now status, price range.
- ⭐ **Reputation** — recommendation rate and review count.
- 🔗 **Social links** — Instagram, X, YouTube, TikTok, LinkedIn, Threads, Pinterest.
- 🏛️ **Transparency** — `createdOn`, `isRunningAds`, `confirmedOwner`.
- 🌐 **Website enrichment (optional)** — `websiteEmails`, `websitePhones`, with a `found`/`unreachable`/`no-website` status.

### 🎬 Quick Start

```bash
curl -X POST "https://api.apify.com/v2/acts/foxlabs~facebook-page-profile-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"pages": ["NASA", "themet"], "includeTransparency": true}'
```

### 🚀 Getting Started (3 steps)

1. **Choose your Pages** — one per line: name, `@handle`, numeric id or URL.
2. **Pick depth** — keep `includeTransparency` on; turn on `enrichFromWebsite` for site contacts.
3. **Run and export** — get a clean dataset as JSON, CSV or Excel.

### 📥 Input

| Field | Default | What it does |
|---|---|---|
| `pages` | — | One Page per line: a name (NASA), @NASA, a numeric id, or a URL. A Page written twice is read once. |
| `includeTransparency` | true | Reads the Page transparency tab too: `createdOn`, `isRunningAds`, `confirmedOwner`. |
| `enrichFromWebsite` | false | Opens the Page's own website (home + contact/legal page) and adds the e-mails and phone numbers it publishes. |
| `proxyConfiguration` | residential Apify Proxy | Nothing to change for normal use. |

### 📤 Output

One row per Page (`type: "page"`). A value Facebook does not give is `null` — never `0`/`""`.

| Field | What it is |
|---|---|
| `name`, `username`, `url`, `pageId`, `userId` | name, @username, URL and the two ids |
| `category`, `categories` | the first category and all of them |
| `isVerified` | the blue badge |
| `followersText/Approx`, `followingText/Approx` | followers/following as text and as rounded numbers |
| `phone`, `email`, `website`, `websites`, `address` | the contact section |
| `hoursStatus` | "Open now" / "Closed now" |
| `priceRange` | "$$" and the like |
| `ratingText`, `ratingPercent`, `reviewCount` | recommendation rate and review count |
| `socialLinks` | Instagram, X, YouTube, TikTok, LinkedIn, Threads, Pinterest |
| `createdOn`, `isRunningAds`, `confirmedOwner` | the transparency tab |
| `profilePictureUrl`, `coverUrl` | the pictures |
| `websiteEmails`, `websitePhones`, `websiteStatus` | with `enrichFromWebsite` |
| `type`, `error` | `page`, or `status` + `error` for a free row explaining an empty line |

```json
{
  "type": "page",
  "name": "NASA - National Aeronautics and Space Administration",
  "url": "https://www.facebook.com/NASA",
  "category": "Government organization",
  "isVerified": true,
  "followersText": "28M followers",
  "followersApprox": 28000000,
  "email": "public-inquiries@hq.nasa.gov",
  "website": "http://www.nasa.gov/",
  "websites": ["http://www.nasa.gov/", "https://www.nasa.gov/nasa-app/"],
  "createdOn": "2009-03-04",
  "isRunningAds": false,
  "confirmedOwner": "NATIONAL AERONAUTICS AND SPACE ADMINISTRATION",
  "input": "NASA"
}
```

A business Page like The Met fills the other half: `phone` "+1 212-535-7710", `address` "1000 5th Ave, New York, NY 10028", `hoursStatus` "Open now", `ratingPercent` 100, `reviewCount` 119567.

### 💼 Use cases

**1. B2B contact lists** — turn a list of Facebook Pages into phone/e-mail/website/address rows.
*Input:* target Pages, `enrichFromWebsite` on. *Output:* contact fields per Page. *Use:* feed a CRM or outreach.

**2. Brand & competitor monitoring** — track followers, verification and whether a Page is running ads.
*Input:* competitor Pages, scheduled weekly. *Output:* firmographic rows over time. *Use:* watch presence and ad activity.

**3. Due diligence** — who's behind a Page and when it was created.
*Input:* Pages, `includeTransparency` on. *Output:* `confirmedOwner` + `createdOn`. *Use:* verify a brand's provenance.

### 🔗 Integration

**JavaScript / Node.js**

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('foxlabs/facebook-page-profile-scraper').call({
  pages: ['NASA', 'themet'], includeTransparency: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0]);
```

**Python**

```python
from apify_client import ApifyClient
client = ApifyClient('YOUR_TOKEN')
run = client.actor('foxlabs/facebook-page-profile-scraper').call(
    run_input={'pages': ['NASA', 'themet'], 'includeTransparency': True}
)
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)
```

Written for `apify-client` 3 for Python, where `call()` returns a run object; with version 1 or 2 it returns a dict — write `run['defaultDatasetId']` there.

**Automation (n8n / Zapier / Make):** schedule or webhook → HTTP request to the Actor API with your `pages` → handle the JSON dataset → push to a sheet, CRM or dashboard.

### 📊 Pricing

Pay per event: **`page`** for every delivered Page row — whatever it carries. The price is on the Pricing tab. Nothing else is charged: no start fee, nothing for a status row, nothing for a Page that could not be read, nothing extra for the transparency tab or the website look-up.

### ❓ FAQ

**Do I need a Facebook account, login or cookies?** No. It reads only what Facebook shows a signed-out visitor on public Pages.

**Where do the contacts come from?** The Page's own contact section, plus (with `enrichFromWebsite`) the Page's website — never private data.

**Can I get opening hours?** Only "Open now"/"Closed now" — the weekly schedule is not on the visitor's page.

**Can I export to CSV / Excel / JSON?** Yes — directly from the Apify dataset.

**What happens for a bad Page?** You get a free status row saying why (not a Page, no such Page, signed-in only) — not charged.

### 🐛 Troubleshooting

- **Few contact fields** — big brands rarely publish a phone/e-mail/address on Facebook (measured: 6 of 20 did); the fields are returned only when present, never faked.
- **`websiteStatus: unreachable`** — the Page's site answers 429 or blocks a plain request (metmuseum.org did); the row says so instead of pretending.
- **Wording varies by exit** — "Government organization"/"organisation" and differently-formatted phones were both seen for one Page on different addresses.
- **A Page returns a status row** — it's a personal profile, group, or signed-in-only Page (free, not charged).

**How it reads Facebook:** opens the contact tab and the transparency tab as a signed-out visitor, reading the records they carry. Facebook serves public Pages to residential addresses only, so Apify Proxy residential is used by default; rate-limited exits are dropped and replaced. With `enrichFromWebsite` the Page's site is opened directly (no proxy), home + contact/legal page, 20 s each. Every run starts with a one-call check and ends with a clear message if Facebook's queries changed. A Page's tab HTML can be up to 14 MB, so the run uses 1 GB of memory.

### ⚠️ Trademark

Independent, third-party tool. Not affiliated with, endorsed by or connected to Meta Platforms, Inc. "Facebook" and related marks belong to their owners and are used here for identification only.

### ⚖️ Is it legal to scrape this data?

It reads only what Facebook shows a signed-out visitor, about Pages (businesses and organisations). Contact details are what the Page and its website publish for the public; personal data is protected by the GDPR and similar laws (and marketing law), so only collect and process it with a legitimate basis. The Actor does not log in, use anyone's account or cookies, or solve CAPTCHAs. See Apify's blog post on the legality of web scraping.

### 🤝 Support & contact

- 🌐 **Website:** [data.foxlabs.com.tr](https://data.foxlabs.com.tr)
- 📧 **Email:** info@foxlabs.com.tr
- 🐛 **Issues:** open a ticket in the Actor's **Issues** tab — include the run id; the run's `SOURCE_REPORT` record holds what was asked, what Facebook answered and why the run stopped.
- 🧰 **More clean data actors:** [Fox Labs on Apify](https://apify.com/foxlabs)

### Changelog

#### 0.1.3 — 2026-10-11 — the shared core of the family

- The shared core was updated with the Page Videos, Events and Reviews Actors; Page rows are unchanged.

#### 0.1.2 — 2026-10-11 — 1 GB, two Pages at once

- Reads two Pages side by side and asks for 1 GB of memory (a tab's HTML is up to 14 MB); the compute share of a Page's cost stays well under a tenth of a cent.

#### 0.1.1 — 2026-10-11 — memory on long lists, website clean-up

- Only the header and fields travel with a Page now (fixing out-of-memory on 20-Page runs); a Page naming its own Facebook address as its website gets no website from it; the same site named twice is one website.

#### 0.1.0 — 2026-10-11 — first release

- One record per public Facebook Page: name, username, category (all), verification, followers/following, phone, e-mail, website(s), address, open-now, price range, recommendation rate and review count, social links, pictures, ids; the transparency tab (`includeTransparency`); website contacts (`enrichFromWebsite`). Free status rows for lines that bring nothing; restarted runs continue without duplicates. Standby mode prepared; published in batch mode.

# Changelog

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

# Actor input Schema

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

One Page per line: a name (NASA), @NASA, a numeric id, or an address (https://www.facebook.com/NASA). The forms can be mixed; a Page written twice is read once. Only public Pages can be read — a Page Facebook shows to signed-in users only gets a free status row that says so.

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

One more page per Page: when the Page was created, whether it is running ads right now, and who Facebook names as responsible for it. Off: these three fields stay empty and each Page costs one page less.

## `enrichFromWebsite` (type: `boolean`):

Opens the website the Page names (its home page and, when it names one, its contact or legal-notice page) and adds the e-mail addresses and phone numbers that site publishes. Two pages per website at most, nothing else charged; a site that does not answer leaves the fields empty.

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

Nothing to change for normal use: the Actor reads Facebook through Apify Proxy residential addresses, the only kind Facebook serves its public Pages to (measured: residential 25 of 25 requests, datacenter 0 — sent to the login page). Set a proxy here to send every Facebook request through it instead. Websites are opened from the run's own address.

## Actor input object example

```json
{
  "pages": [
    "metmuseum",
    "NASA"
  ],
  "includeTransparency": true,
  "enrichFromWebsite": false
}
```

# Actor output Schema

## `dataset` (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 = {
    "pages": [
        "metmuseum",
        "NASA"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("foxlabs/facebook-page-profile-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 = { "pages": [
        "metmuseum",
        "NASA",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("foxlabs/facebook-page-profile-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 '{
  "pages": [
    "metmuseum",
    "NASA"
  ]
}' |
apify call foxlabs/facebook-page-profile-scraper --silent --output-dataset

```

## MCP server setup

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