RESOURCE_EXHAUSTED on the Gemini API: which of the two 429s you have

Google now returns two separate 429 codes, one for per-minute throttling and one for daily quota, and they need opposite responses. It also stopped publishing per-model limit numbers in August 2026, so any guide quoting you an RPM figure is quoting something that no longer exists.

By the Continuum team. We build a workbench that runs Claude Code, Codex, and their peers, so the model rates quoted here are the ones our own cost analytics ship with.

The short version

A Gemini 429 means you crossed a rate limit or a quota, and which one matters. On the current Interactions API the error carries a snake_case code: rate_limit_exceeded for the per-minute or per-second ceiling, which clears in seconds and should be retried with backoff, or quota_exceeded for the daily allowance, which does not clear until midnight Pacific. The older generativelanguage endpoint still returns the classic Google RPC envelope with "status": "RESOURCE_EXHAUSTED". Limits are enforced per project, not per key, and vary per model. Note that Google removed the per-model RPM, TPM, and RPD tables from its rate-limits page in August 2026: the live numbers are only visible in AI Studio now.

What you need to know
  • Two codes, two fixes: rate_limit_exceeded clears in seconds, quota_exceeded does not clear until midnight Pacific.
  • Limits are per project, not per key. A second key buys you nothing.
  • Google deleted the per-model limit tables in August 2026. Any blog quoting 15 RPM is quoting a dead page.
  • On the free tier, your content is used to improve Google products. On paid, it is not.
  • There is a spend-based rate limit too: a rolling 10-minute cap of $10, $50, or $200 by tier.
  • Billing disabled is failed_precondition with a 400 on the current API, not a 429.
  • Google does document jitter, and its Python SDK already retries transient errors up to four times.

Two error formats, because there are now two APIs

Before diagnosing anything, work out which surface you are talking to, because the error envelopes differ and only one of them contains the string RESOURCE_EXHAUSTED.

The current Interactions API

Google recommends this one now, and it uses a flatter envelope with a snake_case string in code and no status field at all.

The current shape. Streaming errors arrive as an SSE frame with event_type "error" and the same body.
{
  "error": {
    "code": "rate_limit_exceeded",
    "message": "..."
  }
}

The legacy generativelanguage endpoint

Still live, still widely used, and still returning the classic google.rpc.Status envelope with a numeric code and a screaming-case status. This is where the searched-for term comes from.

The legacy envelope. Verified live in August 2026 against v1beta generateContent.
{
  "error": {
    "code": 429,
    "message": "...",
    "status": "RESOURCE_EXHAUSTED",
    "details": [ /* may carry QuotaFailure or RetryInfo */ ]
  }
}

rate_limit_exceeded versus quota_exceeded

This split is the most useful thing on the page, because the two conditions need opposite handling and both arrive as a 429.

The two 429 codes, verbatim descriptions from ai.google.dev/gemini-api/docs/api-errors.
CodeDescriptionRecommended actionClears
rate_limit_exceeded"You have exceeded the per-minute or per-second request or token limit.""Wait and retry with exponential backoff."Seconds
quota_exceeded"You have exceeded your daily quota.""Wait until the quota resets or request a quota increase."Midnight Pacific

A retry loop that cannot tell them apart will spend its whole budget of attempts against a daily quota that has fourteen hours left to run, and then report a timeout. Branch first.

Daily quota is a routing decision, not a retry decision.
def handle_429(err):
    code = err.code if isinstance(err.code, str) else None

    if code == "quota_exceeded":
        # RPD resets at midnight Pacific. Retrying now cannot work.
        return failover_or_defer()

    if code == "rate_limit_exceeded" or err.status == "RESOURCE_EXHAUSTED":
        return retry_with_backoff()   # seconds, not hours

    raise err

The limits Google stopped publishing

This section exists because almost every other page on this topic is now wrong, and we would rather tell you what is unknowable than repeat a stale number.

That is the whole of it. The per-model RPM, TPM, and RPD tables that used to sit on that page, the ones every tutorial quotes as "15 RPM and 1,500 RPD on the free tier", have been removed. There is no citable public number any more. Open AI Studio and read your own project's limits; that is now the only accurate source.

What the page does still state, and what therefore remains safe to build on:

  • "Rate limits are applied per project, not per API key." Minting a second key changes nothing. This one surprises people every time.
  • "Requests per day (RPD) quotas reset at midnight Pacific time." Not at midnight your time, and not on a rolling 24-hour window.
  • Limits are per model, not shared. Being throttled on one model says nothing about another, which makes a same-provider fallback genuinely useful here.
  • Preview and experimental models are more restricted than GA models, explicitly.
  • Image models are limited in IPM (images per minute), and some models carry a TPD as well as a TPM.
  • Priority inference gets 0.3x the standard rate limit for its model and tier. You trade throughput headroom for latency.
Usage tiers, checked August 2026. These are still published; the per-model numbers behind them are not.
TierQualificationMonthly capSpend rate limit (rolling 10 min)
FreeActive project or free trialN/AN/A
Tier 1Set up and link an active billing account$250$10
Tier 2Paid $100 and 3 days from first successful payment$2,000$50
Tier 3Paid $1,000 and 30 days from first successful payment$20,000 and above$200

Note that unlike OpenAI, Google kept the waiting period: Tier 2 and Tier 3 both require elapsed days as well as spend, and the spend counted is cumulative across Google Cloud services on the linked billing account, not just the Gemini API. Free to Tier 1 takes effect essentially instantly; later upgrades land within about ten minutes.

The free tier and what it costs you

The Gemini free tier is genuinely generous and it has one condition that belongs in any honest discussion of it. From Google's own pricing tables, every model has a row labelled "Used to improve our products": Yes on the free tier, No on paid.

The practical upgrade path is short: link a billing account and you are Tier 1, which raises your limits, removes the training clause, and does not oblige you to spend anything beyond what you use.

Fixing it

Google, unlike Anthropic, documents jitter explicitly, and its own SDK already implements a reasonable policy: "the Python SDK automatically retries transient errors up to four times with an initial delay of approximately 1 second and a maximum delay of 60 seconds."

01

Read the code and branch

Per-minute throttling gets backoff. Daily quota gets a different model, a different project, or a deferral to tomorrow. Nothing else in this list matters if you skip this step.

02

Check your real limits in AI Studio

Since the public tables are gone, this is the only way to know your numbers. It also tells you whether you are actually on the tier you think you are, which is worth two minutes when a project has been through several billing changes.

03

Move down the model ladder before you move providers

Limits are per model. A Flash-Lite model usually has considerably more headroom than a Pro preview, and on the current lineup gemini-3.5-flash-lite at $0.30 and $2.50 per million is a serious workhorse rather than a consolation prize. Preview models are explicitly the most restricted, so a preview dependency in a production path is a limit you chose.

04

Batch anything that is not interactive

The Batch API has its own quota space, 100 concurrent batch requests, input files to 2GB, and per-tier enqueued-token allowances measured in the millions to billions. It is also priced at a discount. Anything without a human waiting belongs here rather than competing with your interactive traffic for RPM.

05

Enable billing, if you are still on free

It is the single largest step change available, it moves you off the training clause, and it costs nothing until you use something.

One last structural note for anyone comparing the two Google surfaces. Vertex, now branded Gemini Enterprise Agent Platform, does not work like this at all: it allocates org-level tokens-per-minute by 30-day rolling spend and has no per-tier RPM limit, bursting above baseline on a best-effort basis. Its own documentation warns that "high and instantaneous traffic can lead to throttling even if your average per-minute usage is below your limit", which is the same acceleration-limit idea both OpenAI and Anthropic have under different names.

Questions people ask

What does RESOURCE_EXHAUSTED mean in the Gemini API?

It is Google's status for a 429: you crossed a rate limit or a quota. On the legacy generativelanguage endpoint it appears as the status field in the error envelope. On the current Interactions API it has been split into two clearer codes, rate_limit_exceeded for the per-minute or per-second ceiling and quota_exceeded for the daily allowance.

What are the Gemini API free-tier rate limits?

Google removed the per-model RPM, TPM, and RPD tables from its rate-limits page in August 2026. The page now says only that limits depend on your usage tier and can be viewed in Google AI Studio. Any figure you find quoted elsewhere, including the widely repeated 15 RPM and 1,500 RPD, comes from a version of that page that no longer exists. Read your own limits in AI Studio.

Do Gemini rate limits apply per API key or per project?

Per project. Google states this explicitly. Creating additional API keys inside the same project gives you no extra headroom, and limits also vary by model within a project, so being throttled on one model tells you nothing about another.

When does the Gemini daily quota reset?

Requests-per-day quotas reset at midnight Pacific time, not on a rolling 24-hour window and not in your local timezone. That is why a quota_exceeded error is not worth retrying: it can be many hours from clearing, and the right response is to fail over or defer the work.

Does Google train on my Gemini API data?

On the free tier, yes. Google's pricing tables mark every model "used to improve our products: Yes" for the free tier and "No" for paid, and the API terms add that human reviewers may read and annotate free-tier input and output, disconnected from your account. Linking a billing account moves you to Tier 1 and removes that clause.

Why do I get 429 errors when I am nowhere near my request limit?

Most likely the spend-based rate limit, a rolling ten-minute cap of $10 on Tier 1, $50 on Tier 2, and $200 on Tier 3. A small number of expensive requests can trip it while your requests-per-minute stays low. The other possibility is that you are on a preview model, which Google documents as more restricted than GA models.

Sources

Every figure above was read from these pages on August 2026. Vendors reprice without notice; if you find a stale number, tell us.

  1. Gemini API error codes the Interactions API envelope and the two 429 codes
  2. Gemini API rate limits per-project enforcement, midnight Pacific reset, tiers, spend-based limits
  3. Gemini API troubleshooting backoff and jitter guidance, SDK retry behaviour
  4. Gemini API pricing per-model prices and the used-to-improve-our-products row
  5. Gemini API additional terms of service free-tier data use and human review
  6. Vertex AI 429 error codes the two documented Vertex 429 message strings
Try it

Every quota,
one dashboard.

Continuum drives Claude Code, Codex, and peers under your own subscriptions, with live quota gauges and spend by repo. The app is free. Mac is stable; Windows and Linux desktop are beta.

free app · your subscriptions · local-first