App attribution allows developers to associate their API usage with their application, enabling visibility in OpenRouter’s public rankings and detailed analytics. By including simple headers in your requests, your app can appear in our leaderboards and gain insights into your model usage patterns.
Benefits of App Attribution
When you properly attribute your app usage, you gain access to:
Public App Rankings : Your app appears in OpenRouter’s public rankings with daily, weekly, and monthly leaderboards
Model Apps Tabs : Your app is featured on individual model pages showing which apps use each model most
Detailed Analytics : Access comprehensive analytics showing your app’s model usage over time, token consumption, and usage patterns
Professional Visibility : Showcase your app to the OpenRouter developer community
OpenRouter tracks app attribution through the following HTTP headers:
HTTP-Referer (required)
The HTTP-Referer header identifies your app’s URL and is used as the primary identifier for rankings. This header is required for app attribution — without it, no app page will be created and your usage will not appear in rankings. Your app’s URL becomes its unique identifier in the system.
X-OpenRouter-Title
The X-OpenRouter-Title header sets or modifies your app’s display name
in rankings and analytics. X-Title is still supported for backwards compatibility. This header alone does not create an app page — it must be paired with HTTP-Referer.
X-OpenRouter-Categories
The X-OpenRouter-Categories header assigns your app to one or more marketplace categories. Pass a comma-separated list of up to categories per request. Categories must be lowercase, hyphen-separated, and each category is limited to 30 characters. Only recognized categories from the list below are accepted; unrecognized ones are silently ignored. Categories are merged with any existing ones (up to total).
Category Groups
Categories are organized into groups for the marketplace :
Coding — Tools for software development:
cli-agent — Terminal-based coding assistants
ide-extension — Editor/IDE integrations
cloud-agent — Cloud-hosted coding agents
programming-app — Programming apps
native-app-builder — Mobile and desktop app builders
Creative — Creative apps:
creative-writing — Creative writing tools
video-gen — Video generation apps
image-gen — Image generation apps
Productivity — Writing and productivity tools:
writing-assistant — AI-powered writing tools
general-chat — General chat apps
personal-agent — Personal AI agents
Entertainment — Entertainment apps:
roleplay — Roleplay apps and other character-based chat apps
game — Gaming and interactive entertainment apps
Custom Categories
Only recognized categories from the list above are accepted.
Unrecognized values are silently dropped. If you have a use case
that doesn’t fit the existing categories, reach out to us and
we may add new categories in the future.
HTTP-Referer is required to create an app page and appear in rankings. Setting only X-OpenRouter-Title without a URL will not create an app entry. Apps using localhost URLs must also include X-OpenRouter-Title to be tracked.
Implementation Examples
TypeScript SDK
Python (OpenAI SDK)
TypeScript (OpenAI SDK)
Python (Direct API)
TypeScript (fetch)
cURL
import { OpenRouter } from '@openrouter/sdk' ;
const openRouter = new OpenRouter ({
apiKey: '<OPENROUTER_API_KEY>' ,
httpReferer: 'https://myapp.com' , // Your app's URL
appTitle: 'My AI Assistant' , // Your app's display name
appCategories: 'cli-agent,cloud-agent' , // Optional categories
});
const completion = await openRouter . chat . send ({
model: 'openai/gpt-5.2' ,
messages: [
{
role: 'user' ,
content: 'Hello, world!' ,
},
],
stream: false ,
});
console . log ( completion . choices [ 0 ]. message );
See all 21 lines
from openai import OpenAI
client = OpenAI(
base_url = "https://openrouter.ai/api/v1" ,
api_key = "<OPENROUTER_API_KEY>" ,
)
completion = client.chat.completions.create(
extra_headers = {
"HTTP-Referer" : "https://myapp.com" , # Your app's URL
"X-OpenRouter-Title" : "My AI Assistant" , # Your app's display name
"X-OpenRouter-Categories" : "cli-agent,cloud-agent" , # Optional
},
model = "openai/gpt-5.2" ,
messages = [
{
"role" : "user" ,
"content" : "Hello, world!"
}
]
)
import OpenAI from 'openai' ;
const openai = new OpenAI ({
baseURL: 'https://openrouter.ai/api/v1' ,
apiKey: '<OPENROUTER_API_KEY>' ,
defaultHeaders: {
'HTTP-Referer' : 'https://myapp.com' , // Your app's URL
'X-OpenRouter-Title' : 'My AI Assistant' , // Your app's display name
'X-OpenRouter-Categories' : 'cli-agent,cloud-agent' , // Optional
},
});
async function main () {
const completion = await openai . chat . completions . create ({
model: 'openai/gpt-5.2' ,
messages: [
{
role: 'user' ,
content: 'Hello, world!' ,
},
],
});
console . log ( completion . choices [ 0 ]. message );
}
main ();
import requests
import json
response = requests.post(
url = "https://openrouter.ai/api/v1/chat/completions" ,
headers = {
"Authorization" : "Bearer <OPENROUTER_API_KEY>" ,
"HTTP-Referer" : "https://myapp.com" , # Your app's URL
"X-OpenRouter-Title" : "My AI Assistant" , # Your app's display name
"X-OpenRouter-Categories" : "cli-agent,cloud-agent" , # Optional
"Content-Type" : "application/json" ,
},
data = json.dumps({
"model" : "openai/gpt-5.2" ,
"messages" : [
{
"role" : "user" ,
"content" : "Hello, world!"
}
]
})
)
fetch ( 'https://openrouter.ai/api/v1/chat/completions' , {
method: 'POST' ,
headers: {
Authorization: 'Bearer <OPENROUTER_API_KEY>' ,
'HTTP-Referer' : 'https://myapp.com' , // Your app's URL
'X-OpenRouter-Title' : 'My AI Assistant' , // Your app's display name
'X-OpenRouter-Categories' : 'cli-agent,cloud-agent' , // Optional
'Content-Type' : 'application/json' ,
},
body: JSON . stringify ({
model: 'openai/gpt-5.2' ,
messages: [
{
role: 'user' ,
content: 'Hello, world!' ,
},
],
}),
});
curl https://openrouter.ai/api/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $OPENROUTER_API_KEY " \
-H "HTTP-Referer: https://myapp.com" \
-H "X-OpenRouter-Title: My AI Assistant" \
-H "X-OpenRouter-Categories: cli-agent,cloud-agent" \
-d '{
"model": "openai/gpt-5.2",
"messages": [
{
"role": "user",
"content": "Hello, world!"
}
]
}'
Where Your App Appears
App Rankings
Your attributed app will appear in OpenRouter’s main rankings page at openrouter.ai/rankings . The rankings show:
Top Apps : Largest public apps by token usage
Time Periods : Daily, weekly, and monthly views
Usage Metrics : Total token consumption across all models
Model Apps Tabs
On individual model pages (e.g., GPT-4o ), your app will be featured in the “Apps” tab showing:
Top Apps : Apps using that specific model most
Weekly Rankings : Updated weekly based on usage
Usage Context : How your app compares to others using the same model
Individual App Analytics
Once your app is tracked, you can access detailed analytics at openrouter.ai/apps?url=<your-app-url> including:
Model Usage Over Time : Charts showing which models your app uses
Token Consumption : Detailed breakdown of prompt and completion tokens
Usage Patterns : Historical data to understand your app’s AI usage trends
Best Practices
URL Requirements
Always include HTTP-Referer — this is the minimum requirement for app attribution
Use your app’s primary domain (e.g., https://myapp.com)
Avoid using subdomains unless they represent distinct apps
For localhost development, always include X-OpenRouter-Title as well
You can view your app’s page at openrouter.ai/apps?url=<your-referer-url>
Title Guidelines
Keep titles concise and descriptive
Use your app’s actual name as users know it
Avoid generic names like “AI App” or “Chatbot”
Privacy Considerations
Only public apps, meaning those that send headers, are included in rankings
Attribution headers don’t expose sensitive information about your requests