Veo videos vanish after 2 days: copy to Cloud Storage and expire them

Google keeps Veo output on its server for 2 days. Copy each clip to your own bucket, then let a Cloud Storage lifecycle rule delete old copies on a schedule.

5 min readSume
All posts

Veo 3.1 videos are stored on Google's server for 2 days and then removed, so download each clip right away and keep your own copy. A Cloud Storage lifecycle rule with an age condition and a Delete action will then expire your copies after the number of days you choose.

What Google keeps and what Sume keeps

Google's Veo guide says generated videos are stored for 2 days, after which they are removed, and that extended videos have the same 2-day window. Sume's media inputs doc says Sume mirrors generated outputs into Sume-owned media URLs before it shows them in public results, and that integrations must store the Sume URL and not raw provider URLs. The docs do not state a retention period for those artifacts, so copy anything you must keep long term.

Retention facts for generated video (read 2026-10-05)
SystemWhat the docs sayYour action
Veo on Gemini APIStored 2 days, then removedDownload within hours
Sume artifactsMirrored to Sume-owned URLs, no retention period statedStore the Sume URL, copy what you must keep
Cloud Storage lifecycleRules act on age in daysSet Delete after N days
Lifecycle timingActions can lag, config changes can take up to 24 hoursDo not rely on exact minutes

The lifecycle rule

Google's lifecycle docs list conditions such as age (days since creation), matchesPrefix and matchesSuffix, and actions such as Delete and SetStorageClass. Delete makes objects soft-deleted by default, retained for seven days unless soft delete is off. Cloud Storage inspects objects regularly, so there can be a lag between a rule becoming true and the action.

import json

config = {
    "rule": [{
        "action": {"type": "Delete"},
        "condition": {"age": 30, "matchesPrefix": ["sume-clips/"]},
    }]
}
with open("lifecycle.json", "w") as f:
    json.dump(config, f, indent=2)
print("wrote lifecycle.json")
print("apply: gcloud storage buckets update gs://YOUR_BUCKET "
      "--lifecycle-file=lifecycle.json")

Why a prefix

Put clips you want to expire under one prefix, such as sume-clips/, and keep finals under another. The rule above only touches the first. Choose the age to fit your review cycle: if a client needs a month to approve, 30 days is a safe floor, and an age of 2 days would copy Google's window without any benefit.

Operational notes

These details come from Google's lifecycle page, and they matter because a deletion rule is hard to undo. A wrong prefix can remove files you meant to keep.

  • Name objects with the Sume job id, so a clip and its record can be matched.
  • Test the rule on a small prefix first, since lifecycle changes can take up to 24 hours to apply.
  • Remember that deleted objects stay soft-deleted for seven days by default.
  • Use a storage class change only for large files, because Class A operations cost money on small ones.

Download first, then archive

For Sume jobs, poll GET /v1/videos/{id} until completed, then fetch unsigned_urls[0] with your key and write it to your bucket. Record the job id and usage.cost beside the object, as in the Videos guide. That gives you a clip and its cost record in your own storage, on your own expiry schedule.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume