LLM API pricing / Dataset

The LLM API pricing dataset

The data behind the pricing table as files: 72 current models from 9 makers, each price with the day it was verified and the maker's page it was read from, and the 17 recorded changes to those prices. Free to reuse under Creative Commons Attribution 4.0 International (CC BY 4.0), with attribution.

Files

FileContentsRows
/data/models.jsonCurrent models in the table's scope, one object per model.72 models
/data/models.csvThe same rows as models.json, one line per model.72 models
/data/price-changes.jsonEvery recorded change to a price this site publishes.17 entries

The same three files, with their full history, are on GitHub: alvaroluceroo/llm-api-pricing-dataset. Every build that changes the data adds a commit there, so any past version can be retrieved and two versions can be diffed; a build that changes nothing but the build time adds none. The repository also has a CITATION.cff for GitHub's "Cite this repository". They are also on Hugging Face as alvaroluceroo/llm-api-pricing, updated at the same time, with a dataset viewer: load_dataset("alvaroluceroo/llm-api-pricing", "models") loads the model rows and "price-changes" the record of changes.

Both JSON files have the same envelope: name, publisher, homepage, generatedAt (when that copy was built, UTC), license, licenseUrl, attribution, rowCount and rows. The CSV starts with three lines beginning with # that carry the same name, build time, licence and attribution, then a header line. Skip them with pandas.read_csv(url, comment="#") or the equivalent option of your reader; no value in the file contains #.

What is in it and what is not

The model files hold the same rows as the table's default view: models whose status is current, charged per token, with text output. Deprecated and retired models are not included, and neither are rows found to be outside the table's scope. 5 of the 72 rows are models whose maker was checked and publishes no per-token price: their prices are empty and priceStatus says no-published-price. No figure in the files is estimated or filled in. 19 rows have a long-prompt tier, 1 of them more than one, and 6 carry a promotion with its end date.

Left out on purpose: this site's internal notes, confidence levels, the detector's working fields, prices by inference hosts (they are on the inference providers page) and second price lists such as Batch or Priority (see the post about them).

Fields of models.json

FieldMeaning
idStable identifier on this site: maker/model.
apiIdThe model name the maker's API expects.
makerMaker identifier (openai, anthropic, google, ...).
makerNameMaker name as printed on the site.
nameModel name.
statusAlways "current" in this file.
priceStatus"priced", or "no-published-price" when the maker was checked and publishes no per-token price (prices are then null).
inputPerMTokInput price, USD per 1M tokens.
outputPerMTokOutput price, USD per 1M tokens.
cachedInputPerMTokCached input (cache read) price, USD per 1M tokens, or null.
cacheWritePerMTokCache write price, USD per 1M tokens, or null; for Anthropic, the 5-minute cache write.
cacheWrite1hPerMTokAnthropic's 1-hour cache write, USD per 1M tokens, or null.
priceRegionRegion the price applies to when the maker prices by region (Alibaba: Singapore), else null.
longPromptTiersPrices that apply to the whole request above a prompt length: condition, input, output, cachedInput. Empty when none is recorded.
contextWindowContext window in tokens, or null when the dataset has none.
maxOutputMaximum output tokens, or null when the dataset has none.
promotionnull, or the promotion the price belongs to: endsOn, atLeastUntil (the maker says "at least through"), and listPriceAfter when the maker publishes it.
verifiedAtDay the price (or its absence) was last verified on the source page, YYYY-MM-DD.
sourceUrlThe maker's page the price was read from.
pageUrlThis model's page on AI Signal.

models.csv has the same fields, with nested ones flattened: the first long-prompt tier goes into longTierCondition, longTierInputPerMTok and longTierOutputPerMTok, and longTierCount says how many tiers the row has (the others are only in the JSON); the promotion goes into promoEndsOn and promoAtLeastUntil. Columns, in order: id, apiId, maker, makerName, name, status, priceStatus, inputPerMTok, outputPerMTok, cachedInputPerMTok, cacheWritePerMTok, cacheWrite1hPerMTok, priceRegion, longTierCondition, longTierInputPerMTok, longTierOutputPerMTok, longTierCount, contextWindow, maxOutput, promoEndsOn, promoAtLeastUntil, verifiedAt, sourceUrl, pageUrl.

Fields of price-changes.json

FieldMeaning
idStable identifier of the entry.
effectiveDateDay the change took effect (a future day for an announced change), YYYY-MM-DD.
providerMaker or host whose price it is, or "multiple".
kindWho moved the figure: provider, correction (of this site's reading), omission (a row this site had missed) or criterion (a change of this site's rule).
directionWhat the published figure did: increase, decrease, withdrawn or none.
multiplierNew figure over old, or null.
affectsModel ids or host API ids the entry names.
figuresBefore and after prices (input, output, USD per 1M tokens) per model, when recorded.
summaryWhat happened, as printed on /price-changes/.
sourceUrlWhere the change can be checked.
pageUrlThe entry on /price-changes/.

How often it is updated

The files are generated from the dataset on every build of the site, so they always match the pages: a copy never lags behind the table. What changes between builds is set by the checks described in the methodology: rows from the makers the weekly detector reads are checked each Monday against their maker's page, the rest (makers whose pages it cannot read, and rows with no published price) are reviewed by hand, and a change found on any day is published once the editor has read it on the source page. In the 7 days to October 1, 2026, 56 current prices were re-verified. The verifiedAt of each row, not generatedAt, says when its price was last confirmed. New entries in the record of changes also reach the price changes RSS feed.

How to cite it

Attribution line, ready to copy, for a page, an app or a chart:

LLM API pricing data by AI Signal (https://aisignalhq.com/api-pricing/), licensed under CC BY 4.0.

For a paper or a report:

AI Signal. LLM API pricing dataset. October 1, 2026 edition. https://aisignalhq.com/data/. Licensed under CC BY 4.0.

Link to https://aisignalhq.com/api-pricing/, to this page or to the model page you took the figure from, and say whether you changed the data. Every row carries its own sourceUrl: for a single price, citing the maker's page as well is the most checkable form.

Licence

The data, meaning the prices, the dates they were verified and the source pages they were read from, is licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) licence. You may copy, share and adapt it, including commercially, with the attribution above. The site's text, design and code are not covered; see the Terms of Use. The data is provided as is: providers change prices without notice, so confirm a price on the maker's page before committing spend. To report an error, write to the editor from the About page.