What is kept, and for how long
A lapsed context stops working the moment its status flips, and a predict against it raises
fitted_context_expired. Its artifact bytes sit under a contexts/ key, which the staging
purge refuses by design and the 1-day staging lifecycle rule does not cover.
Uploaded rows
The uploaded payload is deleted the moment a job reaches a terminal state, and failure is a terminal state. A job that dies withworker_oom purges its rows exactly as a successful one
does.
Two backstops sit behind that, for the case where a job never becomes terminal at all:
- A 4-hour expiry on the staged payload, swept every 15 minutes.
- A 1-day lifecycle rule on the storage bucket, which removes the bytes either way.
Scored predictions are kept for one hour
Predictions are output derived from your rows. They are retained for one hour after the job completes, so that the SDK can read them back. A result over 512 KiB goes to object storage and comes back as a presigned URL. That object is removed by the 1-day lifecycle rule, not by the one-hour sweep. Reading a result after the hour raisestraining_ref_expired. The job record survives; the
data behind it does not.
What is kept indefinitely
“Only hashes and counts” is not exact enough. The jobs ledger is never purged, and each row holds:- Column names — the target column on every job, and the feature column names on every fitted context.
- Counts — rows and columns per job.
- Job metadata — task, engine version, duration, status, and the content hash of the input.
- The full error envelope of a failed job, including its
problemandcausestrings.
Encryption
In transit, uploads and API calls are HTTPS. At rest, the buckets are configured with provider-managed AES-256 default encryption and block all public access. Both are provisioning-time bucket settings, not something the request path applies per object, and neither is visible in the console. Customer-managed keys are not built. There is no client-side or envelope encryption anywhere in the production path — the SDK uploads gzipped JSON to a presigned URL.The weights are frozen
No gradient update ever runs on anything you send. The model was pretrained once, before your data existed, and nothing you upload changes a weight. Your table is read as context while the job runs, then purged with the rest of the payload. How Hollerith works covers why that is the whole mechanism.What is not built
- Self-hosted or in-VPC deployment. Hollerith runs in our infrastructure only.
- Customer-managed encryption keys.
- Deleting a fitted context on demand. No endpoint exists. A context expires 7 days after the fit that created it and cannot be removed sooner.
Next
- Authentication — key scope, rotation, and revocation
- Usage and billing — what the retained counts are used for
- The fitted context — the 7-day artifact and its expiry