---
title: "Every tracked model with its current token prices."
method: GET
path: "/api/v1/models.json"
tags: ["Catalog"]
---

# Every tracked model with its current token prices.

`GET /api/v1/models.json`

## Request

- Base URL: `https://modelpricewatch.com`
- URL: `https://modelpricewatch.com/api/v1/models.json`
- Auth: one of:
  - none
  - API key in header `X-API-Key`

## Response `200`

The full model catalog.

- ModelCollection: Standard collection envelope used by most feeds.
  - `count` integer, required: Number of items in `data`.
  - `updated` string, date, required: Date this feed was last regenerated.
  - `data` object[], required
    - `id` string, required: Stable slug, e.g. anthropic-claude-opus-5.
    - `provider` string, required
    - `model` string, required: Display name.
    - `category` string
    - `input_per_mtok` number, nullable, required: USD per 1M input tokens.
    - `output_per_mtok` number, nullable, required: USD per 1M output tokens. Null for embedding/rerank models that bill input only.
    - `cached_input_per_mtok` number, nullable: USD per 1M cached input tokens, where the provider offers prompt caching.
    - `promo` boolean: True when the served price is a time-limited launch/intro/promotional rate. Budget on the list price, not this number, when true.
    - `promo_until` string, date, nullable: ISO date the promotional price is announced to end. Null when the provider has published no end date (the promo can still end at any time).
    - `price_status` 'verifying' | 'null', nullable: Absent/null on a priced row. "verifying" means we are re-verifying this model's current rate and are deliberately publishing no number: input_per_mtok, output_per_mtok, cached_input_per_mtok and blended_cost_per_mtok are all null, and none of them should be read as zero. Distinct from a null price on a priced row, which means that SKU has no such charge (an embedding bills input only).
    - `blended_cost_per_mtok` number, nullable: Weighted input:output blend. See /api/v1/price-index.json for the ratio in force. Null when price_status is "verifying".
    - `context_window` integer, nullable: Maximum context in tokens.
    - `modality` string, nullable
    - `tags` string[]
    - `released` string, date, nullable
    - `status` string: Lifecycle, e.g. Current, Deprecated, Retired.
    - `open_source` boolean, nullable
    - `parameters` string, nullable
    - `pricing_url` string, uri, nullable: The provider's official pricing page this row was read from.
    - `last_updated` string, date, nullable
    - `evidence` object, nullable: Provenance for the current price, read from our archive of dated captures of provider pricing pages. null means we hold no capture that proves this row's price — either none ever tied the model's name to a published price on the provider's page, or the price has moved since one did. null is a deliberate statement that we cannot prove the number, not missing data.
      - `basis` 'anchored_capture' | 'price_change_receipt' | 'legacy_capture': Which question this receipt answers. `anchored_capture`: we matched the SKU to a price on the same row of the provider's page — the only basis served for a Current/Preview model. `price_change_receipt` / `legacy_capture`: an older capture predating row-level anchoring, served only for Retired/Deprecated rows whose price is historical and whose SKU the vendor no longer lists.
      - `as_of` string, date: The date we read the provider's page.
      - `event` string, nullable: What the capture documented (e.g. price_drop, correction, new_model). null when the price simply held, which is the common case: a re-verification that confirms an unchanged price is still a receipt.
      - `evidence_url` string, uri, nullable: The provider page we read. This is the checkable artefact.
      - `captured_at` string, date-time, nullable
      - `sha` string, nullable: Content hash of the page text we captured.
      - `snapshot` string, nullable: Repository path of the archived page text. Not a public URL.
      - `anchor_sku` string, nullable: The SKU string matched on the provider's page. Present on `anchored_capture` only. This is the derived finding behind the citation.
      - `anchor_scope` string, nullable: Where the price was found relative to the SKU: `row`, `column`, `card`, `tier` (a shared pricing tier that enumerates the SKU on its `Models:` line), `record` (the block the vendor keys with this SKU's machine id — printed as the block's footer, or as the key line above a transposed token-type/price table), `json` (the vendor serves a machine-readable rate list and the price was read from this SKU's own record in it), or `schedule` (the SKU's own card carries a dated rate schedule and the price was read from the window open on the receipt's date).
      - `source` string, nullable
      - `confidence` string, nullable: Capture-time trust label, derived from whether the capture tied the SKU to a price on the provider's page. It therefore restates what `basis: anchored_capture` and `anchor_sku` already tell you; those are the primary fields.
    - `detail_url` string, uri: Human-readable page for this model.

## Other responses

- `429`: Daily request limit for the tier exceeded.

---

[API](https://skmtc.dev/modelpricewatch/apis/model-price-watch-api.md) · [All operations](https://skmtc.dev/modelpricewatch/apis/model-price-watch-api/llms.txt) · [OpenAPI document](https://skmtc.dev/modelpricewatch/apis/model-price-watch-api/revisions/795a15aa2516?raw)
