# Facebook Reels Scraper + Transcripts (`latentlark/facebook-reels-scraper`) Actor

Scrape public Facebook Reels from reel links or whole pages: caption, plays, reactions, comments, shares, owner, video URLs, plus a spoken-word transcript (Facebook captions or built-in Whisper). No login or cookies.

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

## Pricing

from $1.70 / 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 + Transcripts

Get public **Facebook Reels** with full metadata **and what is said in them**. Paste reel links, or just page names like `cnn` or `facebook.com/bbcnews`, and get one clean row per reel: caption, plays, reactions, comments, shares, owner, video and thumbnail URLs, plus a spoken-word **transcript** with timed segments.

No login, no cookies, no browser and no residential proxy needed.

### Quick start (first run in a few minutes)

1. Click **Start**. The form is prefilled with `https://www.facebook.com/bbcnews/reels/` and **3 reels per page**, with transcripts on `auto`.
2. Wait about 1-2 minutes (Whisper runs on the Actor's own CPU).
3. Open the **Reels** table: 3 rows with metadata and a transcript for every reel that has speech.

**Approximate cost of the prefilled run (Free plan): about $0.04** (start $0.02 at the default 4096 MB, 3 reels × $0.0025, and up to 3 Whisper transcripts × $0.004).

### What you can do with it

- **Content research:** see which reels of a page or competitor get the most plays, reactions and shares, and what they actually say.
- **Repurposing:** turn reels into blog posts, captions, subtitles (SRT) or quotes.
- **Brand and news monitoring:** track new reels of brands, publishers or creators every day with a schedule.
- **AI and NLP datasets:** searchable spoken text with language detection for classification, summaries or sentiment.
- **Ad and influencer vetting:** check what a creator says on camera before a deal.

### Input

| Field | What it does | Default |
|---|---|---|
| `startUrls` | Reel links (`/reel/123…`, `/watch?v=…`, `/<page>/videos/…`, `fb.watch/…`, `/share/r/…`), page URLs (`facebook.com/cnn`, `facebook.com/cnn/reels`) or bare handles (`cnn`, `@bbcnews`). Mix freely. | — |
| `maxReelsPerPage` | Newest reels per page (page URLs/handles only), up to 2000 | 20 |
| `transcriptMode` | `auto` (Facebook captions, then Whisper), `native` (captions only), `whisper` (always Whisper), `none` | `auto` |
| `whisperModel` | `base` (fast) or `small` (more accurate, about 2.5× slower) | `base` |
| `transcriptLanguage` | Optional spoken-language hint (`en`, `de`, `es` …); empty = auto-detect per reel | — |
| `maxWhisperTranscripts` | Hard cap on Whisper transcripts per run | 200 |
| `maxWhisperDurationSecs` | Skip Whisper for longer reels (metadata is still returned) | 180 |
| `includeSegments` / `includeSrt` / `includeVideoUrls` | Timed segments, SRT subtitles, signed video URLs | on / off / on |
| `proxyMode` | `auto` (direct first, Apify datacenter proxy as fallback), `proxy`, `none` | `auto` |

**A page's latest 50 reels with transcripts**

```json
{"startUrls": ["https://www.facebook.com/bbcnews"], "maxReelsPerPage": 50}
```

**Specific reels, metadata only (cheapest)**

```json
{"startUrls": ["https://www.facebook.com/reel/2326466588106158"], "transcriptMode": "none"}
```

**Many pages, Facebook captions only (no Whisper charge)**

```json
{"startUrls": ["cnn", "natgeo", "gordonramsay"], "maxReelsPerPage": 100, "transcriptMode": "native"}
```

### Output

One row per reel (example, shortened):

```json
{
  "url": "https://www.facebook.com/reel/2326466588106158",
  "reelId": "2326466588106158",
  "sourcePage": "bbcnews",
  "caption": "At least 64 people have been killed …",
  "createdAt": "2026-10-28T15:30:15Z",
  "durationSecs": 19.69,
  "playCount": 980000,
  "reactionCount": 10901,
  "commentCount": 503,
  "shareCount": 412,
  "owner": {"name": "BBC News", "id": "…", "url": "https://www.facebook.com/bbcnews", "isVerified": true},
  "thumbnailUrl": "https://scontent…",
  "videoUrlSd": "https://video…",
  "transcript": "Officials say the high-speed train …",
  "segments": [{"start": 0.0, "end": 4.2, "text": "Officials say the high-speed train …"}],
  "transcriptSource": "whisper",
  "transcriptLanguage": "en",
  "transcriptStatus": "ok",
  "status": "ok"
}
```

Fields: `url`, `reelId`, `postId`, `caption`, `createdAt`, `durationSecs`, `width`/`height`, `playCount` (page mode), `reactionCount`, `commentCount`, `shareCount`, `owner.*`, `thumbnailUrl`, `videoUrlSd`, `videoUrlHd`, `audioTrack`, `isOriginalAudio`, `captionTracks` (every caption Facebook offers, original and translated), `transcript`, `segments`, `srt`, `transcriptLanguage`, `transcriptSource` (`facebook_captions` or `whisper`), `transcriptStatus`.

The dataset has two views, **Reels** and **Transcripts only**. The `OUTPUT` record has a run summary (per-page counts, transcript statuses, Whisper seconds).

#### Transcript status

| transcriptStatus | Meaning | Whisper charged? |
|---|---|---|
| `ok` | Transcript returned | yes, only if the source is `whisper` |
| `no_speech` | Music, ambience or silence. No made-up text like "Thank you." | no |
| `low_confidence` | Song lyrics, chants or very short or unclear speech; text returned but flagged | no |
| `skipped_budget` / `skipped_duration` | Over your Whisper cap or length limit | no |
| `skipped_memory` | Run memory below 2048 MB, so Whisper was skipped | no |
| `no_captions` | `native` mode and Facebook has no captions | no |
| `no_audio` / `error` | No audio track, or the transcript failed | no |

Only about 1 in 6 reels has Facebook's own captions. This Actor uses those first (exact and included in the reel price) and falls back to built-in Whisper speech-to-text for the rest.

### Pricing

Pay per event, with volume discounts on higher Apify plans:

| Event | What it is | Free plan | Bronze | Silver | Gold+ |
|---|---|---|---|---|---|
| `apify-actor-start` | Once per run, per GB of memory (default 4096 MB = 4 events) | $0.005 | $0.005 | $0.005 | $0.005 |
| `reel` | One reel row with metadata; a Facebook-caption transcript is included | $0.0025 | $0.0022 | $0.002 | $0.0017 |
| `whisper-transcript` | Add-on, only when Whisper returns a transcript with status `ok` | $0.004 | $0.0036 | $0.0032 | $0.0028 |

- **Free:** `invalid_input`, `not_found`, `no_reels`, `page_error` and `error` rows, duplicates, and every transcript status other than Whisper `ok`.
- **Examples (Free plan, 4096 MB):**
  - 100 reels, metadata + Facebook captions (`native`): $0.02 + $0.25 = **$0.27**
  - 100 reels with `auto` transcripts (about 60 need Whisper and have speech): $0.27 + $0.24 = **about $0.51**
  - 1,000 reels from 20 pages, `native`: **about $2.52**
- Want metadata only for many reels? Use `transcriptMode: "native"` or `"none"` and 1024 MB to lower the start fee to $0.005.
- Set **Max total charge per run** in the run options to cap spend. The Actor stops cleanly when the cap is reached.

### How it works and limitations

- Page mode reads the page's public reels tab and pages through it, so one request returns many reels with plays, reactions, comments and shares.
- Whisper (faster-whisper `base`, int8) runs inside the Actor. **Use at least 2048 MB; 4096 MB (one full vCPU) is the default and fastest**, at about 8 seconds per one-minute reel.
- Only public reels are supported; private, age-gated, login-only or region-locked content is not.
- `playCount` comes from page listings. Single reel links do not expose it when logged out.
- Video and thumbnail URLs are signed by Facebook and expire after a few hours, so download them soon after the run.
- Some pages have no reels tab; they return a free `no_reels` row.
- Network: direct connection first, Apify datacenter proxy as fallback. No residential proxy needed.
- Facebook changes its internals often. If a page returns `page_error`, please open an issue and we will fix it fast.

### FAQ

**Why did I get 0 results?** Check that the page is public and actually has a Reels tab (open `facebook.com/<page>/reels` in a private browser window). Pages without reels return a `no_reels` row. Reel links that were deleted or made private return `not_found`. Neither is charged.

**Why does a reel have no transcript?** It is probably music or silence (`no_speech`), or you used `native` mode and Facebook has no captions (`no_captions`). Check `transcriptStatus`.

**Which languages work?** Whisper auto-detects about 100 languages. Set `transcriptLanguage` if you know the language, for better accuracy on short reels.

**Can I get only the transcripts?** Yes: open the **Transcripts only** dataset view, or export with the fields `url,transcript`.

**Do I need a Facebook account or cookies?** No. Everything is public data, fetched logged-out.

**Can I run it every day?** Yes. Create a schedule with your pages and a small `maxReelsPerPage`; duplicates inside a run are removed and never charged.

**Is this legal?** It only reads publicly available data. You are responsible for how you use it, including GDPR and Facebook's terms. Do not collect personal data you do not need.

### More from LatentLark

- [TikTok Transcript Scraper](https://apify.com/latentlark/tiktok-transcript): transcripts of TikTok videos.
- [TikTok Ads Library Scraper](https://apify.com/latentlark/tiktok-ads-library): TikTok EU Ad Library and Top Ads.
- [Google Trends Compare](https://apify.com/latentlark/google-trends-compare): unlimited keywords on one Google Trends scale.
- [Google Ads Transparency & LinkedIn Ad Library Scraper](https://apify.com/latentlark/competitor-ads-monitor): your competitors' ads.
- [Google Sheets Export & Import (No OAuth)](https://apify.com/latentlark/sheets-export): send any dataset to Google Sheets.

# Actor input Schema

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

Mix freely: reel links (facebook.com/reel/123…, /watch?v=…, /<page>/videos/…, fb.watch and /share/r/ short links), page URLs (facebook.com/cnn or facebook.com/cnn/reels) or bare handles (cnn, @bbcnews). Pages are expanded into their latest public reels. Each reel row costs $0.0025.

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

For page URLs/handles: how many of the newest reels to return per page.

## `transcriptMode` (type: `string`):

auto = Facebook's own captions when the reel has them (included in the reel price), otherwise Whisper speech-to-text (+$0.004 per transcript with speech). native = Facebook captions only, no Whisper charge. whisper = always Whisper. none = metadata only. Whisper needs at least 2048 MB run memory; 4096 MB is fastest.

## `whisperModel` (type: `string`):

base = fast and accurate for clear speech (default). small = higher accuracy, about 2.5x slower.

## `transcriptLanguage` (type: `string`):

ISO code such as en, de, es. Leave empty to auto-detect per reel.

## `maxWhisperTranscripts` (type: `integer`):

Budget cap for Whisper transcriptions in this run ($0.004 each). Reels over the cap still return metadata (transcriptStatus = skipped_budget, not charged).

## `maxWhisperDurationSecs` (type: `integer`):

Longer reels keep their metadata but skip Whisper (transcriptStatus = skipped_duration).

## `includeSegments` (type: `boolean`):

segments: \[{start, end, text}] in seconds.

## `includeSrt` (type: `boolean`):

Adds an srt string per reel.

## `includeVideoUrls` (type: `boolean`):

videoUrlSd / videoUrlHd (signed Facebook CDN links, expire after some hours).

## `proxyMode` (type: `string`):

auto = direct connection first, Apify proxy as fallback (cheapest, recommended). proxy = always use the proxy below. none = never use a proxy.

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

Used only when a direct request fails (or always in proxy mode). Datacenter proxy is enough.

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

Parallel reels processed. 8 is a safe default.

## `maxPageConcurrency` (type: `integer`):

How many pages are listed at the same time.

## `gqlDocId` (type: `string`):

Leave empty. Only for maintenance if Facebook rotates its reels-tab query id.

## Actor input object example

```json
{
  "startUrls": [
    "https://www.facebook.com/bbcnews/reels/"
  ],
  "maxReelsPerPage": 3,
  "transcriptMode": "auto",
  "whisperModel": "base",
  "maxWhisperTranscripts": 200,
  "maxWhisperDurationSecs": 180,
  "includeSegments": true,
  "includeSrt": false,
  "includeVideoUrls": true,
  "proxyMode": "auto",
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8,
  "maxPageConcurrency": 2
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `transcripts` (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 = {
    "startUrls": [
        "https://www.facebook.com/bbcnews/reels/"
    ],
    "maxReelsPerPage": 3,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("latentlark/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/bbcnews/reels/"],
    "maxReelsPerPage": 3,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("latentlark/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/bbcnews/reels/"
  ],
  "maxReelsPerPage": 3,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call latentlark/facebook-reels-scraper --silent --output-dataset

```

## MCP server setup

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