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.

6 min readSume
All posts

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.

Snap product-level video file specs (read 2026-10-03)
SpecValue
Max file size1 GB
Minimum dimensions1080 wide, 1920 high
Duration3 to 180 seconds
FormatMP4 or MOV, H.264 encoded
Ratio served in the ad9: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_media with url, tags, internal_url and internal_url_status; use it to confirm ingest before you spend.
Snap PLV serving fallback, in priority order (read 2026-10-03)
PrioritySourceMediaRatio
1video[x].url matched by preferred_video_tagsVideo9:16
2image[x].url matched by preferred_image_tagsImage1:1
3image_link, the main catalog imageImage1: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

All Use cases posts

Written by Sume