YouTube Transcript Scraper – Clean Text & JSON avatar

YouTube Transcript Scraper – Clean Text & JSON

Pricing

from $5.00 / 1,000 youtube transcript results

Go to Apify Store
YouTube Transcript Scraper – Clean Text & JSON

YouTube Transcript Scraper – Clean Text & JSON

Extract clean, timestamped transcripts from public YouTube videos and Shorts. Batch up to 1,000 URLs, choose caption languages, and export text or structured segments for AI, research, SEO, and automation. Pay only for successful transcripts.

Pricing

from $5.00 / 1,000 youtube transcript results

Rating

0.0

(0)

Developer

Chronometrica

Chronometrica

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

21 hours ago

Last modified

Share

YouTube Transcript Scraper

🚀 What does YouTube Transcript Scraper do?

Paste YouTube video URLs. Get clean transcript text and timestamped segments that are ready for AI, research, spreadsheets, and automated workflows.

The Actor extracts existing public captions from videos and Shorts. It also returns video context, selected language details, and clear result states. No YouTube API key, account, or cookies are required from you.

🎯 What can you use it for?

  • 🤖 Send clean transcript text into ChatGPT, Claude, AI agents, RAG pipelines, embeddings, and LLM prompts.
  • ✂️ Pull out key points, summaries, quotes, clips, and content ideas without watching every video first.
  • 🔎 SEO, competitive content analysis, media monitoring, and creator research.
  • 🎓 Academic, market, podcast, lecture, interview, and training-data workflows.
  • ♿ Accessibility review and subtitle/caption export.
  • 📊 Load stable rows into warehouses, Google Sheets, no-code automations, and repeatable batch jobs.

The Actor is built for direct video objects. Each successful YouTube video or Short becomes one billable transcript row. Failed inputs stay non-billable and are counted in the run OUTPUT record.

✨ Why use this Actor?

  • Clean output without formatting fluff: timestamped segments plus one joined text field.
  • 🔗 Easy to integrate: use stable dataset rows with the Apify API, webhooks, schedules, Make, Zapier, n8n, or your own code.
  • 📺 Video and channel context: title, publish date, duration, channel, and thumbnail when YouTube exposes them.
  • 📈 Transcript quality signals: word count, character count, segment count, timing coverage, and coverage ratio.
  • 🌍 Language clarity: requested languages, selected language, available language codes, auto-generated/manual flag, and match reason.
  • 🩳 Shorts and long videos: works with normal videos, Shorts, and long public videos when captions are available.
  • 🔑 No API key required from you: use direct video URLs, Shorts URLs, youtu.be, embed URLs, or raw video IDs.
  • 💸 Non-billable failures: invalid, unsupported, unavailable, age-restricted, login-required, and no-transcript outcomes are reported in OUTPUT, not written as charged dataset rows.
  • 🧾 Clear billing unit: one successful transcript equals one dataset row and one billable event. A failed lookup costs no result event.
  • 🆕 Fresh on every run: each public run fetches the current public caption track instead of reusing an older transcript result.

⚙️ Can I use this Actor through an API?

Yes. You can run YouTube Transcript Scraper manually in Apify Console or use it through:

  • Apify API
  • Python SDK
  • Node.js SDK
  • Webhooks
  • Scheduled runs
  • Apify integrations

This makes it useful for AI pipelines, research tools, spreadsheets, data warehouses, and no-code automations.

🚀 How do I use YouTube Transcript Scraper?

Paste one or more direct YouTube video URLs, Shorts URLs, youtu.be links, embed URLs, or raw video IDs into startUrls.

{
"startUrls": ["https://www.youtube.com/watch?v=dQw4w9WgXcQ"]
}

That is enough for most jobs:

  1. Open YouTube Transcript Scraper in Apify Console.
  2. Paste one or more YouTube video URLs or IDs.
  3. Leave the default language and output settings for your first run.
  4. Click Start.
  5. Open Output to inspect the transcript rows and run summary.
  6. Download the dataset or send it to another tool through an integration.

🧩 Input

OptionWhat it controls
startUrlsOne to 1,000 direct video, Shorts, live, embed, youtu.be, or raw video ID inputs. Duplicate videos run once.
preferredLanguagesOptional language codes in priority order. Empty means best available. A filled list is strict.
outputFormatsOne or more of json, text, srt, vtt, and llm. Defaults to json and text.
includeFailedInputDetailsInclude safe per-input failure details in OUTPUT. Defaults to true. Failures are never dataset rows.

When preferredLanguages is set and no requested language exists, the Actor records a typed non-billable LANGUAGE_UNAVAILABLE failure in OUTPUT. It does not silently return another language.

📦 Output

Each default-dataset row represents one successful unique YouTube video or Short. The fields are ordered for clean loading into spreadsheets, APIs, and warehouses.

GroupFields
Inputplatform, inputIndex, inputUrl
VideovideoUrl, videoId, title, publishedAt, videoDurationSeconds, thumbnailUrl
ChannelchannelId, channelName, channelUrl
LanguagerequestedLanguageCodes, transcriptLanguageCode, transcriptLanguageName, availableLanguageCodes, languageMatch, isAutoGenerated
Transcriptsegments, text, optional srt, optional vtt, optional llmText
QualitysegmentCount, wordCount, characterCount, firstSegmentStartSeconds, lastSegmentEndSeconds, transcriptSpanSeconds, videoCoverageRatio
Resultstatus, statusReason, errorCategory, errorCode, isRetryable, scrapedAt

✅ Successful row sample

{
"platform": "youtube",
"inputIndex": 0,
"inputUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"videoUrl": "https://www.youtube.com/watch?v=dQw4w9WgXcQ",
"videoId": "dQw4w9WgXcQ",
"title": "Example video title",
"publishedAt": "2024-04-30",
"videoDurationSeconds": 212,
"thumbnailUrl": "https://i.ytimg.com/vi/dQw4w9WgXcQ/hqdefault.jpg",
"channelId": "UCexample123",
"channelName": "Example Channel",
"channelUrl": "https://www.youtube.com/@example",
"requestedLanguageCodes": ["en"],
"transcriptLanguageCode": "en",
"transcriptLanguageName": "English",
"availableLanguageCodes": ["en", "es"],
"languageMatch": "exact",
"isAutoGenerated": false,
"segments": [
{
"startSeconds": 0,
"endSeconds": 2.4,
"durationSeconds": 2.4,
"text": "Example transcript text"
}
],
"text": "Example transcript text",
"srt": null,
"vtt": null,
"llmText": null,
"segmentCount": 61,
"wordCount": 534,
"characterCount": 3180,
"firstSegmentStartSeconds": 0,
"lastSegmentEndSeconds": 210.4,
"transcriptSpanSeconds": 210.4,
"videoCoverageRatio": 0.9925,
"status": "succeeded",
"statusReason": "Transcript parsed from public YouTube caption tracks.",
"errorCategory": null,
"errorCode": null,
"isRetryable": false,
"scrapedAt": "2026-07-08T21:43:38.000Z"
}

⚠️ Failed input detail

When enabled, OUTPUT.failedInputDetails preserves safe input and canonical identity details without creating a billable dataset row.

{
"inputIndex": 1,
"inputUrl": "https://www.youtube.com/watch?v=example1234",
"videoUrl": "https://www.youtube.com/watch?v=example1234",
"videoId": "example1234",
"status": "failed",
"statusReason": "No public transcript was available.",
"errorCategory": "no_transcript",
"errorCode": "TRANSCRIPT_NOT_FOUND",
"isRetryable": false
}

Common failure codes:

  • TRANSCRIPT_NOT_FOUND: public video resolved, but no public caption track was available.
  • VIDEO_UNAVAILABLE: the video was unavailable.
  • AGE_RESTRICTED: YouTube required age-confirmed access.
  • LOGIN_REQUIRED: YouTube required login for the lookup.
  • LANGUAGE_UNAVAILABLE: none of the requested transcript languages were available.
  • INVALID_INPUT and UNSUPPORTED_INPUT: the input was not a supported direct video object.
  • ACCESS_BLOCKED, TEMPORARY_FAILURE, and TRANSCRIPT_PARSE_FAILED: the public lookup could not produce a transcript and may succeed later when isRetryable is true.

🧾 Run summary

The OUTPUT record shows:

  • inputs received;
  • unique videos processed;
  • successful transcript rows;
  • duplicate videos skipped;
  • unavailable or unsupported inputs;
  • error-code counts;
  • optional safe details for inputs that did not produce a transcript.

Use this summary to check the whole run before loading the dataset.

💵 Pricing Event

The Actor is designed for Pay Per Event pricing. One billable event is one successful transcript row written to the dataset. Failed, invalid, unsupported, age-restricted, unavailable, language-unavailable, and no-transcript rows are non-billable. Public runs always fetch a fresh caption result.

🚫 What this Actor is not

  • It does not generate AI speech-to-text when YouTube has no public captions.
  • It does not download video or audio files.
  • It does not use your YouTube account, cookies, OAuth, or private session.
  • It does not access private, deleted, members-only, or account-only videos.
  • It does not expand playlists, channels, search keywords, recommendations, or comments. Use a discovery Actor first, then pass direct video URLs here.
  • It does not guarantee every public video has captions. When captions are unavailable, the row explains the outcome and stays non-billable.

🏆 Best practices

  • 🎯 Pass direct video or Shorts URLs whenever possible.
  • 🧠 Keep outputFormats to ["json", "text"] for most AI and data workflows.
  • 📝 Add srt or vtt only when you need subtitle files.
  • 🌐 Leave preferredLanguages empty for the best available track. Add language codes in priority order when the result must use one of those languages.
  • 🔗 For channel, playlist, or keyword workflows, run discovery first and send the resulting direct video URLs into this Actor.

Combine this Actor with our other social media scrapers for discovery, performance tracking, comment research, and transcript collection.

YouTube

Facebook

Instagram

TikTok