Workspace isolation
Every record belongs to exactly one workspace, and all data access is scoped to your active workspace on the server. Data is never shared across workspaces, and switching workspaces re-scopes the entire app. The active workspace is determined server-side from your session (or, for an API key, from the key’s workspace) — it is never taken from anything the browser supplies.Authentication
Sessions are cookie-based and the session cookie is HTTP-only, so it is never exposed to client-side scripts. Passwords are hashed with Argon2id. API keys, invitation tokens and password-reset tokens are stored only as hashes. Session cookies are signed, so a stored session record alone cannot sign anyone in.Credentials you configure
API keys are stored only as hashes and are shown once, at creation. Model-provider credentials, custom-API connector secrets, webhook secrets and integration tokens are encrypted at rest (AES-256-GCM) and never shown back in plaintext.Product analytics
Enrik uses product analytics from PostHog, in its EU region. The web app records page views, product events and errors with your user ID and workspace ID; page addresses are reduced to the screen’s route, without record IDs. The server records usage and error events with your workspace ID. Every event property passes a default-deny allow-list: no emails, prompts, message bodies, request payloads, API keys or secrets. Click autocapture and session recording are off, and there is no survey, feedback or chat widget. There is no setting to turn analytics off yet.Signed outbound webhooks
Enrik sends two kinds of signed request to a webhook destination, and each has its own header. Both are signed with the destination’s signing secret, which it gets when you create it. The secret is shown once, at creation; Rotate signing secret replaces it and shows the new one.
Both headers have the form:
- Compute an HMAC-SHA256 over the string
`${t}.${rawBody}`using your destination’s signing secret — over the exact raw bytes as received, before any JSON re-serialization — and hex-encode it. - Compare it to the
v1value using a constant-time comparison. - Reject requests whose
ttimestamp is outside a freshness window, such as 5 minutes, to prevent replay.
Export deliveries
Each export delivery carriesX-CRM-Signature. A delivery that fails with a timeout, a network error
or a 5xx answer is retried up to two more times within about 30 seconds; a 4xx answer is not
retried. Retries carry the same t and signature.
Webhook events
Each event carriesX-Enrik-Signature, with a fresh t on every attempt, so a retry hours later still
verifies; the body bytes never change. A failed attempt is retried for up to 8 attempts over about 45
hours, and a delivery is attempted for at most 72 hours. See
Receive webhook events. Only a workspace owner or admin can subscribe a
destination to events, or change the address, credentials, headers or signing secret of a destination
that has an event subscription.
Beta limitations. Security hardening continues throughout the private beta. To report a
security concern, email support@enrik.ai — please do not post details
publicly.