← All free LLM API errors

OpenRouter · checked October 10, 2026

OpenRouter "Rate limit exceeded: free-models-per-day" (and per-min)

OpenRouter caps free (:free) models at 20 requests per minute and 50 requests per day, or 1,000 per day once you have bought at least 10 credits (checked October 10, 2026). "free-models-per-day" means the daily cap is spent and resets at 00:00 UTC; "free-models-per-min" clears within a minute. Extra keys on the same account share the limit.

The exact error

What you see.

HTTP 429. The daily body is a full example from 2025, when the message said "Add 5 credits"; in 2026 it says "Add 10 credits" and adds a limit_source field. The third body is the different upstream case.

{"error":{"message":"Rate limit exceeded: free-models-per-min. ","code":429,"metadata":{"headers":{"X-RateLimit-Limit":"20","X-RateLimit-Remaining":"0","X-RateLimit-Reset":"1785658140000"},"limit_source":"openrouter_free_tier_per_minute","remedy_hint":"Slow down requests to free models, or retry after the per-minute window resets.","provider_name":null}},"user_id":"user_..."}
{"error":{"message":"Rate limit exceeded: free-models-per-day. Add 5 credits to unlock 1000 free model requests per day","code":429,"metadata":{"headers":{"X-RateLimit-Limit":"50","X-RateLimit-Remaining":"0","X-RateLimit-Reset":"1759708800000"},"provider_name":null}},"user_id":"user_..."}
{'error': {'message': 'Provider returned error', 'code': 429, 'metadata': {'raw': 'deepseek/deepseek-chat is temporarily rate-limited upstream. Please retry shortly, or add your own key to accumulate your rate limits: https://openrouter.ai/settings/integrations', 'provider_name': 'DeepInfra', 'is_byok': False}}, 'user_id': 'user_...'}

Causes

Why it happens.

  1. 1

    The daily free-model cap is spent

    50 requests per UTC day on accounts that have bought less than 10 credits in total; 1,000 per day after that, where the message becomes "free-models-per-day-high-balance".

  2. 2

    A burst over 20 requests per minute

    Agent loops and parallel calls hit the per-minute cap quickly. X-RateLimit-Reset gives the end of the window in epoch milliseconds.

  3. 3

    The model is throttled upstream for everyone

    "Provider returned error" with "temporarily rate-limited upstream" means the provider behind a popular free model is limiting all OpenRouter traffic. It has nothing to do with your account and carries no X-RateLimit headers; since 2026 it can also arrive inside an HTTP 200 body.

  4. 4

    More keys do not add capacity

    Keys on the same account share the free limits, and OpenRouter says it governs free capacity globally.

Fixes

How to fix it.

Per minute: wait for the reset

Sleep until X-RateLimit-Reset, or pace requests to fewer than 20 per minute.

Per day: wait, buy credits, or use the source

Wait for 00:00 UTC, buy 10 credits (once) to raise the cap to 1,000 per day, or send the overflow to providers' own free tiers, which have separate quotas.

Upstream: retry shortly or switch model

Try again after a short delay, use a different free model, or add your own provider key in OpenRouter's integrations settings.

Check how many free requests are left

The key endpoint reports the free-model counter for the current UTC day.

curl -s https://openrouter.ai/api/v1/key -H "Authorization: Bearer $OPENROUTER_API_KEY"
# look for free_model_daily_requests: used, limit, remaining

With freelm

Handle it automatically.

freelm separates the three cases. A daily cap with no retry time rests that OpenRouter key for an hour and re-checks hourly instead of every minute; a per-minute limit cools the key briefly; "rate-limited upstream" sets aside only that model, for every key. In each case the same call continues on Gemini, Groq, Cloudflare Workers AI or your other providers, which have their own free quotas, and an error object returned with HTTP 200 is classified the same way.

pip install freelm      # or: npm install freelm
export OPENROUTER_API_KEY=...   # plus any other free keys you have
freelm doctor               # one tiny live request per key

import freelm
llm = freelm.FreeLLM.from_env()   # OpenRouter becomes one pool among several
print(llm.text("hello"))

freelm is an open-source Python and Node.js library that pools the free tiers of Gemini, Groq, OpenRouter, Cloudflare Workers AI, Mistral, NVIDIA NIM, Z.ai and Cohere behind one OpenAI-compatible call. See how its failover works.

Questions

Related questions.

When does the OpenRouter free limit reset?

Daily counts are per UTC day, so the free-models-per-day limit resets at 00:00 UTC. The per-minute window resets within a minute.

Does buying OpenRouter credits raise the free limit?

Yes. Once you have bought at least 10 credits in total, the free-model limit rises from 50 to 1,000 requests per day. The 20 requests per minute limit stays.

What does "temporarily rate-limited upstream" mean?

The provider serving that free model is throttling OpenRouter as a whole. It is not your daily limit; retry shortly or pick another model.