Skip to main content
Developer portal

Developer docs

Telemetry and Status

Request IDs, the error envelope, the HTTP status table, and the health endpoints to monitor.

Request IDs

Every response carries an X-Request-Id header. The value is a UUID generated by the platform's middleware on entry. Log it. Quote it when reporting issues — every internal log line ties back to it.

If you submit your own correlation ID via X-Correlation-Id, the platform echoes it back unchanged in addition to its own request ID.

Error envelope

Every JSON error response has the same shape:

{
  "success": false,
  "error": {
    "code": "STABLE_STRING",
    "message": "A human-readable description.",
    "details": { /* optional, present for 400s and 422s */ }
  }
}
  • error.code is stable. Switch on it.
  • error.message is for humans. Do not parse it.
  • error.details carries Zod field-error trees on 400/422, and contextual hints on others.

HTTP status table

StatusMeaningAction
200Success
201Created (POST that creates a resource)
204Success, no body (e.g. successful DELETE)
400Malformed requestFix the payload; do not retry as-is
401Missing / invalid / revoked tokenRefresh credentials
403Authenticated but not entitledConfirm scope; do not retry
404Not found, or hidden from this caller
409State conflict (e.g. double-accept of a Hold)Re-read current state and decide
422Validation failedSee error.details
429Rate-limitedHonour Retry-After; see Auth and Rate Limits
500Unexpected server errorRetry with backoff, then escalate with X-Request-Id
502/503/504Upstream / dependency issueRetry with backoff

Health endpoints

The three health endpoints described in Public Endpoints are the canonical signals for operations:

  • /api/health/live — process is responsive (poll every 30–60s)
  • /api/health/ready — dependencies are reachable (poll every 60–120s)
  • /api/health — combined envelope, suitable for a load-balancer probe

Health endpoints are observability signals, not feature contracts. Do not gate user-facing logic on their response shape — it may change without notice.

What we will not expose

  • The full route table to the public (probe it and you get a polite 404)
  • Internal operations dashboards (auth-gated under /dashboard/system and admin surfaces)
  • Database schema reflection endpoints (there are none)

Where to next