Snapchat product-level video ads: one video per product, 1080x1920
Snap product-level video for Dynamic Product Ads: one video per product, 1080x1920 minimum, 3 to 180 s, 1 GB, with an image fallback. Make the clips with Sume.

Snap's product-level video ads (PLV) let a Dynamic Product Ad play a video from your product feed instead of a still. The feed holds one video per product, the video must be at least 1080 x 1920, 3 to 180 seconds, MP4 or MOV in H.264, and 1 GB or less, and the Dynamic Template has to ask for it with preferred_video_tags and the AUTOMATIC layout.
This post follows Snap's Dynamic Product Ads - Video guide, read on 2026-10-03. For what a catalog normally supplies to Sponsored Snaps, see Snap DPA for Sponsored Snaps.
What does the video file have to be?
Snap lists one set of video file specifications for PLV. Note that the minimum is stated as dimensions, so a 720 x 1280 file, the size Snap's general ad specs list for Story, Collection and Commercial video, would fall short here.
| Spec | Value |
|---|---|
| Max file size | 1 GB |
| Minimum dimensions | 1080 wide, 1920 high |
| Duration | 3 to 180 seconds |
| Format | MP4 or MOV, H.264 encoded |
| Ratio served in the ad | 9:16, full-screen |
How does the catalog and template pick the video?
In the product feed, Snap adds columns video[0].url and video[0].tag[0]. A product can have one video, and that video can carry up to 20 tag columns (video[0].tag[0] through video[0].tag[19]). The catalog vertical must be COMMERCE; other verticals are not supported for PLV. The supported ad types are REMOTE_WEBPAGE, APP_INSTALL and DEEP_LINK.
On the Dynamic Template, preferred_video_tags is required, and layout must be AUTOMATIC. Snap says other layouts (FILL_WIDTH, FILL_HEIGHT, FIT and so on) will not surface a product video even if the tags match. You can add preferred_image_tags as a fallback, and at serving time Snap walks this order:
- If a video fails to ingest, the ad quietly serves a 1:1 image, so a bad file shows up as a different ad, not an error.
- Product Search returns the video as
video_mediawithurl,tags,internal_urlandinternal_url_status; use it to confirm ingest before you spend.
| Priority | Source | Media | Ratio |
|---|---|---|---|
| 1 | video[x].url matched by preferred_video_tags | Video | 9:16 |
| 2 | image[x].url matched by preferred_image_tags | Image | 1:1 |
| 3 | image_link, the main catalog image | Image | 1:1 |
How do I make one vertical clip per SKU with Sume?
Sume's Video Generation docs list seedance-2 with 4 to 15 second durations, 1080p, and 9:16 among its aspect ratios, and GET /v1/videos/models reports the live values. For /v1/videos, size returns 400 unsupported_parameter, so request resolution and aspect_ratio instead. Send one request per SKU with an Idempotency-Key that includes the SKU, so a replay returns the original job.
The docs name a resolution tier, not exact pixels or a codec, so do not assume the file meets Snap's 1080 x 1920 minimum or H.264 rule. Probe each finished file with ffprobe before you host it in the feed; re-encode if it falls short. Keep the clip short: Snap's range starts at 3 seconds, and a 4 to 8 second product loop is plenty for a tile.
import os, requests
H = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}",
"Content-Type": "application/json"}
skus = {
"A001": "Matte black charging cable coiled on a white desk, slow push-in",
"A002": "Canvas tote bag on a hook, soft daylight, gentle handheld sway",
}
for sku, prompt in skus.items():
r = requests.post("https://api.sume.com/v1/videos",
headers={**H, "Idempotency-Key": f"plv-{sku}-v1"},
json={"model": "seedance-2", "prompt": prompt,
"aspect_ratio": "9:16", "resolution": "1080p", "duration": 6})
j = r.json()
print(sku, r.status_code, j.get("id"), j.get("polling_url"))Before you switch the template
Keep preferred_image_tags in the template while you roll out, so any SKU whose clip fails ingest still serves a 1:1 image. Check Product Search for internal_url_status on a sample, then preview in Snap Ads Manager, where Snap lists preview as supported. If a clip is AI-generated, Snap's Marketing API has its own declaration field: see Snapchat Ads API: ai_content_source. This guide does not cover that field, so check it against Snap's current docs before you launch.
Sources
Related posts
More in Use cases
- Spain's AI bill and AI labels: in Congress, not law yet
Spain's AI governance bill reached Congress in June 2026 with fines up to 35 million euros. Is AI video labelling Spanish law yet, and what to check on a file?
- Spanish song lyrics from an AI music prompt: write it in Spanish
Google says Lyria lyrics follow the prompt language. For a Spanish track on Sume, write the prompt and lyrics in Spanish, then read the lyrics section map.
- A speaker withdrew voice consent: finding every narration that used it
Revocation is a clean-up job. Build a manifest of voice, model and job id for each narration, then regenerate with another voice and join audio on Sume.
- Splice an AI ending onto a Short and keep the original audio
Gemini Omni clips come with their own sound. To keep your Short's voice and music, detach both audio tracks and join them as audio parts in one Timeline render.
Written by Sume