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:
{ "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:
{
"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
| Status | Meaning |
|---|---|
400 | The body is not JSON (type invalid_json), a compressed body does not decompress (bad_encoding), or a multipart body is malformed (bad_multipart). |
400 | An 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. |
401 | Missing, wrong, expired or revoked API token. |
402 | Type out_of_credit: the account has no prepaid credit left. Top up in the console. Do not retry until you have. |
402 | Type 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. |
403 | Type model_not_allowed: the key's workspace is not allowed to use that model. Change the workspace's models in the console. |
404 | Unknown path. |
410 | Type 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. |
411 | No Content-Length header. |
413 | Type body_too_large: the body is over 32 MiB, as sent or once decompressed. |
415 | Type unsupported_encoding: a Content-Encoding other than gzip or zstd, or more than one. The Accept-Encoding header lists what is accepted. |
422 | A 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. |
422 | Type invalid_image_budget: image_budget is not 70, 140 or 280. |
422 | Type 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. |
429 | Type 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. |
502 | The model behind the endpoint did not respond. Retry with backoff. |
503 | The 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
| Limit | Value |
|---|---|
| Request body | 32 MiB as sent, and 32 MiB once decompressed |
| Request bytes per key | 256 MiB a minute |
| Questions per request | 256 (4,096 options over them) |
| Options or levels per question | 256 |
| Images | 8 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 model | The 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 window | 24,576 tokens on the hosted Myles-G 31B; 32,768 on the hosted Myles-G 12B |
| Hosted key | 1,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.

