# Facebook Reels Scraper - Page & Profile Reels, No Login (`benthepythondev/facebook-reels-scraper`) Actor

Returns the reels of public Facebook pages and profiles: link, caption, date, plays, reactions, comments, shares, length, video file and thumbnail of every reel, in the order of the Reels tab, as far back as it goes. Works from page links or names and from single reel links. No login, no cookies.

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

## Pricing

from $2.40 / 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.
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?

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

Returns the reels of public Facebook pages and profiles without a login, a cookie or a browser. Enter page links or names and get one row per reel: link, caption, date, plays, reactions, comments, shares, length, video file and thumbnail, in the order of the page's Reels tab. Single reels can be read by their own links.

**Price:** $3.00 per 1,000 reels on the Apify Free plan, down to $2.40 from the Gold plan up. A page without a Reels tab, a page or reel that does not exist and reels outside your date limit cost nothing. Export to JSON, CSV or Excel, run on a schedule, call via API, or connect to Make, Zapier or n8n.

| What users report on the most used Facebook reels Actors | What this Actor does |
|---|---|
| ""Like" is missing", "Not getting Created time (date of reel) and also Likes, comments count etc.," | Every row has the date, the reactions, the comments and the shares of the reel |
| "Public shares of reel?" | `shares` is on every row |
| "single reel", "can not scrape Facebook Reels from URL" | `reelUrls` takes links of single reels and returns the same row |
| "Can you fetch the fanpage name and follower count?" | `authorName` and `pageFollowers` (the exact number) are on every row of a page |
| "How can I scrape only the current day's Facebook Reels?" | `postedAfter: "1 day"` |
| "No Results Scraped", "Crawler unable to retrieve stats but returns success" | The status message names every input that gave no rows and says why. A count that did not arrive is empty, never 0 |
| "Accidental credit usage" | The default is ten reels. Inputs without rows are not charged, and a run stops at its maximum charge |

### 🔎 What is the Facebook Reels Scraper?

A public page shows its Reels tab to any visitor, ten reels at a time while you scroll. This Actor makes the same requests the tab makes. It opens no browser (the test runs below used less than 200 MB of memory), and your own Facebook account is never involved.

#### What data does it extract?

- **Reel:** id, link, the link of its post, caption and publication time
- **Reach:** plays, reactions, comments and shares
- **Video:** length, width and height, the video file (HD when Facebook offers it), the cover picture, and the subtitle file when the reel has captions
- **Author:** name, id, link and the verified badge
- **Page:** link and exact follower count of the page the reel was listed on, and the reel's place in the tab

### ⬇️ Input

| Field | Type | Default | What it does |
|---|---|---|---|
| `pages` | array | | Links of public pages or profiles, their names (`natgeo`) or numeric ids. An empty input reads a sample page |
| `reelUrls` | array | | Links of single reels (`https://www.facebook.com/reel/1390761463245388`) |
| `maxResults` | integer | 10 | Reels to save per page, up to 5,000. Single reels are not counted against it |
| `postedAfter` | string | empty | Lower date limit for pages: a day (YYYY-MM-DD) or a period back from now (`3 days`, `2 weeks`, `6 months`) |

Links of the forms `facebook.com/natgeo`, `facebook.com/natgeo/reels`, `facebook.com/profile.php?id=…` and `facebook.com/people/Name/id` are understood. A reel link is recognised in either field. A link of a page's single video, post or photo (`facebook.com/natgeo/videos/…`) is skipped with a note in the log: this Actor reads Reels tabs and reel links.

#### Example input

The latest 100 reels of three pages:

```json
{
  "pages": ["https://www.facebook.com/natgeo", "bbcnews", "ESPN"],
  "maxResults": 100
}
```

The reels of the last two days, for a daily schedule:

```json
{
  "pages": ["bbcnews", "cnn"],
  "postedAfter": "2 days",
  "maxResults": 200
}
```

Single reels, for example to refresh their counts:

```json
{
  "reelUrls": [
    "https://www.facebook.com/reel/1390761463245388",
    "https://www.facebook.com/reel/1665351285019129"
  ]
}
```

#### Coming from another Facebook reels Actor?

The input names `startUrls`, `resultsLimit` and `onlyPostsNewerThan` are read as well, so an input written for the most used Facebook reels Actor runs here unchanged. The row names `facebookUrl`, `inputUrl`, `topLevelUrl`, `topLevelReelUrl`, `text`, `time` and `playCountRounded` mean the same here. What that Actor nests under `playback_video`, `video` and `video_owner` is flat here: `videoUrl`, `videoSeconds`, `thumbnailUrl`, `width`, `height`, `captionsUrl`, `authorName`, `authorId`, `authorUrl`.

### ⬆️ Output

One row per reel. A reel of a page (the two media links are shortened here):

```json
{
  "reelId": "1434930798741696",
  "topLevelReelUrl": "https://www.facebook.com/reel/1434930798741696/",
  "postId": "1679914753505948",
  "topLevelUrl": "https://www.facebook.com/100044623170418/posts/1679914753505948/",
  "facebookUrl": "https://www.facebook.com/natgeo",
  "inputUrl": "https://www.facebook.com/natgeo",
  "text": "Presented by ROLEX. It's time to explore nature on an epic scale. It's time to explore Africa. …",
  "time": "2026-10-03T14:09:52.000Z",
  "playCountRounded": 96000,
  "reactions": 1168,
  "comments": 16,
  "shares": 99,
  "videoSeconds": 30.0,
  "videoUrl": "https://video-fra3-2.xx.fbcdn.net/o1/v/t2/f2/m366/AQOWVg-O9Y4oD_7xi4jIVSVE3Jheag….mp4?…",
  "thumbnailUrl": "https://scontent-fra5-1.xx.fbcdn.net/v/t15.5256-10/835305431_1602651628018385_652232471749145288_n.jpg?…",
  "width": 1080,
  "height": 1920,
  "captionsUrl": null,
  "trackTitle": "National Geographic · Original audio",
  "authorName": "National Geographic",
  "authorId": "100044623170418",
  "authorUrl": "https://www.facebook.com/natgeo",
  "authorVerified": true,
  "pageFollowers": 51305541,
  "position": 4,
  "scrapedAt": "2026-10-06T17:17:41.634971+00:00"
}
```

`playCountRounded` is the number Facebook shows, and Facebook rounds it: 96K is 96000. `shares` is exact below 1,000 and rounded above (1.4K is 1400). `reactions` and `comments` are exact. `position` is the reel's place in the page's Reels tab, counted from the top; a reel read by its own link has no `position` and no `pageFollowers`. The run also writes a `SUMMARY` record that names the inputs without rows and the reason a run stopped.

### 💰 What a run costs

| Apify plan | Per 1,000 reels |
|---|---|
| Free | $3.00 |
| Bronze | $2.80 |
| Silver | $2.60 |
| Gold, Platinum, Diamond | $2.40 |

Apify's standard start event ($0.00005) is the only other charge; proxies are included. Not charged: a page that shows visitors no Reels tab, a page or reel that does not exist, a reel that two entries of your input name (it is saved once) and reels older than your date limit. Set the run's maximum charge and the Actor stops at it with the rows it has saved.

### ⏱️ Measured

These numbers are from October 6, 2026, on a test server outside Apify that asked Facebook from its own address, without a proxy. Times on Apify can differ.

| Run | Reels | Time |
|---|---|---|
| Empty input (sample page), three runs | 10 | 3.4 s each |
| One page, 100 reels | 100 | 19 s |
| Three pages side by side, 300 reels each | 900 | 52 s |
| One page, 1,000 reels, back to February 2024 | 1,000 | 168 s |
| A page's whole list of 131 reels, back to its first of 2018 | 131 | 23 s |
| Ten single reels by link | 10 | 6 s |
| Four pages with a date limit of two days | 54 | 20 s |

The runs in the table stayed below 200 MB; the highest of all test runs was 215 MB. A request for ten recent reels takes one to two seconds, and two to three seconds 2,000 reels down a list. The deepest read was 3,260 reels of one page, back to May 2019, and the list had not ended there. In the 1,900 rows of two of these runs every row had plays, reactions, comments, shares, length, video file and thumbnail. A run that was killed and started again ended with 481 rows, none of them twice. Through residential addresses, which the Actor takes only when Facebook serves neither its own address nor Apify's datacenter proxy, ten requests took 9 to 17 seconds each.

### 🤖 For AI agents

Smallest useful call:

```json
{"pages": ["https://www.facebook.com/natgeo"], "maxResults": 20}
```

Each row is one reel with `topLevelReelUrl`, `text`, `time`, `playCountRounded`, `reactions`, `comments`, `shares`, `videoSeconds`, `videoUrl` and `authorName`. `pages` and `reelUrls` take several entries at once. An input that gives no rows costs nothing; the status message and the `SUMMARY` record name it with the reason. No credentials are needed.

### 💡 Use cases

- 📊 **Competitor and brand tracking:** what a company publishes as reels, how often, and which reels get plays, reactions and shares.
- 🎯 **Creator research:** the reach of a creator's reels over time, before a campaign is booked.
- 🎬 **Content research:** which lengths, formats and captions work on the pages of your market.
- 🔁 **Reporting:** the counts of a known list of reels, read again every week by their links.

### ⚠️ Limits, stated plainly

- **Pages that show visitors a Reels tab.** In a check of 32 pages, 30 did. NASA showed none and is reported as "No Reels tab for visitors"; a reel of that page was still read by its link. Samsung's page sends a visitor to the login and is reported as "Not shown to visitors".
- **Plays are rounded by Facebook,** and shares above 999. Reactions come as one total, not by kind.
- **The tab is close to newest first, not exactly.** Two of the three lists read to depth were in date order but for one reel. In the third, 3,250 reels of a page that publishes in batches, half of the reels stood below an older one, and 96 in 100 reels stood at most thirty places late. A date limit therefore reads on until thirty reels in a row are older. Tested on that third list with 997 date limits inside its newest 1,000 reels, the rule missed no reel; with limits reaching back seven years it missed one to five reels for 2 in 100 limits.
- **A lower date limit only.** Facebook's list takes no dates, so a range from the past means reading down to it. Filter on `time` for an upper limit.
- **Ten reels per request.** That is what Facebook hands out; one page gave 310 to 360 reels a minute in the runs above, and several pages run side by side.
- **5,000 reels per page and run.** Lists longer than 3,260 reels are untested.
- **Comments are counted, not exported.** The [Facebook Comments Scraper](https://apify.com/benthepythondev/facebook-comments-scraper) returns the texts when you give it the `topLevelReelUrl` of a row.
- **No keyword or hashtag search, no reels of groups.** This Actor reads pages and reels you name.
- **Media links are Facebook's own and expire.** Download videos and pictures soon after the run if you need the files.
- **A single reel's plays come from its page title.** A reel whose title states none has an empty `playCountRounded`.

### ❓ FAQ

**Do I need a Facebook account or cookies?** No. The Actor reads what a visitor without an account gets.

**Does it work for personal profiles?** For profiles that show their reels to everyone, such as public figures. In the tests a personal profile with 121 million followers was read like a page.

**Why is a page reported as "No Reels tab for visitors"?** The page exists, and Facebook shows a visitor no Reels tab for it. Open the page in a private browser window to see the same. Its reels can still be read one by one through `reelUrls`.

**Why are there fewer reels than I asked for?** The page has fewer, or your date limit was reached. When a page has more reels than `maxResults`, the status message says so.

**How do I get only new reels every day?** Put the run on a schedule with `postedAfter` set to `2 days` and keep the rows by `reelId`. A reel is then delivered on two days; `reelId` identifies it.

**Can I download the videos?** `videoUrl` is the file's link. The Actor returns the link and does not store the file.

**Are the counts exact?** Reactions and comments are. Plays, and shares above 999, are rounded by Facebook before anyone sees them.

**Can the same reel appear twice?** No. A reel that is listed under its page and also given by its link is saved once, and a run that is started again saves nothing a second time.

**How do I call it from code?** With the Apify API or the Python and JavaScript clients; every run returns a dataset you can fetch as JSON or CSV. It also works as a tool through Apify's MCP server.

**Is it legal?** The Actor reads what Facebook shows to everyone without a login. Reels and captions can contain personal data: GDPR, CCPA and similar rules apply to how you store and use them, and Facebook's terms apply to you as well. Collect only what you need.

### 🔗 You might also like

- [Facebook Posts Scraper](https://apify.com/benthepythondev/facebook-posts-scraper): all posts of public pages and profiles, with a date range
- [Facebook Comments Scraper](https://apify.com/benthepythondev/facebook-comments-scraper): the comments and replies under a reel or post
- [Facebook Groups Scraper](https://apify.com/benthepythondev/facebook-groups-scraper): posts of public Facebook groups
- [Instagram Reels Scraper](https://apify.com/benthepythondev/instagram-reels-scraper): reels of public Instagram accounts with plays and likes
- [TikTok Profile Videos Scraper](https://apify.com/benthepythondev/tiktok-profile-videos-scraper): a profile's videos with views, likes and captions

**Keywords:** facebook reels scraper, facebook reels api, scrape facebook reels, facebook reel download link, facebook reels data, facebook reel views, facebook reels play count, facebook reels reactions, facebook reels by page, facebook page reels export, facebook reel url scraper, facebook reels csv, facebook video scraper, competitor reels tracking, no login facebook scraper, social media monitoring

# Actor input Schema

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

Pages or public profiles whose reels are listed: links (https://www.facebook.com/natgeo, with or without /reels), names (natgeo) or numeric ids. Several are read side by side. A page that shows visitors no Reels tab, or that does not exist, is reported and costs nothing.

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

Links of single reels (https://www.facebook.com/reel/1390761463245388). Each returns one row with the same fields. Use this for reels of pages that show visitors no Reels tab, or to refresh the counts of reels you already know.

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

Reels to save for each page, in the order of its Reels tab (close to newest first). Facebook hands out ten reels per request. Single reel links are not counted against this number.

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

Lower date limit for pages: a day (YYYY-MM-DD) or a period back from now such as 3 days, 2 weeks or 6 months. Older reels are neither saved nor charged, and a page is left after thirty reels in a row that are older. A reel given by its own link is returned whatever its date.

## Actor input object example

```json
{
  "pages": [
    "https://www.facebook.com/natgeo"
  ],
  "maxResults": 10
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "pages": [
        "https://www.facebook.com/natgeo"
    ]
};

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

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

```

## MCP server setup

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