# Facebook Reels Scraper - Exact Play Counts (`scrapesage/facebook-reels-scraper`) Actor

Scrape Facebook Reels without login: exact play count (not rounded), reaction breakdown by type, comment count, share count, duration, caption, thumbnail and page identity. Filter by plays and date, with monitor mode for new Reels.

- **URL**: https://apify.com/scrapesage/facebook-reels-scraper.md
- **Developed by:** [Scrape Sage](https://apify.com/scrapesage) (community)
- **Categories:** Social media, Videos, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 reel scrapeds

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/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 - Exact Play Counts

Scrape **Facebook Reels without a login** and get the **exact play count** - not a rounded one - plus a **reaction breakdown by type**, comment count, share count, duration, caption, thumbnail and page identity.

### Why this one

The incumbent Facebook Reels scraper charges **$0.005 per item** for a declared output view of **four fields**: reel URL, text, time, and `playCountRounded`. *Rounded.* On an analytics product, the headline number is approximated and everything else is missing.

This actor returns **~15 fields** for **$0.004**, and the play count is exact.

| | This actor | Typical incumbent |
|---|---|---|
| Play count | ✅ **exact** (e.g. 5,054,092) | rounded |
| Plays attributable to the post | ✅ `postPlayCount` | ❌ |
| Reactions | ✅ total **+ breakdown by type** (like / love / haha / …) | ❌ |
| Comment count | ✅ | ❌ |
| Share count | ✅ | ❌ |
| Duration | ✅ to the millisecond | ❌ |
| Caption + hashtags | ✅ | text only |
| Thumbnail, page id, owner id | ✅ | ❌ |
| Date + play filters | ✅ | ❌ |
| Price per item | **$0.004** | $0.005 |

### What you get per Reel

`reelUrl` · `videoId` · `isReel` · `pageSlug` · `pageName` · `pageId` · `ownerId` · `caption` · `hashtags[]` · **`playCount`** · `postPlayCount` · **`reactionCount`** · **`reactionBreakdown{}`** · `commentCount` · `shareCount` · `shareCountLabel` · `engagementTotal` · `engagementRate` · `durationSeconds` · `publishedAt` · `publishedTimestamp` · `thumbnailUrl` · `totalPosts` · `isSplitOwnership` · `scrapedAt`

### Input

```json
{
  "pages": ["natgeo", "cnn"],
  "onlyReels": true,
  "requirePlayCount": true,
  "minPlays": 100000,
  "postedAfter": "2026-06-01",
  "maxResults": 100,
  "proxyConfiguration": { "useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"] }
}
```

| Field | What it does |
|---|---|
| `pages` | Page slugs or page URLs |
| `reelUrls` | Specific Reels (URL or numeric id) |
| `onlyReels` | Reels only (default). Off = include the page's regular videos, same metrics |
| `requirePlayCount` | Only return Reels that have an exact play count (default on - see limits) |
| `minPlays` | Play floor |
| `postedAfter` / `postedBefore` | Date window (`YYYY-MM-DD`) |
| `maxResults` | Cap. `0` = no limit |
| `onlyNewReels` | Monitor mode for a scheduled feed |

### How it works (and the honest limits)

Facebook splits this data across two logged-out surfaces, and this actor joins them:

- **`/{page}/videos/`** carries the **exact play count**, plays-per-post, publish time, caption, reaction breakdown, thumbnail and permalink.
- **`/{page}/reels/`** identifies **which** videos are Reels and adds **duration, comment count and share count**.

They are joined on the internal feedback id that *both* surfaces expose - never by position on the page, which would silently attach one Reel's engagement to another.

**The consequence you should know about:** the two tabs paginate independently, so a page's **older Reels can appear in the Reels tab with no play count** - measured at 67% coverage on a 46-Reel sample. Because this actor is sold on the exact play count, **`requirePlayCount` defaults to on**, so the play-count column is never empty. Turn it off to receive every Reel found, including ones without a play count.

Other limits:

- **Reactions are only available as a per-type breakdown.** Facebook returns `aggregated_reaction_count` as **null** to logged-out callers; `top_reactions` gives real per-type counts, which this actor sums into `reactionCount`. That sum reflects the top reaction types, so treat it as a strong floor rather than a guaranteed grand total.
- **Not every page serves logged-out video data.** Some pages return a shell on every attempt (measured: National Geographic works richly, some others return nothing). The run still ends successfully, says so in the status, and bills you nothing for that page.
- **`commentCount`, `shareCount` and `durationSeconds` are Reels-tab fields**, so they are absent on regular videos when you set `onlyReels: false`.
- **Public pages only.** No login, no cookies, no personal profiles.

### Pricing (pay per event, no start fee)

| Event | Price | What it covers |
|---|---|---|
| `reel` | **$0.004** | One Reel with exact play count, reaction breakdown, comment count, share count, duration, caption, thumbnail and page identity |

Reels are billed **before** they are written, and Reels removed by your filters are never billed.

### Use with AI assistants (MCP)

Works as an LLM tool via the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) - ask an assistant for "National Geographic's best-performing Reels this month by plays" and it can call this actor directly.

### Agent-ready: autonomous payments (x402 & Skyfire)

This actor is **agent-ready** — AI agents can discover it, run it, and **pay for it autonomously**, with no Apify account and no human in the loop. It uses [pay-per-event](https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event) pricing and [limited permissions](https://docs.apify.com/platform/actors/development/permissions), so it qualifies for Apify's agentic-payment standards:

- **[x402](https://docs.apify.com/platform/integrations/x402)** — an open, HTTP-native payment protocol. Agents pay per run in USDC on the Base network directly through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp) — no account, no API key.
- **[Skyfire](https://docs.apify.com/platform/integrations/skyfire)** — agent-to-service payments for fully autonomous AI-agent workflows.

Building an AI agent, MCP tool, or autonomous data pipeline? This scraper is ready to plug in and pay as it goes.

### Integrations

[Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://apify.com/integrations/slack), [Google Drive](https://apify.com/integrations/google-drive), [Airbyte](https://apify.com/integrations/airbyte), [GitHub](https://apify.com/integrations/github), the [Apify API](https://docs.apify.com/api/v2), [Schedules](https://docs.apify.com/platform/schedules) and [Webhooks](https://docs.apify.com/platform/integrations/webhooks).

### FAQ

**Do I need a login or cookies?** No.

**Is the play count really exact?** Yes - values come back as integers like `5054092`, straight from Facebook's own payload.

**Why did a page return nothing?** Some pages are gated for logged-out visitors. The run succeeds, tells you in the status message, and bills nothing.

**Can I get view counts as well as plays?** Facebook exposes `play_count` (and a per-post variant) on this surface; there is no separate logged-out view-count field, so this actor does not invent one.

### Related scrapers by scrapesage

- [Instagram Reels Scraper](https://apify.com/scrapesage/instagram-reels-scraper) - the Instagram side, with play and view counts
- [Facebook Ad Library Scraper](https://apify.com/scrapesage/facebook-ad-library-scraper) - Meta ad creatives and advertiser intelligence
- [Instagram Hashtag Scraper](https://apify.com/scrapesage/instagram-hashtag-scraper) - filtered hashtag and keyword search
- [TikTok Scraper](https://apify.com/scrapesage/tiktok-scraper) - short-form video analytics on TikTok

# Actor input Schema

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

Page slugs or page URLs whose Reels you want, e.g. natgeo or https://www.facebook.com/natgeo/

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

Specific Reels, e.g. https://www.facebook.com/reel/2891748427826015/ or the bare numeric id.

## `onlyReels` (type: `boolean`):

Return only Reels. Turn off to include the page's regular videos too (they carry the same exact play counts and reaction breakdown).

## `requirePlayCount` (type: `boolean`):

Play counts come from the page Videos tab, which paginates separately from the Reels tab, so a page’s older Reels can appear without one. On by default so the play-count column is never empty. Turn off to receive every Reel found, including ones with no play count.

## `minPlays` (type: `integer`):

Skip Reels below this exact play count.

## `postedAfter` (type: `string`):

Only Reels published on or after this date (YYYY-MM-DD).

## `postedBefore` (type: `string`):

Only Reels published on or before this date (YYYY-MM-DD).

## `maxResults` (type: `integer`):

Total Reels to return across all inputs. 0 means no limit (the run's time budget stops it safely).

## `onlyNewReels` (type: `boolean`):

Remembers Reels already returned for this input set and emits only unseen ones. Ideal on a schedule.

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

RESIDENTIAL is the tested default and strongly recommended - Facebook rate-limits datacenter ranges hard.

## Actor input object example

```json
{
  "pages": [
    "natgeo"
  ],
  "onlyReels": true,
  "requirePlayCount": true,
  "minPlays": 0,
  "maxResults": 100,
  "onlyNewReels": false,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

Every scraped Reel with its exact play count, per-type reaction breakdown, comment count, share count, duration, caption, thumbnail and page identity as JSON items in the default dataset.

# 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 = {
    "pages": [
        "natgeo"
    ],
    "onlyReels": true,
    "requirePlayCount": true,
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapesage/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 = {
    "pages": ["natgeo"],
    "onlyReels": True,
    "requirePlayCount": True,
    "maxResults": 100,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("scrapesage/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 '{
  "pages": [
    "natgeo"
  ],
  "onlyReels": true,
  "requirePlayCount": true,
  "maxResults": 100,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call scrapesage/facebook-reels-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/PkzofVTggtwb0uZgU/builds/igRfhRUj1EQMGcMZ3/openapi.json
