At a glance
Generated images and videos are copied into our storage so we can hand you a stable link, and that copy is
deleted automatically after 30 days. You can shorten that per request with store: false or
output_ttl_secs on images and videos, and delete a video yourself through the API. A scheduled lifetime is never
shorter than 24 hours, and a video can't be deleted by hand sooner than 24 hours after it was generated.
"store": false is kept 24 hours instead.Deletion applies to our copy only. It does not reach the model provider that generated the output, see what deletion does not cover.
Controlling how long a video is kept
Three controls. store and output_ttl_secs work on both POST /v1/videos and
POST /v1/images; deleting a finished video by id is videos only. Each needs an API key with the matching scope.
DELETE /v1/videos/{id}Permanently removes the stored file now. The job then answers 404."store": falseOn POST /v1/videos or POST /v1/images. The output is deleted 24 hours after the job completes (for an image, after the request returns) instead of after 30 days."output_ttl_secs": NOn POST /v1/videos or POST /v1/images. Deletes the output N seconds after the job completes. Integer, 86400 (24 hours) to 2592000 (30 days). Overrides store.Delete a video
curl -X DELETE https://videorouter.sh/v1/videos/$VIDEO_ID \
-H "Authorization: Bearer $VIDEOROUTER_API_KEY"
# 200
{
"id": "video_...",
"object": "video.deleted",
"deleted": true,
"files_deleted": 1
}
Deleting is permanent and cannot be undone. Calling it again, or fetching the video afterwards, returns
404. It only works on a video that has finished, and only once the video is 24 hours old.
Give a video a shorter lifetime
curl https://videorouter.sh/v1/videos \
-H "Authorization: Bearer $VIDEOROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "bytedance/seedance-2.0/fal",
"prompt": "A paper boat drifting down a rainy street",
"output_ttl_secs": 172800
}'
The timer starts when the job completes, not when you submit it. Once it has completed, the job
reports the deletion time as output_expires_at (Unix seconds):
{
"id": "video_...",
"status": "completed",
"data": [{ "url": "https://..." }],
"cost_usd": 0.42,
"output_expires_at": 1760745600
}
store: falsedoes not mean the output is never stored. A result has to be stored so we can deliver it to you, so it means the shortest lifetime we offer: 24 hours after completion.- A value of
output_ttl_secsbelow 24 hours is raised to 24 hours, not rejected. A value that is not an integer, or above 30 days, is a400. - "Completes" means the moment we first see the job finished, either on your poll or on our background check of unattended jobs. A job nobody polls still expires, at the latest on the 30-day default.
Why 24 hours?
A finished video or image has already been paid for upstream, so we do not let it be generated, viewed and removed within the same hour. Every way of deleting an output, whether by hand or by a requested lifetime, waits until it is 24 hours old.
What each call returns
DELETE on a finished video200 with "deleted": true.DELETE on a video that is still rendering409 job_in_progress. Retry once it has finished.DELETE on a video younger than 24 hours403 delete_not_allowed_yet, with retry_after_s in the error body.DELETE just after completion409 job_in_progress while the job is still being finalized. Retry in a minute.DELETE on an unknown, already deleted, or someone else's video404.DELETE with a key that lacks the video scope403 insufficient_scope.DELETE when storage fails502 storage_error. Nothing was removed, so it is safe to retry.GET /v1/videos/{id} after DELETE404.GET /v1/videos/{id} after the lifetime ran out410 output_expired. Distinct from 404 so you can tell expired from never existed.Webhooks are not sent for a job whose output was deleted before it finished.
Generated images
Images are kept for the same 30 days. Send "store": false (24 hours) or "output_ttl_secs"
(24 hours to 30 days) with the POST /v1/images request and the response reports output_expires_at.
There is no per-image delete call yet. To remove images by hand, open the request log, tick the image rows, and choose
Delete outputs. The same button handles videos, and skips any image or video generated in the last 24 hours.
Each image is billed when it is submitted, so deleting one never changes what you were charged.
Other files we hold
- Audio on
/v1/audio/*(speech-to-text input, text-to-speech, music and sound-effect output): kept 30 days for debugging, then deleted. Send"store": false(a form field on transcriptions) to keep it 24 hours instead. Like videos, it is never deleted sooner than 24 hours, and it is not skipped entirely: a copy has to exist briefly so we can look into a billing or quality dispute. - Image- and video-request input references:
kept 30 days for debugging, then deleted.
store: falseandoutput_ttl_secsapply to generated outputs only, not to these copies. - Reference files you upload for a generation call (the upload endpoint): the uploaded file is deleted after 30 minutes. Using it in an image or video request also leaves the 30-day debugging copy above.
- Assets you save in Studio (uploads, elements, voices), review attachments and community posts: kept until you delete them or delete your account.
The request log
Every request writes a log row: model, routing decision, token counts, cost, timing, status, and a copy of what you sent (the chat messages and reply, or the parameters and prompt of an image, video or audio request, with very long values truncated). It backs /logs and /usage, and is visible to your own account and to our staff for support, billing and safety review.
These rows are kept while your account is active and are not removed when you delete a generated output. We keep the prompt, settings and cost of a job for billing. There is no automatic expiry yet; email contact@zeus.rocks to have them erased. What a log row contains is covered on Data privacy & logging.
What deletion does not cover
- The model provider's copy. Your request is sent to whichever provider serves it, and none of them offers us a delete call. Whatever they hold follows their own terms, not ours.
- Links you already shared. Until the file is deleted, anyone with the link can open it, so treat output links as secrets. After deletion the link stops working.
- The request-log row, as above.
- Copies you downloaded. Those are yours to manage.
To delete everything tied to your account, including log rows, email contact@zeus.rocks. The full policy is on the Privacy Policy page.