Skippable in-stream bills at 30 seconds: cut a 30-second version
Google bills skippable in-stream per view at 30 seconds watched, or full length if shorter. Cut a 30-second version of a long master with video-trim.

A skippable in-stream ad has no maximum length, but the bill has a 30-second hinge. Google's video specs page says skippable in-stream uses CPV bidding, where you pay when a viewer watches 30 seconds, or the whole video if it is shorter than 30 seconds, or interacts with it (read 2026-10-07). A 30-second version of your master means the view is complete at the point you pay for it.
Sume's video-trim makes that version for $0.02 and leaves the long master untouched.
The lengths and billing on Google's page
From Google Ads video ad specs.
| Format | Length on the page | Billing on the page |
|---|---|---|
| Skippable in-stream | no max (under 3 minutes recommended) | CPV: 30 s watched, or full length if shorter, or interaction |
| Non-skippable in-stream | 15-60 s depending on campaign subtype | Target CPM (impressions) |
| Bumper | 6 s (5 s minimum) | Target CPM (impressions) |
| YouTube Shorts ads | under 60 s recommended | Target CPM, or TrueView views |
Decide with the hinge
A view is paid at 30 seconds or on interaction, so a 3-minute ad and a 30-second ad pay on the same event. The difference is what the viewer sees by then. If the first 30 seconds of the long master carry the offer and a clean ending, cut at a natural stop; if the story needs two minutes, keep the long one and accept that the pay point lands mid-story.
I am not claiming either choice costs less or converts better. The page defines the trigger, and nothing else.
Cut the 30-second version
Video trim takes a clip hosted on media.sume.com, start, and one of end or duration. The source can be up to 1800 seconds, so a 3-minute master is no problem. The script builds the body and refuses nonsense before you spend a call.
import json
def trim_body(url, start, seconds, master_seconds):
if start < 0 or start + seconds > master_seconds:
raise ValueError("range outside the master")
return {"video_url": url, "start": start, "duration": seconds}
body = trim_body("https://media.sume.com/artifacts/artf_demo/master-180s.mp4", 0, 30, 180)
print(json.dumps(body))Check the result
Poll the job as described in Jobs and results, then use video inspect to confirm duration_seconds is 30 or a little under. A trim that runs past the source end clamps and adds trim_clamped_to_source to warnings[], so read the warnings.
A cautionary note
Google's line concerns what triggers the charge. It says nothing about how well each length performs, and I have no numbers. Test the two cuts against each other in your own account rather than assuming the shorter one wins.
Also keep the first five seconds in mind for skippable formats: the viewer can skip early, so the opening matters more than the length. A related post covers sampling those first frames with video-inspect.
Sources
Related posts
More in Media tools
- A small 540x960 draft of a Short for quick feedback: output size
Render a lighter 540x960 draft of a Short with Timeline 1.0 output width and height. The size is free to choose; the price per minute is the same.
- Split a 9-minute recording into three Reels under 3 minutes
Instagram's Reels page says Reels over 3 minutes won't be recommended to new audiences. Find sentence ends with video-inspect STT, then cut with video-trim.
- Sume TTS output: mp3, wav or raw, picked by the next step
Sume TTS defaults to mp3 at 44.1 kHz and 128 kbps; wav and raw cover editing and slicing. Pick the container, rate and encoding by what you do next.
- Sume TTS word timestamps and sentence slices: the 70 ms boundary rule
Ask Sume TTS for timestamps.words and segmentation.mode sentence to get gapless sentence segments. The cut lands 70 ms after the last word unless you change it.
Written by Sume