Encryption & key handling
Secrets envelope-encrypted; bring your own AI key if you prefer.
Every secret AI Emaily holds on your behalf — OAuth tokens, IMAP passwords, BYOK keys — is envelope-encrypted and decrypted only in an isolated worker at the moment it’s needed. Nothing sensitive is stored inline, written to logs, or accessible to application code.
Encryption in transit and at rest
All traffic between your device and AI Emaily’s servers travels over TLS 1.2+ with modern cipher suites. Connections that fall back to older TLS versions are rejected at the load balancer.
Data at rest — message bodies, metadata, summaries — is encrypted using AES-256 at the storage layer. Object storage blobs (message bodies) carry an additional per-object encryption key managed by a KMS, so a compromised storage layer cannot yield plaintext without also compromising the KMS.
Envelope encryption for all credentials
Least-privilege everywhere
AI Emaily requests the minimum access needed for each mail provider. For OAuth providers like Gmail, Google Workspace, Outlook, and Microsoft 365 we request only read + send + folder management — never contacts export, drive access, or admin APIs — and every scope grant is surfaced in the connection UI. AI Emaily is CASA-certified for the Gmail scopes it uses. iCloud, Yahoo, Fastmail, and other IMAP providers connect with an app password you control and can revoke at any time.
Every database row, object storage blob, and function invocation carries an owner ID. Requests that don’t present a matching JWT are rejected at the data layer, not just the API layer. This object-level authorisation means a bug in the API routing cannot leak one user’s data to another.
Webhooks, CORS, and CSP
Inbound webhooks from Stripe, Gmail Push Notifications, and Microsoft Graph are validated with HMAC signatures before any payload is processed. Replayed or tampered webhooks are silently dropped and logged.
The web app ships with a strict Content Security Policy that blocks inline scripts, restricts fetch targets to our own domains and known API hosts, and disallows framing from third-party origins. CORS is configured per-route to allow only the production and staging origins.
Idempotency and safe retries
Every mutating API call — send, archive, label, delegate — accepts an idempotency key so that network retries can’t duplicate actions. This is especially important for send: if a connection drops after the server accepts the request, a retry with the same key is a no-op, not a duplicate send.
PCI compliance via Stripe
Frequently asked
Feature overview
AI Drafting
Ready to try it?
Start Free Trial