Skip to main content
Success and failure are carried by the HTTP status code. There is no envelope to unwrap — a 200 body is the object itself, and any 4xx or 5xx body is an error object.
string
The broad class. Branch on this — it is stable.
string
The specific reason. New codes can be added within an existing type, so treat an unrecognized code as its type.
string | null
The offending field as a dot-path, matching your request body exactly.
string
Also returned as the X-Request-Id header on every response. Log it on both success and failure — it is the only thing that lets support trace a specific call.
message is written for a human reading a log. It is not stable across releases — never parse it or match on its text. Branch on type and code.

Types

Common codes

A parameter has the wrong type or an impossible value. param names it.The usual cause is a rate passed as a percentage. revenue_growth_rate is a ratio — 0.5 is +50%. Passing 50 is a request for +5,000% growth, and it is accepted as valid, so it returns an empty list rather than an error.
A required parameter is absent. Most often market on a search, which cannot be inferred.
The key is missing, malformed or revoked. Check the Authorization header is present and formatted Bearer unif_sk_….
You filtered on a field that is not filterable for this channel and market. Unif rejects the query rather than returning a silently biased result set. Check GET /coverage.
The channel or market is not enabled for your workspace. An entitlement problem — see GET /channels.
The requested period starts before the market’s earliest_period, or ends in the future.
No credits left in this billing period. See Credits.
The same Idempotency-Key was sent with a different body. Keys are bound to the request that created them. See Idempotency.

Retrying well

Retry 429 and 5xx. Never retry a 4xx other than 429 — the request will fail identically every time.
Two details that are easy to skip and expensive to skip:
  • Honor Retry-After on a 429. Backing off on your own schedule keeps you rate limited longer.
  • Add jitter. Without it, every worker that hit the limit together retries together.
Retrying a POST /jobs or POST /enrich without an Idempotency-Key can charge you twice for the same work. Send one on every non-idempotent call you might retry.

When you need support

Include the request_id. It identifies the exact call, its parameters and what happened internally, and it is the difference between a same-day answer and a long conversation.