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.

A Spotlight created with Snap's Public Profile API reports one of three states: SUBMITTED, LIVE or REJECTED. You send a description of up to 160 characters, hashtags included, plus a locale such as en_US, and you get a spotlight_id back when the post is accepted. Treat SUBMITTED as not live yet and poll until it moves.
What are the Spotlight request fields?
The Profile Asset Management page lists MP4 video of 6 to 60 seconds at at least 540x960, a description up to 160 characters that can include hashtags, and a required locale. The endpoint is POST https://businessapi.snapchat.com/v1/public_profiles/{profile_id}/spotlights. The upload steps are shared with other assets: media is encrypted with AES-256-CBC, files larger than 32 MB are split into chunks, the maximum file size is 1 GB, and chunks use an ADD action with a FINALIZE action to complete.
| Item | Value |
|---|---|
| Video | MP4, 6 to 60 seconds, at least 540x960 |
| Description | Up to 160 characters, hashtags allowed |
| Locale | Required, for example en_US |
| Chunking | Files above 32 MB are split; 1 GB maximum |
| Status values | SUBMITTED, LIVE, REJECTED |
How do you write the description from an avatar script?
Do not copy the spoken script into the description. Write it as its own 160-character field and count the characters, hashtags and spaces together. If an agent drafts it, validate the length in code before posting, because a description over the limit is an avoidable failure.
A one-line check keeps this honest.
import asyncio
async def main():
desc = "Three tips for a calmer morning routine #wellness #tips"
assert len(desc) <= 160, len(desc)
print(len(desc), "characters ok")
asyncio.run(main())What does REJECTED mean for an avatar clip?
The page gives the state names but, in the part I read, not rejection reasons, so I cannot tell you why a clip was rejected. Do not guess. Check the clip against the listed constraints first: duration of 6 seconds or more, resolution of 540x960 or more, MP4.
Sume avatar clips are 720p and default to 9:16, which meets the resolution, and the planned length is 4 to 60 seconds, so only a 4 to 5 second clip fails the duration rule. If you need to change one line of a script, the avatar docs show a preview stage so you can check the first frame before a full render.
Honest limits
Sume does not post to Snapchat for you, and I did not find a Sume feature that predicts Spotlight acceptance. Snap has separate guidance on AI-generated Spotlight content, which the earlier post on wholly AI-generated Spotlight videos covers.
Sources
Related posts
More in Integrations
- 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.
- Supabase Edge Function 504 at 150 s idle: Sume sync stays under it
A Supabase Edge Function that sends no response in 150 seconds returns 504. Sume sync waits at most 30 seconds: a bounded wait, then poll.
- Supabase Queues visibility timeout as a Sume job poller
Supabase Queues (pgmq) hide a read message for a visibility timeout, which fits polling a Sume job: read, check status, archive on terminal, else it reappears.
- TikTok max_video_post_duration_sec: trim before Direct Post
TikTok's creator_info endpoint returns max_video_post_duration_sec, a per-creator limit. Read it first, then cut the clip to fit with Sume video trim.
Written by Sume