Upload 15 Shorts at once in Studio: probe every file first
Studio takes up to 15 Shorts per upload, each up to 3 minutes and square or vertical. Check duration and frame shape with video-inspect before you queue.

What does YouTube Studio accept in one Shorts upload?
On a computer, YouTube's help page for uploading Shorts says each file can be up to 3 minutes long with a square or vertical aspect ratio, and you can upload up to 15 short videos at once. A batch of AI clips is exactly that case, and one wrong file in fifteen is easy to miss until it publishes as a regular video.
You can check all fifteen before you open Studio. Sume's video inspect route probes a clip and returns its duration, width, height, rotation and whether it has an audio track, without cutting or changing it.
Turn the help page into a pass or fail rule
Two of the statements on the page are checkable from a probe. The rest (titles, privacy, the draft screen) happen inside Studio.
| YouTube statement | Probe field to read | Fail when |
|---|---|---|
| Up to 3 minutes | duration_seconds | Greater than 180 |
| Square or vertical aspect ratio | width and height | width greater than height |
| Up to 15 files at once | Your own list length | More than 15 files |
Probe a folder of clips
The clips must already live on media.sume.com; there is no open-internet fetch, so import first with the media import route described under media inputs. Send frames: false so the call is a probe only. The default mode waits up to 30 seconds for a finished answer and returns 202 if the job is still running, in which case you poll GET /v1/video-inspect/:id.
The probe also carries rotation. A phone file with a rotation flag can report a stored shape that differs from what plays, so look at any file whose rotation is not 0 by eye. The sample below prints one verdict per file.
import asyncio, os
import httpx
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
URLS = ["https://media.sume.com/artifacts/artf_demo/short-01.mp4"] # up to 15
async def probe(client, i, url):
r = await client.post(
"https://api.sume.com/v1/video-inspect",
headers={**H, "Idempotency-Key": f"studio-batch-{i}"},
json={"video_url": url, "frames": False},
)
r.raise_for_status()
body = r.json()
p = body["video_inspect"]["probe"]
if p is None:
return url, "still running: GET /v1/video-inspect/" + body["request_id"]
long = (p["duration_seconds"] or 0) > 180
wide = (p["width"] or 0) > (p["height"] or 0)
return url, "FAIL" if long or wide else f"ok rotation={p['rotation']} audio={p['has_audio']}"
async def main():
async with httpx.AsyncClient(timeout=60) as c:
for url, verdict in await asyncio.gather(*(probe(c, i, u) for i, u in enumerate(URLS))):
print(verdict, url)
asyncio.run(main())What to do with a file that fails
Each failure has a different fix, and the cheap ones are worth trying before you regenerate anything. A file over 180 seconds can be cut down: video trim takes a start and exactly one of end or duration, caps the output at 900 seconds, and is $0.02 per job in the docs. A file that is wider than tall needs a crop to a vertical frame, which the video filter handles with fractions of the source frame.
A file with no audio track will not break the upload, but it will break speech-to-text captions, which fail on a silent clip. Read has_audio in the same probe and route silent files to authored caption cues instead. Doing this check once per file, before the batch, keeps the 15-file upload from stalling on the one clip that needed a different path.
| Probe says | Next step | Surface |
|---|---|---|
| duration_seconds over 180 | Cut to a shorter range | Video trim |
| width greater than height | Crop to a vertical frame | Video filter crop |
| has_audio false | Burn authored cues, not speech captions | Video captions with cues |
| rotation not 0 | Look at the clip before trusting width and height | Your eyes |
What the probe cannot tell you
A probe reports file facts. It does not know whether a clip is the right length for the story, whether the text is inside the safe area, or whether a rights holder will claim the music. The upload page itself warns that using copyrighted material can lead to Content ID claims or strikes if the owner files a takedown.
If a file fails on length, cut it with video trim rather than re-generating; if it fails on shape, see the guide to Shorts specs. The API's own probe-only note is also worth reading in the QA gate post, since the docs and the catalog text describe billing slightly differently and you should confirm the live rate in GET /v1/catalog.
Sources
Related posts
More in Media tools
- Upscale an old Sora download: the limits of Sume's video upscaler
Sora files you saved can be upscaled. Sume's video-upscale model takes a scale from 1.1 to 4, up to 30 seconds, and a fast, standard or pro tier.
- Vertical video subtitles: BBC's 3-line rule and Sume settings
BBC guidance for 9:16 subtitles: up to 3 lines, 90% width, placed a little high. How to set safe_width_ratio and anchor_ratio on Sume burned-in captions.
- Video filter caps sources at 300 s: handling 5-minute TikTok videos
A 5-minute TikTok episode sits exactly on Sume video filter's 300 s source limit. Why /check passes, where the worker refuses, and how to split first. Costs.
- Video reach campaign: which video lengths to cut from one master
A Google Ads video reach campaign wants a 15 s, a 6 s and sometimes a 30 s horizontal cut, plus a vertical one. Google's compositions, and trims on Sume.
Written by Sume