api/openapi.json), which the API builds from the same
TypeBox schemas it validates requests and responses against. Paths, methods,
parameters, request bodies, and response shapes therefore cannot drift from the
running service — when a route changes, the spec (and these pages) change with
it.
The machine-readable spec is published at
GET /openapi.json on the API, and
an interactive Swagger UI is served at /docs when enabled. The pages here are
rendered from a committed snapshot of that spec./v1. See Base URLs for environment hosts.
Authentication
Every authenticated endpoint requires two headers together:Authorizationcarries your MeshQu API key as a bearer token. Keys are prefixedmqu_. Mint one in the console (Settings → API keys). This is not anX-API-Keyheader.X-MeshQu-Tenant-Idis your tenant UUID. It is validated before the API key, so a missing or malformed value returns400(MISSING_TENANT_ID/INVALID_TENANT_ID) before authentication runs.
Determinism guarantee
Given the same decision context and the same policy snapshot, MeshQu always returns the same verdict. Theevaluated_rules_hash and integrity_hash in
each response let you verify this independently.
Example: Replaying a decision six months later produces the same verdict as long as the same policy snapshot is used, even if current policies have since changed.Determinism applies strictly to MeshQu’s policy evaluation logic and snapshot resolution. Client-supplied data and external evidence are outside this guarantee. Evaluations are designed for synchronous use at decision boundaries. Typical policy-evaluation time is single-digit milliseconds, excluding network latency. Clients should still set timeouts and fallback strategies.
Evaluate vs record
Two endpoints sit at the core of the API, and the difference matters for audit:POST /v1/decisions/evaluate— dry-run. Evaluates a context against active policies and returns a signed receipt. Nothing is persisted.POST /v1/decisions/record— evaluates and persists the result. Requires anidempotency_keyfor safe retries.
Errors
Every response carries acorrelation_id. Error bodies follow a consistent
{ error: { code, message, details }, correlation_id } shape. See
Errors & Status Codes for the full code catalogue and retry guidance.
Public verification & trust roots
The unauthenticated receipt, chain, and bundle endpoints are intended for offline verifiers and counterparties holding a receipt or chain ID. Verifiers should fetch the JWKS atGET /v1/.well-known/signing-keys out-of-band, pin
the key fingerprints, and use them as trust roots. The trusted_keys.json file
inside an exported bundle is informational only and must not be used as a
trust root. See Verifying offline and
Verification Bundle.