| Encryption in transit | TLS 1.2+ on every connection, service-to-service included |
| Encryption at rest | AES-256, cloud KMS-managed keys |
| Region pinning | Postgres, Redis, object storage, auth, logging: all pinned to EU (Stockholm) |
| Database privilege separation | Three Postgres roles enforced with GRANT/REVOKE: the valuation engine cannot read user or billing tables; the scraper can only write comparables. A bug in either cannot leak account data. |
| Process isolation | The scraping worker runs in its own container with its own resource limits, so a scraping spike cannot starve the API or the valuation engine. |
| Right to erasure | Scheduled job cascades deletion across Postgres, Redis, S3, and backups; each erasure request records systems_cleared per system. |
| Secrets | Cloud secrets manager. Never in committed files. |
| Audit logging | Sensitive account actions in audit_log; report access in report_access_log. |