# Limits

> Every size limit of a decide request, the error each one returns, and the model limits from the models endpoint.

This page lists every size limit of a `decide` request and the error you get when you pass it. Rate limits are on their own page: [Rate limits](/docs/reference/rate-limits/).

## Request size limits

| Limit | Value | Error |
| --- | --- | --- |
| Request body | 256 KiB | 413 `body_too_large` |
| State tokens, after rendering | 16,384 | 413 `state_too_long` |
| Tokens per rendered question | 4,096 | 413 `question_too_long` |
| Billable tokens per request | 16,384 | 413 `request_too_long` |
| Billable tokens of all questions together | 4,096 | 413 `request_too_long`, with `param` `questions` |
| Questions per request | 32 (at least 1) | 422 `too_many_questions` |
| Options per pick | 255 (at least 1) | 422 `too_many_options` |
| Levels per rate | 2 to 10 | 422 `invalid_levels` |

Token limits are counted after rendering and tokenizing, with the tokenizer of the requested model family. They match the billed counts exactly: `state_tokens`, the tokens of each question, and `input_tokens` for the whole request.

On 26 September 2026 the request limits went down from 32,768 billable tokens (with no limit on the questions together) to the values above, so that every allowed request is answered on the GPU in time. The slowest request they allow, a 12,288-token state with one 4,096-token question, takes about 3 seconds on the GPU. Questions cost more per token than the state, because the model reads all of them in one pass that attends to the whole state.

## State

| Limit | Value |
| --- | --- |
| A string state | 1 to 65,536 characters, not only whitespace |
| A JSON object state | At least 1 field |
| JSON nesting | At most 32 levels deep |
| JSON keys | 1 to 256 characters each |
| A JSON array state | At least 1 item |

A state that breaks one of these gives 422 `invalid_value`; a state of the wrong JSON type, such as a number, gives 422 `invalid_type`. A key repeated inside the same JSON object gives 400 `duplicate_key`. See [State](/docs/concepts/state/).

## Questions

| Field | Limit | Error |
| --- | --- | --- |
| Question id | Matches `^[A-Za-z][A-Za-z0-9_-]{0,63}$` | 422 `invalid_question_id` |
| `instructions` | 1 to 4,000 characters, not only whitespace | 422 `invalid_value` |
| `criteria` as a string | 1 to 4,000 characters, not only whitespace | 422 `invalid_value` |
| `criteria` as a list | 1 to 20 strings, each 1 to 500 characters and not only whitespace | 422 `invalid_value` |
| Pick option label | 1 to 100 characters, no leading or trailing whitespace | 422 `invalid_value` |
| Pick option labels | Unique: a label repeated character for character gives 400 `duplicate_key`; labels equal only after Unicode NFC normalization or ignoring case (`Billing` and `billing`) give 422 `duplicate_label` | 400 `duplicate_key`, 422 `duplicate_label` |
| Pick option description | `null`, or 1 to 1,000 characters, not only whitespace | 422 `invalid_value` |
| Rate level | 1 to 200 characters, no leading or trailing whitespace | 422 `invalid_value` |
| Rate levels | 2 to 10 strings, unique after Unicode NFC normalization and ignoring case | 422 `invalid_levels` |
| `min_confidence` | 0 to 1 | 422 `invalid_min_confidence` |

Where the table shows only the type `validation`, the error `code` names the rule that failed, and `param` names the field.

## Headers

| Header | Limit | Error |
| --- | --- | --- |
| `idempotency-key` | 1 to 255 printable ASCII characters, without spaces | 400 `invalid_header` |
| `x-client-request-id` | 1 to 128 printable ASCII characters, without spaces | 400 `invalid_header` |

## Model limits

Each model version reports its limits in `GET /v1/models`. The values below are the ones in the contract. Read them from the endpoint rather than hard-coding them: limits may change within v1, as they did on 26 September 2026. The limit on all questions together (4,096 tokens) is not in the endpoint yet.

| Field | Value | Meaning |
| --- | --- | --- |
| `max_state_tokens` | 16384 | State tokens after rendering. |
| `max_question_tokens` | 4096 | Tokens per rendered question. |
| `max_total_tokens` | 16384 | Billable tokens per request. |
| `max_questions` | 32 | Questions per request. |
| `max_options` | 255 | Options per pick. |
| `max_levels` | 10 | Levels per rate. |
| `exact_option_probabilities` | 255 on GPU versions, 20 on fallback versions | How many options of a pick get exact probabilities. See [Fallback and served_by](/docs/concepts/fallback/#what-differs-on-the-fallback). |

## Other limits

| Limit | Value |
| --- | --- |
| `GET /v1/usage` range | Up to 93 days by day, up to 7 days by hour |
| Top-up amount | EUR 10 to EUR 2,500 per top-up |
| Top-ups in an account's first 30 days | EUR 500 in total (`422 top_up_limit_exceeded`) |
| Opt-in content logging | 1 to 30 days of retention |
| API key name | 1 to 64 characters |
