# Security and privacy

## What Veqen never sees

Prompts, responses, documents, embeddings and tool outputs. The SDKs read the usage block of each response, the model name and service tier, and, for speech, the length of the input text; nothing else is sent. The API has no field meant for content, and free-form tags shouldn't carry any: use your internal ids.

## What Veqen stores

Per call: provider, model, token counts, batch and service tier, residency, price and price-book version, your tags, latency and status. Per organization: members and roles, budgets, credits, daily provider costs, daily Stripe revenue per customer, and approved close snapshots. Per person: name, email and the time of last sign-in.

Tags are stored as you send them. Use your internal ids rather than emails or names.

## Credentials

| Secret | How it's kept |
|---|---|
| Veqen API keys | Only an HMAC of the secret; shown once at creation |
| OpenAI and Anthropic admin keys, the Stripe restricted key, Slack and webhook secrets | Encrypted at rest (AES via Fernet, key derived from a server secret), used only to read costs or deliver alerts |
| Sign-in | Delegated to WorkOS; Veqen stores no passwords |
| OAuth tokens for MCP clients | Only hashes; refresh tokens rotate, and reuse revokes the whole session |

Webhook and Slack destinations must be public HTTPS addresses; Veqen checks this when you save them and again before each delivery.

## Hosting

Veqen runs in Microsoft Azure in the United States: containers and a managed PostgreSQL database with encryption at rest. Every connection to the site, the API and the database uses TLS. Database backups are kept for 14 days, and operational logs for 90 days.

Every page is served with a strict Content Security Policy (scripts from Veqen only, no framing), HSTS, `nosniff` and a strict referrer policy. Dashboard pages are never cached.

## The AI analyst and draft assistant

Both are optional and only for signed-in members. When they're turned on, the analyst sends your question and the ledger figures it looks up for your organization to a language model hosted on Microsoft Azure (Azure OpenAI), and the What-if draft assistant sends the workload description you type. Azure OpenAI doesn't use this data to train models. Nothing else from your ledger is sent, and the public site never calls a model.

## Your controls

- Export your data any time with `/v1/export.csv` or the dashboard.
- Owners can delete the organization from Settings once any paid subscription is cancelled; everything recorded for it is deleted at once.
- Calls and rollups follow your plan's history; see [Plans and limits](/docs/plans#retention) for what is kept longer.

Report a vulnerability to support@veqen-app.com. See also the [privacy policy](/legal/privacy).
