Skip to content

Methodology

Where the numbers come from, how they are combined, and what the LLM Price Index measures. Prices have been tracked since Oct 3, 2026.

Data collection

Prices are collected from provider listings every six hours, at 00:00, 06:00, 12:00 and 18:00 UTC. For every model, each provider endpoint that serves it is recorded with its prices, region or variant, quantization, context length and recent uptime. Each run keeps the raw responses, so every number on this site can be traced back to what was published at that moment.

Models are identified by a stable id such as meta-llama/llama-3.3-70b-instruct. Automatic routers and “latest” aliases, which point at other models, are left out.

Prices & blending

All prices are in US dollars per one million tokens, except per-request, per-image and per-search fees. Stored prices are exact decimal strings; nothing is rounded until it is displayed.

Most workloads read far more than they write, so models are compared on a single blended price that weights input three to one:

blended = (3 × input + 1 × output) / 4
Only for paid offers that publish both an input and an output price.

Best price is the lowest blended price among a model’s active, paid provider endpoints. Spread is the most expensive provider’s blended price divided by the cheapest, so 2.0× means the priciest provider charges twice as much for the same model.

The LLM Price Index

The index tracks how the price of LLM tokens moves over time, the way a consumer price index tracks a basket of goods. It starts at 100 on the first tracked day.

Each day it compares every offer that was active on both that day and the day before: paid endpoints of text-output models, priced at the end of each UTC day. It takes the geometric mean of their price ratios and multiplies it onto the previous value:

index(d) = index(d−1) × ( ∏ blended(d) / blended(d−1) ) ^ (1/n)
A chained Jevons index. n is the number of offers present on both days.

Because only offers present on both days are compared, a new provider launching a cheap endpoint or an old one disappearing does not move the index. Only real price changes do. The geometric mean gives a 50% cut on a $0.10 model the same weight as a 50% cut on a $15 model.

Alongside the index, each day records the median of every model’s best blended price and the number of offers compared, both visible when you hover the chart.

Changes & removals

Every offer has a price history made of periods. A new period begins only when a price actually changes, and each changed field (input, output, cache, and so on) is logged as its own change with its old and new value.

An offer is marked delisted only when the source that lists it responded successfully and the offer was missing. A timeout or an error from a provider never counts as a removal, so outages don’t produce phantom delistings. Models are retired the same way, when the model catalogue loads and no longer includes them.

History begins with the first crawl. Seven- and thirty-day changes, sparklines and the index fill in as the history grows.

API

Everything on this site comes from a public JSON API. Responses are cached for 60 seconds. Timestamps are UTC, prices are numbers in USD per 1M tokens, and percent changes are fractions (−0.12 is −12%).

GET/api/stats
Headline counts, last and next crawl, current index value
GET/api/models
Every model with best price, provider count, spread, 7d/30d change and a 30-day sparkline
GET/api/models/{author}/{slug}
One model: all offers, per-offer price history, change log
GET/api/providers
Every provider with offer and model counts, cheapest count, median premium
GET/api/providers/{slug}
One provider: its offers and recent changes
GET/api/changes?limit=&before=&kind=&model=&provider=
The change log, newest first, paginated with the before cursor
GET/api/movers?window=7d|30d
Ten biggest drops and increases by blended price
GET/api/index?range=30d|90d|1y|all
Daily LLM Price Index points