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.

5 min readSume
All posts

If a Snapchat Story post returns MEDIA_EXPIRED, the media object you created is more than 24 hours old. Snap's Public Profile docs say the Story media object expires 24 hours after creation, so upload the finished clip and post the Story in the same run, and create a fresh media object when you retry a day later.

What does Snap say about the expiry?

On the Profile Asset Management page, the Stories section lists the video constraints (MP4, 5 to 60 seconds, at least 540x960) and states that the media object expires 24 hours after creation. The Story post endpoint is POST https://businessapi.snapchat.com/v1/public_profiles/{profile_id}/stories, and its result status is SUCCESS or ERROR. Two named error codes appear: MEDIA_EXPIRED and MEDIA_POSTING_ALREADY_IN_PROGRESS.

Story post errors (Snap Marketing API, read 2026-10-02)
Error codeLikely causeFix
MEDIA_EXPIREDMedia object older than 24 hoursCreate a new media object and post again
MEDIA_POSTING_ALREADY_IN_PROGRESSA post for that media is already runningWait for the first result instead of re-posting
ERROR statusPost failedRead the error detail and re-check the clip

Where does a Sume avatar job fit in the 24 hours?

The clock starts when you create the Snap media object, not when Sume renders the clip. Sume jobs queue first: the jobs docs call queued a normal accepted state, with workspace concurrency applied when workers move jobs into processing. So wait until the job is completed, then start the Snap upload.

A pipeline that creates the Snap media object first and renders the avatar clip afterwards can burn the 24 hours in a queue. Order matters: generate, probe, upload, post.

A safe order of operations

  • Submit the avatar video and keep the job id. Use an Idempotency-Key so a retry cannot create a second billed render.
  • Poll GET /v1/jobs/:id/status or use a webhook until completed, then read GET /v1/jobs/:id/result for the media.sume.com video URL.
  • Check duration and resolution (at least 540x960; Sume avatar output is 720p in the default 9:16).
  • Encrypt, upload and finalize the file on Snap's side, then post the Story immediately.
curl https://api.sume.com/v1/jobs/job_123/status \
  -H "Authorization: Bearer $SUME_API_KEY"

curl https://api.sume.com/v1/jobs/job_123/result \
  -H "Authorization: Bearer $SUME_API_KEY"

What if the post is late anyway?

Do not regenerate the avatar clip. Re-read the stored job result, and create a new Snap media object from the same file. Regeneration is billed again; a second upload is not a Sume cost. Also do not double-post while MEDIA_POSTING_ALREADY_IN_PROGRESS is showing, because that code means the first post has not finished.

Sume does not publish to Snapchat in the docs I read, so scheduling and retry timing live in your own code.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume