OpenRouter Fundamentals Basics
8 examples to get you started with OpenRouter - 5 basic and 3 intermediate.
Search across all documentation pages
8 examples to get you started with OpenRouter - 5 basic and 3 intermediate.
You will authenticate against the OpenAI-compatible gateway, call chat completions, swap model slugs, inspect routing metadata, and handle the errors agents hit first.
:free variants with tight rate limitspython -m venv .venv && source .venv/bin/activate
pip install openai httpx
export OPENROUTER_API_KEY="sk-or-..."Use the standard OpenAI Python SDK with OpenRouter's base URL.
import os
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key=os.environ["OPENROUTER_API_KEY"],
)
resp = client.chat.completions.create(
model="openai/gpt-4o-mini", # verify slug at build
messages=[{"role": "user", "content": "Reply with the word pong."}],
)
print(resp.choices[0].message.content)chat.completions surface most agent frameworks already use.Related: What OpenRouter Actually Is: One API for 300+ Models
Optional headers help rank your app on OpenRouter and do not change model behavior.
resp = client.chat.completions.create(
model="openai/gpt-4o-mini",
messages=[{"role": "user", "content": "Hello"}],
extra_headers={
"HTTP-Referer": "https://example.com", # your site
"X-OpenRouter-Title": "My Agent Demo",
},
)default_headers for cleaner call sites.Keep messages and tools fixed; change the model string.
MODELS = [
"openai/gpt-4o-mini",
"anthropic/claude-3.5-sonnet", # verify at build
"google/gemini-2.5-flash",
]
prompt = [{"role": "user", "content": "In one sentence, what is an agent loop?"}]
for model in MODELS:
r = client.chat.completions.create(model=model, messages=prompt)
print(model, "=>", r.choices[0].message.content)Free models use a :free suffix and platform rate limits.
resp = client.chat.completions.create(
model="meta-llama/llama-3.3-70b-instruct:free", # example; verify at build
messages=[{"role": "user", "content": "Say hi in five words."}],
)
print(resp.choices[0].message.content)Related: Free Models on OpenRouter: What's Available and Their Limits
Agents should log cost drivers every turn.
resp = client.chat.completions.create(
model="openai/gpt-4o-mini",
messages=[{"role": "user", "content": "Count to three."}],
)
print("usage:", resp.usage)
# Provider may appear on the object or in raw JSON depending on SDK version
print(resp.model_dump().get("provider"))stream = client.chat.completions.create(
model="openai/gpt-4o-mini",
messages=[{"role": "user", "content": "List three agent stop conditions."}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content or ""
print(delta, end="", flush=True)
print()Do not hardcode the entire catalog in source control.
import os
import httpx
r = httpx.get(
"https://openrouter.ai/api/v1/models",
headers={"Authorization": f"Bearer {os.environ['OPENROUTER_API_KEY']}"},
timeout=30.0,
)
r.raise_for_status()
models = r.json()["data"]
print("count:", len(models))
print("sample:", models[0]["id"])from openai import APIStatusError
def complete(model: str, messages: list) -> str:
try:
resp = client.chat.completions.create(model=model, messages=messages)
return resp.choices[0].message.content or ""
except APIStatusError as e:
code = e.status_code
if code == 402:
raise RuntimeError("Insufficient OpenRouter credits or key limit") from e
if code == 429:
raise RuntimeError("Rate limited; back off or switch model") from e
raise
print(complete("openai/gpt-4o-mini", [{"role": "user", "content": "ok"}]))Stack versions: Pins from the category manifest (verify at build): OpenRouter (~315+ models, July 2026 pricing/fees); LangGraph 1.0+; CrewAI 1.14+; Microsoft Agent Framework 1.0; Vercel AI SDK 6; Pydantic AI (latest); LlamaIndex (latest); OpenAI Agents SDK (latest + MCP); MCP (Linux Foundation governance); A2A (HTTP+SSE+JSON-RPC 2.0); Solana
@solana/web3.js+@solana/spl-token.
Reviewed by Chris St. John·Last updated Jul 16, 2026