Data retention and security
Every Mouse API customer gets Zero Data Retention (ZDR) by default on the standard API. No enterprise contract, sales approval, or request header is required.
What Mouse retains vs discards
Section titled “What Mouse retains vs discards”| Data element | Retained on disk? | Where it lives | Lifecycle |
|---|---|---|---|
state, questions, instructions, criteria | No | Process memory for the active HTTP request | Discarded as soon as the HTTP response is sent |
answers, probabilities, confidence | No | Process memory for the active HTTP request | Discarded as soon as the HTTP response is sent |
POST /v1/calibrations labeled examples | No | Process memory during 5-fold cross-fitting | Discarded as soon as the signed profile is returned |
Calibration profile (calp1.) | No | Returned to caller, HMAC-SHA256 signed | Held by the caller and passed back on /v1/systemone |
Prefix cache (KV tensors of recent states) | Memory only | GPU VRAM on the inference worker, keyed by SHA-256(state) | 5-minute TTL; evicted automatically; gone on worker restart; never written to disk |
Request metadata (request_id, key_id, model, status, input_tokens, cached_tokens, questions count, latency_ms, region) | Yes | Structured logs and billing usage rollups | 30 days in console activity logs; billing aggregates as required by law |
How ZDR is enforced in code
Section titled “How ZDR is enforced in code”Zero data retention in apps/decide is enforced mechanically rather than by policy alone:
- Allow-listed log filter (
MetadataOnly): The API logger strips every attribute outside the fixed metadata allow-list (event,request_id,key_id,path,status,latency_ms,model,region,input_tokens,cached_tokens,questions,error_code) and drops any formatted string arguments before serialization. Even an accidentallog.info(..., extra={"state": ...})cannot emit request content. - Non-echoing validation errors: When Pydantic rejects a malformed request body (
422 invalid_schema), the error handler extracts only the field path (loc) and schema rule, never the rejected input value. Automated tests place secret canary strings inside invalidstateandcriteriapayloads and assert they never appear in error bodies or log streams. - Explicit HTTP headers on every response: Every response carries:
Cache-Control: no-storeMouse-Data-Retention: none
- No response cache: Only input
stateKV tensors live in ephemeral GPU memory (keyed by SHA-256 digest with a 300-second TTL), which matches the industry ZDR standard for stateless in-memory prompt caching.
Infrastructure, availability SLO, and subprocessors
Section titled “Infrastructure, availability SLO, and subprocessors”- Serving region:
https://api.mouse.devruns in US-East (Mouse-Region: us) on stateless CPU API gateways paired with isolated GPU workers on Modal. - Availability SLO (preview): We target 99.5% monthly availability on
POST /v1/decisionsandPOST /v1/systemoneduring themouse-preview-2026-10-13preview, monitored viaGET https://api.mouse.dev/healthz. Formal contractual SLAs with service credits ship at General Availability after 30 days of continuous production telemetry. - No model training on customer traffic: Customer requests, states, questions, and calibration examples are never used to train or fine-tune models.
- Key security: API keys (
sk_mouse_...) include a 6-character base62 CRC32 checksum verified before any database query, are stored exclusively asSHA-256hashes, and are automatically revoked via GitHub secret scanning if leaked to a public repository.
12-Question AI-CAIQ Enterprise Security & Trust Reference
Section titled “12-Question AI-CAIQ Enterprise Security & Trust Reference”For security and procurement reviews (CSA AI-CAIQ), here are direct answers for https://api.mouse.dev:
| # | Security review question | Mouse (api.mouse.dev) answer |
|---|---|---|
| 1 | Is Zero Data Retention (ZDR) enabled by default? | Yes. Every response includes Mouse-Data-Retention: none and Cache-Control: no-store on all accounts with $0 surcharge. |
| 2 | Are customer prompts, state, or questions used for training? | Never. Neither inference requests nor POST /v1/calibrations labeled examples are stored or used for training, distillation, or evaluations. |
| 3 | Where does calibration data live? | Stateless in-memory only. POST /v1/calibrations scores examples in memory, fits temperature T and cutoff, and returns an HMAC-SHA256 signed calp1. token. Examples and profiles are immediately discarded. |
| 4 | How is the in-memory prefix cache isolated across tenants? | Cache keys are scoped to (user_id, state) (cache_salt per tenant) in ephemeral GPU memory (~5m best-effort TTL) and never written to disk, preventing cross-tenant cache probing. |
| 5 | What is retained in audit logs? | Only allow-listed operational metadata (request_id, key_id, path, status, model, region, input_tokens, cached_tokens, questions count, latency_ms, error_code) enforced by MetadataOnly in apps/decide/mouse_api/zdr.py. |
| 6 | Can validation errors leak sensitive payload contents? | No. RequestValidationError handlers strip rejected values and return only the schema field path (param). |
| 7 | How are API keys stored and protected against leaks? | Keys (sk_mouse_...) carry a base62 CRC32 checksum (invalid keys are rejected before any DB query), are stored as SHA-256 digests only, and support automatic revocation on public GitHub exposure. |
| 8 | How is prompt injection inside state mitigated? | mouse-1 is non-autoregressive (output_tokens = 0) and only scores the fixed option keys you supply in criteria. Untrusted text placed in state cannot invoke tools or emit free-form output. |
| 9 | How are model versions pinned and deprecated? | Every response echoes Mouse-Model-Version: mouse-preview-2026-10-13. Immutable snapshots receive at least 12 months' notice (retire_after in GET /v1/models) before retirement, and calp1. profiles reject mismatched snapshots with 409 profile_model_mismatch. |
| 10 | What are theserving regions and data residency options? | Currently US-East (us) only. We do not charge regional surcharges; EU residency will be announced in GET /v1/models and /healthz when live. |
| 11 | How are rate limits and runaway spend bounded? | Token buckets enforce 200 RPS (burst 400) and 20M TPM per key with standard x-ratelimit-* headers. Prepaid balances stop at $0.00 (402 insufficient_credits), and optional auto-reload fires at most once per 24 hours. |
| 12 | How do committed-throughput upgrades work? | Keys can be upgraded to reserved RPS/TPM capacity via purchase order at the same $0.10 / $0.02 per-token rate (mailto:sales@mouse.dev). |