# Facebook Reels Scraper | Page Reels & Metrics (`arabiainsights/facebook-reels-scraper`) Actor

Scrape public Facebook Page Reels and direct Reel URLs. Export engagement metrics, captions, creators, dates and optional media URLs to JSON, CSV or Excel. Filter by date and deduplicate results without a Facebook login.

- **URL**: https://apify.com/arabiainsights/facebook-reels-scraper.md
- **Developed by:** [Arabia Insights](https://apify.com/arabiainsights) (community)
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 reels

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

Scrape public Facebook Page Reels and direct Reel URLs for content research, campaign reporting and competitor analysis. Collect captions, creator identity, publication dates, available engagement metrics and optional media links. Export Facebook Reels in bulk to JSON, CSV or Excel for spreadsheets, dashboards and scheduled reports.

The Actor works without a Facebook login or supplied cookies. It supports public Page listings and supported direct Reel/video URLs. A direct Reel can belong to a Page or personal profile; personal profile listing collection is not supported.

### How to scrape Facebook Page Reels

1. Add a public Page URL under **Facebook Page URLs**, or add individual links under **Direct Reel URLs**.
2. Set **Maximum unique Reels** to a small number for your first run.
3. Start the Actor. Open **Results** to review the rows, then check **Run summary** for failures, limits and incomplete sources.
4. Export the dataset in your preferred format.

```json
{
  "pageUrls": ["https://www.facebook.com/Atro55/"],
  "maxReels": 10,
  "includeMediaUrls": false
}
```

This is a valid input example, not a promise that a particular Page is always accessible. Results depend on what Facebook makes publicly available at run time.

### Facebook Reels data and use cases

Use Page Reels to compare publishing activity, track public engagement, find content themes, or prepare a list for manual review. Supply direct links when you already have a campaign or content shortlist. Global deduplication prevents the same Reel from appearing twice within a run, including mixed Page and direct inputs.

- **Content research:** compare captions, publishing dates and available engagement across public Pages.
- **Campaign reporting:** collect a consistent set of fields for a list of Reel URLs.
- **Competitor analysis:** compare posting frequency and public performance signals without combining plays and views.
- **Recurring reports:** schedule collection and use Reel IDs to match results across exports.

#### Inputs and advanced settings

| Setting               | Effect                                                                                                                                                                                             |
| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `pageUrls`            | Public Page URLs or Page Reels tabs.                                                                                                                                                               |
| `reelUrls`            | Public direct Reel or supported video URLs.                                                                                                                                                        |
| `maxReels`            | Maximum unique delivered results across all inputs; 1–10,000, default 1,000.                                                                                                                       |
| `dateFrom`, `dateTo`  | Inclusive UTC publication boundaries. Accept a date, ISO timestamp, or relative expression such as `7 days`, `2 months` or `1 year`. Relative dates use the run time.                              |
| `includeMediaUrls`    | Include available public media links; default true. The Actor does not download media.                                                                                                             |
| `maxCandidateReels`   | Maximum Reels to inspect before filtering, up to 30,000. Defaults to the smaller of five times `maxReels` or 30,000. Increasing this can find more date matches but uses more work.                |
| `metricsMode`         | `rounded` uses standard public counts. Experimental `exact` requests more detailed direct-Reel counts when available. A rounded response stays labeled `rounded`; exact counts are not guaranteed. |
| `relatedReelsPerSeed` | Opt in to up to 5 related Reels per direct input. Default 0 disables it. Results may come from other creators and count toward the same result limits and pricing.                                 |
| `saveErrors`          | Save actionable failures separately in the `error-records` dataset. Default false; Run summary remains available.                                                                                  |
| `proxyConfiguration`  | Choose Apify Proxy, a custom proxy, or no proxy. Public availability varies by route. An explicit choice is preserved.                                                                             |

Dates require an exact publication timestamp. When a date filter is active, Reels with unresolved dates are excluded and counted in Run summary. A zero-result date range can be a valid outcome; check the summary to distinguish no matches from access failures. Narrow date ranges may need a higher inspection limit.

### Facebook Reel engagement data and output

Each result is one Reel. The **Overview** view shows identity, publication time and separate engagement measures. **Details** includes all retained public fields. The following illustrative example uses shortened media coverage; unavailable fields remain `null` in actual rows.

```json
{
  "schemaVersion": "3.0.0",
  "reelId": "123456789012345",
  "videoId": null,
  "url": "https://www.facebook.com/reel/123456789012345/",
  "shareUrl": null,
  "ownerType": "page",
  "ownerName": "Example Page",
  "ownerId": null,
  "ownerUrl": "https://www.facebook.com/ExamplePage/",
  "sourcePageUrl": "https://www.facebook.com/ExamplePage/",
  "inputUrl": "https://www.facebook.com/ExamplePage/",
  "createdAt": "2026-09-01T12:00:00.000Z",
  "createdAtTimestamp": 1788264000,
  "createdAtPrecision": "exact",
  "text": "A new recipe #cooking",
  "hashtags": ["cooking"],
  "mentions": [],
  "scrapedAt": "2026-09-22T09:00:00.000Z",
  "playCount": 1200,
  "playCountDisplay": "1.2K",
  "playCountLabel": "plays",
  "playCountPrecision": "rounded",
  "viewCount": null,
  "viewCountDisplay": null,
  "viewCountLabel": null,
  "viewCountPrecision": null,
  "reactionCount": null,
  "reactionCountDisplay": null,
  "reactionCountLabel": null,
  "reactionCountPrecision": null,
  "commentCount": 0,
  "commentCountDisplay": "0",
  "commentCountLabel": "comments",
  "commentCountPrecision": "exact",
  "shareCount": null,
  "shareCountDisplay": null,
  "shareCountLabel": null,
  "shareCountPrecision": null,
  "durationSeconds": null,
  "width": null,
  "height": null,
  "thumbnailUrl": null,
  "videoUrlSd": null,
  "videoUrlHd": null,
  "dashManifestUrl": null,
  "captionsUrl": null,
  "mediaUrlObservedAt": null,
  "mediaUrlMayExpire": null,
  "musicTitle": null,
  "musicArtist": null,
  "musicIsOriginalAudio": null
}
```

| Fields                                                                       | Meaning                                                                                          |
| ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------ |
| `schemaVersion`, `reelId`, `videoId`, `url`, `shareUrl`                      | Output version, stable content IDs and links. Use `reelId` as the identity in your own database. |
| `inputUrl`, `sourcePageUrl`                                                  | The requested input and originating Page, where applicable.                                      |
| `ownerType`, `ownerName`, `ownerId`, `ownerUrl`                              | Public creator identity; owner type is `page`, `profile` or `unknown`.                           |
| `createdAt`, `createdAtTimestamp`, `createdAtPrecision`, `scrapedAt`         | Publication time as ISO and Unix seconds, its precision, and observation time.                   |
| `text`, `hashtags`, `mentions`                                               | Caption and extracted text tags.                                                                 |
| `playCount`, `viewCount`, `reactionCount`, `commentCount`, `shareCount`      | Five separate measures. Plays and views are never combined.                                      |
| Each metric's `Display`, `Label`, `Precision` fields                         | The displayed count and label, with `exact`, `rounded`, `unknown` or null precision.             |
| `durationSeconds`, `width`, `height`                                         | Available video duration and dimensions.                                                         |
| `thumbnailUrl`, `videoUrlSd`, `videoUrlHd`, `dashManifestUrl`, `captionsUrl` | Available public media links, controlled by `includeMediaUrls`.                                  |
| `mediaUrlObservedAt`, `mediaUrlMayExpire`                                    | When media URLs were observed and whether they may expire.                                       |
| `musicTitle`, `musicArtist`, `musicIsOriginalAudio`                          | Available music information.                                                                     |

`null` means unavailable, not zero. A numeric zero is preserved only when observed. A count displayed as `1.2K` can be represented as 1,200 with `rounded` precision; do not treat it as an exact count. Facebook may expose different metrics on different Reels.

#### Export Facebook Reels to JSON, CSV or Excel

Use Apify's dataset export controls for JSON, CSV and Excel. Read results through the dataset API, or start a run through the Actor API with the same input JSON. Keep your Apify token in an authorization header. Save a task and attach an Apify schedule to repeat the collection. Deduplication applies within each run; use `reelId` to combine repeated exports.

`POST https://api.apify.com/v2/acts/arabiainsights~facebook-reels-scraper/runs`

The response identifies the run and its default dataset. After completion, retrieve `GET https://api.apify.com/v2/datasets/{datasetId}/items`. Review **Run summary** as well as the dataset: it contains per-input progress, delivered and charged totals, excluded dates, partial status and stop reasons.

### Facebook Reels scraper pricing

The price is **$3 per 1,000 delivered Reels** ($0.003 per unique result). Apify platform usage is included. There is no startup charge and no separate automatic dataset-item fee. A run that delivers no Reels has no Reel event charge. Related Reels count at the same rate as directly requested results, and duplicate URLs do not create extra results or charges. Set a maximum run cost in Apify Console to control spending. Check the Actor's Pricing tab for the effective price before starting a run.

### Limits and FAQs

#### Can it retrieve a Page's entire history?

Available history varies by Page, geography, public access and the chosen limits. A large result limit does not guarantee that many results. Public access restrictions can stop a run early. Check each source's stop reason and partial status before drawing conclusions from a dataset.

#### Why are some rows or metrics missing?

A Reel may be deleted, private, restricted, missing an exact publication date, or have too little public information to produce an eligible result. The Actor does not bypass login, CAPTCHA or checkpoint restrictions. It collects public information only; use it in accordance with applicable rights and platform terms.

#### Are saved media links permanent?

No. Media links can expire. Set `includeMediaUrls` to false if you only need metadata. Unavailable links remain null.

#### What happens after an interruption?

Delivered results remain available after an interruption. Resuming the same run avoids returning already-delivered Reels again. Review delivered and charged totals in Run summary and contact support if they differ unexpectedly.

A forced stop or platform timeout can prevent the final Run summary from being saved. In that case, treat the dataset as partial and check the platform run status before using the results.

#### Can I reuse older inputs and exports?

Output version 3 retains the content and metric fields listed above and omits former diagnostic fields. Use `reelId` to identify a result. Old datasets retain their original format. The retired `debug` input is ignored with a notice when it reaches the Actor; remove it from older saved inputs if Apify reports a validation error. Use `saveErrors` for actionable errors.

#### Support

Open an issue through the [Actor Issues tab](https://apify.com/arabiainsights/facebook-reels-scraper/issues). Include the run URL, affected public input URL, expected result and a brief description. Do not share credentials or login cookies.

# Changelog

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

# Actor input Schema

## `pageUrls` (type: `array`):

Public Facebook Page or Reels-tab URLs. Personal profile listings are not supported. Combine with direct Reel URLs; available history varies by Page and public access.

## `reelUrls` (type: `array`):

Public Facebook Reel or video URLs to resolve directly. The owner can resolve as Page, profile, or unknown.

## `maxReels` (type: `integer`):

Run-wide maximum unique Reel records to emit after URL canonicalization and deduplication. Defaults to 1,000.

## `maxCandidateReels` (type: `integer`):

Maximum Reels to inspect before filtering. Defaults to min(maxReels \* 5, 30000). Higher values can find more matches for narrow date ranges but increase work and platform costs. Must be at least maxReels.

## `dateFrom` (type: `string`):

Optional inclusive lower boundary (UTC). Accepts a YYYY-MM-DD date, a full ISO timestamp, or a relative expression like "7 days", "2 months", or "1 year" (resolved against run start). Reels without an exact public timestamp are excluded when a date range is set and reported as unresolved.

## `dateTo` (type: `string`):

Optional inclusive upper boundary (UTC). Accepts a YYYY-MM-DD date, a full ISO timestamp, or a relative expression like "7 days" or "1 year" (resolved against run start). Upper boundary for publication date filtering.

## `metricsMode` (type: `string`):

Choose rounded (default) for standard public counts, or exact to request more detailed counts for direct Reels when available. Exact values are not guaranteed. Each metric retains its observed precision; rounded and unavailable values remain rounded and null.

## `relatedReelsPerSeed` (type: `integer`):

Include up to this many related Reels per direct input Reel (0–5). Related results may belong to other creators. They count toward maxReels and the same result pricing, and are deduplicated across the run.

## `includeMediaUrls` (type: `boolean`):

Include publicly exposed video and thumbnail URLs when available. Such URLs can be signed or transient; the Actor does not download media files.

## `saveErrors` (type: `boolean`):

Save actionable failures with their affected Facebook URLs in the error-records dataset. Errors are separate from result rows.

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

Choose Apify Proxy, your own proxy URLs, or no proxy. Availability can vary by route. Your explicit selection is preserved.

## Actor input object example

```json
{
  "pageUrls": [
    "https://www.facebook.com/Atro55/"
  ],
  "reelUrls": [],
  "maxReels": 1,
  "metricsMode": "rounded",
  "relatedReelsPerSeed": 0,
  "includeMediaUrls": true,
  "saveErrors": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

One record per unique delivered Reel, including content and creator identity, publication time, separate engagement metrics with precision labels, input correlation and optional media URLs. Switch between the Reels and Details views, or export the dataset.

## `summary` (type: `string`):

The RUN\_REPORT record contains per-input progress, delivered and charged totals, excluded or unresolved dates, partial-completion status, stop reasons and actionable failures. A forced stop or timeout can prevent the final report from being saved.

# 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 = {
    "pageUrls": [
        "https://www.facebook.com/Atro55/"
    ],
    "maxReels": 1,
    "dateFrom": "",
    "dateTo": "",
    "relatedReelsPerSeed": 0,
    "includeMediaUrls": false,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("arabiainsights/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 = {
    "pageUrls": ["https://www.facebook.com/Atro55/"],
    "maxReels": 1,
    "dateFrom": "",
    "dateTo": "",
    "relatedReelsPerSeed": 0,
    "includeMediaUrls": False,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("arabiainsights/facebook-reels-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 '{
  "pageUrls": [
    "https://www.facebook.com/Atro55/"
  ],
  "maxReels": 1,
  "dateFrom": "",
  "dateTo": "",
  "relatedReelsPerSeed": 0,
  "includeMediaUrls": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call arabiainsights/facebook-reels-scraper --silent --output-dataset

```

## MCP server setup

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