# YouTube Transcript Scraper Lowcost (0.5$/1K 🤑) (`sones/youtube-transcript-scraper-lowcost`) Actor

Extract YouTube transcripts with timestamps, language and video details, without login or API key. $0.50 per 1,000 transcripts.

- **URL**: https://apify.com/sones/youtube-transcript-scraper-lowcost.md
- **Developed by:** [Samy](https://apify.com/sones) (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 $0.50 / 1,000 transcripts

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## YouTube Transcript Scraper (Low-Cost)

Get the transcript of any public YouTube video, with timestamps and the video's details, for **$0.50 per 1,000 transcripts**. No YouTube account, no API key.

### What does YouTube Transcript Scraper do?

Paste YouTube video links or ids. For every video that has captions, you get one row with:

- 📝 **The full transcript** as one text, ready for search, summaries or an AI model
- ⏱️ **Timestamps**: the transcript line by line, with the start time and duration of each line
- 🌍 **The language you want** when the video has it, and the list of every language the video has
- 🎬 **The video's details**: title, channel, handle, duration, exact view count, publish date, category, description and thumbnail

It works on regular videos, Shorts, past live streams and podcasts of several hours, in any language YouTube captions.

### Why is it cheaper?

- 💰 **$0.50 per 1,000 transcripts**, a fraction of what most transcript scrapers charge.
- 🎯 **You pay for the transcripts you get.** A video without captions, a private video or a mistyped link has no per-item charge. The only other charge is $0.005 per run start (per GB of memory; runs use 1 GB by default).
- ⚡ **Fast and light.** No browser runs behind it: 45 videos take about 40 seconds.
- 🛡️ **Reliable.** Runs finish even when YouTube is slow, with nothing to tune on your side.

### Who uses it?

- **AI and LLM builders**: feed transcripts to retrieval (RAG), summarization, question answering or fine-tuning.
- **Marketers and content teams**: study what competitors say in their videos, find quotes, repurpose your own videos into articles and posts.
- **Researchers and journalists**: search what was said in talks, interviews, lectures and news, in many languages.

### How to use it

1. [Create a free Apify account](https://console.apify.com/sign-up).
2. Open the Actor and paste your video links in **YouTube videos**.
3. Optionally choose the **Preferred language** (`en` by default) and whether to **Include timestamps**.
4. Click **Start**, then download the results as JSON, CSV, Excel or HTML, or read them through the Apify API.

### Input

```json
{
    "videos": [
        "https://www.youtube.com/watch?v=iG9CE55wbtY",
        "https://youtu.be/dQw4w9WgXcQ",
        "https://www.youtube.com/shorts/R6yNUnRXZ64"
    ],
    "language": "en",
    "includeSegments": true
}
```

| Field             | Type    | Required | Description                                                                                                  |
| ----------------- | ------- | -------- | ------------------------------------------------------------------------------------------------------------ |
| `videos`          | Array   | **Yes**  | Video links or 11-character video ids. Watch links, `youtu.be` links, Shorts, embed and live links all work. |
| `language`        | String  | No       | Language code of the transcript you want: `en`, `es`, `de`, `pt-BR`, `ja`… Default: `en`.                    |
| `includeSegments` | Boolean | No       | Add the transcript line by line with timestamps. Turn off to get the full text only. Default: `true`.        |

Entries that are not YouTube videos (a channel link, a typo) are skipped and counted in the run's status; the same video entered twice is fetched once.

#### Which language do I get?

The scraper exports one transcript per video, chosen in this order:

1. Captions the uploader added in your language
2. YouTube's automatic captions in your language
3. Captions the uploader added in the language spoken in the video
4. YouTube's automatic captions in the spoken language
5. The captions YouTube shows by default
6. Any captions the video has

YouTube tells the spoken language through its automatic captions. A video without them, such as many music videos, gets the captions YouTube shows an English-speaking viewer by default: English ones when the video has them, even if it is sung in another language.

A region is matched loosely: `en` also takes `en-GB`, and `es` takes `es-419`. Each row tells you which transcript you got (`language`, `languageName`, `isAutoGenerated`) and lists every language the video has in `availableLanguages`, so you can run again with another language.

### Output

One row per video with a transcript:

```json
{
    "videoId": "iG9CE55wbtY",
    "url": "https://www.youtube.com/watch?v=iG9CE55wbtY",
    "title": "Do schools kill creativity? | Sir Ken Robinson | TED",
    "channelName": "TED",
    "channelId": "UCAuUUnT6oDeKwE6v1NGQxug",
    "channelHandle": "@TED",
    "channelUrl": "https://www.youtube.com/@TED",
    "durationSeconds": 1203,
    "viewCount": 25053272,
    "publishedAt": "2007-01-07T05:00:34.000Z",
    "description": "Visit http://TED.com to get our entire library of TED Talks, transcripts, translations…",
    "thumbnailUrl": "https://i.ytimg.com/vi/iG9CE55wbtY/hqdefault.jpg",
    "category": "Education",
    "language": "en",
    "languageName": "English",
    "isAutoGenerated": false,
    "availableLanguages": [
        { "code": "en", "name": "English", "isAutoGenerated": false },
        { "code": "en", "name": "English (auto-generated)", "isAutoGenerated": true },
        { "code": "de", "name": "German", "isAutoGenerated": false }
    ],
    "transcript": "Good morning. How are you? (Audience) Good. It's been great, hasn't it? I've been blown away by the whole thing. In fact, I'm leaving. (Laughter) …",
    "segments": [
        { "start": 27.103, "duration": 2.575, "text": "Good morning. How are you?" },
        { "start": 29.702, "duration": 1.403, "text": "(Audience) Good." },
        { "start": 31.129, "duration": 1.668, "text": "It's been great, hasn't it?" }
    ],
    "scrapedAt": "2026-10-20T23:11:38.182Z"
}
```

Times are in seconds. `channelHandle`, `viewCount`, `publishedAt` and `category` are `null` in the rare case YouTube does not show them. The dataset's **Overview** tab shows the thumbnail, title, channel, language, duration, views, publish date and transcript of each video.

Each run also saves a `RUN_SUMMARY` record in its key-value store: how many transcripts were exported, and for every video whether it gave a transcript (`scraped`), had none (`without_items`), was unavailable (`not_found`) or could not be fetched (`not_scraped`).

### Pricing

- **$0.50 per 1,000 transcripts** ($0.0005 per transcript)
- **$0.005 per run start** (per GB of memory; runs use 1 GB by default)

Besides the run start, you pay only for the rows in your dataset. Fetching the transcripts of 1,000 videos costs $0.505. Videos without a transcript and unavailable videos have no per-item charge. Set a spending limit on the run and the scraper stops when it reaches it.

### Limits

- **No translation.** You get the transcripts that exist on YouTube: the uploader's captions and YouTube's automatic captions. A video with English captions only gives an English transcript, whatever language you ask for.
- **Age-restricted and members-only videos have no transcript.** YouTube shows age-restricted videos only to signed-in viewers, and members-only videos only to the channel's members. They are reported as "no transcript available", with no per-item charge.
- **Live streams** get their transcript once the stream has ended. A stream that is live right now, or a premiere that has not started, has none yet.
- **Private, removed and blocked videos** are reported as "video unavailable", with no per-item charge.
- **Videos restricted in some countries** are retried. A video that stays blocked is reported as not fetched: run it again later.
- **Some videos have no captions at all**, for example many music videos and videos made for kids. They are reported as "no transcript available".
- Automatic captions are what YouTube's speech recognition heard: names and technical terms may be misspelled, and music-only parts read as `[Music]`.

### FAQ

**Do I need a YouTube account or an API key?** No. Paste links and start.

**How many videos can I put in one run?** Up to 10,000. Runs of thousands of videos are fine: progress is saved, and a run that the platform restarts continues where it stopped without fetching or charging a video twice.

**Can I get the transcript of a whole channel or playlist?** Use [YouTube Scraper (Low-Cost)](https://apify.com/sones/youtube-scraper-lowcost) to list the videos of a channel or playlist, then paste their links here.

**Why does a video give a transcript in another language than the one I asked for?** The video has no captions in your language. The row's `availableLanguages` lists those it has.

**Can I get SRT or VTT subtitles?** The `segments` field holds each line with its start and duration in seconds, which converts directly to SRT or VTT.

**What happens if a video cannot be fetched?** It is reported in the run's status and in `RUN_SUMMARY` as not fetched, with no per-item charge. Run it again later.

### Legal

This Actor collects public information that YouTube shows to anyone without signing in. Transcripts and video details can be protected by copyright and by YouTube's Terms of Service. You are responsible for how you use the data: check that your use is lawful in your country, respect the rights of the creators, and do not republish transcripts you have no right to publish. Read Apify's article on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/).

# Actor input Schema

## `videos` (type: `array`):

Video links or 11-character video ids: watch, youtu.be, Shorts, embed and live links all work. Example: https://www.youtube.com/watch?v=iG9CE55wbtY, https://youtu.be/dQw4w9WgXcQ, iG9CE55wbtY

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

Language code of the transcript you want, such as en, es, de, pt-BR or ja. When a video has no captions in this language, you get the original-language transcript, and the languages it does have are listed in availableLanguages.

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

Add the transcript line by line, with the start time and duration of each line in seconds, beside the full text. Turn off to get the full text only.

## `proxy` (type: `object`):

Leave on automatic. To send every request through your own proxies instead, choose 'Own proxies' and enter their URLs.

## Actor input object example

```json
{
  "videos": [
    "https://www.youtube.com/watch?v=iG9CE55wbtY",
    "https://youtu.be/dQw4w9WgXcQ",
    "https://www.youtube.com/shorts/R6yNUnRXZ64"
  ],
  "language": "en",
  "includeSegments": true,
  "proxy": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "videos": [
        "https://www.youtube.com/watch?v=iG9CE55wbtY",
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
    ],
    "proxy": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("sones/youtube-transcript-scraper-lowcost").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 = {
    "videos": [
        "https://www.youtube.com/watch?v=iG9CE55wbtY",
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
    ],
    "proxy": { "useApifyProxy": True },
}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,sones/youtube-transcript-scraper-lowcost"
        }
    }
}
```

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/kwuKmsehufibVh0a8/builds/8y8vfjyPKqNWJeuaU/openapi.json
