Privacy by construction

An observability product.
Not a logging product.

Prompt content never leaves your process. We collect operational metadata only: tokens, latency, model, your tags. Everything else is rejected at the boundary.

What we never see

  • 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.

What we collect

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.

Defense in depth

  • 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.

Open source SDK

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.

Self-hosted option

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.