DeepSeek requests throttling, slow, or returning 429 under load? DeepSeek throttles dynamically — so:
- Raise your client timeout (e.g. 120s). Under load DeepSeek slows responses rather than rejecting them; a short timeout aborts good requests.
- Back off and retry transient
429s with exponential backoff + jitter, capped. - Confirm it’s not balance — an empty prepaid balance is a billing error, not throttling. See insufficient balance.
DeepSeek doesn’t enforce rate limits the way OpenAI, Anthropic, and Google do. Instead of a published per-minute ceiling that returns 429 the moment you cross it, DeepSeek throttles dynamically — when capacity is tight, requests slow down or queue. You’ll see occasional 429s under heavy platform load, but the dominant failure mode is latency, not rejection. That changes the fix: design for slow responses and transient retries, not for a fixed number.
DeepSeek’s throttling behavior changes over time and isn’t published as a fixed tier table. Treat this as guidance and confirm current behavior in DeepSeek’s API documentation.
What’s actually happening
| OpenAI / Anthropic / Gemini | DeepSeek | |
|---|---|---|
| Limit shape | Published RPM/TPM | Dynamic — no fixed per-minute ceiling |
| Under heavy load | 429 once over the ceiling | Slower / queued responses; sometimes 429 |
| Primary failure mode | Rejection | Latency |
| Plan for | Headroom under a number | Generous timeouts + retries |
Common causes
- Peak-load throttling. During high demand, responses slow and a saturated platform can return
429. Transient — back off and retry. - Short client timeouts. A 10–30s timeout aborts a perfectly good request that was just slow under load, which looks like a failure in your logs.
- Retry storms. Aggressively re-firing slow requests multiplies the load you’re already struggling against.
- Empty balance (not throttling). A
402-class “insufficient balance” is a billing stop — retrying won’t help. See insufficient balance.
How to fix it
DeepSeek exposes an OpenAI-compatible API, so you reuse the standard retry/timeout patterns — just tuned for latency:
from openai import OpenAI
import openai, time, random
client = OpenAI(
base_url="https://api.deepseek.com",
api_key="$DEEPSEEK_API_KEY",
timeout=120, # allow for slow responses under load
max_retries=0, # manage retries ourselves
)
def chat(messages, model="deepseek-chat", attempts=5):
for i in range(attempts):
try:
return client.chat.completions.create(model=model, messages=messages)
except (openai.RateLimitError, openai.APITimeoutError) as e:
if i == attempts - 1:
raise
time.sleep((2 ** i) + random.random())
print(chat([{"role": "user", "content": "Hello"}]).choices[0].message.content) import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.deepseek.com",
apiKey: process.env.DEEPSEEK_API_KEY,
timeout: 120_000,
maxRetries: 0,
});
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
async function chat(messages, model = "deepseek-chat", attempts = 5) {
for (let i = 0; i < attempts; i++) {
try {
return await client.chat.completions.create({ model, messages });
} catch (err) {
const status = err?.status;
if (status !== 429 && err?.name !== "APIConnectionTimeoutError") throw err;
if (i === attempts - 1) throw err;
await sleep(2 ** i * 1000 + Math.random() * 1000);
}
}
}
console.log((await chat([{ role: "user", content: "Hello" }])).choices[0].message.content); Levers that matter
- Generous timeouts so slow-but-valid responses complete instead of aborting.
- Capped backoff with jitter for transient
429s — never uncapped retries. - Off-peak scheduling. DeepSeek has historically offered off-peak pricing discounts; shifting batch work off-peak is cheaper and usually faster.
- Keep balance funded so a billing stop never looks like throttling.
- Failover to another provider when you need guaranteed throughput.
Timing out and re-firing the same slow request doubles the load. Raise the timeout and use capped backoff instead of hair-trigger retries.
Related
- The billing-side error: insufficient balance.
- The reference behind this page: DeepSeek rate limits and the rate limits comparison.
- Same backoff pattern on another provider: OpenAI 429.
DeepSeek’s capacity is latency-variable by design. If you need guaranteed throughput, spread load across providers — OpenRouter routes across providers behind one OpenAI-compatible API. (Affiliate link.)
What to do next
- Raise your client timeout so slow responses complete.
- Add capped backoff with jitter for transient
429s. - Move bulk work off-peak for lower cost and better throughput.
- Rule out balance — confirm it’s throttling, not an insufficient balance stop.