Public API
Everything on this site comes from the same JSON API. Public routes need no key; responses are cached for 1–10 minutes and search is rate-limited per IP.
API ok · v0.1.0
Base URL
https://www.ai-atlas.co/api/v1
Interactive OpenAPI documentation: /api/v1/docs. JSON, UTF-8, ISO-8601 UTC timestamps. Errors are { "detail": "…" } with 400 / 404 / 429 / 503 (422 for parameters rejected by validation).
# Live counters
curl -s https://www.ai-atlas.co/api/v1/stats | jq '.entities'
# Natural-language search → compiled filters + ranked results
curl -s "https://www.ai-atlas.co/api/v1/search?q=open+models+over+100B+released+in+2026" | jq '.query, .items[0:3]'
# A model with provenance, prices, results, lineage
curl -s https://www.ai-atlas.co/api/v1/models/claude-fable-5.1 | jq '{name, attributes, provenance: (.provenance | keys)}'
# Compare two models on every shared dimension (+ shared benchmarks, best prices)
curl -s "https://www.ai-atlas.co/api/v1/compare?ids=claude-fable-5.1,claude-opus-5" | jq '.dimensions[].key, .items[].values'
# What changed between two dates (scope: all | models | org:<slug> | family:<name>)
curl -s "https://www.ai-atlas.co/api/v1/diff?a=2026-09-04&b=2026-09-11&scope=models" | jq '.counts, .new_entities[0:3]'
# Claim history and the state of a record as of a date
curl -s "https://www.ai-atlas.co/api/v1/entities/claude-fable-5.1/history?property=context_length" | jq '.items[] | {value, status, valid_from, valid_to, source_url}'
curl -s "https://www.ai-atlas.co/api/v1/entities/claude-fable-5.1/asof?date=2026-09-04" | jq '{existed, attributes}'
# Neighbourhood graph, price index, leaderboard by config, estimated hardware fit
curl -s "https://www.ai-atlas.co/api/v1/entities/claude-fable-5.1/graph?depth=1&limit=80" | jq '{nodes: (.nodes|length), edges: (.edges|length)}'
curl -s "https://www.ai-atlas.co/api/v1/prices/index?days=90" | jq '.series[-1], (.movers|length)'
curl -s "https://www.ai-atlas.co/api/v1/benchmarks/<benchmark-slug>/results?config=variant=v2.1&limit=20" | jq '.items[] | {model: .model.name, score, config}'
curl -s "https://www.ai-atlas.co/api/v1/hardware/fit?memory_gb=64&quant=4bit&context=32768&limit=20" | jq '.assumptions, .items[0]'
# What changed today
curl -s "https://www.ai-atlas.co/api/v1/changes?importance_min=2&limit=20" | jq '.items[] | {event_type, summary, source_url}'Live examples
Example responses
Fetched from the API when this page was rendered (revalidated hourly) and trimmed for display — not sample data.
GET /stats
{
"entities": {
"model": 333,
"company": 67,
"paper": 753,
"provider": 27,
"benchmark": 27,
"hardware": 33,
"framework": 66,
"dataset": 0,
"tool": 0,
"repository": 10,
"lab": 8,
"organization": 19,
"researcher": 1899,
"university": 1
},
"entities_total": 3243,
"sources": 34,
"connectors": 27,
"claims_current": 11639,
"change_events_24h": 3987,
"benchmark_results": 0,
"prices_current": 148,
"last_event_at": "2026-09-11T21:08:10.291945Z",
"computed_at": "2026-09-11T21:08:21.826206Z",
"…": "26 keys in total"
}GET /models/claude-fable-5.1
{
"id": "model_01M293V7EK3CVA2J99BHKR8PHG",
"entity_type": "model",
"slug": "claude-fable-5.1",
"name": "Claude Fable 5.1",
"organization": {
"id": "company_01M293SNX22C24ZSAB9Y9XFKG6",
"slug": "anthropic",
"name": "Anthropic"
},
"status": "active",
"attributes": {
"family": "Claude",
"status": "active",
"vision": true,
"openness": "proprietary",
"thinking": "Adaptive (always on)",
"api_alias": "claude-fable-5-1",
"modalities": [
"text",
"image"
],
"description": "For demanding reasoning and long-horizon agentic work",
"…": "18 more"
},
"provenance": {
"family": {
"url": "https://platform.claude.com/docs/en/models/overview.md",
"tier": 1,
"extractor": "deterministic",
"source_id": "src_01M293SNSRMMK6WFMM5JTEFM7F",
"confidence": "high",
"observed_at": "2026-09-11T20:51:46+00:00",
"snapshot_id": "snap_01M293V7EBW40K8TJ4TB2ER4F7",
"source_name": "Claude Developer Platform docs",
"source_domain": "docs.claude.com"
},
"…": "one entry per attribute"
},
"quality": {
"score": 80,
"version": "1.0",
"agreement": 1,
"conflicts": 0,
"freshness": 1,
"claim_count": 26,
"completeness": 0.667,
"source_count": 1,
"primary_source_ratio": 1
},
"counts": {
"claims": 26,
"events": 2,
"relations": 2
},
"relations": "2 groups",
"prices": "1 current rows",
"results": "0 benchmark results",
"timeline": "2 events",
"updated_at": "2026-09-11T20:51:51.859116Z"
}Trimmed: the full record has every attribute, a provenance entry per attribute, grouped relations, sources and the latest 30 events — see it rendered or fetch the JSON.
Endpoints
Public routes
| Route | Returns |
|---|---|
| GET /health | Service status (db, redis, llm) and version |
| GET /stats | Live counters: entities per type, sources, documents, claims, events, prices, archive size — always computed from the database |
| GET /stats/history?days=90 | Daily counts |
| GET /search?q=&type=&limit=&offset= | Natural-language or keyword search → { query: compiled filters, items: ranked entities (+rank), total } |
| GET /search/suggest?q= | ≤ 8 prefix suggestions { id, entity_type, slug, name, organization_name } |
| GET /entities/{slug} | Full entity detail: attributes, provenance per attribute, aliases, identifiers, relations (grouped), sources, timeline and type-specific blocks (prices, price_history, results, lineage, hardware_fit, models, papers, repositories) |
| GET /models/{slug} · /companies/{slug} · /papers/{slug} · /providers/{slug} · /benchmarks/{slug} · /hardware/{slug} · /frameworks/{slug} · /datasets/{slug} · /tools/{slug} | Same detail, type-checked (404 if the slug is another type) |
| GET /entities/{slug}/timeline?limit=&before= | { items: ChangeEvent[], next_before } — the entity’s own events (and, for companies, those of the models it develops) |
| GET /entities/{slug}/history?property= | { items: Claim[] } — every claim ever recorded, newest first, with status current | superseded | conflicting | retracted, valid_from → valid_to, source and tier |
| GET /entities/{slug}/asof?date=YYYY-MM-DD | { existed, first_seen_at, date, attributes, claims } — the entity as it was known on that date |
| GET /entities/{slug}/graph?depth=1|2&limit=80 | { root, nodes: { id, slug, name, entity_type, organization_name }[], edges: { source, target, predicate }[] } — capped neighbourhood |
| GET /entities/{slug}/sources · /related?limit= | Documents describing the entity (deduped by URL) · related entities (same org / family / shared relations) |
| GET /models?q=&org=&family=&openness=&modality=&status=&min_params=&max_params=&min_context=&year_from=&year_to=&license=&sort=&order=&facets=1 | Paged models (+facets: organizations, openness, modalities, families, years, licenses, status) |
| GET /companies?q=&country=&kind=&sort= | Paged organizations with model_count and paper_count (+facets) |
| GET /papers?q=&category=&org=&since=&until=&sort= | Paged papers |
| GET /providers · GET /prices?model=&provider=&sort=¤t=1 · GET /prices/history?model=|provider= | Providers with min prices · current price rows (USD / 1M tokens) · every price row incl. closed ones, oldest first |
| GET /prices/index?days=180 | { days, series: { day, median_input, median_output, min_input, max_input, models, offers }[], movers: ChangeEvent[] (PRICE_CHANGED), note } |
| GET /benchmarks · GET /benchmarks/{slug}/results?config=&history=1&limit=&offset= · GET /benchmarks/{slug}/history?model= | Benchmarks with result_count, model_count and current top · leaderboard sorted by score (respecting higher_is_better), current rows only unless history=1, filterable by config key=value · one model’s results over time |
| GET /hardware?kind=&manufacturer=&min_memory=&sort= · GET /hardware/fit?memory_gb=&quant=4bit|8bit|fp16&context=8192&openness=&limit= | Hardware listing · ESTIMATED fit: { inputs, estimated: true, assumptions[], counts, items: { model, parameter_count, estimated_memory_gb, headroom_gb, fits, quantization, note }[] } |
| GET /explore/types · GET /explore/{type}?q=&org=&sort= | Entity types with live counts; generic paged listing for any type |
| GET /changes?category=&type=&entity_type=&importance_min=&since=&until=&q=&limit=&before= · GET /changes/daily?date= · GET /changes/categories?days= | Change-event feed (cursor paged, next_before) · daily digest with sections · category counts |
| GET /timeline?entity=&year=&category=&limit= | { items: { month, count, events[] }[], total } — grouped by month |
| GET /compare?ids=a,b[,…6] | { entity_type, dimensions: { key, label, unit, kind: number|text|list|bool|date, source }[], items: { entity, values, provenance, prices?, results? }[] } — 2–6 entities of one type; models add best prices and the benchmarks shared by all |
| GET /diff?a=YYYY-MM-DD&b=YYYY-MM-DD&scope=all|models|org:<slug>|family:<name> | { a, b, scope, new_entities[], gone_entities[], property_changes[], price_changes[], benchmark_changes[], counts } |
| GET /sources · GET /methodology · GET /trending?days=&limit=&type= · GET /sitemap?type=&limit=&offset= | Transparency page data, vocabularies and tiers, most viewed entities, sitemap feed |
Shapes are documented in the OpenAPI schema. Admin routes (/admin/*) require the x-aia-admin-token header and are not public.
Conventions
Reading responses
- Numeric aggregates may arrive as string (Postgres decimals): treat every numeric field as number | string | null and coerce.
- null means the sources did not state it. Never read a missing field as zero, and never average two conflicting claims — the API returns both, flagged.
- Timestamps are ISO-8601 UTC. Dates without time (release_date, knowledge_cutoff) may be YYYY, YYYY-MM or YYYY-MM-DD, exactly as published.
- Units: tokens, USD per 1M tokens (*_per_mtok), GB, GB/s, W. Openness vocabulary: open-weights | open-source | proprietary | restricted.
- provenance is an object keyed by attribute: { source_id, url, observed_at, tier (1 official → 4 unverified), confidence, extractor: deterministic | llm, unit? }.
- Cursor feeds (/changes, /entities/{slug}/timeline) return next_before; pass it as before= for the next page (null at the end). Listings otherwise use limit/offset, capped at 200 (sitemap: 5 000).
- Parameters rejected by validation (bad type or bounds) return 422 with { detail, errors }; semantic errors (unknown sort, bad date, wrong scope, ids count) return 400.
- Anything marked estimated (hardware fit) is derived from published specs by a stated formula — the assumptions array is part of the response.
Terms
Fair use
- Public routes are free to use without a key. Please cache responses and identify your client with a User-Agent that includes a contact address.
- Search is rate-limited per IP (HTTP 429 when exceeded). Higher limits and developer keys (x-api-key) will be available on request — see contact.
- Attribution: “Data: AI Atlas (www.ai-atlas.co)” with a link. Every record carries its own upstream sources; please keep them when you redistribute.
- Never treat a missing field as zero. null means the sources did not state it.