pick_not_released | 404 | No Pick of the Day is published yet. Each pick normally releases 1 hour before its kickoff. | Schedule one request for error.retry_at. Do not poll. |
unknown_endpoint | 404 | The path is not a route on this API. | Read GET /api/v1 for the route list. Do not retry the same path. |
trader_not_tracked | 404 | The wallet is real and the URL is right, and 0xinsider does not capture its fill history. Only the two position timeline routes return this reason. | Do not ask again for this wallet. Trader still answers 200 for it, with sync_status set to unknown. |
cursor_expired | 400 | The list you were paging was rebuilt, so the cursor no longer points at a real position in it. error.param is cursor. | Request the first page again and continue from there. |
read_model_warming | 503 | This endpoint’s precomputed data is not ready to serve. Nothing is rate limited. | Sleep Retry-After, then retry this route only. |
database_unavailable | 503 | The API’s database, or its connection pool, is unreachable. | Sleep Retry-After, then retry. |
request_accounting_unavailable | 503 | Usage accounting had no capacity, so the handler never ran. | Sleep Retry-After, then retry. |
idempotency_in_progress | 409 | A request with the same Idempotency-Key is still running. error.param is Idempotency-Key. | Retry with the same key and the same body. |
webhook_delivery_in_progress | 409 | The webhook endpoint is mid-delivery, so its URL and signing secret are frozen. error.param is endpoint. | Retry the change once that delivery finishes. |
webhook_secret_rotation_not_prepared | 409 | You asked to activate a staged signing secret, and the endpoint has none prepared. error.param is secret_rotation. | Prepare a secret first, deploy the one it returns, then activate. See Webhooks. |
webhook_secret_rotation_overlap_active | 409 | The previous signing secret is still inside its 1-hour overlap window, where both secrets verify. error.param is secret_rotation. | Retire the previous secret, then prepare or activate the next one. |
sandbox_api_key | 401 | An oxi_sk_test_ key was sent to the live API. | Send it to the sandbox base URL instead, or use a live key. |
api_key_in_query | 401 | The key was sent as ?token=. No route reads a key from the URL, so the key itself was never checked. | Resend it in an Authorization: Bearer header. |
subscription_inactive | 402 | The key is valid, and the account’s Pro subscription has lapsed. | Stop retrying. Show the reactivation URL from error.message. |
monthly_quota_exceeded | 429 | The account used the 250,000 requests Pro includes for the month with pay as you go off, or reached the 1,000,000 request pay-as-you-go ceiling. | Turn on pay as you go at Developers, or wait for error.retry_at, the first of next month. At the ceiling, email support for a higher one. |
invalid_query | 400 | A query parameter did not parse, or it does not fit the route’s schema. error.param is its key. | Fix the parameter. |
unknown_query_parameter | 400 | You sent X-Query-Validation: strict and named a query parameter this operation does not publish. error.param is that name. | Remove the name or correct its spelling. error.message lists the names the operation accepts. |
invalid_path | 400 | A path segment did not parse to the type the route expects. error.param is the segment’s name. | Fix the URL. |
invalid_body | 400 | The body is not JSON, or it misses a required field, or a field has the wrong type. error.param is the JSON path, or body. | Fix the body. |
unsupported_media_type | 415 | A body was sent without Content-Type: application/json. error.param is content-type. | Set the header. |
payload_too_large | 413 | The body is over 1,048,576 bytes. error.param is body. | Split the work across smaller requests. |
method_not_allowed | 405 | The path is a route, but not with this method. | Use a method from the Allow header. |
ip_rate_limited | 429 | The 1,200 requests a minute that every caller behind your IP address shares are spent. This is not your key’s own window, and the RateLimit-* headers describe that shared budget. | Sleep Retry-After. |
ip_throttled | 429 | Your IP address is in a cooldown after sustained over-limit traffic. Retry-After is minutes to days. | Sleep all of Retry-After. Retrying sooner does not shorten it. |