Public paths
The paths below require neither an API key nor a tenant header. Public receipt and form identifiers must be handled as access capabilities: a caller who has one may be able to read the corresponding resource, subject to the endpoint’s limits. Infrastructure:GET /v1/healthGET /v1/.well-known/signing-keys- the OpenAPI document and docs UI, when the operator enables them
GET /v1/receipts/:decisionIdandGET /v1/receipts/:decisionId/bundleGET /v1/chains/:chainId/verify,GET /v1/chains/:chainId/seal,GET /v1/chains/:chainId/bundleGET /v1/forms/:formId/schema,GET /v1/forms/:formId/api-contract,GET /v1/forms/:formId/receipts/:decisionIdPOST /v1/forms/:formId/submit— the one public write. A submission to a hosted form is evaluated and mints a signed receipt without any API key being presented. Rate limiting is per(form, IP)and the form’s own token budget caps total consumption; treat a form’s ID as a capability and disable forms you no longer want submissions on.
“Unauthenticated” here means no API key and no tenant header — not
unrestricted. Every one of these paths is rate-limited, and a request still
only ever reaches the tenant that owns the identifier in the URL. What it
does not do is prove who the caller is.
API keys
API keys are created via the/v1/api-keys endpoint (requires the api-keys:admin scope) or through the MeshQu Console.
When you create a key, the plaintext value is returned exactly once. Store it securely — it cannot be retrieved again. The API stores only a hashed representation.
Each key has:
- Name — a human-readable label for audit trails.
- Scopes — the set of permissions the key grants (see below).
- Expiry (optional) — an
expires_attimestamp after which the key is rejected. - Key preview — a safe prefix-and-suffix fragment (e.g.
mqu_...c123) returned askey_previewin key metadata for identification.
Keys are
mqu_ followed by a base64url-encoded random token (e.g.
mqu_EXAMPLEKEYdonotuse_replace_with_ownx_abc123). There is no
environment segment such as _live_ or _test_ — a single key format is
used everywhere.Revoking a key
Scopes
Each API key carries one or more scopes that control what it can access:
Principle of least privilege: create separate keys for different services. A service that only evaluates decisions needs
decisions:evaluate — not api-keys:admin.
Multi-tenancy
All data in MeshQu is isolated per tenant. TheX-MeshQu-Tenant-Id header determines which tenant’s data is accessed. The API key must belong to the specified tenant; a mismatch returns 403 Forbidden.
Rate limits
MeshQu applies two tiers of rate limiting:
When a limit is exceeded the API returns
429 Too Many Requests with a Retry-After header.
Standard rate-limit headers are included on every response:
Example: creating an API key
key value immediately — it will not be returned again.