Who Controls Retention?
Request Payloads
fal keeps request inputs and outputs (JSON) for 90 days by default to power request history. Callers can sendX-Fal-Store-IO: 0 to disable this storage for a request. They can also ask their fal account team to disable it by default for the account. Explicit per-request headers take precedence over the account default. fal handles this setting, so your app code does not need to change. See Model API Data Retention & Storage for details.
Content-Bearing Logs
fal keeps your app’sstdout and stderr output for 30 days, including print() calls, Python logging, and error tracebacks. For ZDR workloads, make sure your code and its dependencies do not log prompts, inputs, or outputs. Check exception messages and debug output as well as intentional application logs.
Application logs are owner-only. Non-owner callers receive no request logs, even for requests they submitted. This access restriction does not disable log capture or delete stored logs. Neither private_logs nor the account’s Log Privacy setting is a retention control.
See Logging for how logs are captured and exposed.
Persistent Storage
Files written to the shared/data volume persist across requests, runner restarts, and deployments until you delete them. As the app owner, manage which files are written and when they are removed. Runner shutdown does not delete these files.
KVStore values expire after at most 30 days, which is also the default. To remove values sooner, set a shorter ttl or delete them explicitly.
For ZDR workloads, keep customer content out of both /data and KVStore, including caches and intermediate files. If your app uses an external database or object store, manage that store’s retention separately.
Uploaded and Generated Media
Return generated files through toolkit types such asfal.toolkit.Image and fal.toolkit.File to apply the caller’s X-Fal-Object-Lifecycle-Preference, including expiration settings and initial_acl, to CDN uploads. See Controlling Access to Returned Files for implementation patterns. If your app enforces its own output ACL, preserve the caller’s expiration settings as shown there.
fal passes X-Fal-CDN-Token to your runner for CDN downloads and uploads on behalf of the API caller. Toolkit uploads use the caller’s CDN token automatically, so generated files belong to the caller. For custom uploads, see ACLs Inside a Serverless App.
Streaming bytes directly to the caller does not upload them to the CDN. Files that your streaming code uploads, for example through toolkit types, are still stored on the CDN under the normal CDN retention settings.
Operational Metadata
Disabling request-history payload storage does not disable operational metadata, such as request IDs, endpoints, status, timestamps, billing, usage, and latency. These records are separate from the customer content in request payloads, logs, and files described above.Zero Data Retention (ZDR)
For Serverless workloads with ZDR requirements:- Have callers disable request-history storage, per request or through their account default.
- Avoid retaining customer content in application logs and persistent storage.
- Honor the caller’s CDN expiration and access preferences.