Console Client
Documentation
Dashboard
API

API errors and rate limits

Every error code the API can return, what the rate limits are, and how to retry safely.

What an error looks like

Any response that is not HTTP 200 is an error. The body is JSON with a short, stable error code, sometimes with extra fields that belong to that code. Match on the code, never on the HTTP status alone.

HTTP/1.1 429 Too Many Requests
Retry-After: 17
X-RateLimit-Limit: 120
X-RateLimit-Remaining: 0

{ "error": "rate_limited" }

Key, plan, and access errors

ErrorHTTPMeaning and fix
missing_api_key401No Authorization: Bearer header. Dashboard logins do not work on the API.
invalid_api_key401The key is wrong, was regenerated, or was deleted. Keys are case sensitive and exactly 64 characters.
too_many_failed_attempts42920 wrong keys from your IP in 10 minutes. Wait for Retry-After seconds.
ip_not_allowed403Your IP whitelist is on and this request came from an IP that is not on it, or the list is empty.
tier3_required403The plan is not Tier 3 or has expired.
suspended, banned403The Console Client account is suspended or banned.
maintenance503Console Client is in maintenance. Retry in a few minutes.

Request errors

ErrorHTTPMeaning and fix
unknown_endpoint404The path or the HTTP method is not part of the API. Check the spelling and the method.
invalid_json400The body is not valid JSON.
body_too_large413The body is over 5 MB.
invalid_request400A required field is missing or has the wrong type.
invalid_account400The account ID is missing.
not_found404No account with that ID.
not_assigned, account_missing404The account is not running on a backend. Connect it first.
not_connected409The account is not online.
command_timeout, timeout504The account did not answer in time. It may be lagging or reconnecting. Retry once.
server_error500Something failed on our side. Retry, and open a ticket if it keeps happening.

Endpoint-specific codes, such as cooldown for connect or macro_not_found, are listed with their endpoint.

Rate limits

LimitValueWhen you hit it
Requests120 per minute, per key429 rate_limited with Retry-After.
In flight8 requests at the same time429 too_many_concurrent_requests. A long poll counts as one for as long as it is open.
Wrong keys20 per 10 minutes, per IP429 too_many_failed_attempts.

Every authenticated response tells you where you stand:

HeaderMeaning
X-RateLimit-LimitRequests allowed per window: 120.
X-RateLimit-RemainingRequests left in the current window.
X-RateLimit-ResetUnix time in seconds when the window resets.
Retry-AfterOnly on a 429: how many seconds to wait.

The limit is shared by everything that uses your key, and refused requests count too, so a script that hammers a 429 only keeps itself locked out.

Poll less, get more

You wantDo this
Account statusOne GET /accounts every 5 to 10 seconds covers every account. Do not call GET /accounts/{id} once per account.
Chat in real timeOne GET /chat long poll with wait=25000 covers every account, at two or three requests a minute.
To know a macro finishedGET /macros/active every few seconds, or have the macro send a chat line or a Discord webhook as its last step.
A long click sequenceBuild it as a macro and run it with one request.

Retry safely

ResponseRetry?
429Yes, after Retry-After seconds. For cooldown use cooldownRemaining.
500, 503, 504Yes, with a growing delay: 1, 2, 4, 8 seconds, then give up and alert yourself.
400, 401, 403, 404, 409No. The same request will fail the same way until you change something.

Connect, disconnect, stop, and close are safe to repeat. Be careful repeating POST /chat/send after a timeout on your side: the first attempt may have gone through, and the account would say it twice.

Need a hand?

Check the troubleshooting guide or return to all guides.