Vidu Q4 Preview result URLs last 24 hours: save the file the same day
Vidu says Q4 Preview output URLs stay valid for 24 hours. Copy the file the day you render it, and see what Sume documents about its job result URL.

Vidu's Q4 Preview API pages say the generated video URL is valid for 24 hours. After that the link is gone, so a pipeline that stores only the URL will lose clips the next day. The fix is the same for any provider: download the file as soon as the task completes and keep your own copy. Sume's video docs describe a content endpoint for each job, GET /v1/videos/{job_id}/content, but they do not state a retention period, so copy the file there too instead of assuming the link is permanent.
What each side documents
On Vidu's image-to-video page, the response carries a video URL with 24-hour validity, a cover image and a watermarked version, and results are fetched with GET https://api.vidu.com/ent/v2/tasks/{id}/creations. The reference-to-video page repeats the 24 hours.
Sume's video guide says that once a job is completed, unsigned_urls holds the download URLs and the content endpoint serves the file with ?index=0. A failed job answers the content endpoint with 409 job_failed and retryable: false; a job that is still running answers 409 job_not_completed, which is retryable.
| Item | Vidu Q4 Preview | Sume /v1/videos |
|---|---|---|
| Where the file is | URL in the task creations response | unsigned_urls[0] or GET /v1/videos/{id}/content |
| Stated validity | 24 hours | Not stated in the video docs |
| Other outputs | Cover image, watermarked copy | Not documented for video |
| Completion signal | Callback or polling | Polling or a signed callback_url |
| Retry-safe submit | Not documented on the pages read | Idempotency-Key header |
A same-day download step
Add the copy as the last step of your poll loop, before you mark a job done in your own system. If the copy fails, leave the job open so the next run retries while the link is still live.
Steps:
- Poll until the status is
completed. - Stream the file to your own object storage, and verify the byte count is non-zero.
- Store your storage key, not the provider URL, in your database.
- Only then mark the shot as delivered.
import os
import requests
KEY = os.environ["SUME_API_KEY"]
H = {"Authorization": f"Bearer {KEY}"}
def save(job_id: str, path: str) -> int:
r = requests.get(
f"https://api.sume.com/v1/videos/{job_id}/content",
headers=H, params={"index": 0}, stream=True, timeout=120,
)
r.raise_for_status()
size = 0
with open(path, "wb") as f:
for chunk in r.iter_content(1 << 20):
f.write(chunk)
size += len(chunk)
if size == 0:
raise RuntimeError("empty download")
return sizeFailure modes to plan for
Three things go wrong in practice. The first is a nightly batch that submits jobs at the end of a working day and downloads them the next afternoon, after the window has closed. The second is a worker that crashes between completion and download, so the task is done on the provider side but nothing was saved. The third is a retry that re-submits a job it already paid for.
Guard against all three. Run the download inside the same loop that polls, make the download idempotent by keying on the job id, and on Sume send an Idempotency-Key with every submit so a replay returns the original job instead of creating and billing a new one. Log the job id with the storage key so you can match them later.
What Sume does not do
Sume does not list a Vidu Q4 model, so none of this changes what you call there. It also does not promise a retention window for completed video files in the docs we read, which is why the download step matters on both platforms. Rendering is billed when the job completes, so a lost link means paying again to regenerate.
Sources
Related posts
More in Developers
- Vidu Q4 Preview has a seed field; Sume video models reject seed
Vidu Q4 Preview image-to-video takes a custom seed. Sume video models report seed false and return 400 unsupported_parameter if you send one.
- Vidu @subject tags vs Sume Omni <IMAGE_REF_0> reference tokens
Vidu Q4 reference prompts use @[subject_name]. On Sume only Gemini Omni Flash 1.1 documents prompt tokens: <IMAGE_REF_0>, <VIDEO_REF_0>.
- Wait for an avatar video in one request? Sume sync stops at 30 s
Sume sync and subscribe modes are the same bounded wait of at most 30 seconds. For avatar videos use async with polling or a webhook, not a long HTTP hold.
- Wan 3.0 draft and final need different Idempotency-Keys (409)
Reusing one Idempotency-Key for a 480p draft and a 1080p final of the same prompt returns 409 idempotency_conflict. A Python key builder that avoids it.
Written by Sume