DeepSeek API 429 "Rate Limit Reached" and 503 "Server Overloaded": the concurrency cap behind both, and your options
DeepSeek does not meter requests per minute or tokens per minute the way Groq, Gemini or OpenAI do. It meters how many of your requests are open at the same moment, across the whole account, and returns 429 Rate Limit Reached when that number passes the cap. That is why a single developer rarely sees this error and a proxy, a SaaS backend or an agent fleet sees it constantly. The 503 Server Overloaded and 500 Server Error responses are different: they mean DeepSeek itself is out of capacity. DeepSeek's own error-code page gives the same advice for the 429 that we would: "temporarily switch to the APIs of alternative LLM service providers".
Last verified September 21, 2026 against DeepSeek docs: error codes, DeepSeek docs: rate limit and isolation, DeepSeek docs: models and pricing, ollama/ollama #15832: deepseek-v4-pro:cloud returns HTTP 500 on ~70% of requests, anomalyco/opencode #35163: 502 and Insufficient Balance on OpenCode Go, July 3, 2026 · 6 min read
| Provider | DeepSeek API (api.deepseek.com), and products that put many users behind one DeepSeek account, such as OpenCode Zen and Go |
| HTTP status | 429 Too Many Requests, 503 Service Unavailable, and 500 under the same conditions |
| Messages | Rate Limit Reached · Server Overloaded · Server Error |
| Models | deepseek-v4-pro (cap 500 in flight) and deepseek-flash (cap 2,500 in flight) |
| When it happens | 429: the account has more requests in flight than its cap. 503 and 500: DeepSeek's capacity is full, most often in its peak-price hours and after a model release |
| Can you wait it out? | 429 from your own concurrency: yes, in seconds, once requests finish. 503 and 500: sometimes, in minutes to hours. 429 through a reseller: no, the cap belongs to the reseller's account |
- 429 on your own account: you have more than 500 (V4 Pro) or 2,500 (Flash) requests open at once. Cap your client's concurrency below that and the error stops; DeepSeek will raise the cap on request, free.
- 429, 502 or "Insufficient Balance" through OpenCode Go/Zen or another reseller: the cap and the balance are theirs, shared by all their users. Nothing you do on your side changes it.
- 503 and 500: DeepSeek is full. Retry with backoff, or fail over to the same open-weight model on other GPUs. DeepSeek V4 is open weights; it is not only served from China.
What the errors look like
{
"error": {
"message": "Rate Limit Reached",
"type": "rate_limit_error",
"param": null,
"code": "rate_limit_reached"
}
}{ "error": { "message": "Server Overloaded", "type": "server_error", "param": null, "code": "server_overloaded" } }
{ "error": { "message": "Server Error", "type": "server_error", "param": null, "code": "server_error" } }All three use the OpenAI envelope, so the OpenAI SDKs raise RateLimitError for the 429 and InternalServerError for the 500 and 503, and both SDKs retry twice by default before you see anything. If your logs show the exception, the retries already failed.
Two other DeepSeek errors travel with these in bug reports and are worth telling apart: 402 Insufficient Balance (the account is out of prepaid funds) and 401 Authentication Fails (wrong key). Neither is a capacity problem, and neither is fixed by waiting.
The concurrency cap, and why proxies hit it first
From DeepSeek's rate-limit page, as of September 21, 2026:
| Model at api.deepseek.com | Concurrent requests per account | What counts | Over the cap |
|---|---|---|---|
deepseek-flash | 2,500 | Every request from send until the last token, across all API keys and all user_id values on the account | HTTP 429 |
deepseek-v4-pro | 500 | Same | HTTP 429 |
Three details in that table explain most of the reports on GitHub.
- It is per account, not per key. Creating more keys does nothing. DeepSeek's
user_idfield isolates cache and content safety per end user, but alluser_idvalues still add up to the account's cap. - A request counts until the last token arrives. A long reasoning answer on V4 Pro can hold a slot for a minute. 500 slots at a minute each is about 500 requests per minute of sustained throughput, less if answers are long.
- Resellers put thousands of users behind one account. OpenCode Go and Zen call DeepSeek with their own key. When their users collectively exceed the cap, every one of those users gets the 429, and when the reseller's prepaid balance runs dry, every user gets Insufficient Balance for a model they never paid DeepSeek for. The July 3, 2026 OpenCode outage is this shape. Ollama Cloud's 70% failure rate on
deepseek-v4-pro:cloudin April 2026 shows the same symptom from a shared pool, whatever sat behind it.
DeepSeek raises the cap on request through a capacity expansion form, at no charge. If you run your own account and your load is steady, that is the right first move.
Fix 1: cap your own concurrency and back off
If you call DeepSeek directly, keep the number of open requests under the cap with a semaphore, and treat 429 as a signal to wait, not to retry at once. The OpenAI SDKs expose max_retries; set it to 4 or 5 with the default exponential backoff and most bursts clear on their own. Ask DeepSeek for a higher cap if you need more than 500 concurrent V4 Pro requests day to day.
This does nothing for 503 and 500. Those mean the service is full regardless of your own load, and the only options are to wait or to go elsewhere.
Fix 2: use off-peak hours, or Flash instead of Pro
DeepSeek prices every model in two bands, peak and off-peak. If the work is batchable, running it off-peak halves the price, and a quieter service is less likely to answer 503. If the task does not need V4 Pro, deepseek-flash has five times the concurrency cap and a fifth of the price.
Fix 3: fail over to the same model on other GPUs
DeepSeek V4 Pro and V4 Flash are open-weight models. DeepSeek's API is one place that serves them; it is not the only one. Because the wire format is the same, a second client with a different base_url is a complete fallback:
import os
from openai import OpenAI, RateLimitError, InternalServerError, APIStatusError
deepseek = OpenAI(base_url="https://api.deepseek.com", api_key=os.environ["DEEPSEEK_API_KEY"])
backup = OpenAI(base_url="https://api.inferenceapis.com/v1", api_key=os.environ["INFERENCEAPIS_API_KEY"])
def chat(messages, **kw):
try:
return deepseek.chat.completions.create(model="deepseek-v4-pro", messages=messages, **kw)
except (RateLimitError, InternalServerError) as e: # 429, 500, 503
# same open-weight model, different GPUs, no concurrency cap
return backup.chat.completions.create(model="deepseek-ai/DeepSeek-V4-Pro", messages=messages, **kw)
except APIStatusError as e:
if e.status_code == 402: # Insufficient Balance: failing over is the only option
return backup.chat.completions.create(model="deepseek-ai/DeepSeek-V4-Pro", messages=messages, **kw)
raiseOn our endpoint the ids deepseek-v4-pro, deepseek-flash, deepseek-chat and deepseek-reasoner are all accepted, so the model string can stay the same as at DeepSeek. There is no concurrency cap and no per-minute meter; the only limit is the prepaid balance, and a saturated backend returns a 429 with Retry-After rather than a quota message. On September 21, 2026 we sent 20 simultaneous V4 Pro requests from one key as a check; all 20 returned 200.
# DeepSeek
curl -s https://api.deepseek.com/chat/completions -H "Authorization: Bearer $DEEPSEEK_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-pro","messages":[{"role":"user","content":"Say ok"}]}'
# Inference APIs: same model, ids deepseek-v4-pro and deepseek-ai/DeepSeek-V4-Pro both accepted
curl -s https://api.inferenceapis.com/v1/chat/completions -H "Authorization: Bearer $INFERENCEAPIS_API_KEY" -H "Content-Type: application/json" \
-d '{"model":"deepseek-v4-pro","messages":[{"role":"user","content":"Say ok"}]}'Two things to know before switching. First, DeepSeek's deepseek-flash is served by V4.1 Flash today; ours maps deepseek-flash the same way, and deepseek-ai/DeepSeek-V4-Flash is the 0731 build if you need it. Second, thinking defaults match DeepSeek's: on by default, off with reasoning_effort: "none".
What it costs, side by side
| Per 1M tokens | DeepSeek, deepseek-v4-pro (off-peak / peak) | Inference APIs, DeepSeek V4 Pro | DeepSeek, deepseek-flash (off-peak / peak) | Inference APIs, DeepSeek V4 Flash |
|---|---|---|---|---|
| Input, cache miss | $0.66 / $1.32 | $1.60 | $0.15 / $0.30 | $0.19 |
| Input, cache hit | $0.022 / $0.044 | $0.13 | $0.003 / $0.006 | $0.04 |
| Output | $1.98 / $3.96 | $3.40 | $0.60 / $1.20 | $0.38 |
| Concurrency cap | 500 per account | None | 2,500 per account | None |
| Model page | — | DeepSeek V4 Pro: measured speed, tool-calling checks | — | DeepSeek V4 Flash: measured speed, tool-calling checks |
| Where it runs | DeepSeek, China | Together AI GPUs, United States | DeepSeek, China | Together AI GPUs, United States |
| Retention | DeepSeek's privacy policy | Zero, see /trust | DeepSeek's privacy policy | Zero, see /trust |
DeepSeek's figures are from its pricing page on September 21, 2026; peak and off-peak windows are defined there. Ours are flat around the clock. On price alone, DeepSeek off-peak wins on every line, and on cache hits it wins by a lot. The case for a US host is throughput without a cap, a predictable price, location and retention.
If you hit this through OpenCode or another product
The 429, 502 and Insufficient Balance you see are the reseller's relationship with DeepSeek, not yours. Their status page or GitHub issues will show the same error for everyone at the same time, which is the tell. You can wait for them to top up or scale, or bring your own provider: OpenCode accepts any OpenAI-compatible provider in opencode.json (our guide), and most other tools have an equivalent. The OpenCode Go RegionError entry covers the related China-hosting switch.
Frequently asked questions
Does adding API keys raise my DeepSeek concurrency limit?
No. DeepSeek states the cap is calculated at the account level regardless of which key is used. Only a capacity expansion request raises it.
Is DeepSeek's 429 a per-minute or per-day quota?
Neither. It is concurrent requests in flight. As soon as enough of your open requests finish, new ones are accepted. There is no daily reset to wait for.
Why do I get 500 instead of 503 when DeepSeek is overloaded?
DeepSeek documents 503 for overload and 500 for a server issue, but reports during busy periods show both, and resellers in front of DeepSeek often turn either into a 502 from their own gateway. Treat all three as "capacity, retry with backoff or fail over".
Are the DeepSeek models on Inference APIs the same weights?
Yes: the public DeepSeek V4 Pro (0813), V4 Flash (0731) and V4.1 Flash releases, served on Together AI GPUs in the United States. Precision and serving details per model are on the trust page.
Does Inference APIs have any rate limit at all?
We do not meter requests or tokens per minute or per day, and there is no concurrency cap. The prepaid balance is the only limit; a request returns 402 when it reaches zero. If a GPU backend is momentarily saturated you get a 429 with Retry-After, and retrying works.
Where Inference APIs fits
Option 3 is what we sell: DeepSeek V4 Pro, V4 Flash and V4.1 Flash on GPUs in the United States, with no concurrency cap and no per-minute or per-day meter. The model ids you already send work unchanged, and a new account starts with $1 of credit, enough to run the fallback above for real before you decide. We are not cheaper than DeepSeek off-peak, and the table above says so. The reason to pay more is a fixed price, a US location, zero retention, and requests that do not queue behind everyone else on one account.
Something changed or wrong? Tell us and we will re-verify the entry.
