Skip to content

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_price an 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 503 until COST_TRACKING=true is 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:

  1. Call search_models to shortlist model IDs for the task.
  2. Call model_pricing with the shortlist and compare.
  3. Keep responses small: use variants=false and dimension filters.
{
  "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