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

AI transcript extractor for Facebook videos and Reels by URL — plain text + SRT, no cookies, no login. MCP/API-ready.

- **URL**: https://apify.com/khadinakbar/facebook-video-transcript-extractor.md
- **Developed by:** [Khadin Akbar](https://apify.com/khadinakbar) (community)
- **Categories:** Social media, AI, MCP servers
- **Stats:** 1 total users, 0 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $10.00 / 1,000 transcript extracteds

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

Extract AI transcripts from public Facebook videos and Reels by URL — plain text and SRT — without cookies, login, or session tokens. Designed as a first-class MCP tool: paste a video URL, get a clean transcript and (optionally) post metadata back as structured JSON.

### What you get per video

| Field | Type | Description |
|---|---|---|
| `postId` | string | Facebook video / reel ID. |
| `url` | string | Canonical Facebook video URL. |
| `isReel` | boolean | True for `/reel/` URLs. |
| `transcript` | string | Plain-text spoken-audio transcript. |
| `transcriptSrt` | string | null | SRT-formatted transcript with cue numbers and timestamps (when available). |
| `durationSeconds` | number | null | Video length, when metadata is fetched. |
| `viewCount`, `likeCount`, `commentCount`, `shareCount` | int | null | Public engagement counts. |
| `description` | string | null | Post caption. |
| `authorName`, `authorIsVerified` | string / boolean | null | Author identity. |
| `source` | `scrapecreators` | `sociavault` | Which provider produced the transcript. |
| `status` | `ok` | `no_transcribable_audio` | `provider_error` | Per-record outcome. |
| `note` | string | null | Human-readable reason on non-ok rows. |
| `scrapedAt` | ISO 8601 | Extraction timestamp. |

### Why use this actor

- **MCP-ready.** One verb, one input (URLs), one structured output. Perfect for Claude / GPT / Gemini agents wiring "watch a Facebook video" into a workflow.
- **Both formats.** Plain text for prompts and embeddings; SRT with timestamps for subtitle tooling. You don't pick — you get whichever the responding provider returned.
- **No cookies, no login.** HTTP-only against two cookieless providers (ScrapeCreators + SociaVault), with automatic fallback if one is rate-limited.
- **Predictable PPE pricing.** **$0.01 per transcript successfully extracted.** Failed and no-audio rows are recorded but never billed.
- **Honest results.** Photos, long videos (>~2 min), and posts without speech come back with a clear `status: "no_transcribable_audio"` note instead of vanishing.

### Pricing

| Event | Price |
|---|---|
| Actor start | $0.00005 |
| **Transcript extracted** | **$0.01 per video** |

Failed videos and no-speech videos are NOT charged. Optional post-metadata enrichment is included — no extra Apify charge.

### Input

```jsonc
{
  // 1+ Facebook video / reel URLs.
  "postUrls": [
    "https://www.facebook.com/reel/1535656380759655",
    "https://www.facebook.com/watch/?v=1234567890"
  ],

  // Optional: pass URL objects when chaining from another actor.
  "startUrls": [{ "url": "https://fb.watch/abc123XY" }],

  // Optional cap on charged transcripts per run.
  "maxTranscripts": 100,

  // Optional: also fetch likes / views / author / description.
  "includePostMetadata": false,

  // Optional: metadata-only language hint stored on each record.
  "language": "auto"
}
```

Supported URL formats:

- `https://www.facebook.com/reel/<id>`
- `https://www.facebook.com/watch/?v=<id>`
- `https://www.facebook.com/<page>/videos/<id>`
- `https://www.facebook.com/video.php?v=<id>`
- `https://www.facebook.com/share/v/<id>/` and `/share/r/<id>/`
- `https://fb.watch/<slug>`
- Mobile (`m.facebook.com`) variants of all of the above.

### Output

Each transcribed video produces one row in the default dataset. Example:

```json
{
  "postId": "1535656380759655",
  "url": "https://www.facebook.com/reel/1535656380759655",
  "isReel": true,
  "transcript": "Air fryer chocolate cake. Throw one ripe banana into a bowl...",
  "transcriptSrt": "1\n00:00:00,000 --> 00:00:02,561\nAir fryer chocolate cake...\n\n2\n00:00:02,561 --> 00:00:05,121\nThrow one ripe banana into a bowl...",
  "durationSeconds": 25,
  "viewCount": 316000,
  "likeCount": 8784,
  "authorName": "Some Page",
  "source": "scrapecreators",
  "status": "ok",
  "scrapedAt": "2026-06-27T01:23:45.000Z"
}
```

A final run summary is written to the key-value store under `OUTPUT`:

```json
{
  "_summary": true,
  "requested": 10,
  "valid": 9,
  "processed": 9,
  "transcribed": 8,
  "noAudio": 1,
  "failed": 0,
  "charged": 8,
  "billedUsd": 0.08
}
```

### Use cases

- **AI content pipelines** — feed Facebook video transcripts into Claude / GPT for summarization, classification, sentiment, content moderation, or RAG ingestion.
- **Creator research** — pull transcripts of competitor Reels at scale to map content themes, hooks, and CTAs.
- **Accessibility & repurposing** — convert spoken audio into captions, blog posts, or short-form clips.
- **Brand monitoring** — track what's being said in user-generated videos that mention your brand.
- **Newsroom workflows** — quickly transcribe public-figure Facebook Reels for quoting and fact-checking.

### How it works

1. Each URL is normalized to a canonical Facebook video URL + post ID.
2. The actor calls **ScrapeCreators** (`/v1/facebook/post/transcript`) for fast plain-text extraction.
3. If ScrapeCreators returns no transcript or rate-limits, the actor falls back to **SociaVault** (`/v1/scrape/facebook/post/transcript`), which returns SRT-formatted transcripts with timestamps.
4. When `includePostMetadata: true`, a second provider call hydrates likes, views, comments, shares, author, description, and duration.
5. One PPE event fires per successful transcript; failed or no-speech videos are recorded but never billed.

Provider transcription is currently capped at videos under ~2 minutes. Longer videos return `status: "no_transcribable_audio"` with a clear note rather than failing the whole run.

### MCP usage

Hosted at `apify--facebook-video-transcript-extractor` on Apify MCP. Typical agent call:

```jsonc
{
  "tool": "apify--facebook-video-transcript-extractor",
  "input": {
    "postUrls": ["https://www.facebook.com/reel/1535656380759655"],
    "includePostMetadata": true
  }
}
```

Returns a dataset row with `transcript`, `transcriptSrt`, and `status`. Errors come back with `isError: true` and a fix hint — no silent failures.

### Limits & honest disclosure

- Provider transcript is capped at videos under ~2 minutes.
- Only **public** videos are supported. Private posts, group-only posts, and login-walled content cannot be transcribed.
- This actor scrapes data that is publicly accessible on Facebook through third-party providers; you are responsible for compliance with Facebook's Terms of Service and applicable law (GDPR, CCPA, etc.) in your jurisdiction.

### FAQ

**Why two providers?** Single-provider scrapers break when one provider has an outage or rate limit. We try the cheap, fast one first and fall back automatically — that's how we get to 99%+ run reliability without you paying for double calls.

**Why pay $0.01 per video when the cheapest competitor charges $0.005?** Because that competitor (and most others in this niche) ships sub-50% success rates. We refund failures by not billing them, and our provider-backed architecture is bot-proof. Math works out cheaper at run-scale.

**Can I get translations?** No — the providers return the spoken language. Pipe the output into a translation step in your own pipeline.

**What if my video is longer than 2 minutes?** It comes back with `status: "no_transcribable_audio"` and no charge. Pre-filter for shorter videos in your pipeline.

**Does this work with Facebook live videos?** Only after they finish and become available as a regular video post.

### Related actors

- [`instagram-transcript-scraper`](https://apify.com/khadinakbar/instagram-transcript-scraper) — same pattern for Instagram Reels.
- [`youtube-transcript-extractor`](https://apify.com/khadinakbar/youtube-transcript-extractor) — bulk YouTube transcripts.
- [`facebook-posts-scraper`](https://apify.com/khadinakbar/facebook-posts-scraper) — scrape full Facebook page post feeds (not just transcripts).

# Actor input Schema

## `postUrls` (type: `array`):

List of Facebook video or Reel URLs to transcribe. Each item looks like 'https://www.facebook.com/reel/1535656380759655' or 'https://www.facebook.com/watch/?v=123456789'. fb.watch share URLs and mobile (m.facebook.com) URLs work too. NOT a Facebook page or profile URL — this actor transcribes specific videos, not whole pages. Photos and non-video posts return an empty transcript with a clear note.

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

Alternative way to pass targets as request objects when chaining from another actor's output: \[{ "url": "https://www.facebook.com/reel/SHORTCODE" }]. Merged with 'postUrls'. Use 'postUrls' for manual runs; use this for programmatic / agent pipelines that emit URL objects.

## `maxTranscripts` (type: `integer`):

Hard cap on how many videos are transcribed (and billed) in one run. Defaults to 100. Set lower to control spend. NOT a per-video length limit — provider transcription is capped at ~2-minute videos regardless of this value.

## `includePostMetadata` (type: `boolean`):

When true, also fetches per-video metadata (likes, views, comments, shares, author, description, duration) by calling the provider's post endpoint. Adds a small provider cost per video but no extra Apify charge. Defaults to false — leave off for pure transcript runs.

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

Optional label stored on each output record describing the expected spoken language (e.g. 'en', 'es', 'auto'). Defaults to 'auto'. The AI transcriber auto-detects language regardless; this field is metadata only and does NOT force a translation.

## Actor input object example

```json
{
  "postUrls": [
    "https://www.facebook.com/reel/1535656380759655",
    "https://www.facebook.com/watch/?v=1234567890"
  ],
  "maxTranscripts": 100,
  "includePostMetadata": false,
  "language": "auto"
}
```

# Actor output Schema

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

All extracted Facebook video transcripts.

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

Counts and billed amount for this run.

# 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 = {
    "postUrls": [
        "https://www.facebook.com/reel/1535656380759655"
    ],
    "maxTranscripts": 100,
    "language": "auto"
};

// Run the Actor and wait for it to finish
const run = await client.actor("khadinakbar/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 = {
    "postUrls": ["https://www.facebook.com/reel/1535656380759655"],
    "maxTranscripts": 100,
    "language": "auto",
}

# Run the Actor and wait for it to finish
run = client.actor("khadinakbar/facebook-video-transcript-extractor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "postUrls": [
    "https://www.facebook.com/reel/1535656380759655"
  ],
  "maxTranscripts": 100,
  "language": "auto"
}' |
apify call khadinakbar/facebook-video-transcript-extractor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=khadinakbar/facebook-video-transcript-extractor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/v4Xe77TEPVW1yQ0gU/builds/0ZKKpEAEYe6ZWessB/openapi.json
