Error shape
Status codes
Retry guidance
- Retry
429,500,502,503, and504with exponential backoff and jitter. - Do not retry
400,401,403,404, or409. Fix the request instead. - For long-running downloads that return
302, retry the request (not the presigned URL): S3 links expire.
Health check
GET /healthz returns { "status": "ok" } when the database is reachable and 503 { "error": "database unavailable" } otherwise. Use it as a liveness or readiness probe.