Trust & Security

How we protect your data.

Kamy renders billing, contracts, and tax documents — material your customers and your auditors care about. This page is the durable record of our security commitments, current state, and roadmap. Updated when reality changes.

Commitments & controls

LIVE

Encryption in transit

All API traffic is TLS 1.2+. mcp.kamy.dev and kamy.dev terminate at Vercel/Cloudflare with HSTS preload. Storage signed URLs are HTTPS-only.

LIVE

Encryption at rest

Render outputs are stored in Supabase Storage backed by AWS S3 with AES-256 server-side encryption. Database (Postgres) is encrypted at rest by default. API key secrets are stored as SHA-256 hashes — recovery is impossible by design.

LIVE

Per-tenant isolation

Row-level security on every Postgres table. The renders, templates, api_keys, and usage_events tables all enforce user_id scoping; an authenticated request can never read another tenant's data even on a misconfigured client.

LIVE

API key revocation

Revoke from the dashboard at any time. Cache invalidates within 60 seconds globally. Lost key recovery is impossible — generate a new one and revoke the old.

LIVE

SSRF protections

URL-mode renders run through a hardened SSRF guard: blocks RFC1918 internal ranges, link-local, IPv6 hex-mapped/IPv4-compatible, fe80::/10, trailing-dot hostname normalization, and 3xx redirects that resolve to internal addresses.

LIVE

Webhook signing

Every webhook delivery is signed with HMAC-SHA256 over the body using the per-endpoint secret. Includes X-Kamy-Signature, X-Kamy-Event, and X-Kamy-Delivery headers for verification and dedup.

LIVE

Document signing — cert custody

Kamy operates its own X.509 CA root for PAdES PDF signatures. Root and per-account leaf private keys are AES-256-GCM encrypted at rest under a master key held in Vercel encrypted env vars (KMS-backed in Phase 2). Leaf certs are issued lazily on first sign call and rotated within 30 days of expiry. Signing passphrases live in memory for the duration of one signing call only.

LIVE

Public verification page

Every PKI-signed PDF is recorded in an append-only signing_events ledger keyed by SHA-256 of the signed bytes. Recipients confirm authenticity at kamy.dev/verify by drag-dropping the file — the hash is computed in-browser with SubtleCrypto so the document itself never touches our servers a second time. Cert chain, byte-range, signer identity, and RFC 3161 timestamp are surfaced for inspection.

LIVE

Kamy Ingest — extraction verify chain

Every /v1/extract response is bound to its source by an Ed25519 signature over canonical `source_sha256 | extraction_sha256 | model | signed_at`. The public verify URL at kamy.dev/extract/{id} renders the chain side-by-side. Recipients re-verify offline with Kamy's public key at /.well-known/kamy-extract-public-key.txt — no Kamy account, no trust in our infrastructure at audit time. /extract/{id}/report ships the full chain as a downloadable JSON proof bundle for archival.

LIVE

RFC 3161 timestamps

PKI-signed renders receive a cryptographic timestamp from a public TSA so the audit trail records a trusted signing time independent of any clock we control.

LIVE

PDF encryption (AES-256)

Caller-side option: pass options.encrypt with userPassword/ownerPassword and granular permission flags (print, copy, modify, fill-forms). Encryption happens server-side before the signed URL is minted.

IN PROGRESS

PDF/A archival compliance

PDF/A-1b, 2b, and 3b output with sRGB ICC OutputIntent + XMP metadata. Validation against the veraPDF reference suite runs in CI on every change. The runtime processor is currently flagged as best-effort — strict veraPDF compliance for all callers is on the roadmap.

LIVE

GDPR — data subject rights

Right to deletion honored within 30 days; renders and audit logs are wiped from all systems including backups within 90 days. Data Processing Agreement template available on request.

Operational practices

  • Principle of least privilege on all internal tooling. Access reviewed quarterly.
  • Two-factor authentication required on all internal accounts (GitHub, Vercel, Supabase, Stripe).
  • Production secrets stored in Vercel encrypted env vars and rotated on personnel changes.
  • Dependabot + automated CI builds catch dependency vulnerabilities. Patched on next deploy.
  • Pre-commit hooks block accidental secret commits; GitHub secret scanning is on.
  • Data retention: 30 days on Free, 365 days on paid plans. Cleanup cron sweeps storage daily. Signed documents and their audit trail are exempt and kept for the life of the account.
  • Audit log on every render write — who, what, when, which API key — surfaced in the dashboard.

Reporting a vulnerability

Email [email protected]. We respond within 24 hours, triage within 72, and credit responsible disclosure in our changelog. PGP key on request. We don't run a paid bounty program yet, but we credit responsible disclosures publicly when researchers consent.

Subprocessors

Kamy uses a small list of vetted subprocessors. We notify customers 30 days before adding a new one.

SubprocessorPurposeRegion
VercelApplication hosting + Edge networkGlobal
SupabasePostgres + Storageus-east-1
Fly.ioSelf-hosted Chromium pool for PDF renderingus-east + eu-west + ap-southeast
StripeBilling + payment processingGlobal
ResendTransactional emailus-east-1
SentryError monitoringus / eu
AxiomApplication logsus-east-1
AnthropicAI blog post generation (cron)us-east-1

Need an MSA, DPA, or security questionnaire?

We have templates ready to send. Email [email protected] with the document type and your jurisdiction.

Trust & Security — Kamy — Kamy