# Facebook Video Transcript Generator & API: Reels to Text (`s_actors/facebook-video-transcript`) Actor

Transcribe public Facebook videos and Reels without login: full text, timed segments, SRT and VTT subtitles, language and post stats. Uses Facebook's own captions when they exist, Whisper AI when not. Paste links or add Pages to transcribe their latest Reels.

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

## Pricing

from $3.99 / 1,000 transcripts

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 Video Transcript Generator & API: Reels to Text

Get the **transcript of any public Facebook video or Reel**: paste video links, or add **Facebook Pages** to transcribe their latest Reels (a date range, or only the new ones since your last run). For each video you get the **full text**, the **hook** (the words of the first 3 seconds), the language, **timed segments** and ready **SRT and VTT subtitles**, next to the post text, date, reactions, comments and shares.

The Actor uses **Facebook's own captions** whenever a video has them (fast and cheap), and turns the audio into text with **Whisper AI** when it has none. **Videos without speech are free.**

```json
{ "videoUrls": ["https://www.facebook.com/reel/636216875539019"], "pages": ["SteveBartlettShow"], "maxVideosPerPage": 10 }
```

No Facebook login, no cookies, no sign-up on a transcript website. Use it as a **Facebook transcript API**: one call returns clean JSON for a list of videos or a whole Page.

#### What you get

One row per video. Real example, October 2026:

| ownerName | hook | source | language | wordCount | durationSeconds | aiMinutes |
|---|---|---|---|---|---|---|
| Steven Bartlett | Ever seen that video of the ant in the pen? Look, they get an ant on a piece of paper and the guy on YouTube, it's like got | facebook-captions | en | 259 | 60.8 | 0 |
| Vogue | Before I was even involved with Marty's Supreme, I thought, man, that's like four-fifths of a ping-pong ball. | ai | en | 117 | 37.7 | 1 |
| Facebook (2014 video) | How to share with just friends on Facebook. | ai | en | 130 | 74.3 | 2 |
| Steven Bartlett (Page, 22 min) | *(Facebook captions of a 22-minute video)* | facebook-captions | en | 4,582 | 1,370 | 0 |
| Steven Bartlett, `captionLanguage: hi` | माना कि झपकी वास्तव में कुछ भी नहीं करता है... | facebook-captions (translated) | hi | 204 | 61.6 | 0 |

| Field | Description |
|---|---|
| `transcript` | The spoken words as one text |
| `hook` | The words of the first 3 seconds: the opening line that keeps viewers watching |
| `segments` | `[{start, end, text}]` with seconds, for quotes, clips and search inside a video |
| `subtitlesSrt`, `subtitlesVtt` | Ready subtitles to upload to a video editor, YouTube or a player |
| `srtFileUrl`, `vttFileUrl`, `txtFileUrl` | Download links of the same as files (with **Save files**) |
| `transcriptSource` | `facebook-captions` (Facebook's own captions) or `ai` (Whisper speech recognition) |
| `transcriptionModel`, `aiMinutes` | Which captions or model wrote the text, and the AI minutes charged |
| `language`, `languageName` | Spoken (or chosen caption) language: `en` / English |
| `captionLanguages`, `transcriptIsTranslation` | Every caption language Facebook has for the video (many get auto-translations), and whether the text is one of those translations |
| `wordCount`, `segmentCount`, `speechSeconds` | How much is said, and for how long |
| `videoUrl`, `videoId`, `isReel`, `durationSeconds`, `thumbnailUrl` | The video itself |
| `description`, `postedAt`, `reactions`, `comments`, `shares` | The post: its text, exact time (UTC) and engagement |
| `ownerName`, `ownerUrl`, `ownerVerified` | The Page or profile that posted it |
| `hasTranscript`, `noTranscriptReason` | `false` with the reason when a video has no speech or was skipped (free) |
| `input`, `inputPage`, `position`, `scrapedAt`, `error` | Which input the row came from; why a video was not read |

#### How it works

1. Add **video links** (`facebook.com/reel/...`, `facebook.com/watch/?v=...`, `facebook.com/<page>/videos/...`, `fb.watch/...`, `facebook.com/share/v/...`, video IDs) and / or **Pages** (`BBCNews`, `facebook.com/vogue`, `facebook.com/vogue/reels`, Page IDs)
2. Run: each video gets Facebook's captions, or an AI transcript of its sound
3. Open the **Transcripts** view, export to CSV / Excel / JSON, or download `.srt` / `.txt` files

| Input | What it does |
|---|---|
| **Facebook video / Reel links** | Reels, Page videos, Watch videos and short links, any length |
| **Facebook Pages** | The Reels of each Page, newest first |
| **Videos per Page** | Latest N Reels of each Page (default 10, `0` = all of them) |
| **Only videos posted after** | Only recent Reels: `2026-10-01` or `7 days`, `2 weeks`, `1 month` |
| **Only new videos** | Skip what earlier runs already returned: schedule it to follow Pages |
| **Transcribe videos without captions with AI** | On by default. Off = only videos with Facebook captions get text, the rest are free rows |
| **Spoken language (AI)** | Empty = detected per video. Set `en`, `es`, `hi`... only if detection picks the wrong one |
| **Captions language** | Get Facebook's own translation of the captions (`es`, `hi`, `pt_BR`...) when it has one |
| **Max video length for AI** | Longer videos without captions are skipped for free (default 30 minutes) |
| **Timed segments / SRT and VTT / Save files** | What goes into each row, and `.srt` `.vtt` `.txt` files in your storage |

#### Why this Actor

| | |
|---|---|
| 💬 **Facebook captions first** | When Facebook already has captions (most longer videos), they are used: $0.00499 a video, any length, no AI minutes |
| 🤖 **AI for everything else** | Reels without captions are transcribed by Whisper large-v3-turbo; a voice detector runs first, so music-only videos are free and AI never invents words over a song |
| 📘 **Whole Pages and monitoring** | The Reels of a Page, a date range, or only the new ones since the last run, with reactions, comments and shares next to each transcript |
| 🌍 **Translations included** | Facebook's auto-translated captions (Hindi, Spanish, Thai, Vietnamese...) on request, at the same price |
| 🪝 **Hook + segments + subtitles** | The opening line for content research, timestamps for quotes, SRT and VTT ready for editors |

#### Follow Facebook Pages automatically

1. Add the Pages you watch (competitors, clients, your own Page)
2. Turn on **Only new videos**
3. Save as a task with a daily schedule: each run transcribes only the Reels posted since, ready for a Google Sheet, Slack or an AI summary through an integration

The list of returned videos is kept per Page and monitor name in your account (key-value store `facebook-transcript-state`).

#### Pricing

Pay per video with text, plus AI minutes only when Facebook has no captions. Apify Scale and Business plans pay less:

| Event | Free and Starter plans | Scale plan | Business plan |
|---|---|---|---|
| Run start | $0.001 | $0.001 | $0.001 |
| Transcript, per video with text | $0.00499 | $0.00449 | $0.00399 |
| AI transcription, per started minute (only videos without Facebook captions; a 40-second Reel = 1 minute) | $0.00999 | $0.00899 | $0.00799 |

| Task | Cost |
|---|---|
| 10 videos with Facebook captions (any length) | ~$0.05 |
| 10 Reels under a minute without captions | ~$0.15 |
| 1,000 videos, half of them with captions, ~1 minute each | ~$10 |
| Following a Page that posts 2 Reels a day, for a month | ~$0.90 per month |

Videos without speech, videos that are not found and videos over the AI length limit are not charged.

#### Ready-made tasks

Open it, change the link, and run:

| Task | What you get |
|---|---|
| [Facebook Video to Text Converter: Video Link to Transcript](https://apify.com/s_actors/facebook-video-transcript/examples/facebook-video-to-text-converter) | Transcripts, hooks and SRT files of the Facebook videos you paste |

#### FAQ

**How do I get the transcript of a Facebook video?** Paste the video link into **Facebook video / Reel links** and run. The `transcript` column has the text; `subtitlesSrt` has it with timestamps.

**Where does the text come from?** From Facebook's own captions when the video has them (`transcriptSource: facebook-captions`): usually Facebook's automatic speech captions, sometimes ones the Page uploaded. Otherwise from OpenAI's Whisper speech recognition (`transcriptSource: ai`). Clear speech comes out nearly word for word; names, slang and loud music can be misheard.

**Does it read text on screen or song lyrics?** No: only spoken words. A video with just music gets `hasTranscript: false` and is free.

**Which languages are supported?** AI transcription covers the 99 languages of Whisper, detected for each video. Facebook captions come in the video's language, and **Captions language** can pick Facebook's auto-translation (see `captionLanguages` for what each video has).

**Can I transcribe all Reels of a Facebook Page?** Yes: add the Page and set **Videos per Page** to `0`. Personal profiles and private groups cannot be read.

**How are AI minutes counted?** By the video's length, rounded up: a 40-second Reel is 1 minute, a 70-second one is 2. Videos with Facebook captions have no AI minutes.

**Do I need a Facebook account or cookies?** No. The Actor reads public videos the way Facebook shows them to a visitor. Private videos, friends-only posts and private groups are not available.

#### Use with the API and AI agents

Run it via the [Apify API](https://docs.apify.com/api/v2) from Python, Node.js or any HTTP client, or connect it to Claude, ChatGPT and other AI agents through the [Apify MCP server](https://mcp.apify.com): "Transcribe the last 10 Reels of the BBC News Facebook Page and list their hooks".

#### Other Facebook tools

| Tool | What it does |
|---|---|
| [Facebook Page Scraper](https://apify.com/s_actors/facebook-page-scraper) | Exact followers, email, phone, website, page creation date, ads status and last post of any page |
| [Facebook Follower Count Checker](https://apify.com/s_actors/facebook-follower-count-checker) | Exact follower count of many pages and its growth over 7 and 30 days |
| [Facebook Email Scraper](https://apify.com/s_actors/facebook-email-scraper) | Emails of Facebook pages from the page and its website, mail server checked |
| [Facebook Page Search](https://apify.com/s_actors/facebook-page-search-scraper) | Facebook business pages by keyword and city, with exact followers, email, phone and address |
| [Instagram Reel Transcript](https://apify.com/s_actors/instagram-reel-transcript) | Instagram Reels to text from links or profiles, SRT and VTT |
| [TikTok Transcript Scraper](https://apify.com/s_actors/tiktok-transcript-scraper) | TikTok subtitles and AI transcripts from links or profiles, SRT and VTT |
| [YouTube Transcript Scraper](https://apify.com/s_actors/youtube-transcript-scraper) | YouTube captions of videos, channels and playlists in any language |

#### Is it legal?

The Actor reads only public videos that Facebook shows to any visitor, without logging in. Transcripts are the creators' words: use them for research, accessibility, analysis or quotes in line with copyright law, and handle personal data such as names in line with GDPR and other privacy laws.

# Actor input Schema

## `videoUrls` (type: `array`):

One per line: facebook.com/reel/..., facebook.com/watch/?v=..., facebook.com/<page>/videos/..., fb.watch/... and facebook.com/share/v/... links, or a numeric video ID. Public videos only: no login needed.

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

One per line: a Page link (facebook.com/<name> or facebook.com/<name>/reels), its username ("BBCNews") or numeric ID. The Actor takes the Page's Reels, newest first.

## `maxVideosPerPage` (type: `integer`):

How many of each Page's latest Reels to transcribe. 0 = all of them (up to 5,000).

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

Pages only. A date (2026-10-01) or a period back from now ("7 days", "24 hours", "2 weeks", "3 months"). Empty = no date limit.

## `onlyNew` (type: `boolean`):

Pages only: skip videos that an earlier run with the same monitor name already returned. The first run takes the latest videos as usual.

## `monitorName` (type: `string`):

Keeps separate "already seen" lists for different schedules (e.g. "competitors", "brand"). Same name = same list.

## `transcribeWithAI` (type: `boolean`):

On: videos without Facebook captions are transcribed by Whisper AI (charged per started minute on top of the transcript). Off: only videos with Facebook captions get text; the rest come back free without a transcript.

## `language` (type: `string`):

Two-letter code of the spoken language (en, es, pt, hi, ar, de, fr...) for AI transcription. Empty = detected automatically (recommended for mixed lists).

## `captionLanguage` (type: `string`):

Facebook auto-translates captions of many videos. A code like es, hi or pt_BR returns that translation instead of the original captions when Facebook has it (marked "transcriptIsTranslation"). Empty = the original language.

## `maxVideoMinutes` (type: `integer`):

Longer videos without Facebook captions are skipped (free row) instead of transcribed by AI. Videos with Facebook captions are transcribed at any length.

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

Add the transcript as segments with start and end seconds.

## `includeSubtitles` (type: `boolean`):

Add ready subtitles (SRT and WebVTT text) to every row.

## `saveFiles` (type: `boolean`):

Also save each transcript as downloadable files in the run's key-value store (links in the row).

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

How many videos are loaded at the same time.

## `debugLog` (type: `boolean`):

Log every request attempt (for support).

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.facebook.com/reel/636216875539019",
    "https://www.facebook.com/reel/1069402162590703"
  ],
  "maxVideosPerPage": 10,
  "onlyNew": false,
  "monitorName": "default",
  "transcribeWithAI": true,
  "maxVideoMinutes": 30,
  "includeSegments": true,
  "includeSubtitles": true,
  "saveFiles": false,
  "maxConcurrency": 5,
  "debugLog": false
}
```

# Actor output Schema

## `transcripts` (type: `string`):

One row per video: the transcript, its hook, language and source.

## `details` (type: `string`):

The post around each transcript: text, reactions, comments, shares, captions.

## `subtitles` (type: `string`):

SRT and VTT subtitles of every transcript, ready to paste or save.

## `all` (type: `string`):

Every field of every row.

# 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 = {
    "videoUrls": [
        "https://www.facebook.com/reel/636216875539019",
        "https://www.facebook.com/reel/1069402162590703"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("s_actors/facebook-video-transcript").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 = { "videoUrls": [
        "https://www.facebook.com/reel/636216875539019",
        "https://www.facebook.com/reel/1069402162590703",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("s_actors/facebook-video-transcript").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 '{
  "videoUrls": [
    "https://www.facebook.com/reel/636216875539019",
    "https://www.facebook.com/reel/1069402162590703"
  ]
}' |
apify call s_actors/facebook-video-transcript --silent --output-dataset

```

## MCP server setup

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

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/IQeUF876F0EVxOtZs/builds/qy3388Hxw2ZnXaNed/openapi.json
