How long AI video vendors keep your file: Veo 2 days, Higgsfield 7+
Veo keeps videos two days, Higgsfield files at least seven, Sora Batch outputs were kept 24 hours. Retention facts and a download-on-complete script.

Vendors differ by orders of magnitude on how long a generated video stays downloadable: two days for Veo on the Gemini API, a minimum of seven days for files on Higgsfield, and 24 hours for Sora Batch API outputs. The safe rule is the same everywhere: download or copy the file when the job completes.
What each vendor states
Retention is a line in each vendor's docs, usually far from the pricing table. The values below are what each page stated on 2026-10-03.
| Vendor | Retention statement | Source page |
|---|---|---|
| Google Veo (Gemini API) | Generated videos stored for 2 days | Veo guide |
| Higgsfield API | Files stored for a minimum of 7 days | Higgsfield API blog |
| OpenAI Sora Batch API | Outputs kept 24 hours (historical, the Sora API shut down Sep 24, 2026) | Video generation guide |
Why the windows matter
Two of those three are windows you can miss in a normal week. A reviewer who is out on Monday can lose a Friday render on Veo. A batch queue that finishes overnight is a risk if nobody downloads before the window closes.
What Sume does with outputs
Sume mirrors generated outputs into Sume-owned media URLs and tells integrations to store the Sume URL rather than raw provider URLs. See the media inputs docs. The pages read here do not state a retention period for Sume artifacts, so copy the file to your own storage anyway if you have a retention rule of your own.
Copy on completion
A completion handler that copies the file the moment the job is done removes the window problem, whichever vendor serves the model. The poll response for a Sume video job carries unsigned_urls, and the content endpoint accepts your API key.
import os
import time
import requests
headers = {"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"}
def wait_and_save(polling_url: str, path: str, interval: int = 30) -> None:
while True:
job = requests.get(polling_url, headers=headers, timeout=30).json()
if job["status"] == "completed":
video = requests.get(job["unsigned_urls"][0], headers=headers, timeout=120)
video.raise_for_status()
with open(path, "wb") as f:
f.write(video.content)
return
if job["status"] in ("failed", "cancelled"):
raise RuntimeError(job.get("error", job["status"]))
time.sleep(interval)A retention policy for your own pipeline
Whatever the vendors do, decide what you keep. A short policy avoids both lost renders and unbounded storage. Keep the approved final and its job record for as long as the ad runs, plus a margin. Keep rejected takes for a few days to settle disputes about why one was chosen, then delete them.
The Sora Batch figure is historical, since the Sora API shut down on Sep 24, 2026. A pipeline that copies on completion does not depend on any of the windows above.
- Finals: keep with the job id, model id, and prompt.
- Rejected takes: keep briefly, then delete.
- Copy on completion, never on review day.
- Test a restore from your own storage once a quarter.
Add a webhook
Pair the copy with a webhook so nobody has to poll. The video docs describe callback_url for that, and the stored post on Veo's two-day storage covers the Google side in more detail.
Sources
Related posts
More in Developers
- How to get an AI video generation API key: Sume steps and gotchas
Create a workspace API key in the Sume dashboard, send it as one header, check it with GET /v1/me, and keep it on your server. Scopes are fixed at creation.
- Instagram Reels API: a 100-posts-per-24-hours publish budget
The Instagram content publishing API limits an account to 100 API-published posts per moving 24 hours. A tested Python queue that spreads batch output under it.
- Keep your Sora-style create_video() call: map it onto Sume
Sora's seconds, size and input_reference become duration, resolution plus aspect_ratio, and a first frame. Here is that map as a Python wrapper over Sume.
- Luma callback_url or polling: which Sume job mode matches
Luma's API docs list keyframes, loop and callback_url for ray-2. On Sume the equivalent choice is job mode: async, sync up to 30 s, subscribe or webhook.
Written by Sume