Skip to main content
Documentation

Public statistics exports

Download aggregate character (hero) statistics across all recorded 1v1 games as CSV. Two endpoints:

| Endpoint | Returns | | ---------------------------------------- | --------------------------------------------- | | GET /api/v1/public/hero-stats | Per-character win/loss counts and win rate | | GET /api/v1/public/hero-stats/matchups | Head-to-head matchup rates (Hero A vs Hero B) |

The data is aggregate and non-personal — platform-wide totals only, with no per-player or per-competition breakdown and no PII. "Public" describes the data; the endpoints themselves still require authentication (see below).

Authentication

Both endpoints require a signed-in identity. Either auth mode works, and there is no entitlement gate — any signed-in user, not just Personal API early-access accounts:

# Personal API key
curl -H "Authorization: Bearer ttl_user_xxxxx" \
  "https://tabletopleague.com/api/v1/public/hero-stats?gameSystem=unmatched" \
  -o hero-win-rates.csv

# Logged-in session cookie
curl --cookie cookies.txt \
  "https://tabletopleague.com/api/v1/public/hero-stats/matchups?gameSystem=unmatched" \
  -o hero-matchups.csv

An unauthenticated request gets 401. See Authentication for minting a key.

Query parameters

| Param | Type | Description | | ------------ | ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | | gameSystem | string (optional) | Game-system slug (e.g. unmatched). Omit to export every active system — each row carries a Game System column. Unknown slug ⇒ 404. |

Response

Each endpoint streams a UTF-8 CSV file (Content-Type: text/csv, Content-Disposition: attachment). Responses are private, no-store and are never edge-cached.

/api/v1/public/hero-stats columns:

Game System, Hero, Hero Slug, Games Played, Wins, Losses, Win Rate %

/api/v1/public/hero-stats/matchups columns:

Game System, Hero A, Hero A Slug, Hero B, Hero B Slug, Games, Hero A Wins, Hero A Win Rate %

Rate limit

30 requests per minute per IP, per endpoint. Exceeding the limit returns 429 with X-RateLimit-* headers.

Attribution (required for public posting)

Personal, community, and other non-commercial use is free. If you publicly post these exports or derivatives of them, you must credit:

Data: Tabletop League (tabletopleague.com)

Link the credit to tabletopleague.com wherever the medium supports links. Commercial resale of these datasets or their derivatives is prohibited. Full terms: API Terms.

Downloading from the site

Signed-in users can grab the same two CSVs straight from the character stats page — the Win rates CSV and Matchups CSV buttons at /games/[slug]/stats/characters. The API is for scripted or repeated pulls.