Non-skippable YouTube ads: 6 s, 7-15 s and 16-30 s CTV lengths
Google Ads sorts non-skippable in-stream video into bumper up to 6 s, 7 to 15 s, and 16 to 30 s for CTV, bought on target CPM. How to cut each length with Sume.

Google Ads' non-skippable in-stream page defines three lengths: bumper up to 6 seconds, standard non-skippable from 7 to 15 seconds, and a 30-second connected TV format from 16 to 30 seconds. Video trim can cut one master to any of the three, and the length you pick decides the format, so it is worth cutting each on purpose.
What Google says
These ads play before, during or after other videos on desktop, mobile and connected TV. Bidding is target CPM, the video must be uploaded to YouTube as public or unlisted, and the format is supported only under the YouTube reach, views and engagements objective in the video ad sequence subtype. Recommended resolution is 1080p, with 720p the minimum, in MP4 or WebM up to 256 GB.
The Display & Video 360 help page differs a little: it lists non-skippable at between 7 and 15 seconds, and up to 60 seconds through instant deals. Check which tool you buy in.
| Format | Length | Where it is defined |
|---|---|---|
| Bumper | Up to 6 seconds | Google Ads |
| Standard non-skippable | 7 to 15 seconds | Google Ads and DV360 |
| 30-second CTV | 16 to 30 seconds | Google Ads |
| Instant deals in DV360 | Up to 60 seconds | DV360 |
Three cuts from one master
Trim duration accepts 0.2 to 900 seconds, so 6, 15 and 30 are a loop over three calls. Keep each cut's end on a finished beat. A 15 second cut that stops mid-sentence is still a valid file, but that is your problem, not a spec failure.
At the docs' $0.02 per trim job, three cuts cost $0.06. The source is untouched and each result is a new MP4.
import os
import requests
key = os.environ["SUME_API_KEY"]
for seconds in (6, 15, 30):
resp = requests.post(
"https://api.sume.com/v1/video-trim",
headers={"Authorization": f"Bearer {key}", "Idempotency-Key": f"yt-nonskip-{seconds}"},
json={
"video_url": "https://media.sume.com/artifacts/artf_demo/master.mp4",
"start": 0,
"duration": seconds,
"mode": "sync",
},
timeout=60,
)
resp.raise_for_status()
print(seconds, resp.json())
Limits
Trim cuts by seconds, not by frames you name, and a 6 second bumper must be 6 seconds or shorter, so cut at 5.9 if you want margin against rounding. Check the result's duration_seconds field, which the docs list, before you upload.
Sume does not upload to YouTube for you in this flow. Google requires the video on YouTube first, so the upload step is yours.
Sources
Related posts
More in Use cases
- Google Ads video text assets: 40 and 35 characters, not in the cut
Google lists headlines at 2 lines of 40 characters and descriptions at 2 lines of 35. Keep that copy out of the render; use Sume captions only for speech.
- Google Ads video thumbnail: 1280x720 minimum, under 2 MB
Google lists custom video thumbnails at 16:9, 1280x720 minimum, JPG, GIF or PNG, under 2 MB. Pull a still from your cut with Sume's Video inspect frames.
- YouTube Shorts ad video specs: 6 to 60 seconds, 9:16 or 1:1
Google Ads lists Shorts ad video as 9:16 1080x1920 or 1:1 1080x1080, 6 to 60 s. DV360 says 5 s or longer. Make the clip with Sume's Videos API and a timeline.
- Google video experiment results: 70% directional, 95% conclusive
Google labels video experiment results directional at 70% confidence and conclusive at 95%. When to act on each, and how to line up Sume ad variants first.
Written by Sume