LinkedIn video ad: cut a 3-second bumper from a longer video
LinkedIn's Videos API takes MP4 from 3 seconds to 30 minutes. Cut a 3-second bumper from a finished video with POST /v1/video-trim, $0.02 a job.

LinkedIn's Videos API page lists video files from three seconds to 30 minutes, 75kb to 500MB, in MP4 (read 2026-10-06). To make a 3-second bumper from a finished video, call POST /v1/video-trim with start and duration: 3. The trim returns a new MP4 and leaves the source alone; one job is $0.02 at the public rate on Sume's video trim page.
Sources: LinkedIn Videos API, Microsoft Learn (read 2026-10-06) for the file limits, Video trim: cut a range from one Sume-hosted clip for Sume. That page is the Videos API reference, not an ad-format spec, and it points to LinkedIn's separate Video Ads Advertising Specifications help page; check that page before you build a bumper for a specific ad format.
What counts as a good 3 seconds?
Three seconds is one idea: a logo and a line, one product shot with a price, or the single best reaction from a longer clip. Pick the moment by looking at stills, not by guessing a timestamp. POST /v1/video-frames pulls up to 24 frames at times you name, from a source up to 300 seconds, so you can choose the moment first and cut second. See Video frames: stills at times you name.
The cut
Trim requires start and exactly one of end or duration. For exactness leave precision at its default, exact, a frame-accurate re-encode. keyframe is a stream copy and can start a GOP early, which at 3 seconds is a visible error. output can conform width, height and fps on an exact cut. The clip must already be on media.sume.com; trim does not fetch other hosts.
import json, os, urllib.request
body = {
"video_url": "https://media.sume.com/artifacts/artf_demo/webinar-clip.mp4",
"start": 41.2,
"duration": 3,
"precision": "exact",
}
req = urllib.request.Request(
"https://api.sume.com/v1/video-trim",
data=json.dumps(body).encode(),
headers={"Authorization": "Bearer " + os.environ["SUME_API_KEY"],
"Content-Type": "application/json",
"Idempotency-Key": "linkedin-bumper-001"},
)
with urllib.request.urlopen(req) as r:
print(json.load(r))
Check the result against the file limits
When the job reaches result_ready, GET /v1/jobs/{id}/result returns video_url, duration_seconds and actual_start_seconds. A 3-second MP4 is far under the 500MB ceiling, but 75kb is a floor too, so a very small, very low-motion clip is worth a size check. If the result carries a trim_clamped_to_source warning, your range ran past the end of the source.
| Item | LinkedIn Videos API page | Sume trim |
|---|---|---|
| Length | 3 seconds to 30 minutes | Output 0.2 to 900 s; source up to 1,800 s |
| File size | 75kb to 500MB | Check the result file |
| Format | MP4 | MP4 output |
| Captions | One English caption file per video | Separate $0.20 caption job |
| Cost | Not stated | $0.02 per job |
A note on the surrounding changes
The same page says Marketing version 202510 sunsets on 2026-10-15, so if your upload code pins that version, move it. The stored post on the 202510 sunset covers what to change.
Sources
Related posts
More in Use cases
- LinkedIn video ad file check in Python before initializeUpload
Check an MP4 against LinkedIn's Videos API range of 75kb to 500MB before you call initializeUpload, and print the fileSizeBytes the request needs.
- LinkedIn video ad thumbnail: pick a still with video frames
LinkedIn's initializeUpload takes an optional thumbnail. Pull up to 24 candidate stills from your MP4 with POST /v1/video-frames and pick one.
- Live-commerce clip webhook: verify the Sume signature in Python
Verify a Sume webhook in Python: HMAC SHA256 over timestamp.raw_body, any sume-v1 entry, a 300-second window, and reject an empty secret.
- Only 12 left badge over a product clip: compose overlay, $0.02
A low-stock badge on a product clip is $0.02 per variant with Sume compose overlay. Set position, width_ratio and margin_ratio; re-render as stock drops.
Written by Sume