# Facebook Reels Scraper (`fetch_cat/facebook-reels-scraper`) Actor

Export public Facebook Reels from profiles, Reels tabs, and direct URLs with reel IDs, captions, play counts, owner data, thumbnails, video URLs, and audio metadata.

- **URL**: https://apify.com/fetch\_cat/facebook-reels-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** Social media, Marketing, Videos
- **Stats:** 1 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 reel results

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 Reels Scraper

Extract public Facebook Reels from page/profile Reels tabs, usernames, and direct reel URLs. The Actor returns structured rows with reel URLs, IDs, visible play counts, owner/page metadata, and diagnostics for inputs that Facebook does not expose publicly.

Use it for social media research, creator monitoring, competitor content tracking, and repeatable exports to CSV, JSON, Excel, API, or automation workflows.

### At a glance

- **Primary job**: Collect public Facebook Reels URLs and visible metrics from one or more public pages/profiles.
- **Input**: Public Facebook page URLs, `/reels/` URLs, direct `/reel/<id>` URLs, or usernames.
- **Output**: One dataset row per reel, plus explicit diagnostic rows for invalid, blocked, private, or empty inputs.
- **Best for**: Brand monitoring, competitor short-form research, influencer discovery, content planning, and reporting.

### Common workflows

- **Monitor a brand page**: Schedule a run for a public Facebook page Reels tab and export newly seen reel URLs and play counts.
- **Analyze competitors**: Add several public page/profile Reels URLs, cap results per profile, and compare visible play counts in a spreadsheet.
- **Check direct reels**: Submit direct `facebook.com/reel/<id>` URLs to normalize IDs and keep a consistent dataset shape.
- **Automate reporting**: Trigger runs through the Apify API, webhooks, or MCP and send dataset rows to BI tools or a database.

### Ready-to-run examples

- [Monitor Reels from a public Facebook Page](https://apify.com/fetch_cat/facebook-reels-scraper/examples/monitor-public-page-reels) — export three public Reels with visible play counts and page metadata.
- [Extract data from a public Facebook Reel](https://apify.com/fetch_cat/facebook-reels-scraper/examples/direct-public-reel-lookup) — normalize one direct Reel URL and export the metadata Facebook exposes publicly.
- [Compare public Facebook Reels by username](https://apify.com/fetch_cat/facebook-reels-scraper/examples/compare-public-reels-usernames) — compare bounded Reel samples from two public accounts.

### What data can you extract?

| Field | Description |
| --- | --- |
| `inputUrl` | Original URL or username submitted by the user. |
| `normalizedUrl` | Canonical Facebook URL processed by the Actor. |
| `sourceType` | `profile_reels`, `direct_reel`, `username`, or `unknown`. |
| `status` | `ok`, `invalid_url`, `no_reels_found`, `blocked_or_empty`, `private_or_unavailable`, `unsupported_or_changed`, or `failed`. |
| `reelId` | Facebook reel ID when available. |
| `reelUrl` | Canonical public reel URL. |
| `postUrl` | Public post/reel URL for the same item. |
| `text` | Public reel caption/text when exposed in the rendered page. |
| `timestamp` | Public timestamp when exposed. |
| `ownerName` | Visible owner/page name. |
| `ownerUrl` | Owner/page URL used for extraction. |
| `playCount` | Visible reel play count, normalized to a number. |
| `likeCount` | Like count when available publicly. |
| `commentCount` | Comment count when available publicly. |
| `shareCount` | Share count when available publicly. |
| `durationSeconds` | Duration when available publicly. |
| `thumbnailUrl` | Thumbnail URL when exposed publicly. |
| `videoUrl` | Best-effort public video URL when exposed; not guaranteed archival media. |
| `pageName` | Visible page/profile name. |
| `pageUrl` | Page/profile URL. |
| `pageId` | Page ID when exposed publicly. |
| `followerCount` | Visible follower count, normalized to a number. |
| `likesCount` | Visible page like count, normalized to a number. |
| `category` | Page category when visible. |
| `missingFields` | Optional fields not exposed for this row. |
| `error` | Diagnostic message for non-ok rows. |

### Input configuration

| Setting | JSON key | Use it for | Example |
| --- | --- | --- | --- |
| Facebook URLs | `startUrls` | Public page/profile URLs, `/reels/` tabs, and direct reel URLs. | `https://www.facebook.com/9GAGCute/reels/` |
| Facebook usernames | `usernames` | Conveniently convert public usernames to Reels tab URLs. | `9GAGCute` |
| Maximum reels | `maxItems` | Cap saved reel result rows and control spend. | `20` |
| Maximum reels per profile | `maxReelsPerProfile` | Prevent one profile from consuming the whole run limit. | `10` |
| Include page/profile metadata | `includePageProfileMetadata` | Add visible page name, URL, followers, and likes when available. | `true` |
| Proxy configuration | `proxyConfiguration` | Use Apify Proxy; residential proxies are recommended for Facebook. | `{ "useApifyProxy": true }` |

### Example input

```json
{
  "startUrls": [
    { "url": "https://www.facebook.com/9GAGCute/reels/" },
    { "url": "https://www.facebook.com/reel/27749977914588421/" }
  ],
  "usernames": ["Cristiano"],
  "maxItems": 20,
  "maxReelsPerProfile": 10,
  "includePageProfileMetadata": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Example output

```json
{
  "inputUrl": "https://www.facebook.com/9GAGCute/reels/",
  "normalizedUrl": "https://www.facebook.com/9GAGCute/reels/",
  "sourceType": "profile_reels",
  "status": "ok",
  "reelId": "27749977914588421",
  "reelUrl": "https://www.facebook.com/reel/27749977914588421/",
  "postUrl": "https://www.facebook.com/reel/27749977914588421/",
  "text": null,
  "timestamp": null,
  "ownerName": "9GAG Cute",
  "ownerUrl": "https://www.facebook.com/9GAGCute/reels/",
  "playCount": 58000,
  "likeCount": null,
  "commentCount": null,
  "shareCount": null,
  "durationSeconds": null,
  "thumbnailUrl": null,
  "videoUrl": null,
  "pageName": "9GAG Cute",
  "pageUrl": "https://www.facebook.com/9GAGCute/reels/",
  "pageId": null,
  "followerCount": 3700000,
  "likesCount": null,
  "category": null,
  "missingFields": [],
  "error": null
}
```

### Pricing

This Actor uses pay-per-event pricing:

- The one-time `start` event is charged when a run begins.
- The primary `item` event is charged only for successful Reel rows with `status: "ok"`.
- Invalid, blocked, private, unavailable, and empty-input diagnostic rows are not charged as Reel results.
- Current rates and account discounts are shown on the live [Pricing tab](https://apify.com/fetch_cat/facebook-reels-scraper/pricing).

### Tips for best results

- **Use public pages only**: This Actor does not accept cookies or scrape private/logged-in data.
- **Start small**: Test with `maxItems: 3` to confirm a page exposes public Reels in your run environment.
- **Prefer Reels tabs**: URLs ending in `/reels/` are the most direct input for profile/page scraping.
- **Expect optional fields**: Facebook does not expose every metric on every surface; unavailable fields stay `null` and appear in `missingFields` when relevant.
- **Use proxies in cloud**: Facebook can vary responses by IP. Residential Apify Proxy is recommended for production runs.

### API usage

Node.js:

```js
import { ApifyClient } from "apify-client";

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor("fetch_cat/facebook-reels-scraper").call({
  startUrls: [{ url: "https://www.facebook.com/9GAGCute/reels/" }],
  maxItems: 3,
  maxReelsPerProfile: 3
});
console.log(run.defaultDatasetId);
```

Python:

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("fetch_cat/facebook-reels-scraper").call(run_input={
    "startUrls": [{ "url": "https://www.facebook.com/9GAGCute/reels/" }],
    "maxItems": 3,
    "maxReelsPerProfile": 3,
})
print(run["defaultDatasetId"])
```

cURL:

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~facebook-reels-scraper/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"startUrls":[{"url":"https://www.facebook.com/9GAGCute/reels/"}],"maxItems":3,"maxReelsPerProfile":3}'
```

### MCP and AI agents

Use this Actor from MCP-compatible tools through the official Apify MCP Server.

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=fetch_cat/facebook-reels-scraper"
```

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=fetch_cat/facebook-reels-scraper"
    }
  }
}
```

Example prompt: "Run Facebook Reels Scraper for this public Facebook page URL with maxItems 5 and summarize the reel URLs and visible play counts."

### Limits and caveats

- **Public data only**: No account login, cookies, private profiles, private groups, or access-token scraping.
- **Facebook changes often**: Public visibility can change, so a URL that works today may expose fewer fields later.
- **Metrics are best effort**: Play counts are usually visible on Reels tabs; likes, comments, shares, video URLs, and timestamps may be absent.
- **No video archiving guarantee**: `videoUrl` is populated only if Facebook exposes a stable public URL in the same page context.
- **Diagnostics are explicit**: Invalid or blocked inputs produce status rows instead of silently returning an empty dataset.
- **Responsible use**: Process only public data you are allowed to access, and do not use the Actor to bypass access controls or collect private personal data.

### Related actors

#### More Facebook scrapers

- [Facebook Events Scraper](https://apify.com/fetch_cat/facebook-events-scraper)
- [Facebook Ads Library Scraper](https://apify.com/fetch_cat/facebook-ads-library-scraper)
- [Facebook Comments Scraper](https://apify.com/fetch_cat/facebook-comments-scraper)
- [Facebook Marketplace Scraper](https://apify.com/fetch_cat/facebook-marketplace-scraper)
- [Facebook Pages Scraper](https://apify.com/fetch_cat/facebook-pages-scraper)

### FAQ

#### Does this Actor require Facebook login?

No. It is public-only and intentionally does not accept cookies, sessions, passwords, or access tokens.

#### Why are some fields empty?

Facebook does not expose every field on every public page or reel. The Actor leaves unavailable fields as `null` instead of guessing.

#### Will blocked or invalid inputs be charged as reel results?

No. The Actor only charges the item event for successful `status: "ok"` reel rows.

#### Can I export results?

Yes. Apify datasets support JSON, CSV, Excel, XML, RSS, and API access.

### Support

Open an issue from the Actor page if a run fails or output looks wrong. Include the run ID or run URL, input JSON, expected output, actual output, and a reproducible public URL.

# Actor input Schema

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

Public Facebook page/profile URLs, /reels/ tabs, or direct /reel/<id> URLs.

## `usernames` (type: `array`):

Optional public page/profile usernames, for example 9GAGCute or Cristiano. They are converted to public /reels/ URLs.

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

Maximum number of reel result rows to save across all inputs.

## `maxReelsPerProfile` (type: `integer`):

Per-profile cap for page/profile reels tabs. Direct reel URLs count as one input.

## `includePageProfileMetadata` (type: `boolean`):

Include visible page name, URL, follower count, and like count when Facebook exposes them publicly.

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

Facebook may vary or block public content by IP. Apify Proxy with residential groups is recommended for cloud runs.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.facebook.com/9GAGCute/reels/"
    },
    {
      "url": "https://www.facebook.com/reel/3292750537522330/"
    }
  ],
  "usernames": [
    "9GAGCute"
  ],
  "maxItems": 20,
  "maxReelsPerProfile": 20,
  "includePageProfileMetadata": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (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/9GAGCute/reels/"
        },
        {
            "url": "https://www.facebook.com/reel/3292750537522330/"
        }
    ],
    "usernames": [
        "9GAGCute"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/facebook-reels-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/9GAGCute/reels/" },
        { "url": "https://www.facebook.com/reel/3292750537522330/" },
    ],
    "usernames": ["9GAGCute"],
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/facebook-reels-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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/9GAGCute/reels/"
    },
    {
      "url": "https://www.facebook.com/reel/3292750537522330/"
    }
  ],
  "usernames": [
    "9GAGCute"
  ]
}' |
apify call fetch_cat/facebook-reels-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=fetch_cat/facebook-reels-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/dgMhYLs1t65XKaX90/builds/hfaWuVaVyQe6kav9j/openapi.json
