Snap Marketing API ai_content_source: the AI declaration on Media
Snap added an ai_content_source attribute to the Media entity in its Marketing API on August 28, 2026. What the changelog says, and how to record it.

Snap's Marketing API changelog adds an ai_content_source attribute to the Media entity. The August 28, 2026 entry says the Media entity was updated to include the new AI declaration attribute ai_content_source. The changelog does not list the allowed values, so this post gives the dates and the shape of a safe integration, not a value table.
Changelog entries
| Date | Entry |
|---|---|
| 2026-09-11 | Added a section in Ad Squad on sub_request_warnings, launching September 15 (not about ai_content_source) |
| 2026-08-28 | Updated the Media entity to include the new AI declaration attribute ai_content_source |
Record the declaration with the asset
Because the values are not on the changelog, read them from Snap's Media entity reference before sending anything. What you can do today is store, next to each ad asset, how it was made: generated, edited from real footage, or captured. The sketch refuses to build a media payload until that is known.
ALLOWED = {"generated", "edited", "captured"}
def media_record(name, origin):
if origin not in ALLOWED:
raise ValueError("origin must be one of %s" % sorted(ALLOWED))
return {"name": name, "origin": origin}
print(media_record("spring-teaser", "generated"))
# map origin -> Snap ai_content_source using the Media entity reference
Where Sume fits
Sume produces the creative; it does not call Snap. A job id from a Sume generation or edit gives you a durable record of how a file was made. Edits like video trim ($0.02 per job) or video captions ($0.20 per clip up to 60 seconds) return new MP4s, so store the origin per file you upload, not per campaign.
Pre-launch checklist
Before the first ad goes out, open the Media entity reference and note the allowed values for ai_content_source. Add a test that fails when an asset has no recorded origin. Keep the origin on the asset, not the campaign, because one campaign can mix generated and captured files. When the same file is reused across ad squads, the declaration should travel with it. Finally, log the Sume job id that produced each file, so a review question can be answered from your own records.
Limits
The changelog gives no definition of what counts as AI content for Snap, and it has a single entry for the attribute. Treat the attribute as required reading in the reference before launch. Snap's own organic-content stance is covered separately in Spotlight and wholly AI-generated videos.
Sources
Related posts
More in Integrations
- Snapchat Ads API: set ai_content_source USER_AI_GEN on an AI video
Snap's create-media call has an optional ai_content_source field: USER_AI_GEN or SNAP_AI_GENERATED. Set it when you upload a Sume clip, then wait for READY.
- Snapchat Top Snap video: 1080x1920, 32 MB, or 1 GB in 32 chunks
Snap's media API takes 1080x1920 mp4 or mov from 3 to 1800 seconds, 32 MB in one call or up to 1 GB in 32 parts. Check a Sume clip against it first.
- Snapchat Spotlight API: SUBMITTED, LIVE or REJECTED, 160-char caption
A Spotlight post through Snap's Public Profile API returns SUBMITTED, LIVE or REJECTED and takes a 160-character description with a locale. Prep it with Sume.
- Snapchat MEDIA_EXPIRED: Story media dies 24 hours after creation
Snap Public Profile Story media objects expire 24 hours after creation, which causes MEDIA_EXPIRED. Generate with Sume, then upload and post in one run.
Written by Sume