# YouTube Transcript Scraper — $0.002 per video (`devsef/youtube-transcript-scraper`) Actor

Extract YouTube video transcripts and subtitles as clean structured JSON with timestamps, language info and video title. Manual and auto-generated captions, any language. Only $0.002 per transcript — the cheapest on Apify; failed videos are never charged.

- **URL**: https://apify.com/devsef/youtube-transcript-scraper.md
- **Developed by:** [Steffano van Hoven](https://apify.com/devsef) (community)
- **Categories:** Videos, AI, Social media
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.00 / 1,000 transcript  scrapeds

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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

### What does YouTube Transcript Scraper do?

**YouTube Transcript Scraper extracts the full transcript (subtitles/captions) of any YouTube video as clean, structured JSON — for just $0.002 per transcript, the cheapest on Apify.** Paste video URLs or IDs, run the Actor, and get the complete spoken text with timestamps, language info, and video title. It supports both manual captions and auto-generated captions in any language YouTube offers.

Because it runs on the [Apify platform](https://apify.com), you get API access, scheduling, webhooks, integrations (Make, Zapier, n8n, LangChain, MCP), and monitoring out of the box.

### Why use YouTube Transcript Scraper?

- **Cheapest per-transcript price on Apify: $0.002.** Comparable actors charge $0.005-$0.01 per transcript — 2.5× to 5× more.
- **You only pay for delivered transcripts.** Videos without captions, unavailable videos, or blocked requests are never charged.
- **Built for AI workflows.** Feed transcripts into RAG pipelines, summarizers, content repurposing tools, or LLM agents. The plain-text field is ready for embedding; the segments array keeps timestamps for citation and clipping.
- **Any language.** Request your preferred language (e.g. `en`, `es`, `de`, `pt-BR`); the Actor falls back to the best available track and always tells you which language you got.
- **Honest output.** Every video gets a result row with an explicit `status` (`ok`, `no_transcript`, `unavailable`, `blocked`, `error`) so your automation can handle each case.

### How to use YouTube Transcript Scraper

1. Click **Try for free** — you'll need an Apify account (free plan works).
2. Paste one or more YouTube video URLs (or bare 11-character video IDs) into **YouTube videos**.
3. Optionally set your **Preferred language** (default: English) and toggle **Include timestamped segments**.
4. Click **Start**. Results appear in the **Output** tab within seconds per video.
5. Export the dataset as JSON, CSV, Excel, or HTML — or fetch it via the API.

### Input

| Field | Type | Description |
|---|---|---|
| `videoUrls` | array | YouTube video URLs or 11-character video IDs. Supports `watch?v=`, `youtu.be/`, `shorts/`, `embed/`, `live/`. Max 200 per run. |
| `language` | string | Preferred transcript language (ISO code, default `en`). Falls back to the best available track. |
| `includeSegments` | boolean | Include the timestamped `segments` array (default `true`). Disable for smaller, plain-text-only output. |
| `proxyConfiguration` | object | Proxy settings. **Keep the default (Apify residential proxy)** — YouTube blocks most datacenter IPs. |

```json
{
    "videoUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"],
    "language": "en",
    "includeSegments": true
}
````

### Output

Each video produces one dataset item. You can download the dataset in various formats such as JSON, CSV, Excel, or HTML.

```json
{
    "videoId": "dQw4w9WgXcQ",
    "url": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    "title": "Rick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)",
    "status": "ok",
    "language": "en",
    "isAutoGenerated": false,
    "segmentCount": 61,
    "charCount": 2089,
    "text": "We're no strangers to love You know the rules and so do I ...",
    "segments": [
        { "start": 18.64, "duration": 3.24, "text": "We're no strangers to love" }
    ],
    "error": null
}
```

| Field | Description |
|---|---|
| `videoId` / `url` / `title` | Video identification. |
| `status` | `ok`, `no_transcript`, `unavailable`, `blocked`, or `error`. Only `ok` is charged. |
| `language` | Language of the returned track (may differ from your preference if unavailable). |
| `isAutoGenerated` | `true` for YouTube auto-captions, `false` for manual subtitles. |
| `text` | The full transcript as plain text. |
| `segments` | Array of `{ start, duration, text }` in seconds (when enabled). |
| `charCount` / `segmentCount` | Size indicators for quick filtering. |

### How much does it cost to scrape YouTube transcripts?

**$0.002 per successfully extracted transcript** — that's 500 transcripts per $1. You are never charged for videos without captions, unavailable/private videos, or blocked requests. Apify platform usage (compute, residential proxy traffic) is billed separately by Apify at standard platform rates; a typical transcript costs well under a cent in total.

### Tips

- **Keep the residential proxy enabled** (the default). YouTube aggressively blocks datacenter IPs with a "confirm you're not a bot" wall; residential proxies avoid this.
- Batch up to 200 videos per run — sequential processing with automatic retry on blocked videos.
- Set `includeSegments` to `false` if you only need plain text and want a smaller dataset.
- If a run reports many `blocked` results, re-run it — the Actor automatically rotates to fresh proxy sessions.

### FAQ and disclaimers

**Does this Actor download videos or audio?** No. It only retrieves the caption/subtitle text that YouTube already publishes for the video.

**Can it transcribe videos that have no captions at all?** No — it extracts existing captions (manual or auto-generated). Videos without any captions return `status: "no_transcript"` and are not charged.

**Is scraping YouTube transcripts legal?** This Actor only accesses publicly available caption data and does not collect personal data. You are responsible for how you use the extracted content — respect copyright and YouTube's Terms of Service for your use case.

Found a bug or missing feature? Open an issue in the **Issues** tab — issues are answered within a few days.

# Actor input Schema

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

YouTube video URLs or plain 11-character video IDs. Supported URL forms: watch?v=..., youtu.be/..., shorts/..., embed/..., live/... Maximum 200 videos per run.

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

Preferred transcript language as an ISO code (e.g. "en", "es", "de", "pt-BR"). If the video has no track in this language, the first available track is used instead — check the "language" field in the output.

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

When enabled, each result contains a "segments" array with start time, duration and text per caption line, next to the full plain-text transcript. Disable to keep the output small (plain text only).

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

Residential proxies are strongly recommended: YouTube blocks most datacenter IP addresses with a "confirm you're not a bot" wall. The default (Apify residential proxy) works out of the box.

## Actor input object example

```json
{
  "videoUrls": [
    "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
  ],
  "language": "en",
  "includeSegments": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `results` (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": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("devsef/youtube-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": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"] }

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

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "YouTube Transcript Scraper — $0.002 per video",
        "description": "Extract YouTube video transcripts and subtitles as clean structured JSON with timestamps, language info and video title. Manual and auto-generated captions, any language. Only $0.002 per transcript — the cheapest on Apify; failed videos are never charged.",
        "version": "0.0",
        "x-build-id": "RR3t8FA0msx4LZhhq"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/devsef~youtube-transcript-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-devsef-youtube-transcript-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/devsef~youtube-transcript-scraper/runs": {
            "post": {
                "operationId": "runs-sync-devsef-youtube-transcript-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/devsef~youtube-transcript-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-devsef-youtube-transcript-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "videoUrls"
                ],
                "properties": {
                    "videoUrls": {
                        "title": "YouTube videos",
                        "type": "array",
                        "description": "YouTube video URLs or plain 11-character video IDs. Supported URL forms: watch?v=..., youtu.be/..., shorts/..., embed/..., live/... Maximum 200 videos per run.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "language": {
                        "title": "Preferred language",
                        "type": "string",
                        "description": "Preferred transcript language as an ISO code (e.g. \"en\", \"es\", \"de\", \"pt-BR\"). If the video has no track in this language, the first available track is used instead — check the \"language\" field in the output.",
                        "default": "en"
                    },
                    "includeSegments": {
                        "title": "Include timestamped segments",
                        "type": "boolean",
                        "description": "When enabled, each result contains a \"segments\" array with start time, duration and text per caption line, next to the full plain-text transcript. Disable to keep the output small (plain text only).",
                        "default": true
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Residential proxies are strongly recommended: YouTube blocks most datacenter IP addresses with a \"confirm you're not a bot\" wall. The default (Apify residential proxy) works out of the box.",
                        "default": {
                            "useApifyProxy": true,
                            "apifyProxyGroups": [
                                "RESIDENTIAL"
                            ]
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
