# Video Transcript Scraper (`fetch_cat/video-transcript-scraper`) Actor

Extract normalized transcripts, timestamped segments, and public metadata from mixed YouTube, TikTok, Instagram, and Facebook video URLs.

- **URL**: https://apify.com/fetch\_cat/video-transcript-scraper.md
- **Developed by:** [Hanna Nosova](https://apify.com/fetch_cat) (community)
- **Categories:** AI, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $15.02 / 1,000 transcript extracteds

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?

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

## Video Transcript Scraper

Extract transcripts from public **YouTube, TikTok, Instagram, and Facebook videos** in one run. Send a mixed list of video URLs and receive normalized transcript text, timestamped segments, language, video metadata, and clear per-video status rows.

### What you can export

- Full transcript text for public videos with accessible captions or speech
- Timestamped transcript segments
- Platform, canonical URL, video ID, title, author, duration, thumbnail, and caption when public
- Stable success/failure status and error details
- Original platform-specific fields in `sourceData`

### Input example

```json
{
  "videoUrls": [
    { "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" },
    { "url": "https://www.tiktok.com/@scout2015/video/6718335390845095173" }
  ],
  "preferredLanguage": "en",
  "includeTimestamps": true,
  "includeMetadata": true,
  "maxVideos": 2
}
```

### Output example

```json
{
  "inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "canonicalUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
  "platform": "youtube",
  "videoId": "dQw4w9WgXcQ",
  "title": "Video title",
  "authorName": "Channel name",
  "language": "en",
  "transcriptText": "Transcript text...",
  "segments": [{ "text": "Transcript text", "startSeconds": 0, "endSeconds": 2.4, "durationSeconds": 2.4 }],
  "durationSeconds": 213,
  "thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
  "caption": null,
  "status": "succeeded",
  "errorMessage": null,
  "scrapedAt": "2026-09-06T00:00:00.000Z",
  "sourceData": {}
}
```

### Input settings

| Field | Description |
|---|---|
| `videoUrls` | Public YouTube, TikTok, Instagram Reel/video, or Facebook Reel/video URLs. |
| `preferredLanguage` | Preferred caption or speech language code. |
| `includeTimestamps` | Include segment timing when available. |
| `includeMetadata` | Include public title, author, duration, thumbnail, and caption. |
| `maxVideos` | Maximum unique URLs to process (1–5) within the shared run deadline. |
| `maxRetries` | Maximum retries (0–5) for transient timeout, connection, rate-limit, and 5xx failures. |
| `proxyConfiguration` | Optional Apify Proxy settings. |

### Output fields

`inputUrl`, `canonicalUrl`, `platform`, `videoId`, `title`, `authorName`, `language`, `transcriptText`, `segments`, `durationSeconds`, `thumbnailUrl`, `caption`, `status`, `errorMessage`, `scrapedAt`, and `sourceData`.

### Who is it for?

- AI and data teams building RAG, semantic search, or media-monitoring pipelines
- Researchers comparing video narratives across social platforms
- Content teams creating summaries, subtitles, topic indexes, and editorial briefs
- Developers who need one stable schema instead of platform-specific integrations

### Use cases

- Feed mixed social-video transcripts into RAG or search pipelines
- Monitor creators across several platforms
- Create subtitles, summaries, topic indexes, and content briefs
- Export timestamped quotes for research and editorial review

### Pricing

Pay per successful transcript plus a small run-start fee. Failed or unavailable transcripts do not incur the transcript event charge. See the live [Pricing tab](https://apify.com/fetch_cat/video-transcript-scraper/pricing) for current rates and volume tiers.

### Tips and limits

- Use direct public video URLs, not profile or channel pages.
- Private, deleted, age-restricted, geo-restricted, or silent videos may return failed rows.
- Metadata and timestamp availability varies by platform and public source.
- Keep the first run small, then increase `maxVideos` after confirming the source URLs work.

### API usage

#### cURL

```bash
curl -X POST "https://api.apify.com/v2/acts/fetch_cat~video-transcript-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"videoUrls":[{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}],"maxVideos":1}'
```

#### JavaScript

```javascript
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('fetch_cat/video-transcript-scraper').call({
  videoUrls: [{ url: 'https://www.youtube.com/watch?v=dQw4w9WgXcQ' }],
  maxVideos: 1,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

#### Python

```python
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('fetch_cat/video-transcript-scraper').call(run_input={
    'videoUrls': [{'url': 'https://www.youtube.com/watch?v=dQw4w9WgXcQ'}],
    'maxVideos': 1,
})
items = client.dataset(run['defaultDatasetId']).list_items().items
print(items)
```

### MCP and AI agents

Connect through [Apify MCP](https://mcp.apify.com/?tools=fetch_cat/video-transcript-scraper) and expose `fetch_cat/video-transcript-scraper` to your agent.

```bash
claude mcp add apify --transport http "https://mcp.apify.com/?tools=fetch_cat/video-transcript-scraper"
```

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com/?tools=fetch_cat/video-transcript-scraper"
    }
  }
}
```

Example prompts:

- “Extract timestamped transcripts from these three public video URLs.”
- “Summarize the main themes and cite the source URL for each transcript.”

### Ready-to-run examples

Open a public example to inspect its input, run it, or reuse it as a task:

- [Extract mixed-platform video transcripts](https://apify.com/fetch_cat/video-transcript-scraper/examples/mixed-platform-video-transcripts)
- [Extract a YouTube transcript with timestamps](https://apify.com/fetch_cat/video-transcript-scraper/examples/youtube-transcript-with-timestamps)

#### Timestamped YouTube transcript

```json
{"videoUrls":[{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"}],"includeTimestamps":true,"maxVideos":1}
```

#### Mixed-platform batch

```json
{"videoUrls":[{"url":"https://www.youtube.com/watch?v=dQw4w9WgXcQ"},{"url":"https://www.instagram.com/reel/DPR-1mcCAqa/"}],"preferredLanguage":"en","maxVideos":2}
```

### Related Actors

- [YouTube Transcript Scraper](https://apify.com/fetch_cat/youtube-transcript-scraper)
- [Instagram AI Transcript Extractor](https://apify.com/fetch_cat/instagram-ai-transcript-extractor)
- [TikTok AI Transcript Extractor](https://apify.com/fetch_cat/best-tiktok-ai-transcript-extractor)
- [Facebook AI Transcript Extractor](https://apify.com/fetch_cat/facebook-ai-transcript-extractor)
- [TikTok Sound Scraper](https://apify.com/fetch_cat/tiktok-sound-scraper)

### FAQ

#### Does it translate transcripts?

No. `preferredLanguage` selects an available caption or speech-language route; it does not translate text.

#### Are failed videos charged as transcripts?

No. The per-transcript event is charged only when transcript text is returned.

#### Can one run contain different platforms?

Yes. Mixed URL batches are the main purpose of this Actor.

### Support

Open an issue from the Actor's Apify Store page with a public example URL, expected result, and run ID. Do not include private videos, credentials, cookies, or personal data.

# Actor input Schema

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

YouTube, TikTok, Instagram Reel/video, or Facebook Reel/video URLs.

## `preferredLanguage` (type: `string`):

Preferred caption or speech language code. The source may return another available language.

## `includeTimestamps` (type: `boolean`):

Include segment-level timestamps when the public source provides them.

## `includeMetadata` (type: `boolean`):

Include public title, author, duration, thumbnail, and caption when available.

## `maxVideos` (type: `integer`):

Maximum unique URLs processed in this run.

## `maxRetries` (type: `integer`):

Maximum retries for transient timeout, connection, rate-limit, and 5xx failures. Validation and permanent extraction errors are not retried.

## `proxyConfiguration` (type: `object`):

Optional connection settings forwarded to the platform-specific extractor.

## Actor input object example

```json
{
  "videoUrls": [
    {
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    }
  ],
  "preferredLanguage": "en",
  "includeTimestamps": true,
  "includeMetadata": true,
  "maxVideos": 1,
  "maxRetries": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

# 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": [
        {
            "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
        }
    ],
    "preferredLanguage": "en",
    "maxVideos": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetch_cat/video-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 = {
    "videoUrls": [{ "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" }],
    "preferredLanguage": "en",
    "maxVideos": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("fetch_cat/video-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 '{
  "videoUrls": [
    {
      "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    }
  ],
  "preferredLanguage": "en",
  "maxVideos": 1
}' |
apify call fetch_cat/video-transcript-scraper --silent --output-dataset

```

## MCP server setup

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