YouTube Transcript with Word-Level Timestamps
Pricing
from $50.00 / 1,000 video transcribeds
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
Maintained by CommunityActor stats
1
Bookmarked
9
Total users
0
Monthly active users
18 days ago
Last modified
Categories
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 aconfidence score per word, and/or a downloadable copy of the video itself. Good for cuttingshorts on precise word boundaries, generating word-by-word (karaoke) captions, buildingSRT/VTT at any granularity, and finding the exact moment a phrase is spoken. It runs speechrecognition 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-readingActor is cheaper for that.How to call it: pass `videoUrls`, an array of YouTube URLs (watch, youtu.be, Shorts, embedor live). Optionally set `maxDurationMinutes` to skip videos longer than a limit. Each videoreturns 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 andvalid 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 thekey-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 storeclip = words[120:260] # whatever range your agent chosestart, 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 readers | This Actor | |
|---|---|---|
| Videos with no captions | Nothing to return | Transcribed |
| Word-level start/end times | Caption-line level | Every word |
| Per-word confidence | Not available | Included |
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}
| Field | Type | Default | Notes |
|---|---|---|---|
videoUrls | array of strings | — | Watch, 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. |
includeVideo | boolean | true | Returns 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. |
maxDurationMinutes | integer | 180 | Longer 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:
| Field | Description |
|---|---|
videoId, url, title | Video identity |
language, languageProbability | Detected language and confidence |
duration | Audio duration in seconds |
wordCount, segmentCount | Size of the transcript |
text | Full plain-text transcript |
transcriptUrl | Link to the full word-level record |
videoUrl | Direct video download link, up to 720p. Expires after 24 hours |
error | Present 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.
About the video link
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:
| Event | Price | Charged |
|---|---|---|
video-transcribed | $0.05 | Once per successfully transcribed video |
audio-minute | $0.025 | Per 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
- The video's audio track is retrieved through a commercial extraction service.
- The audio is transcribed with word-level timestamps and voice-activity detection.
- 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
speakerfield.
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.