Errors
What 401, 402, 429, and 502 mean on OpenBroker, and what to change in the client.
The HTTP status on a chat completion is either OpenBroker refusing the call, or the status the gateway returned. Read error.message in the JSON body when there is one. Usage rows store the same status and message for your account. See Usage.
OpenBroker responses
| Status | Message | What to do |
|---|---|---|
| 401 | missing or invalid OpenBroker API key | Send Authorization: Bearer obk-.... A dashboard session is not a key. |
| 401 | invalid API key | The key was deleted or mistyped. Create a new one. |
| 402 | broker is not active | Deposit at least 100 GNK. See Deposits. |
| 402 | broker GNK reserve exhausted | Available balance is 0. Top up. Balance shows the spendable amount. |
| 400 | read body failed, or invalid JSON | Send a JSON object. |
| 400 | missing required field: prompt | Legacy completions only. |
| 503 | no active OpenBroker devshard capacity for this broker | Capacity is not assigned yet. Retry shortly after activation. |
These are not model outages. They will not clear by switching from DeepSeek to MiniMax.
Gateway responses you will see often
| Status | What it usually means | What to do |
|---|---|---|
| 429 | Too many requests are in flight on the gateway. OpenBroker does not apply a per-key quota. | Back off and retry. This is demand, not a broken prompt. The status page files these under over-limit, not under the red error rate. |
| 502 | The gateway did not return a usable response. A common body mentions timeout awaiting response headers and does not include an internal address. | Raise the client timeout to several minutes and retry. OpenBroker waits up to 20 minutes for headers. See Streaming. |
| 400 | The model id is unknown, or a parameter was rejected. | Check GET /v1/models. Kimi-K2.6 fails because it is deprecated. |
| 4xx / 5xx with capacity wording | No host or escrow is free (no currently-available host, request budget exhausted, and similar). | Retry. These are capacity, same as 429, for status-page purposes. |
Headers on errors
X-Request-Id is set when the gateway assigned one. You can pass it to GET /v1/usage/{id} even when the body is not JSON. Calls rejected with 401 or 402 never reach the gateway, so they may have no request id and no usage row.
Failed requests are not charged. cost_ngonka on an error row is 0. Which of these to send again is in Retries. Whether to lower or raise how many calls you keep in flight is in How much to send.