Public API
Free, read-only JSON over the official rating snapshots. No authentication, no keys. Version 1 lives under /api/v1/; additive fields won't break you, breaking changes would ship as /api/v2 alongside.
Ground rules
- Rate limit: per-IP, fixed windows. Exceeding it returns
429with aRetry-Afterheader and body{"code":"RATE_LIMITED"}— back off and retry. - Caching: responses carry
Cache-Control: public, max-age=300. Data derives from snapshots computed every 6 hours — polling more often than a few minutes gains nothing. - Bulk analysis? Don't crawl the API — the nightly dumps contain every eligible battle and vote.
- Unknown categories/models return
404. All timestamps are ISO 8601 UTC.
GET/api/v1/categories
All active battle categories with the timestamp of their latest official rating snapshot.
Live example: /api/v1/categories
GET/api/v1/leaderboards/{category}
The latest official leaderboard of a category: every rated model with raw AND style-controlled ratings, 95% bootstrap confidence intervals, vote counts, provisional flags, and the published rank bands (overlapping CIs share a rank; provisional models are rated but unranked).
category(path) — category slug from /api/v1/categories (e.g. human-like-chat)
computed_at is null and entries is empty while a category has no snapshot yet.
Field names mirror the published leaderboard.json (DUMP_FORMAT.md §6).
Live example: /api/v1/leaderboards/human-like-chat
GET/api/v1/models
Every listed model with public metadata: provider, license, open-weights flag, context window, list pricing, release date, tier, mock flag, plus model_type, input_modalities, output_modalities and capabilities.
Listed = in the arena roster, or carrying official ratings or curated benchmark scores. Models we have not evaluated ourselves yet appear too — their arena ratings are simply absent.
Live example: /api/v1/models
GET/api/v1/models/{slug}
One model's profile: metadata plus its latest official rating (both variants) in every category it is rated in, and its latest curated third-party benchmark score per benchmark (benchmarks[]) with full provenance.
slug(path) — model slug from /api/v1/models (e.g. claude-fable-5-1)
Live example: /api/v1/models/claude-fable-5-1
GET/api/v1/models/{slug}/history
The full rating history of a model: every official snapshot row (raw and style-controlled variants), oldest first per category.
slug(path) — model slugcategory(query (optional)) — restrict to one category slug
Live example: /api/v1/models/claude-fable-5-1/history?category=human-like-chat
GET/api/v1/benchmarks
The curated third-party benchmark catalogue: active sources (with their terms notes), the metric-group taxonomy, and every active benchmark with unit, direction, scale, description, methodology link, listed-model coverage and latest observation date.
External scores are curated imports (content files + admin entry — no scrapers), shown as context with provenance; our blind-vote arena ratings remain the primary signal.
Live example: /api/v1/benchmarks
GET/api/v1/benchmarks/{slug}
One benchmark with the latest score per listed model, best value first. Every score row carries value, ci_low/ci_high, and its provenance: observed_at, retrieved_at, source_url and source_version.
slug(path) — benchmark slug from /api/v1/benchmarks (e.g. lmarena-text)
Unknown or inactive benchmarks return 404.
Live example: /api/v1/benchmarks/lmarena-text
GET/api/v1/boards/{modelType}
The unified board of one model type: every listed model with its metadata, capabilities and humaneval_evaluated flag, our arena ratings per category (rank bands match /api/v1/leaderboards), telemetry medians from our own battles, and the latest external score per benchmark of that type.
modelType(path) — one of llm, image-generation, video-generation, text-to-speech, speech-to-text, other
Live example: /api/v1/boards/llm
Example
curl -s https://humaneval.org/api/v1/leaderboards/human-like-chat | jq '.entries[] | {model, rating, rank}'