Skip to main content

Overview

/v1/models/pricing is a public, unauthenticated aggregation endpoint that returns every model currently available on the platform along with its published price. The response strictly follows the OpenRouter Providers specification, so it can be ingested by OpenRouter, third-party price aggregators, or any custom client.
This endpoint is the “published price” entry point and carries no user identity. Prices returned represent the final cost for the default group in an anonymous context. To see the price an authenticated user actually pays (group, tier discount, agent markup, etc.), use /api/pricing instead.

When to use it

Endpoint

Request examples

Response structure

The top level is always wrapped in a data array:

Top-level field

Model fields

Pricing fields

All prices are USD strings. Token-class fields are priced per token; flat-class fields use the unit listed below.
  • The four required fields (prompt / completion / request / image) are always present, possibly as "0". Optional fields are omitted when not configured.
  • A value of "0" may mean either “free” or “not applicable to this model”. Combine with supported_features and supported_sampling_parameters to infer capability instead of relying on pricing alone.

supported_features enum

How the three billing modes map

The platform supports three internal billing modes (see Pricing). All three are losslessly mapped to OpenRouter fields:

How the price is computed

The published price is:
  • base_price: the official price configured by the admin
  • group_ratio: the ratio of the default group
  • currency_factor: if the base is configured in CNY it is divided by the FX rate; if already USD it is left unchanged
  • Not applied: agent markups, user tier discounts, per-user model multipliers, time-of-day rules, runtime dynamic factors
Authenticated users may pay a different price. Pricing returned here always reflects the anonymous “default group” view. Custom group, tier discount, or agent-domain markups are layered on top per request and are intentionally hidden from this public endpoint.

Tiered pricing

Some models charge a different unit price above a context-length threshold (e.g. Gemini 1.5 / 2.5 Pro doubles at ≥128K tokens). The upper tier is exposed via pricing_tiers:
  • pricing is the base tier (the Prompt Tier with the lowest threshold)
  • pricing_tiers[i] is the upper tier; applied when total input tokens ≥ min_context
  • At most one upper tier is returned (matching OpenRouter’s 2-tier maximum)

Data source: structured Prompt Tiers

The admin panel configures Prompt Tiers for each model. Each tier has two fields: Runtime billing and public exposure share the same data, ensuring published price ≡ billed price so OpenRouter monthly reconciliation never drifts.

Matching dimension

The threshold is matched against total input tokens, including cache and multimodal:
This aligns with OpenRouter min_context and Gemini/Claude official tiered docs — total context length defines the tier; otherwise users could bypass tiered pricing by going fully through cache.

Matching rule

Largest-threshold-wins: among all tiers satisfying total >= min, the one with the highest threshold is selected. The full price of the matched tier is applied (no progressive stepping, matching how official providers price). If no tier is matched, the base tier (lowest threshold) is used.

Conditions that cannot be tiered

OpenRouter only models the “input token count” dimension. The following scenarios are still billed by the general rule engine (Conditions) but are not published via pricing_tiers — OpenRouter only sees the base price:
  • Image quality (e.g. request.body.quality == '1080p')
  • Video duration (e.g. request.body.duration > 30)
  • Response-driven conditions (e.g. response.body.usage.reasoning_tokens > 100)
  • Compound conditions (&& / || combinations)
For these models, configure an unconditional baseline price under the default group as the publishable rate.

Caching and update cadence

Comparison with other endpoints

FAQ

The published price reflects the default group in an anonymous context. If you belong to a different group (e.g. pro / premium), have tier discounts, or access through an agent domain with markup applied, your real price will differ. Authenticated users should call /api/pricing to fetch their own effective price.
"0" can mean either “free” or “this dimension does not apply to the model”. Always combine supported_features and supported_sampling_parameters to infer model capability — don’t rely on pricing alone.
OpenRouter has no per_second field, so the platform publishes per_second × typical_duration (admin-configured, default 30 seconds) as the request / video / audio price. Actual billing still uses real seconds, so OpenRouter’s monthly reconciliation always matches what we charged.
Yes — a strict per-IP critical rate limit. Best practices:
  • Poll no more than once every 5 minutes
  • Honor Cache-Control: max-age=60 and cache client-side
  • For long-term monitoring, subscribe to platform announcements rather than polling aggressively
No query parameters are supported right now — the endpoint always returns all healthy models. Filter client-side using supported_features / input_modalities after fetching.