OpenRouter Analytics
Query your OpenRouter usage data programmatically. Answer questions like "What was my spend this month?", "Which models cost the most?", and "How can I reduce my bill?" using the Analytics API.
Prerequisites
- An OpenRouter management key (provisioning key). Regular API keys will get a 403.
- Get a management key at https://openrouter.ai/settings/management-keys (separate from the regular API keys page)
- Pass it via or set the environment variable
First-Time Setup
bash
cd <skill-path>/scripts && npm install
Decision Tree
| User wants to… | Do this |
|---|
| Know what data is available | Run to see metrics, dimensions, and filters |
| See spend / usage / volume | Run with appropriate metrics |
| Break down by model, provider, API key | Add to the query |
| See trends over time | Add (or , , ) |
| Reduce costs | Run , find the cost optimization template, execute it |
| Inspect individual generations | Add --dimensions generation_id
, then use the skill for details |
| Break down by classifier labels | Use in the request body (see openrouter-analytics-query
skill) |
| Filter by classifier labels | Use in the request body (see openrouter-analytics-query
skill) |
| Answer a specific question | Map the question → metrics + dimensions, then query |
Workflow
The recommended workflow for answering a user's analytics question:
- Discover — Call to see available metrics and dimensions
- Map — Translate the user's question into metrics, dimensions, filters, and time range
- Query — Execute via
- Interpret — Analyze the returned data and explain the results
For common questions,
provides ready-made query templates.
Discover Available Data
bash
cd <skill-path>/scripts && npx tsx discover-schema.ts
Returns the full schema: metrics, dimensions, filter operators, and granularities.
Filter to a specific section:
bash
npx tsx discover-schema.ts --section metrics
npx tsx discover-schema.ts --section dimensions
npx tsx discover-schema.ts --section operators
npx tsx discover-schema.ts --section granularities
See the
openrouter-analytics-schema
skill for detailed guidance on interpreting the schema response and mapping user questions to the right metrics and dimensions.
Query Analytics Data
bash
cd <skill-path>/scripts && npx tsx query-analytics.ts --metrics request_count,total_usage
See the
openrouter-analytics-query
skill for the full parameter reference and query construction guide.
Quick Examples
Spend over the last 7 days, broken down by day:
bash
npx tsx query-analytics.ts --metrics total_usage --granularity day
Top 10 models by cost:
bash
npx tsx query-analytics.ts --metrics total_usage,request_count --dimensions model --order-by total_usage --limit 10
Usage by API key:
bash
npx tsx query-analytics.ts --metrics request_count,tokens_total --dimensions api_key_id --order-by request_count --limit 10
Latency by provider (limited to 31-day range):
bash
npx tsx query-analytics.ts --metrics avg_latency,p90_latency --dimensions provider --order-by p90_latency
Usage cost breakdown (credits, BYOK, upstream, cache, data logging, web search):
bash
npx tsx query-analytics.ts --metrics credits_usage,byok_usage,byok_fees,usage_upstream,usage_cache,usage_data,usage_web --granularity day
Common Query Templates
bash
cd <skill-path>/scripts && npx tsx suggest-queries.ts
Returns a list of pre-built query templates for common questions, each with:
- The natural-language question it answers
- The query parameters (metrics, dimensions, filters, time range)
- The CLI flags to pass to
- Interpretation guidance (where applicable)
Interpreting Results
The query endpoint returns an array of data rows. Each row is a flat object with keys matching the requested metrics and dimensions.
When interpreting results for the user:
- Spend metrics (, , , , , , , , , , , , ) are in USD. includes BYOK inference cost. is typically negative (a data logging discount)
- Token counts (, , ) are in native model tokens
- Latency (, , etc.) is in milliseconds
- Rates () are 0–1 ratios
- Throughput () is tokens per second
- When is set, rows include a field for the time bucket (e.g., , , )
- Label resolution: dimensions , , , and have their raw IDs replaced with human-readable names (key name, app title, user name, workspace name) directly in the data rows; and return raw values
- Truncation: when consuming output programmatically, check . If , the result was capped at and is a partial dataset — raise or paginate before reporting totals or rankings
Cost Optimization Guidance
When the user asks "How can I spend less?" or similar:
- Query top models by spend:
--metrics total_usage,tokens_total,cache_hit_rate,request_count --dimensions model --order-by total_usage --limit 10
- Query cost breakdown:
--metrics credits_usage,byok_usage,byok_fees,usage_upstream,usage_cache,usage_data,usage_web,usage_file --granularity day
to see where spend goes
- Look for:
- Models with high spend but low — prompt caching can help
- Expensive models that could be replaced by cheaper alternatives for specific tasks
- High token counts with low request counts — may indicate oversized prompts
- Models where are a large fraction of total — consider disabling extended thinking if not needed
- High or relative to — web search and file processing add-on costs may be significant
Drilling Down to Individual Generations
To inspect specific generations or sessions from your analytics results, add
or
as a dimension. Both are generations-only dimensions (31-day limit).
returns the unique ID for each generation in the result set.
groups and filters sessionless requests as the literal
: the ClickHouse column defaults to an empty string, and the query builder coalesces it to
. Use
to exclude sessionless requests; filtering on
matches nothing.
bash
npx tsx query-analytics.ts --metrics total_usage,tokens_total --dimensions generation_id --order-by total_usage --limit 10
Once you have a generation ID (e.g.,
), use the
skill to get detailed information:
- — Fetch full request metadata: cost breakdown, token counts, latency, provider routing chain, finish reason, and more
- — Fetch the stored prompt and completion text (unless Zero Data Retention was enabled)
bash
cd <openrouter-generations-skill-path>/scripts
npx tsx get-generation.ts gen-aBcDeFgHiJkLmNoPqRsT
npx tsx get-generation-content.ts gen-aBcDeFgHiJkLmNoPqRsT
This workflow is useful for identifying your most expensive or slowest requests via analytics, then inspecting the actual prompt/completion to understand why.
API Reference
Both endpoints require a management key via
Authorization: Bearer sk-or-v1-...
.
| Endpoint | Method | Description |
|---|
| GET | Returns available metrics, dimensions, operators, granularities |
| POST | Executes an analytics query and returns structured data |