Limits and errors
Nenavi pays for the models that extract entities and claims from your text, so every project has hard caps. These are the alpha defaults. They can change, and the operator can raise the limits of one project.
Limits
| Limit | Default | What counts | Error |
|---|---|---|---|
| Requests per minute | 60 per key | Every request the service accepts | 429 rate_limited, with Retry-After |
| Content size | 32 KiB | The content of one store or ingest | 413 content_too_large |
| Ingest calls per month | 20,000 | Ingests, fast ingests, stores that extract, each memory a re-ingest takes, and organize and extraction re-runs | 429 monthly_ingest_calls_exceeded |
| Content tokens per month | 2,000,000 | The tokens in the content of stores and ingests | 429 monthly_content_tokens_exceeded |
| Memories per project | 50,000 | Stored memories, plus saved text that is not indexed yet | 429 max_nodes_exceeded |
Months are UTC calendar months.
In the console, an organization can have up to 10 projects, and a project can have up to 5 active keys. A deleted project still counts toward the 10 until its seven day grace period ends. Reaching either limit returns 409 limit_exceeded from the console’s API.
How the counts work
- A store extracts by default, so it counts as one store call and one ingest call. Send
"extract": falseto store text with no extraction. Then it counts as a store call and its tokens only. - A fast ingest batch counts as one ingest call, however many items it holds. It adds the tokens of every item.
- A retry of a fast ingest batch with the same
Idempotency-Keyand the same items costs one request. It does not count again toward the monthly limits. - A request that the service refuses before doing any work is not counted. Neither is a request that the engine answers with a
4xxerror. - The check happens before the work. A request is refused when it would take the month past the limit, so you can reach a limit exactly.
- The counts are close, not exact. With several servers, a project can pass a monthly limit by about one minute of traffic. The rate limit is also kept per server, so the effective limit can be higher than 60 per minute.
See your usage
The console’s Usage tab shows this month’s requests, store, ingest, retrieve, and MCP calls, and content tokens, with a bar against the two monthly limits. The same numbers are at GET /v1/usage, which needs a key. It takes no engine slot, so it is cheap to poll. It counts as one request.
The number of memories is at GET /v1/stats.
Errors
Every error from the hosted layer has a detail and a reason_code. Errors that the engine raises keep the engine’s { "detail": "..." } shape.
| Status | reason_code | What to do |
|---|---|---|
401 | api_key_missing | Send Authorization: Bearer <key>. |
401 | api_key_invalid | Check the key. Copy it again from where you saved it. |
401 | api_key_revoked | Create a new key in the console. |
401 | project_deleted | The project was deleted. |
413 | content_too_large | Send less than 32 KiB in one content. Split the text. |
413 | body_too_large | Send a smaller body. The limit is 256 KiB, or 4 MiB on batch routes. |
422 | content_invalid | The text cannot be encoded as UTF-8. |
422 | wait_for_extraction_unsupported | Remove wait_for_extraction. Poll the extraction status instead. |
422 | privacy_policy_unsupported | Remove the policy. |
422 | reembed_unsupported | This route is off in the alpha. |
422 | limit_out_of_range | Change limit to a value in the range on The API. |
429 | rate_limited | Wait the number of seconds in Retry-After. |
429 | monthly_ingest_calls_exceeded | Wait for the next month, or send "extract": false to store without extraction. |
429 | monthly_content_tokens_exceeded | Wait for the next month. |
429 | max_nodes_exceeded | Archive memories you no longer need. The count is refreshed about once a minute. |
409 | reingest_running | A re-ingest for this user is already working. The detail names it. |
503 | extraction_disabled | Extraction is off on the service. Fast ingest still works. |
503 | database_unavailable | Wait a moment and send the request again. |
503 | lease_unavailable | The service was busy. Wait a moment and send the request again. |
To raise a limit, contact the maintainer. The address is on the privacy page .