Skip to main content
Attesso uses application/problem+json when it supplies an error body.
Branch on code and retryable. The API does not send field-level pointers; detail names the rule that failed, so fix the request from it. Do not branch on human-readable text.

Status handling

Authorization decisions

An authorization is a durable record, not an HTTP error. A refusal is 201 with decision: "DENY", state: "DENIED", and can_execute: false. Never execute on DENY or INDETERMINATE. reason.violations[] carries path, code, and, when the failing check has them, observed and bound. path is a JSON Pointer: /attributes/section, /payment/amount. Policy constraints name the same paths as attributes.section and payment.amount. Violation codes are ACTION_MISMATCH, VALUE_MISMATCH, VALUE_NOT_ALLOWED, ABOVE_MAXIMUM, OUTSIDE_DATE_RANGE, REQUIRED_ATTRIBUTE_MISSING, and ATTRIBUTE_TYPE_MISMATCH. violations is present for POLICY_MISMATCH and for decisions of INDETERMINATE. State refusals carry code only. PERIOD_LIMIT_EXCEEDED carries code and message.

Idempotency keys

Every write except external reports requires Idempotency-Key; a report replays by its external_reference. Keys contain 16 to 255 letters, digits, periods, underscores, colons, or hyphens.
  • Persist one key before sending each logical operation.
  • Retry that operation with the same key and identical logical input.
  • Use a new key for a new operation.
  • Reusing a key with different input returns 409.
  • A successful replay returns the same resource identity in its current state.

Recover a lost create response

If a create response was lost, find the Mandate by its external_reference:
The match is exact, newest first. limit is 1 to 100 (default 20). has_more is true when more Mandates carry the same reference; raise limit to read them. The result is scoped to the calling Organization. There is no unfiltered list and no cursor. If more than 100 Mandates share the reference, only the newest 100 are returned. Unknown query parameters are refused with 422.

Retry pattern

  1. Treat every timeout or unavailable response as non-permission.
  2. Keep the original operation identity and input.
  3. Back off with jitter and honor Retry-After when present.
  4. Read the Mandate or Authorization before starting any replacement action.
Log the safe Attesso-Request-Id for support correlation. Never log API keys, identity assertions, approval URLs, or external credentials.