# Facebook Video Transcript Extractor (`automation-lab/facebook-video-transcript-extractor`) Actor

Turn public Facebook videos and Reels into AI transcript records with text, timestamps, detected language, metadata, and source provenance. No Facebook login or transcription API key required.

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

## Pricing

Pay per event

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Facebook Video Transcript Extractor

Turn public Facebook videos and Reels into clean transcript records with detected language, timestamped segments, optional word timing, public video metadata, and source provenance.

Facebook Video Transcript Extractor downloads only the audio needed for speech recognition and transcribes it inside the Actor. It does not require a Facebook login or a separate transcription API key. Use it for recurring content research, searchable archives, quote discovery, subtitle preparation, and downstream AI workflows.

### What does Facebook Video Transcript Extractor do?

Provide one or more public Facebook video URLs. For every accessible video, the Actor:

1. resolves the canonical public video and metadata;
2. checks the configured duration and file-size limits;
3. downloads the best available audio stream;
4. detects or uses the requested spoken language;
5. generates plain text and timestamped segments with a bundled speech model;
6. optionally adds timing and confidence for every recognized word;
7. saves one typed dataset record with its source URL and extraction method.

Unlike caption-only tools, this Actor recognizes speech even when the creator did not publish a caption track. It does not use a remote AI transcription service, so users do not need to supply an API credential.

### Who is it for?

#### Content researchers

- Search spoken content across public Facebook videos.
- Collect source-linked transcripts for qualitative analysis.
- Compare recurring videos without manually replaying every clip.

#### Social media and editorial teams

- Find quotes and topic mentions quickly.
- Repurpose public video ideas into notes or editorial briefs.
- Create a first-pass subtitle timeline for review.

#### AI and data teams

- Feed transcript text into summarization, classification, or RAG pipelines.
- Keep segment timestamps for source-grounded answers.
- Export repeatable JSON records instead of copying text by hand.

#### Accessibility and localization teams

- Create an editable first transcript for public videos.
- Use detected language as routing metadata.
- Request word timing for subtitle or review tools.

### Why use this Actor?

- **No Facebook login** — designed for public video and Reel URLs.
- **No transcription API key** — speech recognition runs in the Actor container.
- **Works without published captions** — audio is transcribed directly.
- **Useful timestamps** — every transcript includes segment start and end times.
- **Optional word timing** — add per-word timing and confidence only when needed.
- **Source provenance** — every result keeps the original and canonical URL.
- **Public metadata** — title, creator, duration, thumbnail, and view count are included when Facebook exposes them.
- **Bounded processing** — duration, item, and audio-size limits protect unattended runs.
- **Pay for useful output** — failed URLs do not trigger a transcript event charge.

### What Facebook video data can you extract?

| Field | Meaning |
| --- | --- |
| `sourceUrl` | Exact Facebook URL supplied in the input |
| `canonicalUrl` | Canonical URL resolved from the public video |
| `videoId` | Facebook video identifier |
| `title` | Public title or title-like post text |
| `description` | Public description or caption when available |
| `creatorName` | Public creator or Page name |
| `creatorId` | Public creator or Page identifier |
| `durationSeconds` | Video duration in seconds |
| `thumbnailUrl` | Public thumbnail URL when available |
| `viewCount` | Public view count when Facebook returns it |
| `language` | Detected or requested spoken-language code |
| `languageProbability` | Detection confidence from 0 to 1 |
| `transcript` | Full recognized speech as plain text |
| `segments` | Timestamped passages with start, end, and text |
| `words` | Optional word timing and confidence records |
| `segmentCount` | Number of transcript segments |
| `wordCount` | Approximate transcript word count |
| `extractionMethod` | `ai-speech-to-text` provenance marker |
| `transcriptionModel` | Model used to generate the transcript |
| `error` | Per-URL diagnostic when processing fails |
| `transcribedAt` | ISO 8601 processing timestamp |

Metadata can be null when Facebook does not expose it. Transcript fields are populated only when accessible audio contains detectable speech.

### How much does it cost to transcribe Facebook videos?

The Actor uses pay-per-event pricing:

- **Run started:** $0.005 once per run.
- **Facebook transcript extracted:** charged only when a URL produces a non-empty transcript.

| Apify plan tier | Price per successful transcript |
| --- | ---: |
| FREE | $0.02392 |
| BRONZE | $0.02080 |
| SILVER | $0.016224 |
| GOLD | $0.01248 |
| PLATINUM | $0.00832 |
| DIAMOND | $0.005824 |

Examples on the FREE tier:

- 1 successful video: $0.005 + $0.02392 = **$0.02892**.
- 10 successful videos: $0.005 + (10 × $0.02392) = **$0.24420**.
- 100 successful videos: $0.005 + (100 × $0.02392) = **$2.39700**.

A private, unavailable, silent, over-duration, or otherwise failed URL produces a diagnostic record but no transcript event charge. The one-time start fee still applies. Apify platform credits and plan terms determine the final account charge.

### Getting started

1. Open the Actor in Apify Console.
2. Add one or more public Facebook Reel or video URLs.
3. Leave `language` as `auto`, or enter the known spoken-language code.
4. Enable word timestamps only if your workflow needs them.
5. Set a suitable maximum duration; the default is 10 minutes.
6. Click **Start**.
7. Open the dataset to inspect transcript text, segments, metadata, and errors.
8. Export the dataset as JSON, CSV, Excel, XML, or RSS, or connect it to another workflow.

Start with one short public video. Once its transcript quality fits your use case, add the rest of your batch.

### Input parameters

| Parameter | Type | Default | Description |
| --- | --- | --- | --- |
| `videoUrls` | string array | required | Public `facebook.com` or `fb.watch` video and Reel URLs; maximum 25 |
| `maxItems` | integer | `10` | Maximum number of unique URLs processed, from 1 to 25 |
| `language` | string | `auto` | Automatic detection or a 2/3-letter code such as `en`, `es`, `fr`, or `deu` |
| `includeWordTimestamps` | boolean | `false` | Include per-word start, end, and confidence values |
| `maxVideoDurationSeconds` | integer | `600` | Reject videos longer than this value; allowed range 10–1800 |

Example input:

```json
{
  "videoUrls": [
    "https://www.facebook.com/reel/636216875539019"
  ],
  "maxItems": 1,
  "language": "auto",
  "includeWordTimestamps": false,
  "maxVideoDurationSeconds": 120
}
```

Duplicate URLs are processed once. `maxItems` is applied after deduplication.

### Output example

The following abbreviated record reflects current output from a real public Reel test:

```json
{
  "sourceUrl": "https://www.facebook.com/reel/1527031198388079",
  "canonicalUrl": "https://www.facebook.com/reel/1527031198388079",
  "videoId": "1527031198388079",
  "title": "Squeeze lemon to a cloves water",
  "creatorName": "Remedies 4U",
  "durationSeconds": 23.822,
  "language": "en",
  "languageProbability": 1,
  "transcript": "At night, add four cloves to a glass of water and let it sit until morning...",
  "segments": [
    {
      "startSeconds": 0,
      "endSeconds": 4.64,
      "text": "At night, add four cloves to a glass of water and let it sit until morning."
    }
  ],
  "words": null,
  "segmentCount": 5,
  "wordCount": 78,
  "extractionMethod": "ai-speech-to-text",
  "transcriptionModel": "faster-whisper-tiny",
  "error": null,
  "transcribedAt": "2026-01-15T12:00:00.000Z"
}
```

When `includeWordTimestamps` is true, `words` contains objects with `word`, `startSeconds`, `endSeconds`, and `probability`.

### Transcript accuracy and limitations

Speech recognition is probabilistic. Accuracy varies with language, accents, overlapping speakers, music, background noise, compression, and recording quality. Review transcripts before publishing quotations, subtitles, legal records, or accessibility content.

Other limitations:

- Only public videos that Facebook serves without login are supported.
- Private, deleted, age-restricted, region-restricted, or login-only videos fail.
- The Actor transcribes audible speech; it does not perform OCR on on-screen text.
- Speaker diarization and translation are not included.
- Public metadata availability varies by video format and Facebook response.
- Videos longer than 30 minutes are not accepted.
- Audio files above the internal 50 MB safety limit are rejected.
- Facebook delivery changes can temporarily affect extraction.
- The Actor processes URLs sequentially to keep memory and source load bounded.

### Failure behavior and retries

Each URL receives its own dataset record. When a URL fails, `transcript` is null and `error` explains the failure. Other URLs in the same batch continue.

If every URL fails, the Actor exits non-zero after saving the diagnostic rows. This makes scheduled tasks and API clients detect a useless run instead of treating an empty result as success.

For transient Facebook delivery errors, retry the run later. Do not add private cookies or account credentials; this Actor has no login input and does not store user sessions.

### Tips for reliable transcript extraction

- Use the canonical public video or Reel URL when possible.
- Test each source Page with one short video before scheduling a batch.
- Keep `language` on `auto` unless you know the spoken language.
- Set the language explicitly when short clips are detected incorrectly.
- Leave word timestamps off for ordinary research; enable them for subtitle editing or precise quote lookup.
- Set `maxVideoDurationSeconds` close to the expected clip length to fail fast on accidental long-form inputs.
- Keep batches small when processing long videos.
- Preserve `sourceUrl`, `videoId`, and segment timestamps in downstream systems so every quote remains traceable.

### Recurring content research workflow

A practical scheduled workflow is:

1. maintain an approved list of public Facebook video URLs;
2. run this Actor on new URLs daily or weekly;
3. store `videoId` as the deduplication key;
4. split `segments` into source-linked text chunks;
5. classify topics or search for tracked phrases;
6. send matched excerpts and timestamps to a reviewer;
7. retain the canonical URL for verification.

The Actor does not discover new videos or compare historical runs itself. Use an upstream Facebook scraper or your own URL feed for discovery, then pass selected public URLs here.

### Integrations

#### Google Sheets or Airtable

Export one row per video for editorial review. Keep the full transcript and source URL; store segment arrays in JSON-capable columns or a linked table.

#### LLM summarization

Send `transcript` to an LLM for summaries, themes, or quote candidates. Include `sourceUrl` and timestamps in the prompt so generated notes remain verifiable.

#### RAG and semantic search

Chunk the `segments` array, embed each chunk, and store `videoId`, `startSeconds`, and `endSeconds` as metadata. Search results can then link back to the relevant moment.

#### Webhooks and scheduled tasks

Use Apify schedules for recurring URL lists and webhooks to notify a downstream pipeline after successful runs. Check run status and each row's `error` field before importing.

### Run with the Apify API

Replace `YOUR_TOKEN` with an Apify API token.

#### cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~facebook-video-transcript-extractor/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "videoUrls": ["https://www.facebook.com/reel/636216875539019"],
    "maxItems": 1,
    "language": "auto",
    "includeWordTimestamps": false,
    "maxVideoDurationSeconds": 120
  }'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/facebook-video-transcript-extractor').call({
  videoUrls: ['https://www.facebook.com/reel/636216875539019'],
  maxItems: 1,
  language: 'auto',
  includeWordTimestamps: false,
  maxVideoDurationSeconds: 120,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items[0].transcript);
```

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient(token="YOUR_TOKEN")
run = client.actor("automation-lab/facebook-video-transcript-extractor").call(
    run_input={
        "videoUrls": ["https://www.facebook.com/reel/636216875539019"],
        "maxItems": 1,
        "language": "auto",
        "includeWordTimestamps": False,
        "maxVideoDurationSeconds": 120,
    }
)
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items[0]["transcript"])
```

### Use with MCP and AI agents

Add the Actor to Claude Code through Apify MCP:

```bash
claude mcp add --transport http apify \
  "https://mcp.apify.com?tools=automation-lab/facebook-video-transcript-extractor"
```

For **Claude Desktop**, **Cursor**, **VS Code**, or another MCP client, add this JSON configuration:

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/facebook-video-transcript-extractor"
    }
  }
}
```

Example prompts showing MCP usage:

- “Transcribe this public Facebook Reel and list the main claims with timestamps.”
- “Create a source-linked summary from these Facebook video URLs.”
- “Extract word timestamps from this Reel and draft an editable subtitle timeline.”

Always review speech-recognition output before an agent publishes or acts on it.

### Responsible use and legality

This Actor processes publicly accessible video audio and metadata. It does not authenticate to Facebook, access private posts, or accept user cookies.

You are responsible for ensuring that collection, storage, transcription, and downstream use comply with applicable laws, Facebook terms, intellectual-property rights, privacy obligations, and organizational policies. Avoid collecting sensitive personal data without a valid purpose. Do not use transcripts to impersonate speakers, misrepresent statements, or redistribute protected content unlawfully.

Use short excerpts and source links where appropriate. Apply retention controls to downloaded dataset records. Honor deletion or access requests that apply to your use case.

### Troubleshooting

#### “No videos could be transcribed”

Open the dataset even when the run failed. It contains one diagnostic row per attempted URL. Confirm that each URL opens publicly in a logged-out browser and is not private, deleted, region-restricted, or over the configured duration.

#### The language is wrong

Short clips, music, or sparse speech can confuse automatic detection. Set `language` to the known two/three-letter code and rerun.

#### The transcript contains incorrect words

Speech recognition can mishear names, technical terms, overlapping speakers, or noisy audio. Use segment timestamps to review the original and correct important text manually.

#### Word timing is missing

Set `includeWordTimestamps` to `true`. The default is false to keep ordinary output smaller.

#### A URL worked before but fails now

Public Facebook media URLs and delivery responses can change. Retry the canonical post URL later. If it remains unavailable while logged out, it is outside the Actor's public scope.

### FAQ

#### Does this Actor require Facebook login cookies?

No. It intentionally supports only videos Facebook exposes publicly without authentication.

#### Does the video need captions?

No. The Actor performs speech recognition on audio and does not depend on a published caption track.

#### Which languages are supported?

The bundled multilingual model detects and recognizes many common languages. Quality varies by language and audio. Set a language code when automatic detection is unreliable.

#### Does it download or return the whole video?

No. It downloads the best audio stream temporarily for transcription, deletes temporary files after processing, and returns transcript data rather than media files.

#### Can it translate transcripts?

No. Translation is not included. Send the resulting transcript to a translation workflow if needed.

#### Can it find all videos from a Facebook Page?

No. Input is URL-based. Use a separate discovery source to collect approved public URLs, then send those URLs to this Actor.

#### Are failed videos charged as transcripts?

No. A failed video has no transcript event charge. The one-time run-start fee still applies.

#### How long can a video be?

The default limit is 600 seconds. You can raise it to 1,800 seconds, but longer videos take more compute and are more likely to hit run limits.

### Related Automation Lab Actors

- [Video Transcript Scraper](https://apify.com/automation-lab/video-transcript-scraper) — use one Actor for YouTube, TikTok, Instagram, and Facebook caption workflows.
- [Facebook Video Search Scraper](https://apify.com/automation-lab/facebook-video-search-scraper) — discover public Facebook videos before sending selected URLs to transcription.
- [YouTube Scraper](https://apify.com/automation-lab/youtube-scraper) — collect YouTube videos, channels, and related metadata.

Choose this Actor when the core job is speech-to-text for public Facebook URLs, including videos without caption tracks. Choose Video Transcript Scraper when one mixed-platform caption workflow is more important than Facebook-specific AI transcription.

# Actor input Schema

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

Public facebook.com video, Reel, share, or fb.watch URLs to transcribe. Add one URL per line.

## `maxItems` (type: `integer`):

Stop after this many unique input URLs. Use a small value when testing a new list.

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

Use auto to detect the spoken language, or enter a two/three-letter code such as en, es, fr, or deu.

## `includeWordTimestamps` (type: `boolean`):

Add start, end, and confidence values for each recognized word. Segment timestamps are always included.

## `maxVideoDurationSeconds` (type: `integer`):

Reject longer videos before transcription to keep runtime and cost bounded. Allowed range: 10–1800 seconds.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.facebook.com/reel/636216875539019"
  ],
  "maxItems": 10,
  "language": "auto",
  "includeWordTimestamps": false,
  "maxVideoDurationSeconds": 600
}
```

# Actor output Schema

## `dataset` (type: `string`):

Transcript text, segments, language, provenance, and public video metadata.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/facebook-video-transcript-extractor").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"] }

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/facebook-video-transcript-extractor").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"
  ]
}' |
apify call automation-lab/facebook-video-transcript-extractor --silent --output-dataset

```

## MCP server setup

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

```

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/y05Wz0cItiCr1ddqE/builds/asTGIaWdLoxl1z672/openapi.json
