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.

4 min readSume
All posts

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.

Output retention as stated by each vendor (read 2026-10-03)
VendorRetention statementSource page
Google Veo (Gemini API)Generated videos stored for 2 daysVeo guide
Higgsfield APIFiles stored for a minimum of 7 daysHiggsfield API blog
OpenAI Sora Batch APIOutputs 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

All Developers posts

Written by Sume