Convert YouTube JSON3 Subtitles to SRT, VTT, or LRC
Download YouTube captions as JSON3 and convert them to SRT, VTT, or LRC. Step-by-step guide covering yt-dlp, the JSON3 format, and free online conversion.
When you download captions from YouTube, the rawest format you can get is JSON3, the structured timedtext format YouTube uses internally. It holds every detail of the captions: millisecond timing, word-level offsets, and text segments. The problem is that almost nothing outside YouTube reads JSON3. This guide shows you how to pull JSON3 captions out of YouTube and convert them into the format your tools actually want, SRT, VTT, or LRC, in seconds.
What Is the JSON3 Format?
JSON3 is the JSON-based timedtext format YouTube uses to store and deliver captions. Every caption cue is stored as an event object with a start time in milliseconds (tStartMs), a duration (dDurationMs), and one or more text segments (segs). Individual segments can carry a word-level offset (tOffsetMs) for karaoke-style timing precision.
Because it is structured JSON rather than plain text, JSON3 preserves more timing data than any subtitle format a normal media player uses. That makes it the best intermediate format to download if you care about fidelity, and the worst format to actually hand to a player. The fix is simple: download JSON3, then convert it.
How to Download YouTube Captions as JSON3
Option 1: yt-dlp (recommended)
The most reliable way to get JSON3 captions is yt-dlp, the actively maintained successor to youtube-dl. It works on the command line and handles playlists and channels without effort. To download only the English auto-captions in JSON3 format, without the video itself:
yt-dlp --write-auto-subs --sub-lang en --sub-format json3 --skip-download "https://www.youtube.com/watch?v=VIDEO_ID"
This drops a .json3 file into your current folder. Replace --write-auto-subs with --write-subs when a human-edited track exists, since those are more accurate.
Option 2: YouTube timedtext API
YouTube's timedtext endpoint can return JSON3 directly. Construct a URL like the following, filling in the video ID and the language code:
https://www.youtube.com/api/timedtext?v=VIDEO_ID&lang=en&fmt=json3
This returns the JSON3 payload in the browser. Note that auto-generated captions may require additional parameters, and YouTube occasionally tightens access to this endpoint.
Option 3: Browser extension
Several browser extensions add a download button to YouTube pages and can export captions in JSON3 or VTT. These are convenient for one-off downloads, though they give you less control than yt-dlp over language tracks and output format.
Why Convert JSON3?
No standard media player, video editor, or lyrics app reads JSON3. Each target format has a reason to be the destination:
- SRT for universal compatibility. Every desktop player, smart TV, phone player, and editing tool reads SRT. It is the safest choice when you are not sure what your destination expects.
- VTT for web video. WebVTT is the W3C standard for HTML5 subtitles, so it is the right target when you are embedding captions in a web player.
- LRC for synced lyrics. If the video is a music video and you want the captions to scroll as lyrics in a music player, LRC is the format those apps expect.
The Conversion Workflow
- Download the JSON3 file. Use yt-dlp or the timedtext API to save the caption track as a
.json3file. - Pick your target converter. Choose JSON to SRT, JSON to VTT, or JSON to LRC depending on where the captions are going.
- Upload and convert. Drop the JSON3 file into the converter. Conversion runs entirely in your browser, so the file never leaves your machine.
- Download and verify. Save the converted file and open it in a text editor or load it alongside your video to confirm the timing lines up.
What Happens to Timing During Conversion?
JSON3 stores the richest timing of any subtitle format, so some of that data is necessarily simplified when you convert:
- Word-level offsets (
tOffsetMs) are aggregated into cue-level start and end times, since SRT, VTT, and LRC only support one timestamp per cue. - Millisecond precision is preserved in SRT and VTT. LRC works at centisecond precision, so milliseconds are rounded to the nearest hundredth.
- End times are kept in SRT and VTT but dropped in LRC, which only records start times.
In practice, none of these losses affect readability. The start and end timing of each caption line remains accurate to the frame.
Common Problems and Fixes
- The JSON3 file is empty or tiny. The video may not have captions in the language you requested, or auto-captions are disabled. Try a different
--sub-langcode or check that the CC button offers the track you need. - Auto-caption timing drifts. Machine-generated captions are approximate, especially on long videos. If a human-edited track exists, it will be better aligned.
- Special characters look wrong. JSON3 is UTF-8. Make sure whatever tool opens the converted file also reads it as UTF-8.
- Multiple language tracks downloaded. Use
--sub-langin yt-dlp to grab only the track you need.
Privacy and File Safety
Caption files can contain sensitive material. Downloading with a local tool like yt-dlp and converting in your browser keeps the entire workflow on your machine. No uploads, no third-party servers, nothing to clean up afterward. The JSON3 file and its converted output never leave your device.
Ready to Convert
JSON3 gives you the highest-fidelity capture of YouTube captions. Converting it to SRT, VTT, or LRC makes that capture usable in the real world. Pick the converter that matches your destination and the rest takes a few seconds.
Turn your YouTube JSON3 captions into usable subtitle files.
Convert JSON3 to SRT Now