How 9thSense protects your data

Security Overview


9thSense is built for regulated industries — KYC, lending, insurance, and financial services — where document data is sensitive by definition. This page summarizes the security controls in place at the platform layer.

Authentication

API keys

Every API request must include an API key in the X-Api-Key header. Keys use a split-key format:

zk_<env>_<prefix>_<secret>
  • The prefix is stored in plaintext and used for key lookup.
  • The secret is hashed with bcrypt before storage. The raw secret is never stored.
  • No secret can be recovered from the database — compromised keys must be rotated, not retrieved.

Keys are created in Settings → API Keys in the dashboard and can be revoked at any time.

Scopes and RBAC

Every endpoint enforces a required scope. Keys are issued with only the scopes they need, from a 19-scope catalog: one :read scope per area (case:read, document:read, report:read, …) plus separate privileged scopes for changes (case:write, document:write, agent:run, tool:invoke, tenant:write, tenant:admin, …). See the scope table.

Key management itself is not a scope: only signed-in org admins (and members, for their own keys) can create, rotate or revoke keys. A member's request for a privileged scope needs an org admin's approval before the key works.

Requests with insufficient scope receive a 403 Forbidden response.

Rate limiting

Requests are rate-limited per tenant:

  • 200 requests per minute per tenant
  • Exceeding the limit returns a 429 Too Many Requests response with a Retry-After header

In the sandbox (test) environment, the direct tool endpoints are also capped separately, because their calls are free. Production (live) is not capped:

  • POST /v1/tools/invoke, POST /v2/tools/invoke, POST /v1/batch/jobs and POST /v1/pipeline/run together allow 10 requests per minute and 200 requests per rolling 24 hours per tenant
  • Documents processed inside a case (/v1/cases) are not counted against this cap

Encryption

In transit

All traffic to the 9thSense API is encrypted with TLS. Connections over plain HTTP are rejected.

At rest

All stored data — documents, extracted fields, case records, embeddings — is encrypted at rest using AES-256.

Audit logging

Every API operation is logged to an immutable audit trail, including:

  • Authenticated identity (API key prefix and tenant)
  • Endpoint, method, and timestamp
  • Success or failure status

Audit logs are available to administrators through the platform and are retained for compliance review.

Self-hosted AI

By default, 9thSense routes all AI inference — document analysis, classification, enrichment — through your self-hosted AI runtime. Document content never leaves your infrastructure for AI processing unless you explicitly enable cloud fallback.

Cloud AI fallback is opt-in per request via the allow_cloud flag on tool invocations. When disabled (the default), inference fails closed if the self-hosted runtime is unavailable, rather than silently routing to a cloud provider.

Multi-tenant isolation

All data is scoped to a tenant identifier at the storage and query layer. Cross-tenant data access is not possible through the API. Tenant identifiers are enforced server-side — a key issued for tenant A cannot access data belonging to tenant B.

Responsible disclosure

To report a security vulnerability, contact security@9thsense.ai. We respond to all reports within one business day.