OpenAI OpenAI API HTTP 429 Billing 5 min read

OpenAI 429 insufficient_quota — It's Billing, Not a Rate Limit

The message reads "You exceeded your current quota, please check your plan and billing details." Despite the 429 status, this is not a rate limit — it means your account has no available credit. This guide shows how to confirm it is billing, add credit, and get requests flowing again.

OpenAI API live status

OpenAI API — live status

Updated every 5 minutes · Full incident history →

Check now →

What does insufficient_quota mean?

insufficient_quota is returned with HTTP 429, but it is not a rate limit. It means your account has no available credit or quota. That happens when any of these are true:

  • Your prepaid credit balance is $0.
  • You have no payment method on file.
  • Your free-trial credits expired (they last roughly 3 months and cannot be reused).
  • You hit a hard monthly usage limit you set earlier.

Because it is a billing state, retrying or exponential backoff will not fix it — unlike rate_limit_exceeded, which does clear if you slow down. The two errors are easy to confuse because they share the same HTTP status:

error.code HTTP Meaning Fix
insufficient_quota 429 No credit / quota on the account (billing) Add a payment method, buy credits
rate_limit_exceeded 429 Sending requests too fast (throughput) Slow down, exponential backoff
invalid_api_key 401 Bad, revoked, or missing key Check key at platform.openai.com
server_error 500 OpenAI-side server problem Retry; check /service/openai

The critical takeaway: insufficient_quota and rate_limit_exceeded both return HTTP 429, but the error.type / error.code in the JSON body is what tells them apart. One says stop and pay; the other says slow down.

5 steps to fix insufficient_quota

1

Confirm it IS billing, not a rate limit

Before you change anything, read the error.code in the 429 response body. In the official OpenAI SDKs, both insufficient_quota and rate_limit_exceeded raise RateLimitError — so you must branch on the code, not the exception type. Stop on billing; back off on rate limits:

# Python — branch on error.code, not just the exception type
from openai import OpenAI, RateLimitError

client = OpenAI()  # reads OPENAI_API_KEY from the environment

try:
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": "ping"}],
    )
except RateLimitError as e:
    # IMPORTANT: insufficient_quota AND rate_limit_exceeded both raise
    # RateLimitError with HTTP 429. Only error.code tells them apart.
    code = getattr(e, "code", None)
    if code == "insufficient_quota":
        # BILLING problem — retrying / backoff will NEVER fix this.
        raise SystemExit("No API credit. Add a payment method + buy credits.")
    elif code == "rate_limit_exceeded":
        # Real throughput limit — THIS one you back off and retry.
        print("Rate limited — sleep, then retry with exponential backoff.")
    else:
        raise
// TypeScript — same branch on e.code
import OpenAI from 'openai';

const client = new OpenAI(); // reads process.env.OPENAI_API_KEY

try {
  await client.chat.completions.create({
    model: 'gpt-4o-mini',
    messages: [{ role: 'user', content: 'ping' }],
  });
} catch (e) {
  if (e instanceof OpenAI.RateLimitError) {
    // 429 covers BOTH billing and true rate limits — check the code:
    if (e.code === 'insufficient_quota') {
      // BILLING problem — backoff will NOT help. Stop and add credits.
      throw new Error('No API credit. Add a payment method + buy credits.');
    } else if (e.code === 'rate_limit_exceeded') {
      console.warn('Rate limited — back off and retry.');
    }
  }
}
2

Check your credit balance and payment method

This fixes the vast majority of cases. Open the billing overview and look at your available balance:

Where to look

  • Go to platform.openai.com/settings/organization/billing/overview.
  • If the balance is $0 or there is no payment method, add a card and buy prepaid credits (OpenAI API billing is prepaid — you top up a balance).
  • Note: a ChatGPT Plus subscription is billed separately and grants zero API credit.
3

Replace expired free-trial credits

If your account only ever had free-trial credits, those expire after roughly 3 months and cannot be reused, extended, or reactivated. Once expired, the balance shows $0 and every request returns insufficient_quota.

There is no workaround here — you must add a paid payment method and purchase credits. Trial credit is a one-time grant, not a recurring allowance.

4

Check per-project and monthly usage limits

Even with credit available, a hard monthly cap you (or an org admin) set earlier will return insufficient_quota once you cross it. This is easy to miss on organizations with multiple projects.

What to check

  • Open platform.openai.com/settings/organization/limits.
  • If a monthly budget or per-project limit is set at or near $0, raise it (or remove the cap on the affected project).
  • Re-check after saving — limits apply per project, so verify the exact project your API key belongs to.
5

Wait for propagation, then verify with a test request

After adding credit, allow a few minutes for billing to propagate — the change is not always instant. Then send a tiny test request. A successful response confirms your quota is live:

# Python — minimal test call after topping up credit
from openai import OpenAI

client = OpenAI()
r = client.chat.completions.create(
    model="gpt-4o-mini",
    messages=[{"role": "user", "content": "say ok"}],
    max_tokens=5,
)
print(r.choices[0].message.content)  # prints "ok" once credit is live
// TypeScript — minimal test call
import OpenAI from 'openai';

const client = new OpenAI();
const r = await client.chat.completions.create({
  model: 'gpt-4o-mini',
  messages: [{ role: 'user', content: 'say ok' }],
  max_tokens: 5,
});
console.log(r.choices[0].message.content); // "ok" => quota is active

Still getting insufficient_quota after 10–15 minutes? Re-confirm you actually purchased credits (not just added a card), and that the key belongs to the project you funded.

Get an email the next time OpenAI goes down

Outage alerts for OpenAI, straight to your inbox. No account needed, unsubscribe in every email.

Watching more than one service? A free account covers 5 services + a daily digest — and Pro is currently free.

FAQ

Why do I get 429 insufficient_quota when I haven't made any requests?

Because it is not about request volume — it is about your account having zero available credit. If your prepaid balance is $0, your free-trial credits expired, or you have no payment method on file, the very first request of the month returns 429 with error.code = insufficient_quota. It is a billing state, not a throughput signal, so it appears even on request number one. Retrying or backoff will never clear it.

Is insufficient_quota the same as a rate limit?

No. Both errors share HTTP 429, which is exactly what confuses people. But insufficient_quota means you have no credit left and must add funds — retrying does nothing. rate_limit_exceeded means you sent requests too fast and should slow down and retry with exponential backoff. Same status code, different error.code, opposite fix.

I added a card but still get insufficient_quota — why?

Adding a card does not automatically grant usable credit under OpenAI's prepaid billing — you must actually purchase credits, and it can take a few minutes to propagate. Two common traps: a ChatGPT Plus subscription is completely separate from API billing and grants zero API credit, and a monthly usage limit set to $0 keeps returning the error even with a valid card. Buy API credits and confirm your limit is above $0.

Do free trial credits expire?

Yes. Free-trial and promotional credits expire — typically around three months after they are granted — and cannot be reused or reactivated. Once expired they show as $0 available and every request returns 429 insufficient_quota. The only fix is to add a paid payment method and purchase credits.

Does insufficient_quota mean OpenAI is down?

No. It is an account-level billing state on your side, not an OpenAI outage, so it will not clear on its own. For genuine OpenAI incidents — elevated 500s, 503s, or degraded latency — check the live status at prismix.dev/service/openai. If the dashboard shows OpenAI healthy but you still get this error, the problem is your billing, not their servers.

Related guides