- Prompt content: request body sent to OpenAI/Anthropic stays inside your process.
- Completion text: model response is read locally for token counting and discarded.
- System prompts and tool arguments: same as above.
- Raw user identifiers: only SHA-256 hashes are accepted by our schema.
A strict allowlist of operational metadata: model name, provider, input/output/cache tokens, latency, time-to-first-token, your scopeveil_tag, hashed user ID, computed cost in USD, environment, timestamp. Anything outside this list is rejected by the schema (.strict() in Zod) at the ingestion API.
- SDK sanitize allowlist drops unknown fields client-side before transport.
- API schema strict rejects events containing any field outside the allowlist.
- Body limit on the ingest API to mitigate denial-of-service via oversized payloads.
- Per-organization rate limits enforced in Redis (token bucket).
- Bearer-token authentication with 7-day expiry; tokens stored as bcrypt hashes.
- API keys stored as bcrypt hashes; only a 12-char prefix is shown for identification.
- Multi-tenant global scope on Eloquent models: cross-tenant queries return empty.
The TypeScript SDK is published on GitHub ↗ under MIT license so anyone can audit exactly what it sends. Privacy guarantees are enforced by automated tests that fail the build if any prompt-shaped string makes it into the transport payload.
Enterprise customers can run the full stack inside their own VPC: Hono ingest, Node worker, Postgres, Laravel API, Nuxt frontend. Zero data ever leaves your infrastructure. Available on the Enterprise plan.