Every model we track, as JSON.
The catalog behind this site is a public feed. 204 models across 12 providers — prices, context windows, lifecycle status and retirement dates — read from official provider documentation and refreshed daily. No key, no signup, no rate limit. CORS is open, so you can call it straight from a browser.
Endpoints
| Endpoint | Returns | Size |
|---|---|---|
| GET /api/models.json | The full catalog — every model, all fields. | 204 models |
| GET /api/deprecations.json | Lifecycle only — every deprecation and retirement a provider has declared, with its stated replacement. Chronological by retirement date, so it includes models already gone. | 79 models |
Try it
# every model, as JSON
curl -s https://aimodelwatch.dev/api/models.json
# what's still to come — the feed is the full record, so filter out the dead
curl -s https://aimodelwatch.dev/api/deprecations.json \
| jq --arg today "$(date +%F)" \
'.models[] | select(.retires_on > $today) | {name, retires_on, replacement}'
# is the model I ship on still GA?
curl -s https://aimodelwatch.dev/api/models.json \
| jq '.models[] | select(.api_string=="claude-fable-5") | .status'Response shape
{
"version": 1,
"updated": "2026-08-05",
"count": 204,
"source": "Compiled from official provider documentation…",
"license": "MIT — attribution appreciated: AI Model Watch",
"models": [ /* … */ ]
}Model fields
| Field | Type | Meaning |
|---|---|---|
| id | string | Stable identifier used in our URLs. |
| name | string | Human-readable model name. |
| provider | string | Anthropic, OpenAI, Google, Mistral, … |
| status | enum | ga · preview · beta · deprecated · retired |
| modality | string[] | text, image, vision, audio, video |
| context_window | number|null | Max input tokens. |
| max_output_tokens | number|null | Max tokens the model can emit. |
| price_input_per_mtok | number|null | USD per 1,000,000 input tokens. |
| price_output_per_mtok | number|null | USD per 1,000,000 output tokens. |
| price_cached_input_per_mtok | number|null | USD per 1M cached input tokens. |
| price_per_1k_searches | number|null | USD per 1,000 search units — rerank models bill per query (one query + up to ~100 documents), not per token. null for everything else. |
| released | date|null | ISO date the model became available. |
| deprecated_on | date|null | ISO date the provider declared it deprecated. |
| retires_on | date|null | ISO date the endpoint stops answering. |
| replacement | string|null | Provider's stated migration target. |
| api_string | string|null | The exact string you pass to the API. |
| open_weight | boolean | Whether weights are downloadable. |
| embedding_dimensions | number|null | Output vector size for embedding models; null for non-embedding models. |
| source_url | string | The official provider page this row was read from. |
A null means the provider does not publish that number — never a guess. Prices are USD per 1,000,000 tokens.
Freshness & caching
The feed is rebuilt and redeployed daily. What that means for a program polling it:
| Signal | Value | What it means |
|---|---|---|
| updated | 2026-08-05 | Top-level field: the date the catalog itself last changed or was re-verified against provider docs — not the date this response was generated. A build check fails if a data edit ships without bumping it, so it is the field to diff between polls. |
| Cache-Control | max-age=3600 | Any cache — your HTTP client, a proxy, the CDN edge — may serve a copy up to one hour old. Append a cache-buster (?cb=$(date +%s)) when you need the origin's current copy, e.g. right after we announce a change. |
| ETag | strong | Conditional requests are supported. Send the previous ETag back as If-None-Match and an unchanged feed answers 304 with an empty body instead of the full payload. |
| Content-Encoding | gzip | The full catalog is ~230 KB raw, ~31 KB gzipped. Ask for it — every HTTP client does by default. |
# poll politely: cache the ETag, pay for the body only when it changes
curl -s -D- -o models.json \
-H "If-None-Match: $(cat etag.txt 2>/dev/null)" \
https://aimodelwatch.dev/api/models.json
# has the catalog itself moved since you last looked?
curl -s "https://aimodelwatch.dev/api/models.json?cb=$(date +%s)" | jq -r .updatedHourly is more than enough — the catalog is refreshed once a day, so anything faster than that returns the same bytes. There is no rate limit and no key; the cache window exists so polling you doesn't cost you a full download.
What we promise
Every row carries the official provider page it was read from. We record what the provider states — we never infer a price or a lifecycle change it hasn't declared.
version: 1 fields won't be removed or retyped without a new version. New fields may be added — parse defensively.
MIT, same as the open dataset. Use it in products, research, or agents — commercially too. Attribution is appreciated, not required.
Wiring this into a build? check-models is a single-file CI check that reads the model ids in your repo and fails when one is deprecated, retiring soon or re-priced — no key, no dependencies. The same data powers /llms.txt for AI agents and /rss.xml for change events. Spot something wrong — a stale price, a missing model? Tell us; corrections against an official source ship the same day.