Skip to main content
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:
If a request with that key already succeeded, Unif returns the original response without re-running anything.

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.
Generating the key once and storing it with the task — before the first attempt — is what makes this work when the retry comes from a process that crashed and restarted.

Rules

After that the key is forgotten and the same key starts fresh work. Retries should happen well inside that window.
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.
Two workspaces can use the same key string without colliding.
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 returns 409 with idempotency_key_in_progress. Wait and retry:
This is the case that matters when two workers pick up the same queue message. One does the work, the other waits and then reads the same result — instead of both running an export.

Where it is not needed

The single most expensive mistake against this API is a job-creation retry without a key. An export that costs real credits, run twice because a scheduler timed out and tried again, is entirely avoidable with one header.