Security & Compliance
How we protect customer data.
Authentication
- OIDC via Keycloak (production); HS256 dev login for local development
- JWT access tokens with refresh-token rotation
- API keys for programmatic access (hashed at rest, plaintext shown once)
- Role-based access control: admin, finance_lead, analyst, reviewer, auditor
Tenant isolation
- Every authenticated request asserts the tenant claim from the JWT
- X-Tenant-ID header mismatches return 403 — no impersonation
- Service-layer query filters on every read/write
- Postgres row-level security as a defense-in-depth layer
Audit & evidence
- Immutable audit log of every authenticated request
- Per-tenant SHA-256 hash chain in the evidence vault — tamper-detectable
- CSV export for auditors with date / action / resource filters
- Document upload events stamped into the evidence chain automatically
Data protection
- TLS 1.3 in transit; encryption at rest (managed by your hosting provider)
- Webhook payloads signed with HMAC-SHA256 per subscription secret
- API key plaintext never persisted; only sha256 hash stored
- Refresh tokens explicitly rejected on protected endpoints
Compliance roadmap
- SOC 2 Type II audit — planned
- ISO 27001 alignment — planned
- GDPR data export + deletion — implemented at the API level
Questions? Contact our security team.