When the Wiro API refuses a request, it returns "result": false and an errors array. Read the message, not only the code.
{
"result": false,
"errors": [
{ "code": 97, "message": "Insufficient balance", "time": 1757750400 }
]
}More detail: the Error Reference in our docs.
Check the HTTP status too
HTTP 200 with
"result": false: the request was refused, such as an input, balance or task error. HTTP 200 alone isn't success.HTTP 401: authentication failed.
HTTP 404
Parsing url error.: not a Wiro endpoint, for example/v1/run/in lowercase.Cannot GET ...means you sent GET instead of POST.HTTP 400
Parsing request error.(plain text): the JSON body is malformed.HTTP 413
File size limit has been reached: a file is over 100 MB (see upload limits).HTTP 504
The synchronous wait timed out.: a non-streaming/synccall stopped waiting.
Run and Task endpoints don't send HTTP 429; their limit is concurrency (code 96). The LLM Gateway has its own error format.
Error codes
0: general, such as authentication, inputs, permissions, team limits and server errors.
1: not found or not available, such as an unknown task, a model that isn't public or a task in the wrong state.
96: concurrency limit reached.
97: insufficient balance.
98: sign-in required, for website visitors only.
99: no credentials, or an invalid or expired bearer token.
Authentication errors (HTTP 401)
Authorization bearer token is not founded in headers.(99): nox-api-keyheader arrived.Authorization bearer token is invalid.(99): you sent anAuthorizationheader, so the API ignoredx-api-key. Remove it.Project authorization is not founded.(0): the key matches no project.Project requires signature authentication...(0): sendx-signatureandx-nonce, or use a project with API Key Only.Project authorization is not valid.(0): the signature doesn't match (see Signature authentication).Requested ip ... is not allowed.(0): add your IP to the project's IP Whitelist, or clear it to allow every IP. Changing it generates a new API Secret.Your account has been suspended...orPlease verify your email address before signing in.(0): the project owner's account can't make requests.
Setup help: How do I get an API key?
Balance and limit errors
Insufficient balance(97): a run needs at least $0.50 ($10 for training models). Only coupon credit valid for this model counts, and a team project's key uses the team wallet. Add credit to your wallet.You have reached your concurrent task limit...(96): see How many tasks can I run at the same time?This model is not available for your team,Team spend limit has been reachedorYour personal spend limit in this team has been reached(0): ask a team admin, and see How do organizations and teams work?Billing hard limit has been reached.in an older task's Debug output: it came from the model's provider, not your Wiro balance, so try again.
Input and model errors
Input errors have code 0, one per problem input. See Run errors and how to send inputs and files.
Request parameter [prompt] required: the input is missing, or theContent-Type: application/jsonheader is.Request parameter [...] must be integer or float,must be between ... and ...ormust be one of: ...: change the value.request-files-required: a required file input is missing.Request parameters [...] not valid.orRequest parameters are invalid.: the API can't accept that input or request body.tool-not-accessible(0, or 1 if the model isn't public): the{owner}/{model}path doesn't match a model you can run. See why you get "tool-not-accessible".
Task errors
Task is not in a cancellable state.(1): a server has already picked the task up (even if it still shows Queued), or the task has finished. If it's still running, use Task/Kill.Task could not be killed: Process ended(1): the task has already finished.There is no task yet.or, from Task/Detail,task-not-founded(1 or 0): no task you can access has that ID or token.You don't have any permission for this action.(0): the task isn't yours or your team's.
HTTP 403 with error 1010
Error 1010 doesn't come from the Wiro API: a Cloudflare block stopped the request before it reached Wiro. There's no "API access" setting to switch on. Try this public call, which needs no key (the model list is Tool/List; there's no Model/List):
curl -X POST "https://api.wiro.ai/v1/Tool/List" \
-H "Content-Type: application/json" \
-d '{"limit": "20"}'
If it also returns 403, the block matches your connection or client, not your account. Either way, send us a failed request's Ray ID (its cf-ray header, or the bottom of the error page), its time and your public IP address.
Which errors can I retry?
Retry after a wait: 96 (once a task finishes or you add funds), and server errors such as
Task not checkedor a message ending inPlease retry shortly.Wait longer between attempts.Fix first: HTTP 401, 404, 400 and 413, input errors, code 1, 97, 98, 99 and team errors.
HTTP 504 from /sync: don't run it again. The task keeps running, so check it with Task/Detail using the returned
taskid(see synchronous runs).
Refused requests aren't charged. Wiro charges a task only after it finishes without an error (pexit is "0"). The exceptions are realtime voice sessions, charged per turn, and the Wiro Studio chat. See failed tasks and when you're charged and the error handling guide.
