Skip to content

Errors

Every error response, its type, the limits behind it and how to retry safely.

Every error comes back as JSON with a message and, for most errors, a type:

json
{ "error": "what went wrong", "type": "out_of_credit" }

A 422 also carries detail, a list naming the field at fault as a path from the body, so a program can point at it:

json
{
  "error": "question 'eligible': noul criteria need both sides: the no (false) side is missing",
  "type": "invalid_question",
  "detail": [{ "loc": ["body", "questions", "eligible", "criteria"], "msg": "...", "type": "invalid_question" }]
}

Status codes

StatusMeaning
400The body is not JSON (type invalid_json), a compressed body does not decompress (bad_encoding), or a multipart body is malformed (bad_multipart).
400An image in assets cannot be used. Types invalid_assets, unsupported_image_format, invalid_image, image_too_large, image_dimensions, too_many_images, unreferenced_asset and image_reference_truncated; the message names the asset.
401Missing, wrong, expired or revoked API token.
402Type out_of_credit: the account has no prepaid credit left. Top up in the console. Do not retry until you have.
402Type budget_exceeded: the key's workspace has reached its monthly budget. Raise the budget in the console under Workspaces, or wait for the next month. Budgets reset on the 1st, UK time.
403Type model_not_allowed: the key's workspace is not allowed to use that model. Change the workspace's models in the console.
404Unknown path.
410Type model_retired: the model id names a build that has been retired (for example myles-g-31b-20261024, retired on 27 October 2026). The body names the successor, retired_on and migration_url, and the Link header points to the successor. Nothing is answered: send the moving id (such as myles-g-31b) or the successor. See Models.
411No Content-Length header.
413Type body_too_large: the body is over 32 MiB, as sent or once decompressed.
415Type unsupported_encoding: a Content-Encoding other than gzip or zstd, or more than one. The Accept-Encoding header lists what is accepted.
422A question cannot be answered: no state or no questions, an unknown type, missing criteria for a choice or score, noul criteria that do not name both sides (or use keys other than true/yes and false/no), a label listed twice, more questions or options than the model takes (256 questions, 256 options a question, 4,096 options a request), or a question and its options too long for the model's context window on their own (context_length_exceeded; on Myles-G 31B also a state too long for the context window, which Myles-G 12B trims to fit instead, see State). detail names the field.
422Type invalid_image_budget: image_budget is not 70, 140 or 280.
422Type images_not_supported: the model asked for does not read images (only Myles-G 12B and Myles-G 31B do). Send the request without assets.
429Type rate_limited: over your key's per-minute limit, of requests or of request bytes. Type daily_limit_reached: over a daily cap. The Retry-After header (and retry_after in the body) gives the seconds to wait.
502The model behind the endpoint did not respond. Retry with backoff.
503The model is not available right now: the endpoint is switched off for maintenance, or no healthy server for that model is answering (type model_unavailable), or the server is busy with other large requests (type busy). The Retry-After header says when to try again.

Limits

LimitValue
Request body32 MiB as sent, and 32 MiB once decompressed
Request bytes per key256 MiB a minute
Questions per request256 (4,096 options over them)
Options or levels per question256
Images8 per request and 8 shown in one question; PNG or JPEG, up to 16 MiB, 280 to 1568 pixels a side (details)
State read by the modelThe whole state when the request fits the context window; otherwise, on Myles-G 12B, its beginning and end, trimmed to fit and flagged with "truncated": true, and on Myles-G 31B a 422 context_length_exceeded. With images: the first 20,000 characters, flagged when cut
Context window24,576 tokens on the hosted Myles-G 31B; 32,768 on the hosted Myles-G 12B
Hosted key1,200 requests a minute by default, or the workspace's own per-key limit; no daily cap (more on request)

Retrying

Retry 429, 502 and 503 with backoff (for example 1, 2, then 4 seconds), or after the Retry-After seconds when the answer carries them. Do not retry 400, 401, 410, 411, 413, 415 or 422 without changing the request. Do not retry 402 or 403 at all: they persist until someone changes the account or workspace in the console.

One exception: a batch submission (POST /v1/batches) that ends in a 502 or a lost connection may already have been queued. List your batches before you send it again, or it may be answered and billed twice. A 429 rate_limited or a 503 stored nothing and is safe to retry.

Privacy

The endpoint does not store the states, questions or answers of live requests. Its access log records only the method, the path, the status, the time taken and the request id. A batch is stored, encrypted, until it is deleted; see Retention and deletion, and the rest of the Batches page for the batch errors.

Request id

Every response carries an X-Request-Id header (req_ and 32 hexadecimal digits). Quote it when you contact support about a call: it finds the call in our logs without anyone seeing what you sent.