How OpenRouter's Tiered Free Tier Quota System Works: Rate Limits Explained
OpenRouter's tiered free tier quota system provides a base rate limit of 20 requests per minute and 50 requests per day for each individual free model, with an enhanced tier offering up to 1,000 requests per day across all free models after a $10 lifetime top-up.
The cheahjs/free-llm-api-resources repository automates the tracking of these limits by fetching OpenRouter's model catalog and embedding quota details into generated documentation. Understanding this tiered structure is essential for developers building applications that rely on OpenRouter's free inference endpoints.
Base vs. Enhanced Free Tier Limits
OpenRouter implements a two-tiered approach to free API access, combining per-model restrictions with an optional account-wide daily pool.
Per-Model Rate Limits (Base Tier)
Every free model—identified by the :free suffix in its model ID—enforces individual quotas. According to the fetch_openrouter_models function in src/pull_available_models.py (lines 206-240), the repository hard-codes a static limit object for each retained free model:
{
"requests/minute": 20,
"requests/day": 50
}
These constraints apply independently to each model. Consuming your daily quota on gpt-4-turbo:free does not affect your ability to query claude-instant:free within the same 24-hour period.
Shared Daily Pool (Enhanced Tier)
Users who complete a $10 lifetime top-up unlock the "Free Tier + $10" plan. This enhanced tier replaces the per-model daily limits with a shared pool of up to 1,000 requests per day across all free models. Unlike the base tier limits, this higher quota is not encoded in the static limits object; instead, it is documented via the generated README's reference to OpenRouter's official limits page.
Implementation in the Source Code
The repository's automation pipeline in src/pull_available_models.py handles the discovery, filtering, and formatting of OpenRouter's quota data.
Fetching and Filtering Free Models
The fetch_openrouter_models function queries OpenRouter's public API catalog and applies three critical filters:
- Retains only models where
pricing == 0(truly free inference) - Requires the model ID to contain
:free - Excludes models listed in an internal ignore set
For each surviving model, the function attaches the static 20/minute and 50/day limit object before returning the collection.
Rendering Human-Readable Limits
The get_human_limits function transforms these machine-readable constraints into documentation strings. During README generation (lines 891-998 in src/pull_available_models.py), the script combines the hard-coded base limits with explanatory text about the enhanced tier, producing output similar to:
- 20 requests/minute
- 50 requests/day
- Up to 1000 requests/day with $10 lifetime top-up
Working with OpenRouter Quotas Programmatically
Developers can access these limits using the repository's utility functions. The following example demonstrates fetching the current free model list and displaying their tiered quota constraints:
import logging
from src.pull_available_models import fetch_openrouter_models, get_human_limits
logger = logging.getLogger("OpenRouter")
logger.setLevel(logging.INFO)
# Retrieve free models with their tiered quota data
free_models = fetch_openrouter_models(logger)
# Display limits for each model
for model in free_models:
limits_str = get_human_limits(model)
print(f"{model['name']} ({model['id']}): {limits_str}")
To reference the enhanced tier's shared quota in your applications:
enhanced_tier_url = "https://openrouter.ai/docs/api/reference/limits"
print(f"Enhanced tier: Up to 1,000 requests/day shared across all models")
print(f"Requires $10 lifetime top-up. See: {enhanced_tier_url}")
Summary
- OpenRouter's tiered free tier quota system combines strict per-model limits with an optional shared daily pool for paying users.
- Base tier: 20 requests per minute and 50 requests per day applied individually to each free model ID.
- Enhanced tier: Up to 1,000 requests per day shared across all free models after a $10 lifetime top-up.
- The
fetch_openrouter_modelsfunction insrc/pull_available_models.pyhard-codes base limits at lines 206-240 while README generation at lines 891-998 adds enhanced tier documentation. - Free models are filtered by checking for
pricing == 0and the:freeidentifier in the model ID.
Frequently Asked Questions
What are OpenRouter's exact free tier rate limits?
OpenRouter enforces 20 requests per minute and 50 requests per day for each individual free model. These limits are hard-coded in the repository's src/pull_available_models.py file and apply to every model containing the :free identifier in its model ID.
How do I increase my OpenRouter free tier quota?
Complete a $10 lifetime top-up to unlock the enhanced free tier, which provides a shared pool of up to 1,000 requests per day across all free models. This replaces the standard 50 requests per day per-model limit with a higher account-wide allowance.
Do OpenRouter rate limits apply per model or across my entire account?
The base tier limits (20/minute, 50/day) apply per individual model. However, the enhanced tier's 1,000 requests per day limit is account-wide and shared across all free models you access with your API key.
Where does the free-llm-api-resources repository get its OpenRouter quota data?
The repository fetches model metadata from OpenRouter's public API via the fetch_openrouter_models function, then applies a static limit object to each free model. The enhanced tier information is added during README generation in src/pull_available_models.py (lines 891-998) based on OpenRouter's official documentation links.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →