GET and search requests are read-only and safe to retry as often as you like. Two calls are not:
POST /enrich and POST /jobs both do billable work, and retrying one without protection charges
you twice.
Send an Idempotency-Key:
Choosing a key
A key is any string up to 255 characters. What matters is that it identifies the intent, so a retry produces the same key and a genuinely new request does not.Derive it from the work
nightly-enrich-2026-09-15, export-shops-us-2026-09 — deterministic, so a scheduler retry
naturally reuses it.Not a fresh UUID per attempt
A new UUID on each attempt makes every retry a new request, which is exactly what you were
trying to prevent.
Rules
Keys are retained for 24 hours
Keys are retained for 24 hours
After that the key is forgotten and the same key starts fresh work. Retries should happen well
inside that window.
A key is bound to its request body
A key is bound to its request body
Reusing a key with a different body returns
400 with idempotency_key_reused. This is a
guard: it catches the bug where a key gets reused for work it does not describe.Keys are scoped to a workspace
Keys are scoped to a workspace
Two workspaces can use the same key string without colliding.
Only successes are replayed
Only successes are replayed
If the original request failed with a
4xx or 5xx, the key is not retained — a retry runs
the work properly rather than replaying a failure.Concurrent retries
If a second request with the same key arrives while the first is still in flight, it returns409
with idempotency_key_in_progress. Wait and retry: