# Facebook Pages Scraper · No Login · $3.5/1k (`alfalfa/facebook-pages-scraper`) Actor

Scrape public Facebook pages and profiles: name, category, email, phone, website, address, likes, followers, rating, about text and recent posts. Same output fields as the official Facebook Pages Scraper, contact info included instead of billed separately. No login, from $3.50 per 1,000 pages.

- **URL**: https://apify.com/alfalfa/facebook-pages-scraper.md
- **Developed by:** [Alfalfa](https://apify.com/alfalfa) (community)
- **Categories:** Social media, Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 75.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 pages

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

## Facebook Pages Scraper (No Login)

Extract public data from **Facebook pages and profiles** in bulk: name, category, **email, phone, website, address**, likes, followers, rating, price range, opening status, profile and cover photo, Ad Library ID, and optionally the page creation date and whether the page is running ads. No Facebook account, login or cookies needed. **Same output fields as the official Facebook Pages Scraper** with contact info included, from **$3.50 per 1,000 pages** against their $12 plus $13. About 100 pages in three minutes on residential proxies, faster if you switch the full About text off.

Not affiliated with, endorsed by or connected to Meta Platforms, Inc. Facebook is a trademark of Meta.

### What you can do with Facebook page data

- **Lead generation**: turn a list of Facebook business pages into a contact list with email, phone, website and address. Filter by category, likes or rating and load the result into your CRM.
- **Facebook email extractor**: collect the public contact emails that businesses publish on their pages, without opening every page by hand.
- **Competitor and brand monitoring**: track likes, followers, rating and ad status of any set of pages on a schedule.
- **Data enrichment**: you have Facebook URLs in a spreadsheet and need the company name, category, website and phone next to them.
- **Local business research**: pizza places, dentists, gyms, hotels - any page with an address, opening status, price range and recommendation score.
- **Influencer and creator research**: public profiles return follower counts, work, education, location and verification badge.

### What data do you get

| Field | Example |
|---|---|
| `title`, `categories` | `The Copper Kettle Restaurant`, `["Page", "Pizza place"]` |
| `email`, `phone`, `website`, `websites` | `copperkettle.events@gmail.com`, `+1 306-525-3545`, `thecopperkettle.online` |
| `address` (with Google Maps link) | `1953 Scarth Street, Regina, SK, Canada https://maps.google.com/...` |
| `likes`, `followers`, `followings` | `3268`, `3200`, `386` |
| `rating`, `ratingOverall`, `ratingCount` | `94% recommend (201 reviews)`, `94`, `201` |
| `priceRange`, `services`, `hours` | `$$`, `Outdoor seating`, `Closed now` |
| `intro`, `about_me` | short bio and the full About text with its links |
| `posts` | recent posts with text, images, links and reaction, comment and share counts |
| `info` | Facebook's own summary lines |
| `profilePictureUrl`, `coverPhotoUrl`, `profilePhoto` | image URLs |
| `isVerified`, `alternativeSocialMedia` | `true`, `"https://www.instagram.com/copperkettleyqr"` |
| `pageId`, `pageName`, `pageUrl`, `pageAdLibrary` | IDs and the Ad Library page ID |
| `confirmed_owner`, `CONFIRMED_OWNER_LABEL` | organization behind a verified page |
| `personalProfile` (profiles only) | name, gender, work, education, city, hometown, relationship |
| `creation_date`, `ad_status`, `pageTransparency` (optional) | `October 29, 2014`, `This Page is currently running ads.` |

### How to scrape Facebook pages

1. Paste page or profile URLs into **Page or profile URLs** (one per line). A bare page name like `humansofnewyork` and `profile.php?id=...` URLs work too.
2. Optionally switch on **Page transparency** to add the creation date and ad status, or switch off **Full About text** if you only need contact details.
3. Click **Start**. Results are written to the dataset in batches of 50 and at the end of the run; export as JSON, CSV, Excel or XML, or read them through the API.

### Input

| Field | Type | Description |
|---|---|---|
| `startUrls` | array of `{ "url": ... }` | Facebook page or profile URLs, same format as the official Actor (plain strings work too). Sub-pages like `/about` or `/photos` are resolved to the page. Groups, events and single posts are skipped. |
| `scrapeAbout` | boolean | Read the full About text into `about_me`. On by default to match the official output; billed $2 per 1,000 pages that have one, so turn it off if you only need contact details. |
| `scrapeTransparency` | boolean | Add `creation_date`, `ad_status` and `pageTransparency`. Off by default, charged separately (see pricing). |
| `includeFailedPages` | boolean | Write a row with `url`, `inputUrl`, `error` and `errorDescription` for pages that fail, so you get one row per input. Off by default, and those rows are billed like any other result. |
| `maxConcurrency` | integer | Pages scraped in parallel (default 5). |
| `proxyConfiguration` | object | Residential proxies by default, included in the price. Optionally pick a country or use your own proxy servers. |

Example:

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/copperkettleyqr/" },
    { "url": "https://www.facebook.com/humansofnewyork" },
    { "url": "https://www.facebook.com/profile.php?id=100064027242849" }
  ],
  "scrapeTransparency": true
}
```

The official Facebook Page Contact Info Scraper input (`pages`) is accepted as well.

### Output

One dataset record per page, with the same field names the official Facebook Pages Scraper uses (see the switching section below for the handful of differences):

```json
{
  "facebookUrl": "https://www.facebook.com/copperkettleyqr/",
  "categories": ["Page", "Pizza place"],
  "info": [
    "The Copper Kettle Restaurant, Regina. 3,268 likes",
    "93 talking about this",
    "1,157 were here. Longstanding local restaurant. Mediterranean specialties, signature gourmet pizzas"
  ],
  "likes": 3268,
  "messenger": null,
  "title": "The Copper Kettle Restaurant",
  "pageId": "100064027242849",
  "pageName": "copperkettleyqr",
  "pageUrl": "https://www.facebook.com/copperkettleyqr",
  "intro": "Longstanding local restaurant. Mediterranean specialties, signature gourmet pizzas (Best of YQR for",
  "websites": [
    "https://maps.google.com/maps?q=1953+Scarth+Street%2C+Regina%2C+SK%2C+Canada%2C+Saskatchewan&hl=en",
    "http://www.thecopperkettle.online/"
  ],
  "email": "copperkettle.events@gmail.com",
  "phone": "+1 306-525-3545",
  "website": "thecopperkettle.online",
  "address": "1953 Scarth Street, Regina, SK, Canada, Saskatchewan https://maps.google.com/maps?q=1953+Scarth+Street%2C+Regina%2C+SK%2C+Canada%2C+Saskatchewan&hl=en",
  "rating": "94% recommend (201 reviews)",
  "ratingOverall": 94,
  "ratingCount": 201,
  "priceRange": "$$",
  "services": "Outdoor seating",
  "hours": "Closed now",
  "alternativeSocialMedia": "https://www.instagram.com/copperkettleyqr",
  "followers": 3200,
  "followings": 386,
  "profilePictureUrl": "https://scontent.xx.fbcdn.net/v/t39.30808-1/....jpg",
  "coverPhotoUrl": "https://scontent.xx.fbcdn.net/v/t39.30808-6/....jpg",
  "profilePhoto": "https://www.facebook.com/photo/?fbid=436705568473681&set=a.436705545140350",
  "isVerified": false,
  "facebookId": "100064027242849",
  "pageAdLibrary": { "is_business_page_active": false, "id": "851606664870954" },
  "creation_date": "October 29, 2014",
  "ad_status": "This Page is currently running ads.",
  "pageTransparency": { "pageId": "851606664870954", "adminInfo": [] },
  "about_me": {
    "text": "A downtown landmark housed in a heritage building designed circa 1920s.",
    "urls": []
  },
  "posts": [
    {
      "postId": "1506610744816486",
      "postUrl": "https://www.facebook.com/copperkettleyqr/posts/pfbid0v2yZgVaVh2neWgQsgggMSF5ciwWJdvPhYWwnfBai7wdvW9MggM53LhyjS46p7Jpl",
      "postDate": "2026-09-05T16:05:19.000Z",
      "postText": "Pizza for the People!",
      "postsImages": ["https://scontent.xx.fbcdn.net/v/t39.99422-6/797150353.png"],
      "postLinks": [],
      "postStats": { "likes": 5, "comments": 0, "shares": 3 },
      "postComments": { "count": 0 }
    }
  ],
  "inputUrl": "https://www.facebook.com/copperkettleyqr/"
}
```

Verified pages add `CONFIRMED_OWNER_LABEL` and `confirmed_owner`. Personal profiles add `personalProfile`:

```json
"personalProfile": {
  "name": "Mark Zuckerberg",
  "gender": "MALE",
  "work": ["Works at Biohub", "Founder and CEO at Meta"],
  "education": ["Studied Computer Science and Psychology at Harvard University"],
  "currentCity": "Lives in Palo Alto, California",
  "hometown": "From Dobbs Ferry, New York",
  "relationship": "Married to Priscilla Chan"
}
```

### Pricing

**From $3.50 per 1,000 pages** ($0.0035 per page), no start fee, platform usage and residential proxies included. Two optional add-ons are billed only for the pages that actually return the data: the **full About text** at $2 per 1,000 pages that have one, and **page transparency** (creation date, ad status, admin info) at $2 per 1,000. Pages that cannot be scraped are not charged unless you ask for their error rows. Set the maximum budget per run in the Actor settings; the scraper stops when it is reached.

#### What that buys you

Your Apify plan comes with a monthly usage allowance, and this Actor draws from it at a flat rate.

| Allowance you have | Pages it covers |
|---|---|
| $5, which is what the free plan includes | about 1,400 |
| $29 | about 8,300 |
| $199 | about 56,900 |

Nothing extra is deducted for platform compute or for the residential proxies. Both are already inside the price per page.

#### What you are never charged for

- Pages that never reach your dataset, including anything skipped by a filter or hidden by Facebook.
- An input that returns nothing at all.
- Compute time and proxy traffic.
- The full About text and the page transparency block are add-ons charged only for the pages that actually return them.

#### The cap is a cap

Result limits and the run budget are checked **before** a record is fetched, not after it has been stored, so a run cannot overshoot the number you type. Set the maximum cost per run in the Actor settings and the scraper works out how many pages fit and stops there.

For comparison, on the free plan the official Facebook Pages Scraper charges $12 per 1,000 pages and the official Facebook Page Contact Info Scraper another $13 per 1,000 results; both are cheaper on higher plans.

### Switching from the official Facebook Pages Scraper

1. Replace the Actor ID in your integration and keep the `startUrls` input.
2. Output field names are the same, including `about_me`, `messenger`, `posts` and the `confirmed_owner` pair. Five differences worth knowing:
   - `followers` is the number Facebook shows a visitor who is not logged in: exact below about ten thousand, rounded above it, so 1.1M comes back as 1100000. `likes` is always exact.
   - `creation_date` and `ad_status` arrive only with **Page transparency** switched on.
   - `websites` keeps the address exactly as the page stored it, so a page that saved `http://` returns `http://` where the official Actor shows `https://`.
   - `messenger` is always empty, because Facebook does not serve the m.me link to visitors who are not logged in. It is empty in the official Actor's own published samples too.
   - `wifi`, `payment` and `autoGeneratedPage` are never returned. They are declared in the official schema but absent from its own samples, and they are not shown to a visitor who is not logged in.
3. The official Facebook Page Contact Info Scraper input (`pages` with URLs or page names) works as is.

### Limitations

- Only data Facebook shows to a visitor who is not logged in. Pages restricted by age, country or the owner's settings return fewer fields or fail.
- Follower counts are the rounded values Facebook displays.
- `posts` holds only the handful of posts Facebook ships with the page itself. For a page's full history use [Facebook Posts Scraper](https://apify.com/alfalfa/facebook-posts-scraper).
- Groups are not pages and need a login; they are skipped.

### FAQ

#### Can I scrape emails from Facebook pages?

Yes. When a page publishes a contact email in its Intro, it is returned in `email`. Not every page does; phone numbers and websites are more common.

#### Does it work without a Facebook account?

Yes. No login, cookies or Facebook API key are needed and the scraper never touches your account.

#### Can I scrape Facebook profiles, not just pages?

Yes. Public profiles return name, follower count, verification badge, intro and the public work, education and location details in `personalProfile`.

#### How many pages can I scrape and how fast is it?

There is no fixed limit. Pages are scraped in parallel. Measured on ten mixed pages through residential proxies at the default concurrency of five: about three minutes per 100 pages with the default settings, and roughly two minutes per 100 with the full About text switched off, because that saves one request per page. Raise **Concurrency** for large lists.

#### Can I run it on a schedule or from my code?

Yes. Use Apify schedules, the API, webhooks, or integrations with Make, Zapier, n8n, Google Sheets and LangChain. The Actor is also available through the Apify MCP server for AI agents.

#### Is scraping Facebook pages legal?

The scraper collects only what Facebook shows publicly to anyone without logging in. Emails and phone numbers of businesses are contact details the page owners publish themselves. You are responsible for using the data lawfully (GDPR, CAN-SPAM and local rules); do not use contact data for unsolicited bulk messaging.

### More Facebook scrapers by Alfalfa

All four read only what Facebook shows a signed-out visitor, use the same field names as the official Apify Actors, and charge only for records that reach your dataset.

| Actor | What it returns | Price |
|---|---|---|
| [Facebook Events Scraper](https://apify.com/alfalfa/facebook-events-scraper) | Events by keyword, city, page or URL: dates, venue with GPS, tickets, organizer, going counts, every date of a recurring event, optional organizer email | $5 / 1,000 events |
| [Facebook Posts Scraper](https://apify.com/alfalfa/facebook-posts-scraper) | Posts from pages and profiles: text, media, reaction breakdown, comments, shares, top comments, co-authors | $2 / 1,000 posts |
| [Facebook Pages Scraper](https://apify.com/alfalfa/facebook-pages-scraper) | Page profile: email, phone, website, address, likes, followers, rating, price range, About text, recent posts | from $3.50 / 1,000 pages |
| [Facebook Comments Scraper](https://apify.com/alfalfa/facebook-comments-scraper) | Comments and reply threads of any public post: text, author, date, likes, replies with parent links, three sort modes, date filter without surcharge | $1 / 1,000 comments |

### Not working?

Facebook changes things regularly. If a page that opens in your browser returns nothing, open an issue in the Issues tab with the URL; fixes are usually deployed within a day. If the scraper saved you time, a short review on the Actor page helps other users find it.

# Actor input Schema

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

Facebook page or profile URLs, one per line: <code>https://www.facebook.com/humansofnewyork</code>, <code>https://www.facebook.com/profile.php?id=100064027242849</code>. A bare page name (<code>humansofnewyork</code>) works too. Sub-pages (/about, /photos) are resolved to the page. Same format as the official Facebook Pages Scraper.

## `scrapeAbout` (type: `boolean`):

Read the page's full About text into <code>about\_me</code>. The Intro card on the page itself only carries a ~100 character excerpt, so this needs one extra request per page. On by default to match the official Facebook Pages Scraper. Billed $2 per 1,000 pages that actually have an About text; turn it off to scrape faster and cheaper when you only need contact details.

## `includeFailedPages` (type: `boolean`):

Write a record with <code>url</code>, <code>inputUrl</code>, <code>error</code> and <code>errorDescription</code> for every page that could not be scraped, so you get one row per input like the official Actor does. Off by default, because those rows are billed like any other result.

## `scrapeTransparency` (type: `boolean`):

Also read the page's Transparency section: <code>creation\_date</code>, <code>ad\_status</code> (whether the page is running ads) and admin country info. Charged separately per page (see pricing).

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

Same thing as <b>Page or profile URLs</b>, under the name the official Facebook Page Contact Info Scraper uses. Fill in either field.

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

How many pages are scraped in parallel (default 5).

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

Residential proxies are included in the price per page. Leave the default unless you want to route the traffic through your own proxy servers.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/humansofnewyork"
    },
    {
      "url": "https://www.facebook.com/copperkettleyqr"
    }
  ],
  "scrapeAbout": true,
  "includeFailedPages": false,
  "scrapeTransparency": false,
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `pages` (type: `string`):

All scraped pages as JSON (same fields as the official Facebook Pages Scraper: title, categories, address, phone, email, website, likes, followers, rating, photos, plus optional transparency data). Append ?format=csv for CSV.

# 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/humansofnewyork"
        },
        {
            "url": "https://www.facebook.com/copperkettleyqr"
        }
    ],
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("alfalfa/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/humansofnewyork" },
        { "url": "https://www.facebook.com/copperkettleyqr" },
    ],
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("alfalfa/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/humansofnewyork"
    },
    {
      "url": "https://www.facebook.com/copperkettleyqr"
    }
  ],
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call alfalfa/facebook-pages-scraper --silent --output-dataset

```

## MCP server setup

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