# Facebook Profile Scraper — No Login Required (`crowdpull/facebook-profile-scraper`) Actor

Extract posts, reactions, and images from any public Facebook profile. No login or cookies needed. Supports date filtering, profile info extraction, and Smart Scrape dedup.

- **URL**: https://apify.com/crowdpull/facebook-profile-scraper.md
- **Developed by:** [Crowd Pull](https://apify.com/crowdpull) (community)
- **Categories:** Social media, Lead generation
- **Stats:** 308 total users, 31 monthly users, 99.5% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 post extracteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.
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?

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 Profile Scraper — No Login Required

Extract posts and profile info from any **public** Facebook profile — no login or cookies required.

No browser automation — just fast, lightweight HTTP requests for reliable extraction.

### Features

- **No login required** — extracts posts anonymously from public profiles
- **Smart Scrape (dedup)** — skip posts already scraped in previous runs, saving up to 75% on recurring scrapes
- **Profile info extraction** — public name, category, likes/followers/talking-about metrics, services, and contact fields when Facebook exposes them
- **Full post data** — text, author, permalink, timestamp, reactions, comments, shares, images, videos, hashtags
- **Date filtering** — extract posts newer than a specific date (ISO or relative: `7d`, `30d`, `6m`)
- **Multi-profile support** — process multiple profiles in a single run
- **Pagination** — follows Facebook's available timeline cursors until the requested limit or exposed feed ends
- **Low cost** — runs on 256MB memory, no browser overhead

### Smart Scrape: How It Saves You Money

Enable **Smart Scrape** to skip posts you've already extracted. The scraper maintains a persistent cache per profile that survives across runs indefinitely.

| | Without Smart Scrape | With Smart Scrape |
|---|---|---|
| **Run 1** (500 posts) | **$1.76** | **$1.76** |
| **Run 2** (125 new) | **$1.76** | **$0.8225** |
| **Run 3** (125 new) | **$1.76** | **$0.8225** |
| **Run 4** (125 new) | **$1.76** | **$0.8225** |
| **Monthly total** | **$7.04** | **$4.2275** |
| **Unique posts** | 875 (+ 1,125 duplicate rows) | 875 (zero duplicate rows) |
| **Cost per unique post** | $0.0080 | $0.0048 |

This example uses the currently applied Free-tier post price ($0.0035), $0.001 cache checks, the $0.005 profile-info event, and the $0.005 run-start charge. It assumes `includeProfileInfo: true`. Higher Apify tiers have lower post prices; verify the Store pricing panel for current rates.

#### Refresh Window

Set `refreshWindowDays` to re-check recent posts for updated comment/reaction counts. For example, `refreshWindowDays: 7` re-scrapes posts from the last 7 days even if cached, so you always get fresh engagement data on recent content.

### What you get

#### Profile info (when `includeProfileInfo` is enabled)

| Field | Description |
|-------|-------------|
| `name` | Profile display name |
| `profileUrl` | Direct link to the profile |
| `services` | Array of listed services |
| `contactPhone` | Phone number (if public) |
| `contactEmail` | Email address (if public) |
| `followersCount` | Number of followers, or `null` when Facebook does not expose it |
| `likesCount` | Number of page/profile likes, or `null` |
| `talkingAboutCount` | Current “talking about this” metric, or `null` |
| `category` | Public category, when present |
| `address` | Public address, when present |
| `website` | Public website, when present |
| `entityType` | Facebook entity type (`User`, `Page`, or `Unknown`) |
| `type` | Always `"profileInfo"` |

#### Posts

| Field | Description |
|-------|-------------|
| `postId` | Unique post identifier |
| `postUrl` | Direct permalink to the post |
| `profileUrl` | Link to the source profile |
| `profileName` | Profile display name |
| `authorName` | Author's display name |
| `text` | Full post text content |
| `timestamp` | ISO 8601 timestamp |
| `imageUrls` | Array of image URLs attached to the post |
| `videoUrls` | Array of video URLs attached to the post |
| `reactionCount` | Number of reactions, or `null` when unavailable |
| `commentCount` | Number of comments, or `null` when unavailable |
| `shareCount` | Number of shares, or `null` when unavailable |
| `hashtags` | Array of hashtags extracted from the post text |
| `scrapedAt` | ISO 8601 timestamp of when the post was scraped |

### How it works

1. Fetches the profile page anonymously — no login, no cookies, no browser
2. Extracts CSRF tokens and numeric user ID from the page HTML
3. Queries Facebook's internal GraphQL API for timeline posts
4. Parses public profile metadata from server-rendered profile/About data and structured GraphQL fields
5. Checks each post against the dedup cache (if Smart Scrape is enabled)
6. Paginates via Relay cursors until `maxPosts` is reached or Facebook stops exposing cursors
7. Saves updated cache for next run

### Input examples

#### Basic extraction

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/profile.php?id=61580944632584" }
  ],
  "maxPosts": 20
}
```

#### With profile info and posts

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/zuck" }
  ],
  "maxPosts": 50,
  "includeProfileInfo": true,
  "onlyPostsNewerThan": "30d"
}
```

#### Smart Scrape (incremental monitoring)

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/zuck" },
    { "url": "https://www.facebook.com/profile.php?id=61580944632584" }
  ],
  "maxPosts": 100,
  "enableDedup": true,
  "refreshWindowDays": 7
}
```

### Output example

#### Profile info

```json
{
  "name": "Example Public Page",
  "profileUrl": "https://www.facebook.com/profile.php?id=123456789",
  "services": [],
  "contactPhone": null,
  "contactEmail": null,
  "followersCount": null,
  "likesCount": null,
  "talkingAboutCount": null,
  "category": null,
  "entityType": "Page",
  "type": "profileInfo"
}
```

#### Post

```json
{
  "postId": "1084920485123456",
  "postUrl": "https://www.facebook.com/4/posts/1084920485123456/",
  "profileUrl": "https://www.facebook.com/profile.php?id=4",
  "profileName": "Mark Zuckerberg",
  "authorName": "Mark Zuckerberg",
  "text": "Excited to share what we've been working on. More details coming soon.",
  "timestamp": "2026-03-01T14:30:00.000Z",
  "imageUrls": ["https://scontent.fudi1-1.fna.fbcdn.net/v/..."],
  "videoUrls": [],
  "reactionCount": 42000,
  "commentCount": 8500,
  "shareCount": 1200,
  "hashtags": [],
  "scrapedAt": "2026-03-06T18:00:00.000Z"
}
```

### Other CrowdPull Facebook scrapers

- **[Facebook Page Posts Scraper](https://apify.com/crowdpull/facebook-page-posts-scraper)** — extract posts from any public Facebook page
- **[Facebook Group Posts Scraper](https://apify.com/crowdpull/facebook-group-posts-scraper)** — extract posts from any public Facebook group
- **[Facebook Comment Scraper](https://apify.com/crowdpull/facebook-comment-scraper)** — extract comments and replies where Facebook exposes them; optional cookies support signed-in-only surfaces
- **[Facebook Marketplace Scraper](https://apify.com/crowdpull/facebook-marketplace-scraper)** — extract listings from Facebook Marketplace by location with price filtering

### Cost estimate

This Actor uses **no browser** — just lightweight HTTP requests.

| Event | Cost |
|-------|------|
| Actor start | $0.005 (one-time per run) |
| Profile scraped | $0.005/profile |
| Post extracted | $0.0035/post on Free; $0.003/$0.00225/$0.002/$0.0015/$0.001 on Bronze through Diamond |
| Cache check (Smart Scrape skip) | $0.001/post |

Volume discounts available at higher tiers.

### Is it legal to scrape Facebook profiles?

Our scrapers are ethical and do not extract any private user data, such as email addresses, gender, or location. They only extract what the user has chosen to share publicly. We therefore believe that our scrapers, when used for ethical purposes by Apify users, are safe. However, you should be aware that your results could contain personal data. Personal data is protected by the GDPR in the European Union and by other regulations around the world. You should not scrape personal data unless you have a legitimate reason to do so. If you're unsure whether your reason is legitimate, consult your lawyers.

### Limitations

- Only works with **public** profiles (private profiles return 0 posts)
- Unavailable profile and engagement metrics are returned as `null`, not a misleading zero or empty string
- Facebook may change internal APIs — report issues if extraction stops
- Facebook rate limits apply; residential proxies recommended
- Profile info fields like services depend on what the user has listed publicly

# Actor input Schema

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

One or more public Facebook profile URLs. Supports full URLs and numeric profile IDs.

## `maxPosts` (type: `integer`):

Maximum number of posts to extract per profile. Set to 0 for unlimited.

## `onlyPostsNewerThan` (type: `string`):

Only extract posts newer than this date. Use ISO format (2024-01-15) or relative (7d, 30d, 6m, 1y). Leave empty for no date filter.

## `includeProfileInfo` (type: `boolean`):

Extract profile metadata (name, services, followers) in addition to posts.

## `scrollDelay` (type: `integer`):

Delay between pagination requests in milliseconds. Increase if you experience rate limiting.

## `maxEmptyScrolls` (type: `integer`):

Stop paginating after this many consecutive empty pages.

## `enableDedup` (type: `boolean`):

Skip posts already scraped in previous runs. Uses a persistent cache per profile.

## `refreshWindowDays` (type: `integer`):

Re-scrape posts from the last N days even if already cached. Set to 0 to never re-scrape cached posts.

## `debugMode` (type: `boolean`):

Save the first profile, About, and GraphQL responses to the run key-value store for troubleshooting. Leave off for normal runs.

## `proxyConfig` (type: `object`):

Proxy settings. Residential proxies recommended for Facebook.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/profile.php?id=61580944632584"
    }
  ],
  "maxPosts": 50,
  "includeProfileInfo": true,
  "scrollDelay": 2000,
  "maxEmptyScrolls": 5,
  "enableDedup": false,
  "refreshWindowDays": 0,
  "debugMode": false,
  "proxyConfig": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "startUrls": [
        {
            "url": "https://www.facebook.com/profile.php?id=61580944632584"
        }
    ],
    "maxPosts": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("crowdpull/facebook-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=61580944632584" }],
    "maxPosts": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("crowdpull/facebook-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=61580944632584"
    }
  ],
  "maxPosts": 50
}' |
apify call crowdpull/facebook-profile-scraper --silent --output-dataset

```

## MCP server setup

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