YouTube captions.update costs 450 units: replace a caption track

captions.list costs 50, captions.update 450, captions.insert 400. Plan how many Sume-made caption files a 10,000-unit day can replace on your Shorts.

6 min readSume
All posts

Replacing a caption track with captions.update costs 450 quota units, and finding the track first with captions.list costs another 50. Inserting a brand-new track with captions.insert costs 400, and captions.delete costs 50. With the default 10,000 units per day, that is about 22 updates, or at most 20 list-then-update replacements, using the whole shared bucket.

That is the budget question behind this post: when a Short already has an automatic track and you have a better one from Sume, is it worth the units? The insert call is covered in an earlier post; this one is about finding, replacing and costing.

What do the caption methods cost?

Costs come from the method pages and the quota calculator.

Caption method quota costs (YouTube Data API method pages, read 2026-10-03)
MethodQuota unitsNotes from the page
captions.list50Needs videoId; part is id and snippet
captions.update450Body sets id and snippet.isDraft; a file up to 100 MB replaces the track contents
captions.insert400File up to 100 MB; same language needs a different name
captions.delete50Needs the force-ssl or youtubepartner scope

How do I find the track to replace?

captions.list takes a videoId and returns each caption resource. In the captions resource, snippet.trackKind is standard for a regular track, ASR for one generated by automatic speech recognition, or forced. snippet.language is a BCP-47 tag, and snippet.status is serving, syncing or failed.

So the list tells you which tracks exist and which one is the machine-made track. Whether captions.update is accepted for an ASR track is something the update page does not state, so test one video before building a batch around it, or insert a new standard track beside it.

What does update actually do?

Per the captions.update reference, the request must name the track id, and you may set snippet.isDraft. When you send a new caption file, the existing track's contents are replaced with it. The file may be up to 100 MB, and the scope must be youtube.force-ssl or youtubepartner.

There is no Sume endpoint that uploads captions to YouTube. What Sume gives you is the text and timing: video inspect with transcribe: true and segmentation.mode: "sentence" returns gapless segments[] with index, text, start and end, at $0.01 per audio minute plus the inspect's own compute. Convert those to a caption file yourself, as in the SBV versus SRT post, then send it.

def srt_time(sec):
    ms = round(sec * 1000)
    h, ms = divmod(ms, 3_600_000)
    m, ms = divmod(ms, 60_000)
    s, ms = divmod(ms, 1000)
    return f"{h:02}:{m:02}:{s:02},{ms:03}"

def segments_to_srt(segments):
    blocks = []
    for i, seg in enumerate(segments, 1):
        blocks.append(
            f"{i}\n{srt_time(seg['start'])} --> {srt_time(seg['end'])}\n{seg['text']}\n"
        )
    return "\n".join(blocks)

print(segments_to_srt([{"start": 0.0, "end": 1.8, "text": "Hello there"}]))

When is replacing worth the units?

Replace when the automatic track is wrong enough to hurt the Short: product names, brand terms, or a language the viewer needs. For clips where captions are part of the look, burn them in instead. Sume's video captions endpoint burns captions onto a clip for $0.20 per job on videos up to 60 seconds under the current estimate, and costs no YouTube quota at all. The trade is that burned captions cannot be turned off by the viewer and are not a searchable text track.

If you do replace, a practical order is: list once per video, skip videos whose track is already standard and yours, then update or insert. Count 450 units per video at most for update, and stop the batch with a margin so thumbnails and stats calls still run that day.

  • 22 updates use 9,900 of 10,000 units, so batch across days.
  • A list call per video adds 50 units; cache the track id once you have it.
  • Use isDraft to stage a track only if your process needs it; the page lists it as the settable field.

Sources

Related posts

More in Developers

All Developers posts

Written by Sume