Isolation and encryption
Every record belongs to one tenant, and the database itself refuses one tenant’s rows to another (row-level security, enforced for the roles that serve requests, which cannot switch it off). Each tenant has its own data key (AES-256-GCM), itself encrypted under the platform’s master keys:- the documents and raw emails you send are encrypted with it before they reach storage;
- job requests and results, cached reads, stored model answers, webhook event payloads, corrections and email subjects are encrypted with it in the database;
- mailbox logins, integration credentials and webhook secrets are encrypted under the master keys.
Retention
Every tenant has a retention period,retention_days, set when the tenant is created. Jobs, their files and
the emails that fed them are erased automatically once they are older than it; a queued or running job is never
erased. null keeps everything until you delete it.
$ADMIN_KEY is a key with settings:manage; an owner’s or admin’s access token works too, as
Authorization: Bearer. To erase one job, or every job of one of your end users, at any time, see
Erasure.
Export
GET /v1/tenant/export (settings:manage) streams one ZIP of everything your tenant holds:
Never in it: API key hashes, mailbox and integration credentials, webhook and integration secrets, and the data
key. Cached reads and indexes are left out too: they are rebuilt from the inputs. Every export is recorded in the
audit log. The ZIP is streamed as it is written, so it has no
Content-Length; a large tenant’s export takes a
while.