# Facebook Transcript Scraper (`neuro-scraper/facebook-transcript-scraper`) Actor

Effortlessly extract spoken-word transcripts from public Facebook Videos and Reels. Retrieves native SRT captions with precise timestamps when available, with smart fallback to voiceover text. Supports bulk URLs and all Facebook video formats.

- **URL**: https://apify.com/neuro-scraper/facebook-transcript-scraper.md
- **Developed by:** [Neuro Scraper](https://apify.com/neuro-scraper) (community)
- **Categories:** Videos, Social media, Automation
- **Stats:** 15 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.99/month + usage

To use this Actor, you pay a monthly rental fee to the developer. The rent is subtracted from your prepaid usage every month after the free trial period. You also pay for the Apify platform usage, which gets cheaper the higher Apify subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#rental-actors

## 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 Transcript Scraper

> Extract full transcripts and closed captions from public Facebook Videos and Reels — with accurate timestamps — using Apify's residential proxies.

### Overview

**Facebook Transcript Scraper** is a powerful Apify Actor that automatically extracts spoken-word transcripts from public Facebook Videos and Reels. It downloads the native **SRT caption file** (with precise start/end timestamps) when available, and intelligently falls back to extracting voiceover or post caption text when no captions exist.

Whether you need transcripts for content repurposing, accessibility, SEO, or AI training data — this actor handles it at scale.

***

### Key Features

- 🎯 **SRT Caption Extraction** — Downloads the native Facebook subtitle file and parses it into timestamped segments (`start`, `end`, `text`)
- 🔁 **Smart Fallback** — If no SRT captions exist, extracts inline voiceover transcription or post caption text automatically
- 🌐 **Residential Proxy Support** — Bypasses geo-restrictions using Apify's residential proxy network for reliable scraping
- 🔗 **URL Auto-Resolution** — Handles all Facebook URL formats: `/reel/`, `/watch/`, `/videos/`, and shortened links
- 📦 **Bulk Processing** — Scrape transcripts from multiple videos in a single run
- 🚀 **Fast & Lightweight** — No browser required; pure HTTP scraping for maximum speed

***

### Input Parameters

Configure the actor with the following inputs in the Apify Console or via the API:

| Field | Type | Required | Description |
|---|---|---|---|
| `videoUrls` | `array` | ✅ Yes | List of public Facebook Video or Reel URLs to scrape |
| `maxItems` | `integer` | No | Limit the number of videos to process. `0` = no limit (default) |

#### Example Input

```json
{
  "videoUrls": [
    "https://www.facebook.com/reel/1549207066583030",
    "https://www.facebook.com/watch?v=1665818941169475"
  ],
  "maxItems": 10
}
```

***

### Output Format

Each successfully scraped video produces one record in the Apify dataset.

#### Output Schema

| Field | Type | Description |
|---|---|---|
| `inputUrl` | `string` | The original URL you provided |
| `videoId` | `string` | The Facebook video/reel numeric ID |
| `canonicalUrl` | `string` | The resolved canonical URL of the video |
| `pageName` | `string` | The name of the Facebook page or creator |
| `hasSrtCaptions` | `boolean` | `true` if native SRT captions were found and used |
| `transcriptEntryCount` | `integer` | Total number of transcript segments in the result |
| `transcript` | `array` | Array of transcript objects (see below) |

#### Transcript Entry — With SRT Timestamps

When native captions are available, each entry includes precise timestamps:

```json
{
  "start": 1.0,
  "end": 3.5,
  "text": "Not everyone can win."
}
```

#### Transcript Entry — Voiceover / Caption Fallback

When no SRT file is found, a single plain-text entry is returned without timestamps:

```json
{
  "text": "Greatness takes many forms. Esports World Cup is live in Paris..."
}
```

#### Full Output Example

```json
{
  "inputUrl": "https://www.facebook.com/reel/1549207066583030",
  "videoId": "1549207066583030",
  "canonicalUrl": "https://www.facebook.com/Cristiano/videos/greatness-takes-many-forms/1549207066583030/",
  "pageName": "Cristiano Ronaldo",
  "hasSrtCaptions": true,
  "transcriptEntryCount": 15,
  "transcript": [
    { "start": 0.0, "end": 2.5, "text": "Not everyone can win." },
    { "start": 2.5, "end": 5.0, "text": "The ones who do, they're different." },
    { "start": 5.0, "end": 7.8, "text": "Precision." }
  ]
}
```

***

### How It Works

1. **URL Resolution** — The actor fetches your input URL and follows all Facebook redirects to find the canonical video page (e.g. `/videos/...`).
2. **Caption Discovery** — It searches the page HTML for embedded SRT caption metadata specific to the target video ID.
3. **SRT Download & Parsing** — If English captions are found, the `.srt` file is downloaded and parsed into timestamped segments.
4. **Intelligent Fallback** — If no captions exist, it extracts inline voiceover transcription or the post caption text from the page JSON.
5. **Data Push** — Results are saved to the Apify dataset in structured JSON format.

***

### Setup & Requirements

#### Proxy Configuration

This actor **requires Apify Residential Proxies** to reliably access Facebook content. Before running:

1. Open the actor in the Apify Console
2. Go to the **Proxy & Browser configuration** tab
3. Select **Residential** as the proxy type
4. Set the country to **United States** (recommended)

#### Supported URL Formats

- `https://www.facebook.com/reel/VIDEO_ID`
- `https://www.facebook.com/watch?v=VIDEO_ID`
- `https://www.facebook.com/PAGE_NAME/videos/VIDEO_TITLE/VIDEO_ID/`
- `https://web.facebook.com/reel/VIDEO_ID`

***

### Limitations

- Only **publicly accessible** videos can be scraped. Login-restricted content is not supported.
- SRT captions are only available for videos where the creator or Facebook has enabled closed captioning.
- Facebook's structure changes frequently — if you encounter issues, check for actor updates.

***

### Use Cases

- **Content Repurposing** — Turn video transcripts into blog posts, social captions, or newsletters
- **Accessibility** — Generate text transcripts for videos that lack captions
- **AI & NLP Training** — Build datasets of spoken-word content from public videos
- **SEO Research** — Extract spoken keywords and topics from competitor video content
- **Journalism & Research** — Archive and search the spoken content of public videos at scale

***

### Legal & Ethical Notice

This actor scrapes only **publicly available** Facebook content. Always ensure your use complies with [Facebook's Terms of Service](https://www.facebook.com/terms.php) and applicable data protection laws. Do not use this tool to collect personal data without a lawful basis.

# Actor input Schema

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

List of public Facebook Video or Reel URLs to extract transcripts from.

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

Maximum number of videos to process. Set to 0 for unlimited.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.facebook.com/reel/1665818941169475"
  ],
  "maxItems": 0
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("neuro-scraper/facebook-transcript-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("neuro-scraper/facebook-transcript-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 '{}' |
apify call neuro-scraper/facebook-transcript-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,neuro-scraper/facebook-transcript-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/6AWyJ7iiUHJhxxtyR/builds/tfzHbRVJPAqwYAqk6/openapi.json
