Limits & errors
Rate limits
| Limit | Default | With input storage consent |
|---|---|---|
| Requests per minute (RPM) | 60 | 120 (×2) |
| Tokens per minute (TPM) | 200,000 | 400,000 (×2) |
| Tokens per day | 4,000,000 | 40,000,000 (×10) |
All limits apply per account. Creating more keys does not raise them; all your keys share the same limits. The embeddings, sparse embeddings, and rerank APIs share them too.
- One request can batch up to 8 texts (100 documents for rerank) and still counts as a single request. When you batch long documents, you will reach TPM before RPM.
- Per-minute limits refill continuously rather than resetting each minute. At 60 RPM, for example, one request comes back every second.
- Tokens are deducted after each request by the actual usage (the response's
usage). Rerank counts the query once per document. A request larger than your remaining tokens still goes through, but your balance goes negative and later requests get429until it refills. - The daily limit resets at midnight Korea time (KST).
- If you allow input storage under the Data policy, per-minute limits double and the daily token limit goes up 10×; you can change this at any time in Dashboard → Settings. Your current limits and usage are shown in Dashboard → Usage.
Higher limits
If your research or product needs more, request higher limits. Your account's recent usage is attached, and we raise limits per account after review. For organization-wide use or dedicated capacity, contact us about enterprise use.
Response headers
Successful responses and rate-limit errors carry these headers.
| Header | Description |
|---|---|
x-ratelimit-limit-requests | Requests-per-minute limit |
x-ratelimit-remaining-requests | Requests remaining right now |
x-ratelimit-limit-tokens | Tokens-per-minute limit |
x-ratelimit-remaining-tokens | Tokens remaining right now |
retry-after | On rate-limit errors, seconds to wait before retrying |
Error format
Errors use the OpenAI format.
{
"error": {
"message": "Rate limit reached for requests per minute (60 RPM). Retry after 1s.",
"type": "rate_limit_error",
"param": null,
"code": "rate_limit_exceeded"
}
}| Status | code | Meaning | What to do |
|---|---|---|---|
| 400 | null | Invalid parameter; param names the field | Fix the request |
| 400 | context_length_exceeded | A text to embed is longer than 8,192 tokens (sparse embeddings and rerank truncate instead) | Split the text and retry |
| 401 | missing_api_key | No Authorization header | Add your key |
| 401 | invalid_api_key | Wrong or revoked key | Check your keys in the dashboard |
| 404 | model_not_found | Unknown model ID, or a model for another endpoint (the message names the right one) | Check GET /models |
| 410 | model_retired | The model has been retired | Move to the replacement in the message (model lifecycle) |
| 429 | rate_limit_exceeded | You exceeded your limits | Wait for retry-after, then retry |
| 429 | overloaded | The server is temporarily busy | Retry shortly |
| 502 | worker_error | Internal error in the inference server | Retry shortly; if it persists, email kure.nlpai@gmail.com |
| 503 | no_worker_available, worker_failed, api_unavailable | Inference servers are restarting or under maintenance | Wait for retry-after, then retry |
| 504 | timeout | Inference timed out | Retry with smaller input |
Retries
429 and 5xx errors usually succeed on retry. Wait for retry-after when present; otherwise use exponential backoff. The OpenAI SDKs do this by default (max_retries, 2 by default).
client = OpenAI(
base_url="https://kure.kullm.ai/api/v1",
api_key=os.environ["KURE_API_KEY"],
max_retries=5,
)400, 401, and 404 will fail the same way again, so fix the request instead.
