Step 4 of 5
Errors
What an error looks like, what each one means, and when to retry.
1. Error format
Errors are JSON with the status code and a message.
400 response
{
"statusCode": 400,
"message": [
"priceType must be one of the following values: EXCLUSIVE, NONEXCLUSIVE"
],
"error": "Bad Request"
}
-
messageis a list for request validation errors, otherwise text. -
Organisation errors carry a
codeinstead:{ "code": "CAPABILITY_REQUIRED", "capability": "buyer", "message": "…" }. -
A reached buy limit adds
periodEnd; a rejected webhook template adds anerrorslist.
2. Status codes
| Status | Code / message | Meaning | What to do |
|---|---|---|---|
400 |
— |
Invalid request: filterId, priceType or
price missing on buy, price or
reward below 0, an unknown status, an
updatedSince that isn't ISO 8601, or
limit outside 1–100.
|
Fix the request; message lists each problem. |
400 |
SUBCONTRACT_EXCLUSIVE_ONLY,
SUBCONTRACT_REWARD_MISSING
|
A subcontract lead (leadPhase: SUBCONTRACT). Its reward
isn't exposed through the API yet, so subcontract leads can't be
bought through the API.
|
Contact zolar. |
400 |
— |
Webhook rejected: invalid URL, reserved or repeated header, broken
bodyTemplate, or the 20-endpoint limit reached.
|
Fix the endpoint; a template error lists each problem. |
401 |
— | The key is missing, malformed or unknown, or lacks the permission. |
Send Authorization: Bearer sk_… with a key that has the
permission.
|
403 |
ORG_INACTIVE |
Your organisation's access is disabled. | Contact zolar. |
403 |
CAPABILITY_REQUIRED |
Your organisation is not a lead buyer (this applies to reads and status updates too). | Request lead access in the portal; on Demo, finish the onboarding wizard. |
403 |
— | On buy: your organisation hasn't accepted this marketplace's terms, or has no access to it. | Accept the marketplace's terms in the portal. |
404 |
— | The lead, lead offer or webhook endpoint does not exist or isn't yours. |
Check the ID — buying takes the lead ID, updating takes the
leadOfferId.
|
409 |
PRICE_MISMATCH |
The price changed since you read it. | Fetch the opportunity again and retry with the new price. |
409 |
REWARD_MISMATCH |
Subcontract lead: the reward you sent doesn't match. | Contact zolar (see the subcontract row above). |
409 |
User already claimed this lead | Your organisation already bought this lead. | Don't retry; find it in GET /leads. |
409 |
Purchase limit exceeded … | The marketplace's buy limit is used up. | Wait until periodEnd. |
409 |
Lead is not available … |
The lead can't be bought for this priceType any more,
for example someone bought it exclusively.
|
Skip this lead. |
409 |
Lead is not in the correct status | The lead is no longer for sale. | Skip this lead. |
429 |
— | More than 60 requests in the last 60 seconds with this key. |
Wait, then retry. Spread your requests out. The body has no
error field.
|
500 |
— |
Something went wrong on our side. A database error returns
{ "statusCode", "message", "timestamp" }.
|
Retry later with back-off. If it persists, contact us with the time of the request. |
Not errors: an empty GET /opportunities or
GET /leads returns rows: [], and an
updatedSince older than 90 days is treated as 90 days ago.
3. Retries
- Retry
429after a pause, not immediately. - Retry
5xxwith a growing back-off. -
Don't retry other
4xxunchanged; on a price change, re-read the opportunity first.