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

Scrapes public Facebook Reels from Pages and profiles, or from single reel links, with captions, plays, reactions, comments, shares, duration, publish date, thumbnail and video URL. No login or cookies needed.

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

## Pricing

$1.50 / 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

### What does Facebook Reels Scraper do?

**Facebook Reels Scraper** collects **public Facebook Reels** from any Page or
profile, newest first, or from single reel links. For every reel you get the
**caption, play count, reactions, comments, shares, duration, publish date,
thumbnail, a direct MP4 video link** and the **owner's name, id and Page link**.
No login, cookies or Facebook account needed.

Try it with the prefilled Page: open the Actor, click **Start**, and the 10
newest [National Geographic](https://www.facebook.com/natgeo/reels/) reels
arrive in about 5 seconds. Because it runs on the Apify platform, you also get
API access, scheduled runs, integrations (Google Sheets, Make, Zapier,
webhooks), run monitoring and automatic retries from fresh proxy addresses.

### Why scrape Facebook Reels?

- **Competitor and brand monitoring**: see which reels a Page posts, how often,
  and which ones earn the most plays, reactions and shares.
- **Influencer research**: compare creators by real engagement per reel before
  you contact them.
- **Content research**: find the topics, lengths and captions that perform best
  in your niche.
- **Reporting**: schedule a daily run and send fresh numbers to a spreadsheet
  or dashboard.
- **Archiving and AI datasets**: save captions, dates and video links for
  analysis or model training.

### How to scrape Facebook Reels

1. Open the Facebook Page or profile and copy its address, such as
   `https://www.facebook.com/natgeo`. The Reels tab address works too. You can
   also paste a single reel link such as `https://www.facebook.com/reel/2585145121954483`.
2. Paste it into **Facebook Page, profile or reel links**, one link per line.
3. Set **Max reels per Page or profile**.
4. Click **Start**, then download the results when the run finishes.

### Input

Everything is set on the Input tab. In JSON, the input looks like this:

```json
{
    "startUrls": [
        "https://www.facebook.com/natgeo/reels/",
        "https://www.facebook.com/profile.php?id=100044623170418",
        "https://www.facebook.com/reel/1774316943845214",
        "https://www.facebook.com/share/r/1DWziuVHRi/"
    ],
    "maxReelsPerPage": 30
}
```

| Field | What it does | Default |
|---|---|---|
| `startUrls` | Page or profile links (`facebook.com/natgeo`, `facebook.com/natgeo/reels/`, `facebook.com/profile.php?id=…`, `facebook.com/people/Name/ID/` or just `natgeo`) and single reel links (`facebook.com/reel/…`, `fb.watch/…`, `facebook.com/share/r/…`, `facebook.com/watch/?v=…`, `facebook.com/<page>/videos/…`). Links without `https://` and API objects such as `{"url": "…"}` are accepted. | required |
| `maxReelsPerPage` | Stops after this many reels for each Page or profile, newest first. Facebook sends reels 10 at a time. | 30 |

### Output

One row per reel. You can download the dataset in various formats such as
JSON, HTML, CSV, or Excel. A real row (long links shortened):

```json
{
    "id": "1115126944393860",
    "url": "https://www.facebook.com/reel/1115126944393860",
    "caption": "President Donald Trump has been warding off protesters at his rallies across battleground states ahead of the midterms in November.",
    "playCount": 6700,
    "reactionCount": 146,
    "commentCount": 56,
    "shareCount": 9,
    "durationSeconds": 84.565,
    "publishedAt": "2026-10-20T07:32:13+00:00",
    "thumbnailUrl": "https://scontent-lga3-1.xx.fbcdn.net/v/t15.5256-10/855937162_…_n.jpg?…",
    "videoUrl": "https://video-lga3-2.xx.fbcdn.net/o1/v/t2/f2/m366/AQNjM6K….mp4?…",
    "ownerName": "CNN",
    "ownerId": "100059479812265",
    "ownerUrl": "https://www.facebook.com/cnn",
    "inputUrl": "https://www.facebook.com/cnn/reels/",
    "scrapedAt": "2026-10-20T07:50:29.959219+00:00"
}
```

### Data fields

| Field | Type | Description |
|---|---|---|
| `id` | string | The reel's video id. |
| `url` | string | Link to the reel. |
| `caption` | string or null | The reel's text. Null when the reel has none. |
| `playCount` | number or null | Plays, as Facebook shows them: exact below 1,000, rounded above (131K becomes 131000). Null in the rare case Facebook shows no play count. |
| `reactionCount` | number | Exact number of reactions (likes, loves and the rest). |
| `commentCount` | number | Exact number of comments. |
| `shareCount` | number | Shares, as Facebook shows them: exact below 1,000, rounded above (1.2K becomes 1200). |
| `durationSeconds` | number | Length of the video in seconds. |
| `publishedAt` | string | Publish time, ISO 8601 in UTC. |
| `thumbnailUrl` | string | Cover image. |
| `videoUrl` | string | Direct MP4 file (HD when Facebook offers it). The link is signed by Facebook and stops working after a few days. |
| `ownerName` | string | Name of the Page or person who posted the reel. |
| `ownerId` | string | Their Facebook id. |
| `ownerUrl` | string | Link to their Page or profile. |
| `inputUrl` | string | The link from your input that gave this reel. |
| `scrapedAt` | string | When the row was saved (ISO 8601, UTC). |

### How much does it cost to scrape Facebook Reels?

You pay per reel saved; see the **Pricing** tab for the exact price. Links
that give nothing (a Page without reels, a removed reel, a mistyped link) are
never charged. The Actor uses plain HTTP requests, not a browser, so runs are
fast: a few hundred reels usually take under a minute or two, and the
platform usage itself stays well below a cent per 1,000 reels.

You can set a maximum cost per run in the run options; the Actor stops cleanly
when it reaches it.

### Tips

- **Many Pages at once**: put all of them in one run. Four links are read at
  the same time, and each reel is saved once even if it shows up twice.
- **Daily monitoring**: schedule the Actor with a small `maxReelsPerPage`
  (10 or 20) to pick up only the newest reels.
- **Exact numbers**: reactions and comments are exact. Plays and shares are
  rounded by Facebook itself above 1,000 for every visitor who is not logged in.
- **Downloading videos**: save `videoUrl` files soon after the run; Facebook's
  links expire after a few days.

### FAQ, disclaimers, and support

**Do I need a Facebook account or cookies?** No. The Actor reads only what
Facebook shows to logged-out visitors.

**Why did a link give nothing?** The run's **FAILED_INPUTS** record (in the
key-value store) lists every such link with the reason: for example the Page
does not exist, has no public reels, or the reel was removed or is private.
Private profiles, groups, stories and age-restricted content are not visible
logged out and can't be scraped.

**Which reels does a Page link give?** The reels on the Page's Reels tab,
newest first, up to your limit.

**Is it legal to scrape Facebook?** This Actor collects only publicly
available data. Reels and their owners' names can still be personal data
under rules such as the GDPR, so make sure you have a legitimate reason to
collect them, store them securely, and don't use them for spam. Check
Facebook's terms and consult a lawyer if you are unsure.

**Found a problem or need another field?** Open an issue on the **Issues**
tab and we'll look into it. Custom scraping solutions are available on request.

# Actor input Schema

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

One link per line. Paste a Page or profile (https://www.facebook.com/natgeo, https://www.facebook.com/natgeo/reels/ or https://www.facebook.com/profile.php?id=…) to get its newest reels, or a single reel (https://www.facebook.com/reel/…, https://fb.watch/…, https://www.facebook.com/share/r/…, https://www.facebook.com/watch/?v=…). Links without https:// work too. Links that give nothing are listed with the reason in the FAILED_INPUTS record.

## `maxReelsPerPage` (type: `integer`):

Stops after this many reels for each Page or profile link, newest first. Facebook sends reels 10 at a time, so a multiple of 10 uses every page it loads. Single reel links always give one reel.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/natgeo/reels/"
  ],
  "maxReelsPerPage": 10
}
```

# Actor output Schema

## `dataset` (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": [
        "https://www.facebook.com/natgeo/reels/"
    ],
    "maxReelsPerPage": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("mina_safwat/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": ["https://www.facebook.com/natgeo/reels/"],
    "maxReelsPerPage": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("mina_safwat/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 '{
  "startUrls": [
    "https://www.facebook.com/natgeo/reels/"
  ],
  "maxReelsPerPage": 10
}' |
apify call mina_safwat/facebook-reels-scraper --silent --output-dataset

```

## MCP server setup

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