Model Pricing API¶
Query the exact AWS unit prices for one or more models, straight from the same AWS Price List catalog the server uses for request cost tracking. Native route, served without a dialect prefix.
At a glance¶
- Exact published AWS prices — one row per billed dimension,
unit_pricean exact decimal string per single unit (token, image, second, character, request, search unit). - Every published axis — region, service tier (
standard,flex,priority,batch), prompt-cache write TTL, serving profile, media spec and the beyond-200K-token bucket. - No AWS call on the request path — prices are indexed eagerly at startup and answered from memory, so the endpoint is fast enough to call inline.
- Built for cost-aware model selection — shortlist with
search_models, then compare price cards in one call; both are published as MCP tools. - Disabled by default: this API answers
503untilCOST_TRACKING=trueis set — see Limits and behaviour to know.
export BASE="https://your-host" # native routes carry no dialect prefix
curl -G "$BASE/model_pricing" \
--data-urlencode "model=amazon.nova-pro-v1:0" \
--data-urlencode "variants=false" \
-H "Authorization: Bearer $API_KEY"
Endpoints¶
| Endpoint | Method | MCP Tool |
|---|---|---|
/model_pricing | GET | model_pricing |
How It Works¶
Each returned row is one published AWS price: a billed dimension (same vocabulary as the request-log usage entries) plus its published variants — service tier, prompt-cache write TTL, serving profile, media spec, and long-context bucket. unit_price is an exact decimal string per one billed unit (token, image, second, character, request, search unit).
By default the card reflects your server's configuration: only the configured Bedrock regions, each model's default service tier, and its effective serving profile (routing) are returned, with the same fallbacks billing applies: a tier or routing without a distinct published rate falls back to the standard/plain row, and a standard row kept for an unpublished tier is repriced at what that tier actually bills — half the standard token rates for flex and batch, 1.75× for priority, per-request fees unchanged — while its tier field still reads standard. Pass all_prices=true for the full published price table, and explicit region/tier/routing filters to override any axis in either mode.
A few rates AWS publishes without a model — because one flat rate covers every model that can incur them — are exposed under a stable identifier of their own rather than repeated on each model. The built-in web search tool is priced as amazon.bedrock-web-search, on the grounding_requests dimension, one unit per query; a retrieval from a fully managed knowledge base store is priced as amazon.bedrock-knowledge-base, on the search_units dimension, one unit per query; the guardrail policies are priced under one identifier per policy. Ask for these identifiers by name (model=amazon.bedrock-web-search): they are rates rather than models you can call, so they are not part of the unfiltered listing.
Prices are indexed eagerly: models not currently accessible to your account can still be priced. An empty prices list means AWS publishes no rows for that model (or none match the filters). A missing variant row means AWS publishes no distinct rate for it — billing then falls back the same way cost tracking does.
This endpoint responds without contacting AWS, so it is fast enough to call inline. To compare prices without a running server, the Models page publishes them side by side, per region and per service tier.
Query Parameters¶
All parameters are optional and combine with AND logic.
| Parameter | Type | Description |
|---|---|---|
model | string | Repeatable. Model IDs or aliases to price; omit for the full list of available models |
region | string | Only prices for this AWS region (e.g. us-east-1) |
tier | string | Only this service tier: standard, flex, priority, batch |
dimension | string | Repeatable. Only these billed dimensions (e.g. input_tokens, output_tokens, output_images) |
variants | boolean | false = base price card only: standard tier without cache-TTL, routing, or long-context rows (media spec rows are kept) |
currency | string | Only prices in this ISO currency code, case-insensitive; must be a currency present in the catalog (e.g. USD, EUR on the AWS European Sovereign Cloud (EUSC)) |
routing | string | Only this published serving-profile price variant: global, latency. Row routing values enriched for display (geography prefixes, AWS regions) cannot be filtered on — use region for those |
context | string | Only this context-length bucket: long (prompts beyond 200K tokens) |
all_prices | boolean | true = the full published price table; false (default) = only the prices matching the server's configuration |
Response Fields¶
One ModelPricing object per requested model, in request order (duplicates removed); with no model filter, one per available model, sorted by ID:
| Field | Description |
|---|---|
id | The model ID as requested |
service | AWS service/API the prices apply to (e.g. bedrock-runtime). Note: this uses AWS API endpoint identifiers, a different vocabulary from the display names in the search_models service field — both match the code, but the values are not comparable |
default_tier | Service tier this server applies to the model by default (DEFAULT_MODEL_SERVICE_TIERS) |
default_routings | Serving profiles this server can use for the model across its configured regions, in configured-region order: global, geography prefixes (eu, us, …), or AWS regions |
prices | Price rows, sorted by region then remaining axes; empty when AWS publishes none |
Each row in prices (axes are omitted when not applicable):
| Field | Description |
|---|---|
region | AWS region the price applies to |
dimension | Billed dimension — same names as the usage log entries |
tier | Service tier: standard, flex, priority, batch |
cache_ttl | Prompt-cache write TTL bucket (5m, 1h), when distinctly priced |
routing | Serving profile: global (global cross-region inference), a geography prefix like eu/us (regional cross-region inference), an AWS region (single-region inference), or latency for the latency-optimized variant |
spec | Media bucket, e.g. image resolution:quality (1024:standard) or a modality qualifier |
context | long for the beyond-200K-tokens prompt rate |
unit_price | Exact plain-decimal price per one billed unit (no exponent, no trailing zeros) |
currency | ISO currency code (USD commercially, EUR on EUSC) |
Status Codes¶
| Status | Cause |
|---|---|
200 | Success — a model with no published price, or no row matching the filters, still returns 200 with an empty prices list |
400 | Unknown tier, dimension, routing, context, or currency filter value |
503 | Model pricing is not available on this server, or the price catalog is not loaded yet (retry later) |
Using model_pricing as an MCP Tool¶
When MCP is enabled, model_pricing is exposed as an MCP tool under the same name. The intended agent workflow:
- Call
search_modelsto shortlist model IDs for the task. - Call
model_pricingwith the shortlist and compare. - Keep responses small: use
variants=falseanddimensionfilters.
{
"tool": "model_pricing",
"arguments": {
"model": ["anthropic.claude-sonnet-4-5-20250929-v1:0", "amazon.nova-pro-v1:0"],
"variants": false,
"dimension": ["input_tokens", "output_tokens"]
}
}
Limits and behaviour to know¶
The API is disabled by default. COST_TRACKING is false out of the box, because it needs the extra pricing:GetProducts IAM permission an existing deployment may not grant. Until COST_TRACKING=true is set, every call answers 503.
A 503 right after startup means the catalogue is still loading. The price index is fetched in a background task that never delays readiness, so the first calls after a restart are retry-later rather than errors.
An empty prices list is a 200. AWS publishes no rows for that model, or none match the filters; a missing variant row means AWS publishes no distinct rate for it, and billing falls back the same way cost tracking does.
Enriched routing values cannot be filtered on. Geography prefixes and AWS regions are added for display; filter on region for those. routing accepts only the published variants global and latency.
service is not comparable with the search_models field of the same name. This one carries AWS API endpoint identifiers (bedrock-runtime); search_models carries display names. Both match the code; the values do not match each other.
Prices are strings on purpose. unit_price values are exact decimal strings ("0.000003"), never floats — JSON floats cannot represent small per-token rates without exponent notation or rounding noise. Parse them with a decimal type for arithmetic.
Request headers¶
| Header | Purpose | Notes |
|---|---|---|
Authorization | Gateway API key | Bearer <key>, required like every other route |
Try it¶
The curl examples below use a $BASE variable set to your scheme and host — native routes such as /model_pricing are not prefixed:
export BASE="https://your-host"
Base price card of a shortlist:
curl -G "$BASE/model_pricing" \
--data-urlencode "model=anthropic.claude-sonnet-4-5-20250929-v1:0" \
--data-urlencode "model=amazon.nova-pro-v1:0" \
--data-urlencode "variants=false" \
-H "Authorization: Bearer $API_KEY"
Base price card of every available model:
curl -G "$BASE/model_pricing" \
--data-urlencode "variants=false" \
-H "Authorization: Bearer $API_KEY"
Token rates in one region:
curl -G "$BASE/model_pricing" \
--data-urlencode "model=amazon.nova-pro-v1:0" \
--data-urlencode "region=us-east-1" \
--data-urlencode "dimension=input_tokens" \
--data-urlencode "dimension=output_tokens" \
-H "Authorization: Bearer $API_KEY"
Response (trimmed):
[
{
"id": "amazon.nova-pro-v1:0",
"service": "bedrock-runtime",
"default_tier": "standard",
"default_routings": ["us"],
"prices": [
{"region": "us-east-1", "dimension": "input_tokens", "tier": "standard", "routing": "us", "unit_price": "0.0000008", "currency": "USD"},
{"region": "us-east-1", "dimension": "output_tokens", "tier": "standard", "routing": "us", "unit_price": "0.0000032", "currency": "USD"}
]
}
]
Next steps¶
Next: Search Models API · Cost Management · COST_TRACKING · Models catalogue