On this page
Errors & retries
Every JSON error body has the same top-level shape:
{ "code": "seller_unreachable", "error": "the selected seller could not be reached" }
code is the stable value for program logic. error is human-readable detail
and may change without a version change. Those two fields are the whole
envelope, on every endpoint and every status: there is no message, and no
error_code echoing code. A client that reads error reads every Spot
error.
Bodies served before 2026-08-29 could also carry message and error_code.
The official SDKs still accept both spellings, and will stop doing so after
2027-02-28.
Retry rules
- Retry
GETrequests after transient502,503, or504responses with exponential backoff. - On
429, wait forRetry-After; it is authoritative. - Do not blindly retry a state-changing request after an ambiguous transport failure. First reconcile the order, contract, or trade through its read API.
- Seller registration is idempotent by
endpoint_urlwhen the body and current ownership credentials are unchanged. 402,409,410, and425describe market, balance, or contract state; changing the request or waiting for that state to change is required.
Codes
An endpoint may return a subset of these codes. Its reference page and OpenAPI operation define the applicable statuses.
| code | http | when it happens | source |
|---|---|---|---|
no_fill_at_limit | 402 | nothing crossed at or under the ceiling | errors.json |
contract_exhausted | 402 | ticket remaining is below the requested burn | errors.json |
seller_default | 409 | bound seller failed to deliver | errors.json |
contract_expired | 410 | ticket TTL or window has ended | errors.json |
contract_not_yet_deliverable | 425 | forward ticket used before the window | errors.json |
no_match | 404 | no seller matched the bid | errors.json |
bid_timeout | 504 | legacy alias of a timed-out bid (not emitted on the live path) | errors.json |
request_timeout | 504 | request timed out before a seller matched | errors.json |
rate_limited | 429 | per-key rate limit exceeded | errors.json |
insufficient_balance | 402 | account has insufficient pre-funded balance | errors.json |
seller_unreachable | 502 | winning seller could not be reached | errors.json |
unauthorized | 401 | missing or invalid credentials | errors.json |
forbidden | 403 | caller is not allowed to perform the action | errors.json |
not_found | 404 | resource does not exist | errors.json |
invalid_model | 400 | requested model is not recognized | errors.json |
market_unavailable | 503 | authoritative Market state is temporarily unavailable | runtime |