{
  "page": { "name": "InboxGuard", "url": "https://inboxguard.io" },
  "status": { "indicator": "operational", "description": "All systems operational" },
  "components": [
    { "name": "API (api.inboxguard.io)", "status": "operational" },
    { "name": "Domain scanning", "status": "operational" },
    { "name": "DMARC report ingest", "status": "operational" },
    { "name": "Dashboard (inboxguard.io)", "status": "operational" },
    { "name": "Alerting", "status": "operational" }
  ],
  "liveness": {
    "healthcheck": "https://api.inboxguard.io/health",
    "note": "This is a static status summary. For real-time liveness, GET /health (returns {\"status\":\"ok\",\"db\":\"ok\"})."
  },
  "error_contract": {
    "envelope": { "error": { "code": "string", "message": "string", "requestId": "string", "retryAfterSeconds": "integer (RATE_LIMIT only)" } },
    "codes": ["BAD_REQUEST", "UNAUTHORIZED", "FORBIDDEN", "NOT_FOUND", "CONFLICT", "RATE_LIMIT", "UPSTREAM_ERROR", "INTERNAL_ERROR"],
    "retry_policy": "On 429 honor the Retry-After header. On 502 UPSTREAM_ERROR retry idempotent GETs with exponential backoff (e.g. 1s, 2s, 4s, max 3 tries). On 5xx do not retry non-idempotent writes without a fresh request id.",
    "rate_limits": { "anonymous_scan_domain": "5 requests/hour per IP" }
  },
  "support": "support@inboxguard.io"
}
