# Facebook Video Transcript: Reels & Pages to Text (`firsthand/facebook-video-transcript`) Actor

Facebook video transcript and Reel transcript extractor: paste video, Reel or share links, or a page name. Uses Facebook's own captions when they cover the video, AI (Whisper) otherwise. Text with timestamps, SRT and VTT, views and reactions. No login, no API key.

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

## Pricing

from $4.50 / 1,000 audio minute transcribeds

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: Reels & Pages to Text

Facebook video transcript generator for public videos and Reels: paste a link, a share link from the app, or a page name. The actor returns the full text with timestamps, SRT and VTT subtitles, and the video's data (page, date, views, reactions). No login, no cookies, no API key.

### What you get

- **Transcript text** of Facebook Reels and videos, with the language detected.
- **Timestamped segments** and ready **SRT and VTT subtitles**.
- **Facebook captions first**: when a video has its own captions in the language it is spoken in (made by Facebook) and they cover the whole video, they are used as the transcript and charged as one caption transcript per video. Machine-translated captions are never used.
- **AI transcription** (Whisper) for every other video, charged per started minute of a video with speech.
- **Page Reels**: give a page link or page name and get transcripts of its newest Reels, with a date filter and a caption filter.
- **Video data**: page name and link, publish time, duration, views, reactions and comments where Facebook shows them, thumbnail.
- Optional: speaker labels, translation into up to 5 languages, AI summary with chapters, mention search, word timestamps.

### How to use it

1. Paste Facebook links into **Facebook video, Reel or page links**, one per line:
   - Reels: `https://www.facebook.com/reel/636216875539019`
   - videos: `https://www.facebook.com/watch/?v=...` or `https://www.facebook.com/<page>/videos/...`
   - share links from the phone app: `https://www.facebook.com/share/r/...`, `https://www.facebook.com/share/v/...`
   - pages: `https://www.facebook.com/natashaskitchen` or just `natashaskitchen` in **Page names**
2. For pages, set **Reels per page** (10 by default) and, if you want, **Published after**.
3. Run. Each video is one row in the dataset; export it as JSON, CSV or Excel.

To transcribe Facebook videos regularly, put page links on a schedule and turn on **Only new videos**: each run takes only Reels it has not transcribed before.

### Facebook Reel transcript extractor for a whole page

A page link gives the page's newest Reels, newest first. Use **Published after** (`2026-10-01` or `7 days`) to skip older Reels (the list stops after 5 older ones in a row) and **Caption contains** to keep only Reels about a topic. Skipped Reels are not charged.

### Facebook video to text converter: captions or AI

With **Use the video's own captions first** on (default), a video with full original captions is not sent to AI and costs one caption transcript instead of per-minute AI. If the captions skip parts of the video, are only machine translations, or speaker labels are on, the audio is transcribed by AI. **Captions only** returns just the videos with captions and skips the rest at no charge; captions with gaps are kept then and marked `captionsIncomplete`.

### Example output

```json
{
  "inputUrl": "https://www.facebook.com/reel/636216875539019",
  "url": "https://www.facebook.com/reel/636216875539019",
  "type": "reel",
  "videoId": "636216875539019",
  "title": "The viral spider video explained!",
  "author": "Steven Bartlett",
  "pageUrl": "https://www.facebook.com/...",
  "publishedAt": "2025-07-17T13:00:38Z",
  "durationSeconds": 60.8,
  "viewCount": 3264122,
  "status": "ok",
  "transcriptSource": "facebook-captions",
  "language": "en",
  "wordCount": 259,
  "text": "Ever seen that video of the ant in the pen? ...",
  "segments": [{"start": 0.0, "end": 3.2, "text": "Ever seen that video of the ant in the pen?"}],
  "srt": "1\n00:00:00,000 --> 00:00:03,200\nEver seen that video ...",
  "chargedMinutes": 0,
  "chargedCaptionTranscripts": 1
}
```

### Pricing

Pay per result, no subscription:

| Event | Free plan | Bronze, Silver | Gold and higher |
|---|---|---|---|
| Transcript from Facebook captions, per video | $0.005 | $0.003 | $0.003 |
| AI transcription, per started minute of a video with speech | $0.008 | $0.005 | $0.0045 |
| Speaker labels, per minute | $0.003 | $0.003 | $0.003 |
| Translation, per minute per language | $0.002 | $0.002 | $0.002 |
| AI summary and chapters, per started hour | $0.01 | $0.01 | $0.01 |

A one-minute Reel costs $0.003 with captions or $0.005 with AI on a paid plan. Each run also starts with $0.00005 per GB of memory (1 GB by default).

Not charged: links that fail, private or removed videos, videos without speech, links to other sites, skipped Reels and duplicates (the same video by a Reel, watch or page link is one video).

### API for developers

Run it from your code with the Apify API or client. Example input:

```json
{
  "urls": ["https://www.facebook.com/reel/636216875539019", "https://www.facebook.com/share/r/1FYKYbKvbV"],
  "pages": ["natashaskitchen"],
  "maxVideosPerPage": 20,
  "publishedAfter": "30 days"
}
```

Fields of other Facebook transcript actors are accepted too: `videoUrls`, `startUrls`, `facebookUrl`, `bulkUrls`, `videoUrl`, `pages`, `maxReelsPerPage`, `onlyPostsNewerThan`, `transcribeWithAI`.

You can also pass a dataset: **Dataset ID** takes the Facebook links from another actor's output, for example a Facebook posts or Reels scraper.

### Facebook transcript without login

The actor opens only what Facebook shows to anyone without signing in, so no account, cookies or Facebook API key are needed. AI transcription runs on our side: no OpenAI or other key either.

### Good to know

- Only public videos that open without signing in. Some short share links open only for signed-in users; then paste the video's own link (open the share link and copy the address).
- Private profiles, closed groups and age-restricted pages are not supported; such links come back as errors without charge.
- Live streams can be transcribed after they end.
- **Only new videos** looks at a page's newest 50 Reels. If a page posts more than that between two runs, the older new ones are not taken (the log says so): schedule busy pages daily.
- A page link gives the page's Reels. Long videos on a page's Videos tab are not listed yet; paste their links directly.
- For YouTube, TikTok, Instagram, podcasts and audio files use [Audio & Video to Text](https://apify.com/firsthand/audio-video-transcription).
- The actor reads only what Facebook shows publicly without login. You are responsible for using the transcripts in line with Facebook's terms, copyright and data protection laws such as GDPR.

# Actor input Schema

## `urls` (type: `array`):

One per line. Works with Reels (facebook.com/reel/...), videos (facebook.com/watch/?v=..., facebook.com/<page>/videos/...), share links from the app (facebook.com/share/r/..., share/v/...), and page links (facebook.com/<page>, facebook.com/profile.php?id=...), which give the page's newest Reels (not the Videos tab). Only public videos; private profiles, groups that need a login and live streams are not supported. Links to other sites are listed as errors and not charged.

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

Facebook page names, like natashaskitchen or NBCNews (the part after facebook.com/). The newest Reels of each page are transcribed. Same as putting the page link in the links field.

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

How many of the newest Reels to take from each page link or page name. Pages list their Reels newest first. Empty means 10.

## `publishedAfter` (type: `string`):

Take only page Reels published on or after this date (2026-09-01, midnight UTC) or within a window back from now (30 days, 2 weeks, 12 hours). Applies to page links; a direct video link is always taken.

## `titleIncludes` (type: `array`):

Only page Reels whose title or caption contains one of these texts, one per line, like recipe. Case and accents are ignored; \* matches anything. Skipped Reels are not charged.

## `titleExcludes` (type: `array`):

Skip page Reels whose title or caption contains one of these texts, one per line. Skipped Reels are not charged.

## `useFacebookCaptions` (type: `boolean`):

Many Facebook videos have captions in the language they are spoken in (made by Facebook). When they cover the whole video, they are used instead of AI transcription and charged as one caption transcript per video, not per minute. Machine-translated captions are never used. Turn off to always transcribe the audio with AI.

## `captionsOnly` (type: `boolean`):

Return only videos that have their own captions on Facebook; videos without them are listed as skipped and not charged. The cheapest way to check many videos.

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

Language of the speech as a two-letter code (en, es, de, hi) or a name (Spanish), for AI transcription. Leave empty to detect it automatically.

## `subtitles` (type: `boolean`):

Adds ready subtitle files as text in the srt and vtt fields. Free.

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

Adds the transcript split into lines with start and end seconds. Free.

## `wordTimestamps` (type: `boolean`):

Add the start and end time of every word inside each segment (segments\[].words). Free. Only for videos transcribed with AI, not for Facebook captions. Turns segments on.

## `speakerLabels` (type: `boolean`):

Marks every line with the person speaking (Speaker 1, Speaker 2), also in the subtitles, and adds speakerTranscript. Always uses AI transcription (ElevenLabs Scribe), never the Facebook captions. Adds $0.003 per audio minute.

## `translateTo` (type: `string`):

Also translate the transcript into up to 5 languages, separated by commas: codes like en, es, de or names like Spanish. The first language fills translatedText and translated SRT and VTT subtitles; with two or more, translations has text and subtitles for each. $0.002 per minute per language; a language the video is already in is not translated or charged.

## `summarize` (type: `boolean`):

Adds a short summary, chapters, key points and keywords written by AI from the transcript. Charged per started hour of video with speech.

## `searchTerms` (type: `array`):

Brands, names or topics to find in the transcripts, one per line. Each mention comes back in mentions with its time and the phrase around it; mentionCounts has the number per term. Free.

## `maxMinutesPerItem` (type: `integer`):

Longer videos are transcribed up to this length and charged only for it; the row says truncated. Empty means up to 600 minutes.

## `maxTotalMinutes` (type: `integer`):

A video that would take the run over this many charged AI minutes is skipped; shorter ones that still fit are taken. You can also cap spending with the run's maximum cost.

## `onlyNewVideos` (type: `boolean`):

Remember what was transcribed and leave it out of later runs with the same list name. Put the actor on a schedule with page links: each run transcribes and charges only Reels it has not seen before. A video that failed is tried again next time.

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

Runs with the same name share the list of transcribed videos, for example one name per schedule. Letters, digits, dashes and underscores. Empty means 'default'.

## `datasetId` (type: `string`):

Transcribe the Facebook links found in a dataset, for example the output of a Facebook posts or Reels scraper. In each row the actor takes the first field that holds a link (videoUrl, url, postUrl, facebookUrl, topLevelUrl and similar). Up to 10,000 rows.

## `datasetItems` (type: `array`):

Rows of another actor's output pasted as JSON; a link is taken from each row the same way as with Dataset ID.

## Actor input object example

```json
{
  "urls": [
    "https://www.facebook.com/reel/636216875539019"
  ],
  "useFacebookCaptions": true,
  "captionsOnly": false,
  "subtitles": true,
  "includeSegments": true,
  "wordTimestamps": false,
  "speakerLabels": false,
  "summarize": false,
  "onlyNewVideos": false
}
```

# Actor output Schema

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

Transcript and video data for every link.

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

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

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

```

## MCP server setup

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