YouTube Transcript with Word-Level Timestamps avatar

YouTube Transcript with Word-Level Timestamps

Pricing

from $50.00 / 1,000 video transcribeds

Go to Apify Store
YouTube Transcript with Word-Level Timestamps

YouTube Transcript with Word-Level Timestamps

Get a YouTube transcript with word-level timestamps - a start and end time for every word, plus per-token confidence - AND a free download link to the video itself. Everything you need to cut a short in one call: footage, cut points and caption timings. Works even when a video has no captions.

Pricing

from $50.00 / 1,000 video transcribeds

Rating

0.0

(0)

Developer

Samir Zerrouki

Samir Zerrouki

Maintained by Community

Actor stats

1

Bookmarked

9

Total users

0

Monthly active users

18 days ago

Last modified

Share

Transcribe YouTube videos and get a start and end timestamp for every word, not just for each caption line — plus a download link to the video itself, at no extra cost.

That combination is the point: to turn a long video into a short you need the footage, the exact cut points, and the caption timings. This returns all three from a single call. Structured JSON, ready for subtitle and SRT generation, karaoke-style auto-captions, clip cutting, forced alignment, semantic search and NLP pipelines.

What you get

1. A timestamp and a confidence score for every word:

{ "word": "Hello", "start": 0.0, "end": 0.5, "probability": 0.98 }

probability is the model's confidence in that token, so you can filter or flag low-confidence words rather than trusting the whole transcript equally.

2. A direct download link to the video, at up to 720p, on every row as videoUrl:

{ "videoId": "BLC24lb9yNc", "duration": 311.1, "wordCount": 827,
"videoUrl": "https://.../BLC24lb9yNc.mp4", "transcriptUrl": "https://..." }

Downloading YouTube video is normally its own chore. Here it comes free with the transcript — transcription already fetches the source, and retrieval is metered the same whether we take the audio track or the video, so you are not charged more for receiving it. The link is valid for 24 hours; set includeVideo: false to skip it for a slightly faster run.

🤖 Use with AI agents

Connected to the Apify MCP server? Ask for this Actor by name: zerrouki-samir/youtube-wordlevel-transcript-1

Word-level timing is what makes this useful to an agent rather than a person. An agent can read a transcript, decide which 30 seconds are worth clipping, and get back the exact millisecond that segment starts and ends — accurate enough to cut video on, and to drive word-by-word captions. Caption-line timings are too coarse for either.

Every run also returns a download link to the video, so an agent has everything it needs to produce a finished short in one call: the footage, the cut points, and the caption timings.

Copy this into Claude, ChatGPT, Cursor or any MCP-enabled assistant:

I want word-level transcripts of YouTube videos using the Apify Actor
`zerrouki-samir/youtube-wordlevel-transcript-1`.
Use it when I need: the exact start and end time of every spoken word in a video, with a
confidence score per word, and/or a downloadable copy of the video itself. Good for cutting
shorts on precise word boundaries, generating word-by-word (karaoke) captions, building
SRT/VTT at any granularity, and finding the exact moment a phrase is spoken. It runs speech
recognition on the audio, so it also works on videos that have no captions at all.
Don't use it when: I only need the plain transcript text with no timing. A caption-reading
Actor is cheaper for that.
How to call it: pass `videoUrls`, an array of YouTube URLs (watch, youtu.be, Shorts, embed
or live). Optionally set `maxDurationMinutes` to skip videos longer than a limit. Each video
returns one flat dataset row with the full text, counts, language, a `transcriptUrl`, and a
`videoUrl` - a direct download link to the video at up to 720p, included at no extra cost and
valid for 24 hours. The word array itself lives in the key-value store under
`transcript-<videoId>` and has objects of the form {"word", "start", "end", "probability"}.
Start with this input:
{
"videoUrls": ["https://www.youtube.com/watch?v=BLC24lb9yNc"]
}
Ask me which videos to process, then run the Actor, fetch the word-level record from the
key-value store, and use the word timings for whatever I asked for. If I asked for a short,
give me the cut points from the word timings and the videoUrl to cut from.

Things to ask your agent for:

  • Find the three most quotable 30-second moments in this video and give me exact cut points.
  • Turn this video into a short: pick the strongest hook, then give me an SRT with one word per cue.
  • Find every moment this phrase is said across these ten videos and timestamp each one.
  • Flag any word transcribed with confidence below 0.5 so I know what to check before publishing.

Cutting a short from the output

The word array is designed to be fed straight into a cutting tool. Pick your first and last word, and you have the clip boundaries:

words = kv["words"] # transcript-<videoId> from the key-value store
clip = words[120:260] # whatever range your agent chose
start, end = clip[0]["start"], clip[-1]["end"]
# row["videoUrl"] is the source file, returned by default, valid for 24h
# -> ffmpeg -ss {start} -to {end} -i {row["videoUrl"]} short.mp4

Each word also carries its own start/end, so the same array drives word-by-word caption timing without a second pass.

A machine-readable description of this Actor — input schema, API and MCP config — is published at apify.com/zerrouki-samir/youtube-wordlevel-transcript-1.md.

Why not a caption scraper?

Most YouTube transcript tools read the caption track YouTube already publishes. That is fast and cheap, and if you only need the text, use one of those.

This Actor runs speech recognition on the audio instead, which buys you three things a caption reader cannot give you:

Caption readersThis Actor
Videos with no captionsNothing to returnTranscribed
Word-level start/end timesCaption-line levelEvery word
Per-word confidenceNot availableIncluded

If you are building word-by-word animated captions, cutting clips on exact word boundaries, or filtering a transcript by confidence, the line-level output of a caption reader is not enough. If you just want the text, it is, and it will cost you less.

What it's used for

  • Karaoke and auto-captions — word-by-word highlighting, CapCut-style, driven by real timings
  • Clip cutting — find the exact millisecond a phrase starts and ends
  • Subtitle and SRT generation — build cues at whatever granularity you want
  • Forced alignment — line a known script up against the audio
  • Search and NLP — jump straight to the moment a term is spoken
  • Training data — timed, confidence-scored speech for model work

Input

{
"videoUrls": [
"https://www.youtube.com/watch?v=BLC24lb9yNc",
"https://youtu.be/J9HyZcP3xvE"
],
"maxDurationMinutes": 180
}
FieldTypeDefaultNotes
videoUrlsarray of stringsWatch, youtu.be, Shorts, embed and live URLs, with or without https://. Duplicates are removed, so the same video is never charged twice in one run.
includeVideobooleantrueReturns a direct download link to the video, up to 720p. No extra charge. The link expires after 24 hours. Set false for slightly faster runs.
maxDurationMinutesinteger180Longer videos are skipped instead of transcribed, and are not charged.

Output

Results land in two places.

Dataset — one flat row per video. Every field is a scalar, so CSV and Excel exports work:

FieldDescription
videoId, url, titleVideo identity
language, languageProbabilityDetected language and confidence
durationAudio duration in seconds
wordCount, segmentCountSize of the transcript
textFull plain-text transcript
transcriptUrlLink to the full word-level record
videoUrlDirect video download link, up to 720p. Expires after 24 hours
errorPresent only when a video could not be processed

Key-value store — the full transcript, under transcript-<videoId>:

{
"videoId": "BLC24lb9yNc",
"language": "en",
"duration": 311.1,
"text": "Hello world, this is a test.",
"words": [
{ "word": "Hello", "start": 0.0, "end": 0.5, "probability": 0.98 },
{ "word": "world", "start": 0.6, "end": 1.0, "probability": 0.91 }
],
"segments": [
{ "text": "Hello world, this is a test.", "start": 0.0, "end": 5.0 }
]
}

When you submit exactly one URL, the transcript is also written to the legacy transcript key so existing integrations keep working.

Two limits worth knowing before you build around it:

  • The link expires 24 hours after the run. Download the file within a day; re-running the Actor produces a fresh link. It is a handoff, not an archive.
  • 720p is the ceiling. That is the point where the pricing stops charging for bytes you did not receive, which is exactly why the video is free. Higher resolutions would cost real money.

videoUrl points at an MP4 you can stream or hand straight to ffmpeg.

Accuracy

Transcription is automatic speech recognition, not a human transcript. Expect occasional errors and approximate word boundaries, more so with strong accents, background noise, overlapping speakers, or technical vocabulary. Each word carries a probability so you can flag or filter low-confidence tokens. Review the output before using it anywhere accuracy is critical.

Pricing

Pay-per-event, so cost scales with video length rather than a flat rate that penalises short videos:

EventPriceCharged
video-transcribed$0.05Once per successfully transcribed video
audio-minute$0.025Per minute of audio, rounded up

A 5-minute video costs about $0.20, a 30-minute one $0.80, and an hour $1.55.

Videos that fail — private, geo-blocked, removed, DRM-protected, or over your maxDurationMinutes — are never charged. They are recorded in the dataset with an error field so you can see what happened.

How it works

  1. The video's audio track is retrieved through a commercial extraction service.
  2. The audio is transcribed with word-level timestamps and voice-activity detection.
  3. The temporary audio file is deleted as soon as the transcript is produced, whether or not it succeeded.

Audio is never retained after a run. Only the transcript is stored.

Limitations

  • Public videos only. Private, unlisted-without-access, members-only, geo-blocked and DRM-protected content cannot be processed.
  • Speed is bounded by CPU transcription; expect roughly a minute of processing per hour of audio at default settings.
  • Audio only — no video frames, thumbnails or comments.
  • Videos are processed sequentially within a run.
  • Speaker diarisation is not included; there is no speaker field.

Self-hosting

Requires credentials for the audio extraction service, set as a secret environment variable. See DEPLOYMENT.md.

Support

Report problems through the Issues tab on the Actor page.

License

MIT — see LICENSE.