Sume asset download URL: 300 seconds and the 409 cases
GET /v1/assets/{id}/download-url returns a signed GET link that expires in 300 seconds by default, and 409s for registered URLs or assets not yet ready.

GET /v1/assets/{id}/download-url gives you a short-lived signed GET link for an asset you uploaded to Sume. The link expires 300 seconds after it is issued unless the deployment overrides it, the response carries the exact expires_at, and the call answers 409 with asset_not_downloadable or asset_not_ready when the asset cannot be served that way. These routes are implemented but hidden from the public OpenAPI document, so treat them as a working surface rather than a documented contract; for generation inputs Sume's docs still prefer public HTTPS media URLs.
The behaviour below is from the route code on Sume's main branch, read 2026-10-11.
What does the response look like?
On success the body is { "data": { "asset": ..., "download": { "url", "method", "expires_at" } } }. method is always GET, so the URL needs no extra headers. The asset object is the same public shape the list and detail calls return, so you can check size_bytes and checksum_sha256 against the file you download.
A different asset id, or one from another workspace, is a 404. A Studio Agent turn credential can only read assets stamped for its own thread.
When does it return 409?
Two checks run after the asset is found, in this order. First, the asset must be a first-party upload with a storage key. An asset created by registering a remote URL has neither, and gets asset_not_downloadable with the message that only first-party uploaded assets can receive Sume download URLs. Sume does not proxy the remote file for you.
Second, the asset's status must be ready. An upload that is still pending_upload, or one that failed, gets asset_not_ready. Both errors include the asset's current status in their details, so a client can tell a pending upload from a failed one without a second call.
| Asset state | HTTP | Code |
|---|---|---|
| Unknown id or another workspace | 404 | not found |
| Registered from a remote URL | 409 | asset_not_downloadable |
| Upload, status pending_upload or failed | 409 | asset_not_ready |
| Upload, status ready | 200 | signed GET URL |
How should a client use the link?
Ask for the URL right before you need it and download immediately; do not store it. Five minutes is plenty for a normal fetch, and requesting a new link for a ready asset is cheap and repeatable.
The permanent url field on a completed asset is the Sume media address set when the upload was completed. The download-url call is the signed alternative for fetching the bytes with a link that stops working.
curl -s "https://api.sume.com/v1/assets/$ASSET_ID/download-url" \
-H "Authorization: Bearer $SUME_API_KEY" \
| jq -r '.data.download.url' \
| xargs curl -sSfL -o clip.mp4Why not just register a URL and download it back?
Registering with POST /v1/assets stores metadata only. It does not fetch, mirror or validate the media, and its status is registered, which is not generation-ready. Use the upload flow when you need Sume to hold the bytes, and public HTTPS URLs in generation requests when you do not.
Sources
Related posts
More in Developers
- An uploaded Sume asset you never complete: what happens
A pending_upload asset has a 15-minute URL by default. After the window and a one-hour grace, a reaper deletes the object and marks the row failed.
- Sume generation_capacity_exhausted: the 503, job reason and flag
Sume reports provider capacity three ways: HTTP 503 provider_capacity_exceeded, a job reason generation_capacity_exhausted, and a sync flag. All three retry.
- Sume job failed artifact_too_large: shrink the output, don't rerun
A Sume job failing with artifact_too_large or artifact_upload_rejected made its file but could not store it. Make the file smaller; rerunning changes nothing.
- Sume job failed worker_job_stalled or worker_lease_expired: what now
A Sume job stuck in processing can end as worker_job_stalled or worker_lease_expired. Both are terminal job.failed events with the hold refunded. Resubmit.
Written by Sume