# Facebook Public Profiles Scraper (`automation-lab/facebook-public-profile-scraper`) Actor

Extract public Facebook profile identity, bio, work, education, location, follower signals, verification, images, and links without a login.

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

## Pricing

Pay per event

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 Public Profiles Scraper

Extract **facebook public profiles** into typed records for lead enrichment, research, and recurring data pipelines. Provide public profile URLs and receive identity, bio, work, education, location, relationship, follower signals, verification, profile image, and external-link fields without a Facebook login.

The Actor works with username URLs such as `https://www.facebook.com/zuck` and numeric URLs such as `https://www.facebook.com/profile.php?id=4`. It processes only information visible on the public logged-out profile.

### What does Facebook Public Profiles Scraper do?

The Actor turns a list of public Facebook profile URLs into one normalized dataset item per useful profile.

It:

- validates and canonicalizes Facebook profile URLs;
- removes duplicate input URLs;
- renders the public logged-out profile;
- extracts visible Intro and identity fields;
- normalizes abbreviated follower counts such as `121M` to integers;
- returns null or an empty array when a field is not public;
- retries a challenged profile with a fresh browser session;
- stops at your `maxItems` limit.

It does not log into Facebook, search for people by name, infer hidden attributes, or bypass profile privacy settings.

### Who is this Facebook profile extractor for?

#### Lead operations teams

Enrich a list of known public profile URLs with current public role, education, and location context before review in a CRM.

#### Researchers and analysts

Create consistent snapshots of public figures or creators instead of manually copying fields from individual profiles.

#### Developers and data engineers

Feed typed JSON into a spreadsheet, warehouse, CRM, webhook, or scheduled comparison pipeline.

#### Talent and partnership teams

Review publicly stated work and education information for already identified people. Always apply an appropriate lawful basis and human review.

### What Facebook profile data is extracted?

| Field | Type | Meaning |
| --- | --- | --- |
| `sourceUrl` | string | URL supplied in the input |
| `url` | string | Canonical public Facebook profile URL |
| `username` | string or null | Username from a username URL |
| `profileId` | string or null | Public numeric profile ID when exposed |
| `name` | string | Public display name |
| `accountType` | string or null | Visible profile/category label |
| `bio` | string or null | Public Intro or bio text |
| `work` | string\[] | Visible roles and workplaces |
| `education` | string\[] | Visible schools and education statements |
| `currentCity` | string or null | Visible current city |
| `hometown` | string or null | Visible hometown |
| `relationship` | string or null | Visible relationship statement |
| `followers` | integer or null | Normalized visible follower count |
| `following` | integer or null | Normalized visible following count |
| `verified` | boolean | Whether a verification signal is exposed |
| `profilePictureUrl` | string or null | Public profile image URL |
| `externalLinks` | string\[] | Public non-Facebook profile links |
| `scrapedAt` | ISO timestamp | Time of extraction |

### Why use this Actor?

- **No Facebook credentials:** only the public logged-out surface is used.
- **Typed enrichment output:** downstream tools receive stable fields rather than raw HTML.
- **Privacy-aware nulls:** unavailable fields are not guessed.
- **Bulk-ready input:** submit multiple known profile URLs and set an output limit.
- **Efficient rendering:** images, video, fonts, styles, and trackers are blocked where they are unnecessary for extraction.
- **Failure visibility:** a run fails when no useful profile can be extracted instead of returning a misleading empty success.

### How to get started

1. Open the Actor input page.
2. Add one or more public Facebook profile URLs to **Facebook profile URLs**.
3. Set **Maximum profiles** to the number of records you need.
4. Click **Start**.
5. Open the default dataset to inspect, download, or integrate the records.

A useful first input is:

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

### Input parameters

#### `startUrls`

Required array of public `facebook.com` profile URLs. Supported shapes are:

- username URL: `https://www.facebook.com/zuck`;
- numeric profile URL: `https://www.facebook.com/profile.php?id=4`.

URLs for posts, groups, events, Marketplace, search results, or login pages are outside this Actor's scope and fail validation.

#### `maxItems`

Optional integer from 1 to 1,000. The Actor stops after this many useful records. The default is 100. If fewer input URLs are available, only those inputs are processed.

### Output example

This shortened record reflects the current public output shape:

```json
{
  "sourceUrl": "https://www.facebook.com/zuck",
  "url": "https://www.facebook.com/zuck",
  "username": "zuck",
  "profileId": "4",
  "name": "Mark Zuckerberg",
  "accountType": "Profile · Public figure",
  "bio": "Bringing the world closer together.",
  "work": ["Founder and CEO at Meta", "Works at Biohub"],
  "education": ["Studied Computer Science and Psychology at Harvard University"],
  "currentCity": "Palo Alto, California",
  "hometown": "Dobbs Ferry, New York",
  "relationship": "Married to Priscilla Chan",
  "followers": 121000000,
  "following": null,
  "verified": true,
  "profilePictureUrl": "https://scontent-...fbcdn.net/...",
  "externalLinks": [],
  "scrapedAt": "2026-08-07T14:07:27.673Z"
}
```

Facebook can change public values and visibility at any time. Treat the example as a schema illustration, not a promise that a count or personal statement remains unchanged.

### How much does it cost to extract Facebook public profiles?

The Actor uses pay-per-event pricing:

- one `start` event is charged once per run;
- one `item` event is charged for each useful profile record;
- rejected, failed, duplicate, or non-emitted records have no item charge.

The start event is **$0.005**. The item price decreases by Apify plan:

| Plan tier | Price per emitted profile |
| --- | ---: |
| FREE | $0.00460 |
| BRONZE | $0.00400 |
| SILVER | $0.00312 |
| GOLD | $0.00240 |
| PLATINUM | $0.00160 |
| DIAMOND | $0.00112 |

Your run total follows:

`$0.005 start event + emitted profile records × active item tier`

For example, on the FREE tier, 1 profile costs **$0.00960**, 10 profiles cost **$0.05100**, and 100 profiles cost **$0.46500**. On BRONZE, the same batches cost **$0.00900**, **$0.04500**, and **$0.40500**. Rejected, failed, duplicate, and non-emitted records do not add an item event.

Batching profiles into one run avoids paying the start event separately for each profile. Apify platform usage is included in the event price rather than added as a separate customer charge.

### Tips for reliable runs

- Supply canonical profile URLs collected with an appropriate lawful purpose.
- Use username or numeric profile URLs, not search-result or post URLs.
- Start with a small batch before scheduling a large enrichment job.
- Expect fields to differ by profile because each person controls public visibility.
- Use `profileId` or canonical `url` as the stable join key when available.
- Store `scrapedAt` alongside snapshots when comparing data over time.

### Limits and failure behavior

Facebook may show less information for some profiles, locations, or sessions. A valid record can therefore contain null fields or empty arrays.

The Actor retries a blocked or incomplete profile once with a fresh session. Individual failures are logged while useful profiles continue. If every requested profile fails, the run exits with an error. This prevents a blocked page from appearing as a successful empty dataset.

The Actor does not:

- discover profiles from a person name or keyword;
- access private, friends-only, or login-only information;
- return posts, comments, friends, followers lists, or private contact details;
- perform built-in historical change detection;
- guarantee that a public CDN image URL remains permanent.

### Recurring lead enrichment workflow

For repeated enrichment:

1. keep approved public profile URLs in your CRM or input store;
2. run this Actor on a schedule;
3. export each result with its `scrapedAt` timestamp;
4. compare the current row to the prior row in your own database or automation;
5. route meaningful changes to human review.

This Actor produces fresh snapshots. Scheduling and comparison are configured through Apify Tasks, webhooks, or your downstream system; the Actor does not claim a change unless your workflow compares snapshots.

### Export and integration options

The default dataset can be downloaded as JSON, CSV, Excel, XML, or RSS through Apify. Common patterns include:

- send completed datasets to Google Sheets or Airtable;
- upsert records into a CRM using `profileId` or `url`;
- load snapshots into BigQuery, Snowflake, or PostgreSQL;
- trigger Make, Zapier, or n8n from a run-finished webhook;
- call the Actor from an internal enrichment API.

### Run with the Apify API

Replace `APIFY_TOKEN` with your token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~facebook-public-profile-scraper/runs?token=APIFY_TOKEN&waitForFinish=120" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url": "https://www.facebook.com/zuck"}],
    "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-public-profile-scraper').call({
  startUrls: [{ url: 'https://www.facebook.com/zuck' }],
  maxItems: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
from apify_client import ApifyClient
import os

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/facebook-public-profile-scraper').call(run_input={
    'startUrls': [{'url': 'https://www.facebook.com/zuck'}],
    'maxItems': 1,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### Use with MCP and AI assistants

Add this Actor to Claude Code through Apify MCP:

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

#### Claude Desktop

Add this server object to the `mcpServers` section of Claude Desktop's configuration:

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

#### Cursor

Open **Settings → Tools & MCP → New MCP Server** and use the same Apify MCP URL shown above.

#### VS Code

Add the same HTTP server URL to your workspace MCP configuration, then select the `automation-lab/facebook-public-profile-scraper` tool.

Example prompts:

- “Extract the public profile record for `https://www.facebook.com/zuck`.”
- “Enrich these approved Facebook profile URLs and return name, work, education, city, and follower count.”
- “Create current snapshots for this list and highlight null fields that need manual review.”

### Responsible and legal use

Public availability does not remove privacy, copyright, contractual, or data-protection obligations. Use the Actor only when you have a lawful purpose and authority to process the requested information.

Do not use the output for harassment, unlawful discrimination, sensitive-trait inference, credential collection, or decisions that require protected data. Follow Facebook's terms, applicable privacy laws, data-minimization principles, retention limits, and deletion requests. Obtain legal advice for your jurisdiction and use case.

### Troubleshooting

#### Why is a field null or an array empty?

The profile does not expose that field on its public logged-out surface, or Facebook did not deliver it in the current session. The Actor intentionally does not infer private values.

#### Why was my URL rejected?

The URL must identify a profile by username or `profile.php?id=<number>`. Post, section, group, search, Marketplace, and non-Facebook URLs are rejected before a chargeable browser request.

#### Why did the run fail with no profiles extracted?

Facebook returned blocked, login-only, unavailable, or incomplete pages for every input. Check that the profiles are public and the URLs open without a login, then retry later rather than interpreting an empty result as valid.

#### Can this Actor search Facebook profiles by name?

No. It extracts known public profile URLs. Name search is a different workflow and is not silently approximated.

### FAQ

#### Does it require Facebook cookies or credentials?

No. The Actor uses the public logged-out profile surface.

#### Does it scrape private profiles?

No. Only publicly visible fields are returned.

#### Can I process multiple profiles?

Yes. Add multiple URLs and set `maxItems` up to 1,000. Duplicate input URLs are processed once.

#### Can I monitor profiles?

You can schedule repeated snapshot runs and compare records in your own workflow. Built-in history or change alerts are not included.

#### Are profile pictures downloaded?

No. The Actor returns the public metadata URL and blocks image downloads during extraction to reduce transfer and runtime.

### Related automation-lab Actors

- [Facebook Pages Scraper](https://apify.com/automation-lab/facebook-pages-scraper) for business and organization Page metadata.
- [Facebook Page Contact Info Scraper](https://apify.com/automation-lab/facebook-page-contact-info-scraper) for publicly listed Page websites, email, phone, and addresses.
- [Facebook Followers Following Scraper](https://apify.com/automation-lab/facebook-followers-following-scraper) for visible relationship lists when publicly available.
- [Facebook URL to ID Resolver](https://apify.com/automation-lab/facebook-url-to-id-resolver) when you only need a Facebook numeric identifier.

### Support

When reporting a problem, include the Actor run URL, a public reproducible profile URL, the expected public field, and the observed error. Do not include Facebook credentials, private profile data, or unrelated personal information.

# Actor input Schema

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

Public facebook.com profile URLs. Username URLs and profile.php URLs with a numeric id are supported. Page sections, posts, groups, and search URLs are rejected.

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

Stop after this many useful profile records. Duplicate input URLs are processed once.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/profile.php?id=4"
    }
  ],
  "maxItems": 1
}
```

# Actor output Schema

## `overview` (type: `string`):

Open the default dataset overview with identity, bio, work, education, location, follower, verification, and link fields.

# 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/profile.php?id=4"
        }
    ],
    "maxItems": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/facebook-public-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 = {
    "startUrls": [{ "url": "https://www.facebook.com/profile.php?id=4" }],
    "maxItems": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/facebook-public-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 '{
  "startUrls": [
    {
      "url": "https://www.facebook.com/profile.php?id=4"
    }
  ],
  "maxItems": 1
}' |
apify call automation-lab/facebook-public-profile-scraper --silent --output-dataset

```

## MCP server setup

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