Skip to content

Errors

The draft uses application/problem+json with an HTTP-matching status, stable code, opaque requestId and retryable. Branch on the code, not translated prose. The reference lists responses for each operation.

{
"type": "urn:ginum:problem:idempotency-conflict",
"title": "Idempotency conflict",
"status": 409,
"code": "IDEMPOTENCY_CONFLICT",
"requestId": "90000000-0000-4000-8000-000000000001",
"retryable": false
}
Status Action
400 Correct the request, unsupported field, cursor or missing/invalid key.
401 Check token validity, issuer and API audience. Do not use an ID token.
403 Resolve current scope, grant or module denial. Do not retry a revoked grant.
404 Resource is absent or inaccessible. Do not infer existence.
409 Follow the specific idempotency or cursor code. Only in-progress replay advises a delayed retry.
413 / 415 Reduce the JSON body below 1 MiB / send supported UTF-8 application/json.
422 Correct domain inputs using safe field-error pointers and codes.
429 / 503 Respect Retry-After, add jitter and bound attempts; retry writes only with the same key/payload.
500 Outcome may be uncertain. Preserve the key and reconcile; do not blindly repeat.

CURSOR_EXPIRED means restart the collection with the same authority and filters. It is not permission to query a broader set. Do not auto-retry validation, changed payload, revocation or business holds.

Errors must not echo tokens, SQL, private values or inaccessible identifiers. Send a request ID and safe reproduction to support, never the original credentials or sensitive payload. Edge error parity and direct-core denial behavior remain provider acceptance work.