Safe retry policy
- Retry side-effect-free reads with bounded exponential backoff and jitter.
- For
429, honor a returnedRetry-Afterheader and any documenteddata.retryAfterSeconds. A retry delay is a minimum wait, not permission to repeat an unsafe mutation. - Retry
503only when the operation description says it is safe or the request has a stable idempotency key. - Do not retry other
4xxresponses unchanged. - Cap retries and surface the final
X-Request-Idfor support.
Mutations
Some operations accept a domainidempotencyKey. Reuse the same key with the same semantic input after an uncertain response. Examples in the generated contract include starting an outbound conversation and, when supplied with a stable observation timestamp, asserting a fact.
If an operation has no idempotency key, read current state before replaying it. This applies to many creates, provider onboarding actions, and complete-set updates.
Optimistic revisions
Operations that acceptexpectedRevision use it to prevent lost updates. On 409, use the returned current revision when available, fetch the resource again, and apply your change to the new state. Do not loop by replacing the revision without reconciling the data.
Network and service boundaries
A timeout, disconnected client or5xx response can arrive after a downstream operation has already committed. Retrying from a different process or through MCP does not create a new idempotency guarantee. The owning API operation determines whether the same key and input can be replayed.
For a safe retry, keep a bounded attempt count and total deadline, add jitter to exponential backoff, and stop when the operation returns a permanent validation or authorization refusal. Keep the request reference from each attempt so support can distinguish the original uncertain outcome from later retries. Never log credentials or mutation payloads as retry diagnostics.