# How OpenRouter's Tiered Free Tier Quota System Works: Rate Limits Explained

> Understand OpenRouter's tiered free tier quota system and its rate limits. Get 20 requests/minute for free models, with an option for 1000 requests/day.

- Repository: [Jun Siang Cheah/free-llm-api-resources](https://github.com/cheahjs/free-llm-api-resources)
- Tags: deep-dive
- Published: 2026-05-07

---

**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`](https://github.com/cheahjs/free-llm-api-resources/blob/main/src/pull_available_models.py) (lines 206-240), the repository hard-codes a **static limit object** for each retained free model:

```json
{
    "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`](https://github.com/cheahjs/free-llm-api-resources/blob/main/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`](https://github.com/cheahjs/free-llm-api-resources/blob/main/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:

```python
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:

```python
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_models` function in [`src/pull_available_models.py`](https://github.com/cheahjs/free-llm-api-resources/blob/main/src/pull_available_models.py) hard-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 == 0` and the `:free` identifier 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`](https://github.com/cheahjs/free-llm-api-resources/blob/main/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`](https://github.com/cheahjs/free-llm-api-resources/blob/main/src/pull_available_models.py) (lines 891-998) based on OpenRouter's official documentation links.