YouTube thumbnails.set costs about 50 quota units: plan a batch

Google lists about 50 quota units per thumbnails.set call, a 50MB cap, JPEG or PNG. Sume video frames is unbilled, so spend calls on one chosen still.

5 min readSume
All posts

A thumbnails.set call costs approximately 50 quota units, so a batch of Shorts thumbnails is a quota budget as much as an image job. Pick the still before you call YouTube: Sume video frames lets you pull up to 24 candidate frames per request without any billing, so the only YouTube call is the one with the winner.

The numbers come from Google's Thumbnails: set reference, read 2026-10-02. I did not find a default daily quota on that page, so check your own Google Cloud console for the number you have.

What does the thumbnails.set page say?

The request body is the raw image, with no thumbnail resource. The page lists a maximum file size of 50MB, accepted MIME types of image/jpeg, image/png and application/octet-stream, and a quota cost of approximately 50 units per call.

thumbnails.set quota planning at about 50 units per call, read 2026-10-02
Videos in the batchUnits at one call eachUnits if you retry each once
105001,000
502,5005,000
1005,00010,000
20010,00020,000

Where do I save calls?

Every wasted upload is 50 units. Waste comes from three places: a thumbnail you change your mind about, a file the API rejects, and a retry of a call that actually worked. Choosing on your side removes the first, and sending a valid JPEG or PNG removes the second. For retries, record which video IDs already succeeded before you re-run a batch.

How do I choose the frame first?

Send the clip to POST /v1/video-frames with up to 24 times in at, or an fps of at most 2 for even sampling. The route is unbilled. Use png if you will edit the still, jpeg if you will upload it as is, and keep max_edge unset for source size or set it up to 2160. Each returned frame has t, url, width and height.

The YouTube help page, read 2026-10-02, recommends 2160 x 3840 for Shorts thumbnails with a minimum height of 640, and gives size limits of 2 MB on mobile and 50 MB on desktop. The API page's 50MB limit is the number that applies to your upload call.

curl -X POST https://api.sume.com/v1/video-frames \
  -H "Authorization: Bearer $SUME_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: batch-short-017" \
  -d '{"video_url":"https://media.sume.com/artifacts/artf_demo/short17.mp4",
       "fps": 0.5, "format": "jpeg", "max_edge": 2160}'

How do I structure a safe batch run?

Split the run into two phases. Phase one is Sume only: for every video, call video frames, choose a time, and store the frame URL. Nothing here touches your YouTube quota, and it is unbilled. Phase two is the upload: for each stored frame, download the image and call thumbnails.set once. If a call fails for a reason that is not about the file, such as a network error, check the video before repeating it, because a call that reached Google may have worked.

Since each retry costs about 50 units, add a stop rule. For example, halt the run after three consecutive failures and read the error, rather than burning through the batch. Errors that mean the file is wrong, such as a size or type problem, will fail the same way every time, so retrying them only wastes quota.

Keep the arithmetic honest. The table above is multiplication on the figure from Google's page, not a measured number, and your project's quota allocation may differ from any default. Read your own limit in the console before sizing the batch, and leave headroom for other API calls that share the same quota.

What does this not cover?

Keep a simple ledger: video ID, chosen time, frame URL and whether thumbnails.set succeeded. With that, a batch of any size is predictable.

  • Sume does not call YouTube; you upload the chosen file yourself.
  • Quota cost is a figure from Google's page and can change; re-read it before a large run.
  • Sume frame extraction only works on clips up to 300 seconds.

Sources

Related posts

More in Media tools

All Media tools posts

Written by Sume