Customer-managed encryption keys
All content Syntic stores is encrypted at rest. With customer-managed encryption keys (CMEK), the key that protects your organization’s stored content lives in your cloud key management service, not Syntic’s. Syntic asks your KMS to use the key each time it needs to read or write your data, and you can see every use in your own cloud logs. If you disable or delete the key, Syntic can no longer read that data.
What CMEK covers
CMEK protects content that Syntic stores. It does not change how requests are processed in memory.
| Data | Protected by your key |
|---|---|
| Files | Yes |
| Batch inputs and results | Yes |
| Session events and transcripts | Yes |
| Execution traces | Yes |
| Memory stores | Yes |
| Vault secrets | Yes |
| Prompt cache | No: held briefly in memory |
| Usage records, billing, audit events | No: these hold no prompt or output content |
Chat completions requests are not stored, so they need no key (see Data retention).
Supported key services
| Provider | Key reference format |
|---|---|
| Google Cloud KMS | projects/<p>/locations/<l>/keyRings/<r>/cryptoKeys/<k> |
| AWS KMS | arn:aws:kms:<region>:<account>:key/<key-id> |
| Azure Key Vault | https://<vault>.vault.azure.net/keys/<name> |
Use a symmetric encryption key located in the same geography as the workspace’s data region.
Step-by-step setup for each service: Google Cloud KMS, AWS KMS, Azure Key Vault.
How it works
Syntic uses envelope encryption. Each stored object is encrypted with its own data key; data keys are encrypted (“wrapped”) by your key in your KMS. Syntic keeps only wrapped data keys. To read an object, Syntic asks your KMS to unwrap its data key, uses it in memory, and discards it. Unwrapped data keys are cached in memory for at most 5 minutes to keep latency low.
Set it up
Create a key in your KMS
Create a symmetric key dedicated to Syntic. Turn on automatic rotation if your policy requires it; Syntic handles rotated versions automatically.
Grant Syntic access
In the Console, open Settings → Security → Encryption and select Use my own key. The page shows the Syntic service identity for your cloud (a Google service account, an AWS account ID and role, or an Azure application). Grant it permission to encrypt and decrypt with your key and nothing else.
Register the key
Paste the key reference and select Verify. Syntic performs a test encrypt and decrypt. If it succeeds, the key becomes active for new data.
Re-encrypt existing data
Choose whether existing content should be re-encrypted under your key. Re-encryption runs in the background; progress is shown on the page and in the API.
With the Admin API:
PUT /v1/organizations/encryption_key with provider (gcp, aws or azure), key_ref, optional workspace_ids (default all) and reencrypt_existing (default true). Owner role only.
curl -sS -X PUT https://app.syntic.ai/v1/organizations/encryption_key \
-H "Authorization: Bearer $SYNTIC_ADMIN_KEY" \
-H "Content-Type: application/json" \
-H "syntic-beta: admin-2026-11-01" \
-d '{"provider": "gcp",
"key_ref": "projects/acme-sec/locations/europe-west3/keyRings/syntic/cryptoKeys/content",
"reencrypt_existing": true}'Response:
{
"type": "encryption_key",
"provider": "gcp",
"key_ref": "projects/acme-sec/locations/europe-west3/keyRings/syntic/cryptoKeys/content",
"status": "active",
"verified_at": "2026-11-05T10:00:00Z",
"reencryption": { "status": "running", "objects_total": 48211, "objects_done": 1200 }
}status is verifying, active, unreachable (Syntic cannot use the key right now) or revoked (access denied by your KMS). GET /v1/organizations/encryption_key returns the same object.
If the key becomes unavailable
When your KMS refuses or cannot be reached:
- Features that need to read or write protected content fail with
503 overloaded, codeencryption_key_unavailable(if unreachable), or403 permission, codeencryption_key_revoked(if access was denied). Chat completions keeps working because it stores nothing. - Owners are emailed and a
encryption_key.unavailableevent is sent to your webhooks. - Restoring access resumes normal operation; nothing is lost.
- Deleting the key in your KMS makes protected content permanently unreadable. Syntic cannot recover it. This can be used deliberately as crypto-shredding.
Limits
- One active key per organization, or one per workspace if you set
workspace_ids. - Each read of protected content may add a KMS call (cached for up to 5 minutes), which your cloud provider bills you for.
- Enterprise plans only.
Errors
| Status | type | code | When |
|---|---|---|---|
| 400 | invalid_request | invalid_key_ref | The reference is not in the provider’s format. |
| 400 | invalid_request | key_region_mismatch | The key is outside the workspace’s data region. |
| 403 | permission | key_access_denied | Verification failed: Syntic’s identity lacks encrypt or decrypt permission. |
| 403 | permission | encryption_key_revoked | Your KMS denied access after the key was active. |
| 503 | overloaded | encryption_key_unavailable | Your KMS could not be reached. |
Build notes for the platform team
- Extend the existing KMS helper to call customer keys through per-cloud adapters; keep the envelope format identical across providers.
- Store wrapped data keys next to each object; never persist unwrapped keys.
- Every unwrap is attributable in the customer’s KMS logs; add a request context string containing the object type and id.