Cloud Explainers

Why OpenRouter Free Models Hit Their Limit So Fast

OpenRouter (one API for many AI models)9 min videoPublished Nov 7, 2026

OpenRouter's free models allow 50 requests a day on an account that never bought credits, one counter shared by every free model. We spent a real key's last free requests on camera: bursts of requests all answered while the counter lagged behind, then every free model returned 429 free-models-per-day until midnight UTC. Why tools burn the limit so fast, how to read the reset, the other 429 from a busy provider, and how to make 50 a day go further.

Why OpenRouter Free Models Hit Their Limit So Fast, the full picture: diagram of Ana's script, OpenRouter, Nemotron, free, Cohere, free, Gemma, free, Every:free model
The whole picture, from the video's recap.

Every free request: 429

Your free OpenRouter models worked fine, then every request started coming back: error 429, free models per day. 429 is the web's code for too many requests. Ana's tea shop script just hit it. Nemotron, a free model: refused. Cohere, another free model: the same refusal, word for word.

laptop: Ana's terminal
./ask nvidia/nemotron-3.5-lightning:freeerror 429: Rate limit exceeded: free-models-per-day. Add 10 credits to unlock 1000 free model requests per day
x-ratelimit-limit: 50
x-ratelimit-remaining: 0
x-ratelimit-reset: 1794096000000
laptop: Ana's terminal
./ask cohere/north-mini-code:freeerror 429: Rate limit exceeded: free-models-per-day. Add 10 credits to unlock 1000 free model requests per day
x-ratelimit-limit: 50
x-ratelimit-remaining: 0
x-ratelimit-reset: 1794096000000

Here's the odd part. A few minutes earlier, her key's counter said 23 of fifty used. Then she sent 52 more requests, and every one of them got an answer. How do you fit that many requests into a limit of fifty? By the end you'll know why free models run out so fast, and how to make fifty go further.

You're not alone. On GitHub, Autohand's command-line coding tool filed a bug report: a session only two messages long, on a free model through OpenRouter, failed with this exact error. The maintainer's answer: not a bug in the tool. It's OpenRouter's daily limit.

A real report, on GitHub: cards of A coding tool, Two messages, free-models-per-day, "Not a bug"

The two free limits

So what are the rules? OpenRouter's limits page has a small table for models whose name ends in colon free. Twenty requests a minute. And per day: fifty, until you've bought at least ten dollars of credits in total. After that, one thousand a day.

Free-model requests a day, from OpenRouter's limits page: chart of Bought under $10 of credits: 50 requests, Bought $10 or more: 1000 requests, Both tiers: 20 requests a minute

First, what counts as one request? One message sent to a model, and its one reply. The daily limit counts requests, not their size: a one-word question and a page of code both count as one. And a request is counted even when the model's answer is useless, like an empty reply.

What the free limit counts: requests, not size: diagram of 1 request = 1 message + 1 reply, 1 request = what's counted, 1 message = any size, 1 reply = any reply, Even an empty reply counts

Notice what it doesn't say. The ten dollars isn't spent on the free models. They stay free. It's credits you've ever bought, and the higher limit stays after that. Our key has never had any credits, so it's on fifty.

Which daily limit you get: diagram of Free models stay free, Credits ever bought, $10 or more, Our key: never bought any, The $10 unlocks the limit; free models cost nothing

And the fifty is one counter for every free model. That's why switching from Nemotron to Cohere didn't help: same counter, already full. A second key won't help you. OpenRouter's docs say extra accounts or keys won't change your limits, because capacity is governed globally.

Why fifty goes so fast

Why does fifty go so fast? Because tools don't send one request per question. Ana's burst script sends requests one after another, as fast as answers come back, the way a coding agent or a retry loop does. You don't need to read the shell code: it loops, sends, and prints one line per request.

laptop: Ana's terminal
cat burst#!/usr/bin/env bash
# ./burst N MODEL: send N requests one after another, as fast as they come back, like a coding agent or a retry
# loop does. One line per request: its number, seconds since the start, the HTTP status, and the error if any.
N=$1; M=$2; start=$(date +%s)
BODY=$(jq -cn --arg m "$M" '{model: $m, max_tokens: 8, messages: [{role: "user", content: "Say ok."}]}')
for i in $(seq 1 "$N"); do
  code=$(curl -s --max-time 120 -o r.json -w '%{http_code}' https://openrouter.ai/api/v1/chat/completions \
    -H "Authorization: Bearer $OPENROUTER_API_KEY" -H "Content-Type: application/json" -d "$BODY")
  msg=$(jq -r '.error.message // "ok" | .[0:70]' r.json 2>/dev/null)
  printf '#%-3s %3ss  %s  %s\n' "$i" "$(( $(date +%s) - start ))" "$code" "$msg"
done

She sends 22. They finish in 5 seconds. Every one says two hundred, the web's code for success. That's almost half a day's allowance, gone before you could read the first answer.

laptop: Ana's terminal
./burst 22 nvidia/nemotron-3.5-lightning:free#1     0s  200  ok
#2     0s  200  ok
#3     0s  200  ok
#4     0s  200  ok
#5     1s  200  ok
#6     1s  200  ok
#7     1s  200  ok
#8     1s  200  ok
#9     2s  200  ok
#10    2s  200  ok
#11    2s  200  ok
#12    2s  200  ok
#13    2s  200  ok
#14    3s  200  ok
#15    3s  200  ok
#16    4s  200  ok
#17    4s  200  ok
#18    4s  200  ok
#19    4s  200  ok
#20    5s  200  ok
#21    5s  200  ok
#22    5s  200  ok

What about twenty a minute? That burst was 22 requests in 5 seconds, and none was refused. So in our run, the per-minute limit didn't stop a short burst. Don't build on that, though. Pace a loop to one request every three seconds, and you're under twenty a minute, whatever OpenRouter enforces that day.

Ana's first burst vs the per-minute limit: chart of The docs: per minute: 20 requests, Ana: in 5 seconds: 22 requests, Paced: 1 every 3 s stays under 20 a minute

That's what a coding agent does every time you give it a task. It asks the model what to do, runs a tool, sends the result back, and asks again. Each turn of that loop is one request. A single task can take dozens of them, and a retry loop on errors adds more. One task can use a day's fifty.

One task in a coding agent: diagram of The agent, OpenRouter, 1: what should I do?, read a file, 2: here's the file, edit it, 3, 4, 5..., + retries

Back to Ana. The counter said 23 used, and she has sent 23 since: that's 46 of fifty. She sends 29 more, straight away. Guess first: how many get an answer? All 29. In 13 seconds, well past fifty, with no error at all.

laptop: Ana's terminal
./usagefree tier:        true
free requests:    23 used of 50 today
left today:       27
laptop: Ana's terminal
./burst 29 nvidia/nemotron-3.5-lightning:free#1     5s  200  ok
#2     6s  200  ok
#3     6s  200  ok
#4     7s  200  ok
#5     7s  200  ok
#6     7s  200  ok
#7     8s  200  ok
#8     8s  200  ok
#9     8s  200  ok
#10    8s  200  ok
#11    8s  200  ok
#12    9s  200  ok
#13    9s  200  ok
#14    9s  200  ok
#15    9s  200  ok
#16   10s  200  ok
#17   10s  200  ok
#18   10s  200  ok
#19   10s  200  ok
#20   10s  200  ok
#21   11s  200  ok
#22   11s  200  ok
#23   11s  200  ok
#24   12s  200  ok
#25   12s  200  ok
#26   12s  200  ok
#27   12s  200  ok
#28   13s  200  ok
#29   13s  200  ok

Add up the whole day. 23 requests from earlier testing, one question, a burst of 22, and a burst of 29. That's 75, against a limit of fifty. Two bursts did most of it, in under half a minute.

Free requests on this key today: chart of Earlier testing: 23 requests, One question: 1 requests, Burst 1 (5 s): 22 requests, Burst 2 (13 s): 29 requests, 75 sent, limit 50

The counter runs behind

So is the limit fake? Ana's usage script asks OpenRouter what it has counted. Reading it is free: it isn't a model request. Right after those bursts: still 23 used. A few minutes later: 76 used of fifty, zero left. That includes one test of ours, off camera.

laptop: Ana's terminal
./usagefree tier:        true
free requests:    76 used of 50 today
left today:       0

The limit is real. The counter just runs behind. Requests are counted a few minutes after they happen, and the refusals only start once the count catches up. That's how Ana got past fifty, and why it feels sudden: fine one minute, every request refused the next.

What we measured: the count catches up later: diagram of Ana's script, OpenRouter, The counter, 52 requests, all answered, counted, minutes later, the next request, 429, free-models-per-day

There's no warning in the answers either. OpenRouter's docs say successful replies carry no rate limit headers. You only see the numbers once you're refused: limit fifty, remaining zero, and a reset time.

Read the error itself in parts. Rate limit exceeded: OpenRouter said no, not the model. Free models: all of them, together. Per day: it comes back tomorrow. The rest is the way out: ten dollars of credits for one thousand a day.

The daily 429, in parts: diagram of Rate limit exceeded: free-models-per-day, Rate limit exceeded = who said no, free-models = which models, per-day = which counter

When it comes back

That reset time is in milliseconds since 1970. You don't need this command: it just turns that number into a date: midnight, U T C. The daily count runs by the U T C day, so in New York it comes back at seven in the evening, or eight in summer.

laptop: Ana's terminal
date -u -d @$(( $(grep -i '^x-ratelimit-reset' headers.txt | tr -dc 0-9) / 1000 ))Sun Nov  8 00:00:00 UTC 2026

So we waited for midnight. The same key, the same counter: zero used. A fresh fifty.

laptop: Ana's terminal
date -uSun Nov  8 00:01:09 UTC 2026
laptop: Ana's terminal
./usagefree tier:        true
free requests:    0 used of 50 today
left today:       50

Now the counter's delay, one request at a time. Ana asks Nemotron one question. The reply is empty: it's a reasoning model, and its hidden thinking used up the reply's whole length limit. Straight after, the counter still says zero. Four minutes later: one. Even an empty reply counts, and the number you see can be a few minutes old.

laptop: Ana's terminal
./ask nvidia/nemotron-3.5-lightning:freemodel: nvidia/nemotron-3.5-lightning:free
laptop: Ana's terminal
./usagefree tier:        true
free requests:    0 used of 50 today
left today:       50
laptop: Ana's terminal
./usagefree tier:        true
free requests:    1 used of 50 today
left today:       49

Busy before the limit

There's a second 429 that looks almost the same. Its message says provider returned error, rate-limited upstream. That one isn't your fifty. It's the company running a free model, full with everyone else's requests. It can happen on your first request of the day.

Which 429 is it?: comparison table of free-models-per-day vs Provider returned error, Who said no, Whose limit, Other free models, When

The fix depends on which one you got. A busy provider: another free model can answer, so put several model names in the request's models list, and OpenRouter tries the next. Your daily fifty: every free model shares that counter, so a list doesn't help. Only waiting, or credits, do.

Getting more out of free

The worst thing a script can do with this error is retry it in a loop. A daily 429 won't clear in a second, or a minute. A loop just keeps knocking until midnight. A better loop reads the reset header once, sleeps until then, or switches to a paid model if you've chosen to pay.

Two ways to handle the daily 429: comparison table of A retry loop vs A better loop, On a daily 429, Next try, Requests spent, Or instead

So how do you make fifty go further? Send fewer requests: test with one question, not a loop, and keep answers you'll ask for again. Never retry a daily 429 in a loop: read the reset time and stop until then. Check the counter before a big run, and remember it can be minutes behind.

Making 50 a day go further: cards of One question, not a loop, Keep answers, Stop at the reset, Check the counter

And if you use free models every day, the ten dollars is the big lever. Fifty requests become one thousand requests every day, twenty times as many, and the free models still cost nothing. Set a spending limit on the key too, so a paid model can't quietly use those credits.

After $10 of credits, from OpenRouter's limits page: figure of 1,000 free-model requests a day, source: openrouter.ai/docs/api-reference/limits, 2026-11-07

Ana's ask, burst and usage scripts are in the lab files, linked in the description, ready for your own free key. Run burst with a small number.

Run it yourself: cards of ask, burst, usage, doc

Recap

So: fifty free requests a day, one counter for every free model. Tools spend them in seconds, the counter shows it minutes later, and it resets at midnight U T C.

If this saved you a day of 429s, a like helps other beginners find it, and subscribing gets you the next one.

Every request here went to the real OpenRouter, on free models. Thanks for watching Cloud Explainers.

Sources

Demos: one container on our own Mac standing in for Ana's laptop, sending real requests to OpenRouter with our own free-tier key (never shown); the tea shop is made up. Watch the full video on YouTube.

More videos

Linux9 min

Linux Makefiles Will Finally Make Sense After This

Auth (OAuth, JWT)9 min

SAML vs OAuth vs OpenID Connect: What's the Difference?

Python7 min

How to Fix Python cron Jobs That Never Run

Linux22 min

Linux Bash Scripting: Full Tutorial for Beginners

Networking10 min

How PXE Network Boot Works

Active Directory9 min

How Active Directory Works

Linux10 min

How to Fix a Linux systemd Service That Won't Start

Linux9 min

Linux Logs: syslog vs journald

Auth (OAuth, JWT)9 min

JWT vs Session Cookies: Which One Should You Use?

Docker10 min

Docker vs Docker Compose: Which One Should You Use?

Docker9 min

How to Fix Docker Compose Containers That Can't Talk to Each Other

Django (Python web framework)22 min

Django Full Tutorial for Beginners

Linux9 min

How Linux systemd Works

Networking8 min

How to Fix 'Windows Cannot Access' Network Share Errors (SMB)

APIs10 min

REST vs gRPC: Which One Should You Use?

Certificates & PKI (ADCS)9 min

How to Fix SSL Certificate Chain Errors (Missing Intermediate)

Python9 min

Every Python Concept for Beginners in 10 Minutes

Databases & SQL9 min

Every SQL Join Type in 10 Minutes

Gemini API & Google AI Studio9 min

Why Your Gemini API Free Tier Runs Out So Fast

OpenRouter (one API for many AI models)10 min

OpenRouter Will Finally Make Sense After This

Caching & Redis10 min

How Redis Caching Works

Gemini API & Google AI Studio10 min

Gemini API vs Vertex AI: Which One Should You Use?

Gemini API & Google AI Studio8 min

How to Fix a Leaked Gemini API Key

Go (Golang)9 min

Why Golang Uses Goroutines Instead of Threads

Gemini API & Google AI Studio9 min

How to Fix Gemini API Error 429: Resource Exhausted

Claude & the Claude Developer Platform10 min

Claude Token Pricing Will Finally Make Sense After This

Python11 min

Why Python Web Scraping Returns Nothing (and the Fix)

Python10 min

Python uv vs pip: Which One Should You Use?

Python22 min

Python Automation: Full Tutorial for Beginners

Auth (OAuth, JWT)9 min

How OAuth Login Works

Gemini API & Google AI Studio10 min

Google AI Studio Will Finally Make Sense After This

Docker10 min

What Happens When You Run a Docker Container

Claude & the Claude Developer Platform8 min

How to Fix Claude Code Billing Your API Key Instead of Your Plan

Auth (OAuth, JWT)9 min

Why Passkeys Can't Be Phished Like Passwords

PowerShell10 min

PowerShell vs Bash: Which One Should You Learn?

Linux10 min

The Linux Roadmap for Beginners

Django (Python web framework)9 min

Django vs FastAPI: Which One Should You Use?

Databases & SQL10 min

Why SQLite Is the Most Used Database in the World

Databases & SQL11 min

How a NoSQL Database Like MongoDB Works

Python11 min

How to Fix Python pip error: externally-managed-environment

Databases & SQL9 min

How to Fix MySQL Too Many Connections Database Errors

Go (Golang)9 min

Golang Concurrency Will Finally Make Sense After This

AWS10 min

How Amazon S3 Works

Kubernetes10 min

How Kubernetes Works

Git10 min

How Git Works

Docker10 min

How to Fix Docker Port Already Allocated Errors

PostgreSQL10 min

How PostgreSQL Works

Git8 min

How to Fix Git Merge Conflicts

Linux9 min

How to Fix No Space Left on Device in Linux

Networking10 min

How the Internet Works

Databases & SQL9 min

SQL vs NoSQL: When Each One Wins

Auth (OAuth, JWT)8 min

How to Fix JWT Token Expired Errors (401 Unauthorized)

Claude & the Claude Developer Platform9 min

Claude API vs Claude Pro: Why Your Subscription Doesn't Include It

AI agent skills9 min

Why AI Agent Skills Beat Giant Prompts

Linux10 min

Linux Cron Jobs Will Finally Make Sense After This

Cybersecurity10 min

Security Logs Will Finally Make Sense After This

Cybersecurity8 min

How to Fix a Security Leak: An API Key Pushed to GitHub

DNS9 min

DNS Will Finally Make Sense After This

Cybersecurity9 min

Never Ignore a Security Update

Auth (OAuth, JWT)9 min

Two-Factor Authentication Will Finally Make Sense

Networking8 min

Never Expose a Database to the Internet

Cybersecurity10 min

SSH Keys vs Passwords: Which Is Safer for Security?

Linux10 min

The 5 Levels of Linux Boot: From Power On to Login

Networking12 min

The 5 Levels of Network Firewalls

Cybersecurity10 min

Password Security: Why Hackers Crack Weak Passwords

Linux9 min

Why Your Linux Server Runs Out of Memory

Networking10 min

HTTP vs HTTPS: What Actually Changes on Your Network

Linux12 min

Every Linux File Permission You Need to Know

Linux10 min

Linux Processes vs Threads: When Each One Wins

Networking11 min

The OSI Model Will Finally Make Sense After This

Git11 min

The 7 Levels of Git

Networking10 min

Every Network Troubleshooting Command You Need

Cybersecurity10 min

Hashing vs Encryption in Cybersecurity: When Each One Wins

Networking11 min

Why the Internet Ran Out of IP Addresses

Linux11 min

Linux Package Managers: apt vs Snap vs Flatpak

Python9 min

Why Python Is Slow (and When It Doesn't Matter)

Networking11 min

TCP vs UDP: When Each One Wins

Linux8 min

Stop Running Linux as Root (Do This Instead)

Linux11 min

Linux Users and Groups Will Finally Make Sense

Cybersecurity9 min

Why Phishing Beats Good Security (and How to Spot It)

Docker12 min

The 7 Levels of Docker

AI agents & MCP12 min

AI Agents Will Finally Make Sense After This

Git8 min

Stop Using git push --force (Use This Instead)

AI agent skills10 min

Agent Skills vs MCP: When Each One Wins

Networking12 min

Networking Will Finally Make Sense After This

Linux12 min

Every Linux Command You Actually Need

Cybersecurity12 min

The 7 Levels of Cybersecurity

System design12 min

Every System Design Concept You Need, in One Diagram

PostgreSQL10 min

Why PostgreSQL Ignores Your Index