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.

