Free AI model API — every LLM, as JSON.
The catalog behind this site is a public feed. 258 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. | 258 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. | 117 models |
| GET /api/openapi.json | OpenAPI 3.1 spec — feed this to any tool that speaks OpenAPI and it can discover the API automatically. | spec |
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 (v2)
{
"version": 2,
"updated": "2026-08-19",
"count": 258,
"_meta": {
"source": "AI Model Watch",
"url": "https://aimodelwatch.dev",
"api_docs": "https://aimodelwatch.dev/api",
"openapi": "https://aimodelwatch.dev/api/openapi.json",
"feed_updated": "2026-08-19",
"license": "MIT",
"citation": "Data by AI Model Watch — https://aimodelwatch.dev",
"providers": [ /* every provider in the catalog */ ],
"methodology": "Compiled from official provider documentation…"
},
"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-19 | 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.
MCP server
If your agent speaks MCP, install the AI Model Watch server and query the catalog directly from Claude, Cursor, Windsurf or any MCP-capable tool — no HTTP needed.
# install globally or run on demand
npx @aimodelwatch/mcpAdd it to your MCP config:
{
"mcpServers": {
"aimodelwatch": {
"command": "npx",
"args": ["-y", "@aimodelwatch/mcp"]
}
}
}Seven tools: list_models, get_model,search_models, compare_models,cheapest_models, list_deprecations,check_model_status. Data is fetched from the public API and cached for 1 hour. Full docs on npm.
OpenAPI spec
The API publishes an OpenAPI 3.1 spec. Point any tool that speaks OpenAPI at https://aimodelwatch.dev/api/openapi.json and it will discover endpoints, field types and enums automatically.
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: 2 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.