YouTube Transcripts

Give it YouTube video, Shorts, channel or playlist links (or plain video IDs) and it returns each transcript (subtitles, captions) as JSON: full text, timed segments, language, whether it was auto-generated, every caption language the video has, and the video's title, channel, length, publish date and views.

Sample output

One row as the API returns it. Long text is shortened here; names inside text read [name].

Show the sample as
Download
Sample row, one field per line
FieldValue
rowTypetranscript
platformyoutube
videoIddQw4w9WgXcQ
urlhttps://www.youtube.com/watch?v=dQw4w9WgXcQ
titleRick Astley - Never Gonna Give You Up (Official Video) (4K Remaster)
channelNameRick Astley
channelIdUCuAXFkgsw1L7xaCfnd5JJOw
channelHandle@RickAstleyYT
channelUrlhttps://www.youtube.com/channel/UCuAXFkgsw1L7xaCfnd5JJOw
durationSeconds213
publishDate2009-10-24T23:57:33-07:00
viewCount1,829,055,386

Call it from code or from your agent

This is the request. Small runs answer in the same call; large ones return a run ID.

TerminalOpens at launch
curl -X POST https://scrapers-api.arcadiumdata.io/v1/scrapers/youtube-transcripts/runs \
  -H "Authorization: Bearer $ARCADIUM_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "input": {
      "urls": [
        "https://www.youtube.com/watch?v=dQw4w9WgXcQ"
      ],
      "captionType": "any",
      "maxVideosPerSource": 10,
      "subtitleFormat": "none"
    }
  }'
$1.5011,000 transcripts: $1.50, plus the run start fee of $0.001. A failed or empty run costs $0.

What each row holds

Every row says what it is in rowType: transcript rows are charged, coverage and error rows are free.

The transcript 31 fields

The transcript
FieldTypeWhat it holds
platformstringAlways 'youtube'.
videoIdstringYouTube video id, 11 characters, e.g. dQw4w9WgXcQ.
urlstringWatch page link of the video (Shorts included).
titlestringVideo title.
channelNamestringName of the channel that published the video (the publisher, not a viewer).
channelIdstringChannel id, starts with UC, e.g. UCuAXFkgsw1L7xaCfnd5JJOw.
channelHandlestringChannel handle with the @, e.g. @RickAstleyYT. Null if YouTube did not return it.
channelUrlstringLink to the channel page built from channelId.
durationSecondsnumberVideo length in seconds.
publishDatestringPublish date and time as YouTube gives it, ISO 8601 with offset, e.g. 2009-10-24T23:57:33-07:00.
viewCountnumberViews at the time of the run.
likeCountnumberLikes at the time of the run; null when hidden.
categorystringYouTube category, e.g. Music, Education, News & Politics.
isLiveContentbooleanTrue for live streams and recorded live streams.
keywordsarrayTags the creator set on the video (may be empty).
descriptionstringVideo description, short (about 300 characters) or full per input; emails and phone numbers are removed.
languagestringLanguage code of the returned transcript, e.g. en, de-DE, pt-BR.
languageNamestringEnglish name of that language, e.g. German (Germany).
isAutoGeneratedbooleanTrue when the transcript is YouTube's speech recognition (no punctuation, may misspell names); false when the creator uploaded it.
languageMatchedbooleanFalse when none of the requested languages existed and the original-language track was returned instead.
translationStatusstringValues: 'not_requested', 'original' (the video has a native track in translateTo), 'translated' (YouTube's own machine translation), 'unavailable' (YouTube refused it; the original is returned).
translatedFromSource language code when translationStatus is 'translated', else null.
availableLanguagesarrayEvery caption track of the video: code, name, isAutoGenerated. Use it to request another language.
transcriptstringThe whole transcript as one text: caption lines joined with spaces. Emails and phone numbers are removed.
segmentCountnumberNumber of caption lines.
wordCountnumberWords in transcript, for chunking and token estimates.
segmentsarrayCaption lines in order: start (seconds from the start), duration (seconds), text. Present when includeSegments is on.
srtThe captions as an SRT subtitle file, when subtitleFormat is srt.
vttThe captions as a WebVTT subtitle file, when subtitleFormat is vtt.
sourceThe channel or playlist URL this video came from; null for videos given directly.
scrapedAtstringWhen the row was read, ISO 8601.
Error rows, free 3 fields
Error rows, free
FieldTypeWhat it holds
inputError rows: the URL or id as given.
codeError rows: not_found (private, removed, unknown channel), no_match (no captions, or none of the requested type), unavailable (age-restricted, members-only, upcoming, temporary error), blocked (rate limited, retry later), invalid_input.
messageError rows: what happened, in plain English.

What it can't do

  • It returns captions YouTube already has. It does not transcribe audio.
  • It does not return comments or the names of commenters.
  • Private and members-only videos are not read.

Channel names and URLs are the publisher labels YouTube shows publicly on every video.

What you send

Every field is optional. The example request above fills the ones shown here.

Main input fields
FieldTypeWhat it does
urlsarrayExample: https://www.youtube.com/watch?v=dQw4w9WgXcQ, https://youtu.be/dQw4w9WgXcQ, a Shorts URL, a bare video ID (dQw4w9WgXcQ), a channel (https://www.youtube.com/@kurzgesagt, add /shorts or /streams for those tabs) or a playlist URL. Channels and playlists give up to maxVideosPerSource videos each, channels newest first.
languagesarrayISO language codes in order of preference, e.g. ["en", "de"]; en also matches en-US and en-GB. The first one the video has is used. Empty or none available: the original spoken language (languageMatched is false when none matched).
captionTypestring (one of 3)Values: any (uploaded captions first, else auto-generated), manual (uploaded by the creator only), auto (YouTube speech recognition only). Videos without that type give a free error row. Default: any.
maxVideosPerSourceintegerTranscripts per channel or playlist URL, 1 to 5,000 (default 50). Videos without captions or outside the date range do not count. Direct video URLs are not limited by this.
subtitleFormatstring (one of 3)Values: none, srt, vtt. srt or vtt adds the captions as a ready subtitle file in the srt or vtt field. Default: none.
More options (7)
More input fields
FieldTypeWhat it does
translateTostringISO language code, e.g. es. A native track in that language is used when the video has one (translationStatus original). Otherwise YouTube's own machine translation is asked for; YouTube currently refuses it for anonymous clients, so you get the original with translationStatus unavailable.
publishedAfterstringDate as YYYY-MM-DD, e.g. 2026-01-01. Videos published earlier are skipped for free; on a channel the listing stops at the first older videos.
publishedBeforestringDate as YYYY-MM-DD, e.g. 2026-06-30. Videos published later are skipped for free.
includeSegmentsbooleanAdds segments: one entry per caption line with start and duration in seconds and its text. The joined transcript text is always included.Default true
descriptionstring (one of 3)Values: short (about 300 characters, default), full, none. Emails and phone numbers are removed.Default "short"
maxResultsintegerStops the run after this many transcripts across all URLs, 1 to 1,000,000. A cost cap; leave empty for no limit.
includeErrorRowsbooleanAdds a free row (rowType error, with a code and message) for every video or URL that gave no transcript: no captions, private, age-restricted, not found. On by default.Default true

Questions people ask before they top up

What does a run cost?

Each transcript costs $0.0015, which is $1.50 per 1,000. A run that delivers rows also pays a $0.001 start fee.

A run that returns rows costs at least $0.005, start fee included. Failed runs, empty runs and duplicate rows cost $0. You set the most a run may cost, and it stops there.

Do you ever return personal data?

Not about reviewers or users. Reviewer names, profile links, photos, emails and phone numbers are not collected. When a name appears inside a review or a reply, it is replaced with [name].

Job titles and company sizes stay where a site shows them, because they describe a role rather than a person. On YouTube, channel names and URLs are the publisher labels YouTube shows publicly.

How fresh is the data?

Each run reads the live site when you start it, so rows are as current as the site itself.

More from YouTube

  • Views, likes, duration, exact publish date, Shorts flag, tags

    $1.25per 1,000 videos