Skip to content
AI Atlas
Developers

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

Public endpoints
RouteReturns
GET /healthService status (db, redis, llm) and version
GET /statsLive counters: entities per type, sources, documents, claims, events, prices, archive size — always computed from the database
GET /stats/history?days=90Daily 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=1Paged 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=&current=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.