Each API key is stored as an HMAC-SHA256 hash, keyed with a secret held outside the database, and looked up by that hash alone. Raw keys are never stored. Existing keys keep working; there is nothing to change.
Every identifier the PII rule detects is listed in the docs and the rule editor, and each match is confirmed before it counts.
Security
Rule changes are checked against your app
Turning a rule on or off, editing, saving and deleting it on the dashboard act only on rules of the app you are viewing, which is checked against your account.
Payload encryption at rest covers every stored event
Prompts, responses, tool calls and error text are encrypted before they are written. If encryption is unavailable, the event is not stored: the API answers 503 encryption_unavailable, and the same event can be sent again with its event_id. The SDKs retry once on their own.
Connections require TLS 1.2 or later
The site and the API refuse TLS 1.0 and 1.1 and use TLS 1.3 wherever the client supports it.
Error reports exclude request headers that carry credentials: authorization, cookie, your SignalVault key, the provider key sent on proxy requests, and the Stripe webhook signature. This applies to every route.
Request bodies stay out of error reports
Request bodies are not attached to error reports for API, proxy and webhook requests, so prompts stay out of them. On dashboard pages, form fields that hold a secret and single-use links are masked.
Key-shaped text is masked
Anything shaped like an API key, bearer token or webhook secret is masked in the text of an error report before it is sent.
Tool-call guardrails now run on streaming responses, which is how most chat interfaces work.
Security
Payloads encrypted at rest across every decision
Prompt and response payloads are encrypted at rest across every decision — allowed, flagged, redacted and blocked. Error text captured from providers is encrypted as well.
Rules engine and request limits
Regular expressions in the rules engine run with bounds against pathological input, request body sizes are capped on ingest and on the proxy, and dependencies are checked against published advisories on every change.
Rate limiting on authentication
Repeated sign-in and password-reset attempts are rate limited.