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.

5 min readSume
All posts

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.

Non-skippable in-stream lengths, read 2026-10-03
FormatLengthWhere it is defined
BumperUp to 6 secondsGoogle Ads
Standard non-skippable7 to 15 secondsGoogle Ads and DV360
30-second CTV16 to 30 secondsGoogle Ads
Instant deals in DV360Up to 60 secondsDV360

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

All Use cases posts

Written by Sume