> ## Documentation Index
> Fetch the complete documentation index at: https://docs.rhizomeai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Errors

> Error codes, request ids, and what to do about each

## Error body

API v3 answers every error with an HTTP status and this body:

```json theme={null}
{
  "error": {
    "code": "invalid_filter",
    "message": "filters.fda_483.fei_number: 123 is not of type 'string'",
    "field": "filters.fda_483.fei_number",
    "request_id": "req_3f9c2a7d1e8b4c6a0f5d2e1b"
  }
}
```

| Field | Description |
| - | - |
| `code` | What went wrong, from the list below. Branch on `code`, not on `message`. |
| `message` | What went wrong, for a person. The wording can change. |
| `field` | The request field at fault, as a dotted path (`keywords`, `filters.fda_483`). Only when one field is at fault. |
| `request_id` | The id of this request. Same as the `X-Request-Id` header. |

The [legacy endpoints](/api-reference/search) answer errors with `{"error": "<message>"}` and no code.

## Request ids

Every API v3 response, success or error, carries an `X-Request-Id` header (`req_` and 24 hex characters). Include it when you contact [support@rhizomeai.com](mailto:support@rhizomeai.com): it finds your request in our logs.

## Codes

| Status | Code | Meaning | What to do |
| - | - | - | - |
| 400 | `invalid_request` | The request doesn't parse or a value is out of range: no `keywords`, `limit` over 50, a bad page range, no `message`, a malformed `Idempotency-Key`, a body that isn't JSON. | Fix the request. `field` names the value. |
| 400 | `unknown_dataset` | A dataset id in `datasets` doesn't exist. | Check the id against [`GET /api/v3/datasets`](/api-reference/v3/datasets). |
| 400 | `invalid_filter` | A filter the dataset doesn't list, a value of the wrong type, filters for a dataset the search doesn't cover, or a date given both at the top level and in `filters`. | Check the dataset's filters on its [Datasets](/datasets/index) page. |
| 401 | `missing_api_key` | No `x-api-key` header. | Send your key. See [Authentication](/authentication). |
| 401 | `invalid_api_key` | The key doesn't exist or was deleted. | Create a key in the [API Keys console](https://rhizomeai.com/api-keys). |
| 402 | `quota_exhausted` | A conversation message on a free plan whose monthly questions are used up. | Upgrade at [rhizomeai.com](https://rhizomeai.com/#pricing), or wait for next month. |
| 403 | `forbidden` | The document's dataset needs an enterprise plan, or a conversation's Word, Excel or PowerPoint file needs a paid plan. | Contact support to upgrade. |
| 404 | `not_found` | No document, or no conversation in your account, has this id; or the path isn't an API v3 endpoint. | Use a `document_id` from a search result, a `conversation_id` your account created, and a path from this reference. |
| 405 | `method_not_allowed` | The route doesn't take this method. The `Allow` header names the ones it takes. | Use that method. |
| 409 | `turn_in_flight` | The conversation is still running its previous message. | Wait until polling it shows it finished, then send. |
| 409 | `idempotency_key_in_use` | A request with this `Idempotency-Key` is still being processed. | Retry shortly; you get that request's result. |
| 413 | `payload_too_large` | The request body is over 1 MB. | Send a smaller body. |
| 422 | `idempotency_key_reused` | The `Idempotency-Key` was already used with a different message. | Use a new key for a new message. |
| 429 | `rate_limited` | The key sent 50 requests in the last minute. | Wait `Retry-After` seconds. See [Rate Limits](/rate-limits). |
| 429 | `concurrent_search` | Another search from your account is still running. | Wait for it to finish, or `Retry-After` seconds, then send this one. |
| 429 | `concurrent_conversations` | Your account has 3 conversations running, counting those on rhizomeai.com. | Wait for one to finish, or `Retry-After` seconds, then send this one. |
| 502 | `upstream_error` | A service the API depends on failed. | Retry later. |
| 503 | `busy` | Too many searches are running on the server. | Wait `Retry-After` seconds and retry. |
| 503 | `upstream_error` | Ranking the results failed. | Wait `Retry-After` seconds and retry. |
| 503 | `timeout` | Ranking the results ran out of time. | Wait `Retry-After` seconds and retry. |
| 504 | `timeout` | The search or the document read took too long. | Retry; for a search, fewer `datasets` or narrower `keywords` run faster. |
| 500 | `internal_error` | Something failed on our side. | Retry later; if it persists, send support the `request_id`. |

A 429 or a 503 always has a `Retry-After` header, in seconds. A 429 means you should slow down; a 503 means the server is busy, whatever you send.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.