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

Facebook Reels scraper: get views, likes, comments, shares, captions, music and MP4 video URLs to download from any public Page or profile, or from reel, share and video links. No login. Exact likes and comments, views even from share links, and personal profiles as well as Pages.

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

## Pricing

from $1.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

Scrape public Facebook Reels from any Page or profile, or from single reel, share and video links. This FB Reels scraper gives you each reel's views, likes, comments, shares, caption, hashtags, mentions, music, owner, duration, thumbnail and MP4 video file URL, as clean JSON, CSV or Excel.

Use it as a Facebook Reels API: start it from Apify's API, a schedule or an integration, and get Facebook reel views and video stats back as structured data. The video URLs let you download Facebook reels and videos while the links are valid.

No Facebook account, cookies or login needed: the scraper reads only what Facebook shows to logged-out visitors.

*Published by **Lantern Fetch**. Not affiliated with, endorsed or sponsored by Meta Platforms, Inc. Facebook is a trademark of Meta Platforms, Inc.*

### How to use the Facebook Reels Scraper

1. Click **Try for free** and paste one or more Facebook Pages, profiles, reel, share or video links into **Facebook URLs or handles**. A handle such as `natgeo` works too.
2. Set **Max reels per Page or profile** (the form suggests 20; left out in an API call, it is 50), and optionally **Only reels newer than**, for example `30 days`.
3. Click **Start**. Each reel appears as one row in the **Output** tab; export it as JSON, CSV or Excel, or read it through the API.

Example input:

```json
{
  "startUrls": ["https://www.facebook.com/natgeo", "https://www.facebook.com/reel/1671666994301936"],
  "maxReelsPerProfile": 20
}
```

One output row, shortened (the full item is in the output section below):

```json
{
  "url": "https://www.facebook.com/reel/1671666994301936",
  "owner": { "handle": "natgeo", "name": "National Geographic" },
  "createdAt": "2026-11-06T22:00:06.000Z",
  "viewCountRounded": "318K",
  "likes": 3821,
  "comments": 30,
  "sharesRounded": "54",
  "videoUrl": "https://video-….fbcdn.net/…mp4?…"
}
```

### Use cases

- **Competitor reel tracking**: follow the reels other Pages post, with their views, likes and comments.
- **Creator research**: see what a creator posts and how each reel performs before you work with them.
- **Content performance reports**: export your own or your clients' reel stats to CSV or Excel, on a schedule.
- **Reel stats for AI agents**: call the scraper through Apify's API or MCP server and hand the JSON to your agent.

### What this Facebook Reels API can scrape

| Input | Example | What you get |
|---|---|---|
| Page or profile (URL or handle) | `natgeo`, `https://www.facebook.com/zuck` | Its Reels tab, newest first, paginated to the end or to your limit |
| Numeric profile id | `https://www.facebook.com/profile.php?id=100044623170418` | Same as above |
| Reel URL | `https://www.facebook.com/reel/1671666994301936` | That reel |
| Share link | `https://www.facebook.com/share/r/<code>/` | The reel or video it points to |
| Video URL | `https://www.facebook.com/natgeo/videos/1671666994301936` | That video, with exact play and view counts |

Mix any of these in one run.

### Why this FB Reels scraper

- **Profiles as well as Pages.** Public personal profiles' Reels tabs work, not only Pages.
- **Views from share links.** Share links are followed to the reel and, when the reel page has no view count, to its video page.
- **Exact likes and comments** on every reel, and **two view figures, clearly labelled**: Facebook shows *plays* on the Reels tab and *views* on the reel page, and they differ. You get both instead of one mixed figure.
- **Errors are data, not crashes.** An account with no public reels, a dead link or a blocked request becomes an item that says what happened.
- **No browser.** One request per 10 reels, so runs are small and cheap.

### Input

| Field | Title in the form | Default | |
|---|---|---|---|
| `startUrls` | Facebook URLs or handles | (required) | Page/profile URLs or handles, reel, share and video URLs. |
| `maxReelsPerProfile` | Max reels per Page or profile | 50 | Reels per Page or profile. |
| `newerThan` | Only reels newer than | none | Only reels posted after this date: `2026-10-01`, or relative, like `7 days` or `3 months`. Facebook's Reels tab is not strictly in date order (Pages pin reels, and some appear a few days out of place), so the scraper stops only after 5 older reels in a row. |
| `exactCounts` | Exact view counts (slower) | false | Also open each reel's video page for the exact `playCount` and `viewCount`. One extra request per reel, so Page and profile runs take about 10× the requests. |
| `proxyConfiguration` | Proxy | Apify datacenter | Datacenter proxy works for logged-out Facebook and is the cheapest. |
| `residentialFallback` | Fall back to residential proxy when blocked | false | After 3 blocked requests in a row on datacenter proxy, switch to Apify residential proxy for the rest of the run. Residential traffic is billed to your Apify account. |
| `maxConcurrency` | Max parallel inputs | 5 | Inputs scraped in parallel (max 10). |
| `healthCheck` | Health check mode | false | For monitoring: the run fails when a Page or profile gives fewer reels than asked for, an input becomes an error item, or Facebook's pagination query id is not found. |

```json
{
  "startUrls": ["natgeo", "https://www.facebook.com/zuck", "https://www.facebook.com/reel/1671666994301936"],
  "maxReelsPerProfile": 100,
  "newerThan": "30 days"
}
```

### Facebook reel views, likes and comments: output

One item per reel. Every field is always present and is `null` (or `[]`) when Facebook does not show it, so the schema is the same for every input type.

```json
{
  "type": "reel",
  "id": "1671666994301936",
  "postId": "1714009876763102",
  "url": "https://www.facebook.com/reel/1671666994301936",
  "owner": {
    "id": "100044623170418",
    "handle": "natgeo",
    "name": "National Geographic",
    "url": "https://www.facebook.com/natgeo",
    "isVerified": true,
    "type": "page"
  },
  "caption": "Take to the mountain trails in northern Peru with a visit to Kuélap, …",
  "hashtags": ["bestoftheworld"],
  "mentions": [],
  "createdAt": "2026-11-06T22:00:06.000Z",
  "playCount": null,
  "playCountRounded": "161K",
  "playCountApprox": 161000,
  "viewCount": null,
  "viewCountRounded": null,
  "viewCountApprox": null,
  "likes": 2086,
  "comments": 17,
  "sharesRounded": "29",
  "sharesApprox": 29,
  "durationSeconds": 8.853,
  "width": 1080,
  "height": 1920,
  "thumbnailUrl": "https://scontent-….fbcdn.net/…jpg",
  "videoUrl": "https://video-….fbcdn.net/…mp4?…&oe=6AF4AC92…",
  "videoHdUrl": "https://video-….fbcdn.net/…mp4?…",
  "videoSdUrl": "https://video-….fbcdn.net/…mp4?…",
  "videoUrlExpiresAt": "2026-11-11T21:57:38.000Z",
  "music": { "id": null, "title": null, "artist": null, "isOriginalAudio": null },
  "source": "reels_tab",
  "inputUrl": "natgeo",
  "scrapedAt": "2026-11-07T10:10:43.677Z"
}
```

| Field | Meaning |
|---|---|
| `owner.type` | `page` or `profile`. Read from the Reels tab; on single reel inputs it is known only when the same run also scraped the owner's tab, or from the video page. |
| `playCount` | **Exact** plays. Only from a video page (`/videos/` inputs, `exactCounts`, or share links that lead there). |
| `playCountRounded`, `playCountApprox` | Plays as the Reels tab shows them (`"161K"`), and that figure as a number. **The number is an estimate**: `161K` means anything from 160,500 to 161,499. |
| `viewCount` | **Exact** views from the video page. Facebook counts views differently from plays, so the two can be far apart. |
| `viewCountRounded`, `viewCountApprox` | Views as the reel page title shows them (`"151K views"`). Only for reel and share inputs. |
| `likes`, `comments` | Exact counts. `likes` is all reaction types together. |
| `sharesRounded`, `sharesApprox` | Facebook shows shares only rounded to logged-out visitors. |
| `hashtags` | Lower-case, without `#`, from the caption and Facebook's hashtag links. |
| `mentions` | Pages and profiles tagged in the caption (`name`, `url`, `id`), plus plain `@handles`. |
| `music` | `title` and `artist` of the soundtrack (Facebook's "Artist · Title"), its `id`, and `isOriginalAudio` (the creator's own sound, as opposed to library music). All `null` for reels Facebook shows without a soundtrack label, about half of them. |
| `videoUrl` | Best available MP4 (HD if there is one). The link is signed and **expires at `videoUrlExpiresAt`**, usually about 4 days later: download the file before then. |
| `source` | Where the item was read: `reels_tab`, `reel_page` or `video_page`. |
| `inputUrl` | The input the item came from, as you wrote it. |

#### Errors

Inputs that give no reels produce one item instead of failing the run. They are **never charged**.

```json
{ "type": "error", "inputUrl": "mosseri", "error": "not_available", "reason": "Facebook says this content isn't available right now: …", "scrapedAt": "…" }
```

| `error` | Meaning |
|---|---|
| `no_public_reels` | The account exists, but its Reels tab shows no reels to logged-out visitors. |
| `not_available` | Private, deleted, age- or region-restricted, or hidden from logged-out visitors. |
| `not_a_reel` | A share link that leads to a post, photo or group post, not a video. |
| `reel_not_found` | The reel or share link has no data or does not redirect anywhere. |
| `invalid_input` | Not a supported Facebook URL or handle. |
| `blocked` | Facebook kept answering with HTTP 429/403 or a login page on several fresh sessions. |
| `facebook_error` | Facebook kept answering "Sorry, something went wrong" (HTTP 500). It does this for some specific accounts while others work. |
| `network_error` | Repeated timeouts or connection errors. |
| `doc_id_not_found` | Facebook changed its pagination query and the scraper could not find the new one. The first 10 reels are still returned. |

The run's key-value store has an `OUTPUT` record with totals: reels, errors by code, requests, retries, blocks and which pagination query id was used.

### Pricing

Pay per result: **$2.00 per 1,000 reels**. Users on higher Apify plans pay less:

| Apify plan tier | Price per 1,000 reels |
|---|---|
| Free, Bronze | $2.00 |
| Silver | $1.70 |
| Gold and above | $1.40 |

Error items are free. You can cap a run's cost with the *Maximum cost per run* setting. Apify platform usage is included in the price.

### Reliability

Tested on 2026-11-07: 1,277 reels from 26 Pages and profiles in one run on the default datacenter proxy, plus 1,156 reels on residential proxy and 200 from reel and video URLs. Facebook did not block a single request, and no reel was returned twice. 24 of the 26 accounts returned reels; the other 2 hide them from logged-out visitors and came back as error items.

- Follows Facebook's own redirects (`web.facebook.com`, handle capitalisation, numeric ids to vanity URLs).
- Finds Facebook's current pagination query id in its public scripts and remembers the last one that worked.

### Limits

- Only public content that Facebook shows to logged-out visitors. Some accounts hide their Reels tab from logged-out visitors; those return `no_public_reels` or `not_available`.
- Shares are rounded (`"1.2K"`); Facebook does not show an exact share count logged out.
- Exact play and view counts need the video page, one extra request per reel (`exactCounts`). Video URL inputs (`/<owner>/videos/<id>`) have exact counts but no share count or music, because that page does not show them.
- `fb.watch` short links are not supported yet: open them once and pass the URL they lead to.

### Possible add-ons

Not included yet; ask if you need them:

- **Creator follower counts.** Needs one more request per creator.
- **Transcripts.** Needs speech-to-text on the video file.

### FAQ

#### How do I get Facebook Reels views?

Add the Page, profile or reel to **Facebook URLs or handles**. Reels from a Page's or profile's Reels tab come with plays as Facebook shows them there (`playCountRounded`, for example `"161K"`). Reel and share links come with the views from the reel page (`viewCountRounded`). For exact numbers, turn on **Exact view counts**, or pass video URLs (`/<owner>/videos/<id>`): you then get the exact `playCount` and `viewCount`.

#### Can I download Facebook reels?

Yes. Each item has `videoUrl` (the best MP4 available), plus `videoHdUrl` and `videoSdUrl`. Open or download those links to save the video. Facebook signs them and they stop working at `videoUrlExpiresAt`, usually about 4 days later, so download soon after the run. The scraper returns the links; it does not store the video files. Reels belong to their creators, so get permission before you republish one.

#### Does it need a Facebook login?

No. It needs no Facebook account, cookies or login, and reads only what Facebook shows to logged-out visitors. Accounts that hide their reels from logged-out visitors return an error item instead.

#### How much does it cost?

$2.00 per 1,000 reels on the Free plan, less on paid Apify plans (see [Pricing](#pricing)). Error items are free. Apify's Free plan includes $5 of usage a month ([apify.com/pricing](https://apify.com/pricing)), enough for about 2,500 reels.

#### How do I get reels from a profile?

Paste the profile's URL (`https://www.facebook.com/zuck`), its handle (`zuck`) or its `profile.php?id=` URL. The scraper reads the profile's Reels tab, newest first, up to **Max reels per Page or profile**. Personal profiles work as well as Pages, as long as their reels are public.

#### Can I export to CSV or Excel?

Yes. In the **Output** tab, choose **Export** and pick CSV, Excel, JSON, XML or HTML. Through the API, add `format=csv` or `format=xlsx` to the [dataset items URL](https://docs.apify.com/api/v2/dataset-items-get).

#### Can I use it with AI agents, MCP, n8n, Make or Zapier?

Yes, through Apify. AI agents can find and run it with the [Apify MCP server](https://docs.apify.com/mcp). [n8n](https://docs.apify.com/integrations/n8n), [Make](https://docs.apify.com/integrations/make) and [Zapier](https://docs.apify.com/integrations/zapier) have Apify integrations that start a run and pass on the reels. You can also call it from the Apify API or the JavaScript and Python clients, and get the data by webhook when a run finishes.

### Is it legal?

This scraper collects only data that Facebook shows publicly to anyone without logging in, and no personal data beyond that. You are responsible for how you use the data. If your results contain personal data, it is protected by GDPR in the EU and by other rules elsewhere; do not scrape it without a legitimate reason.

Lantern Fetch is not affiliated with, endorsed or sponsored by Meta Platforms, Inc. Facebook is a trademark of Meta Platforms, Inc.

# Actor input Schema

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

Facebook Pages, profiles, reels, share links or videos, in any mix. For a Page or profile (URL or handle, e.g. <code>natgeo</code> or <code>https://www.facebook.com/natgeo</code>, or a <code>profile.php?id=</code> URL) the scraper reads its Reels tab. Reel URLs (<code>/reel/\<id></code>), share links (<code>/share/r/\<code></code>) and video URLs (<code>/\<owner>/videos/\<id></code>) give one reel each.

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

How many reels to take from each Page's or profile's Reels tab, newest first. Reel, share and video URLs always give one reel each. You pay per reel, so this also caps the cost per Page or profile.

## `newerThan` (type: `string`):

Skip reels posted before this date: a date (<code>2026-10-01</code>) or a relative time (<code>7 days</code>, <code>2 weeks</code>, <code>3 months</code>). Leave empty for all reels up to the maximum. Facebook's Reels tab is not strictly sorted by date, so the scraper keeps going until it has seen 5 older reels in a row.

## `exactCounts` (type: `boolean`):

Also open each reel's video page for the exact <code>playCount</code> and <code>viewCount</code>, instead of only the rounded <code>playCountRounded</code> and <code>viewCountRounded</code>. One extra request per reel, so Page and profile inputs take about 10 times the requests.

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

Apify datacenter proxy works for logged-out Facebook and is the cheapest. Choose residential only if datacenter runs get blocked.

## `residentialFallback` (type: `boolean`):

After 3 blocked requests in a row (HTTP 429 or 403, or a login page) on datacenter proxy, use Apify residential proxy for the rest of the run. Residential proxy traffic is billed to your Apify account.

## `maxConcurrency` (type: `integer`):

How many inputs are scraped at once. Each Page or profile is paginated by one session at a time.

## `healthCheck` (type: `boolean`):

For monitoring: the run fails (status FAILED) when any Page or profile gives fewer than <code>maxReelsPerProfile</code> reels, any input fails, or Facebook's pagination query id is not found. Used by the daily health-check task.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/natgeo",
    "https://www.facebook.com/reel/1671666994301936"
  ],
  "maxReelsPerProfile": 20,
  "newerThan": "30 days",
  "exactCounts": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "residentialFallback": false,
  "maxConcurrency": 5,
  "healthCheck": false
}
```

# Actor output Schema

## `reels` (type: `string`):

One item per reel, plus one free error item per input that gave no reels.

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

OUTPUT record: reels, errors by code, requests, retries, blocks and the pagination query id used.

# 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",
        "https://www.facebook.com/reel/1671666994301936"
    ],
    "maxReelsPerProfile": 20,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("lanternfetch/facebook-reels").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",
        "https://www.facebook.com/reel/1671666994301936",
    ],
    "maxReelsPerProfile": 20,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("lanternfetch/facebook-reels").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",
    "https://www.facebook.com/reel/1671666994301936"
  ],
  "maxReelsPerProfile": 20,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call lanternfetch/facebook-reels --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lanternfetch/facebook-reels"
        }
    }
}
```

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/ulVI5MJp3639VaUfa/builds/f2F22kCPAtdRxGBiY/openapi.json
