Client API Retries and Timeouts
OMNI Client API is designed to be safe to integrate with standard production retry behavior, but only if you pair retries with:- request timeouts
- exponential backoff + jitter
- idempotency for operations that can create side effects
What is safe to retry
Safe from side effects (read-only)
These calls do not create server-side side effects, but each successful HTTP response is still billable. If you retry and multiple attempts succeed, you should expect multiple billable units.GET /v1/healthGET /v1/openapi.jsonGET /v1/fred/*tools/listoverPOST /mcpGET /v1/mcp/tools(legacy compatibility)
Safe only with idempotency
These operations require anIdempotency-Key so OMNI can dedupe and replay responses:
POST /v1/mcp/invoketools/calloverPOST /mcp
Status codes and retry guidance
| Status | Meaning | Retry? | Notes |
|---|---|---|---|
400 | invalid request | No | Fix the request payload/params. |
401 | invalid/missing key | No | Create/rotate key. |
403 | not allowed | No | Fix scopes / allowlist / entitlements. |
409 | idempotency conflict | Yes | Another request with the same idempotency key is in-flight; retry with the same key. |
429 | rate limited | Yes | Honor Retry-After when present; otherwise backoff. |
5xx | server error | Yes | Treat as transient; backoff + jitter. |
Recommended client defaults
- Timeout:
20sper request. - Retry attempts:
GET: up to3attempts.- Idempotent
POST: up to3attempts with the sameIdempotency-Key.
- Backoff:
- exponential (
250ms,500ms,1s,2s, …) - add jitter (randomize by 0-100%)
- exponential (
- Stop retrying immediately on:
400,401,403(except409and429)
Idempotency details
Requirements
- Generate a unique
Idempotency-Keyper logical operation. - Reuse the same
Idempotency-Keyacross retries of that operation. - Keep the request payload stable across retries. If you change the payload, it is a new operation.
Billing behavior
- Successful calls (
2xx/3xx) are billable. - Failed calls (
4xx/5xx) are non-billable. - Idempotent replays (same
Idempotency-Key+ same payload) that return a cached result are not billed again. - Read-only retries (
GETand hostedtools/list) can be billed more than once if multiple attempts succeed.