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
| File | Contents | Rows |
|---|---|---|
/data/models.json | Current models in the table's scope, one object per model. | 72 models |
/data/models.csv | The same rows as models.json, one line per model. | 72 models |
/data/price-changes.json | Every 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
| Field | Meaning |
|---|---|
id | Stable identifier on this site: maker/model. |
apiId | The model name the maker's API expects. |
maker | Maker identifier (openai, anthropic, google, ...). |
makerName | Maker name as printed on the site. |
name | Model name. |
status | Always "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). |
inputPerMTok | Input price, USD per 1M tokens. |
outputPerMTok | Output price, USD per 1M tokens. |
cachedInputPerMTok | Cached input (cache read) price, USD per 1M tokens, or null. |
cacheWritePerMTok | Cache write price, USD per 1M tokens, or null; for Anthropic, the 5-minute cache write. |
cacheWrite1hPerMTok | Anthropic's 1-hour cache write, USD per 1M tokens, or null. |
priceRegion | Region the price applies to when the maker prices by region (Alibaba: Singapore), else null. |
longPromptTiers | Prices that apply to the whole request above a prompt length: condition, input, output, cachedInput. Empty when none is recorded. |
contextWindow | Context window in tokens, or null when the dataset has none. |
maxOutput | Maximum output tokens, or null when the dataset has none. |
promotion | null, or the promotion the price belongs to: endsOn, atLeastUntil (the maker says "at least through"), and listPriceAfter when the maker publishes it. |
verifiedAt | Day the price (or its absence) was last verified on the source page, YYYY-MM-DD. |
sourceUrl | The maker's page the price was read from. |
pageUrl | This 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
| Field | Meaning |
|---|---|
id | Stable identifier of the entry. |
effectiveDate | Day the change took effect (a future day for an announced change), YYYY-MM-DD. |
provider | Maker or host whose price it is, or "multiple". |
kind | Who 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). |
direction | What the published figure did: increase, decrease, withdrawn or none. |
multiplier | New figure over old, or null. |
affects | Model ids or host API ids the entry names. |
figures | Before and after prices (input, output, USD per 1M tokens) per model, when recorded. |
summary | What happened, as printed on /price-changes/. |
sourceUrl | Where the change can be checked. |
pageUrl | The 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.