About esports
A skill for retrieving esports data from public sources without API keys or signup. It covers Dota 2 data from OpenDota and League of Legends esports data from Leaguepedia Cargo, with guidance on query limits and paging.
Key features
- 01Dota 2 match and team data
- 02Dota 2 league listings
- 03Leaguepedia tournament queries
- 04Python and CLI access
- 05Rate-limit and paging guidance
Use cases
- 01Review recent Dota 2 pro matches
- 02Look up Dota 2 teams or leagues
- 03Query LoL tournament and match tables
- 04Page through older Dota 2 matches
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ machina-sports/ sports-skills --skill esportsAfter installing, type/esportsin Claude Code to confirm it loaded.
Details
From the project READMEEsports Data
Keyless, public sources. No API key, no signup.
- Dota 2 → OpenDota (
api.opendota.com). Real JSON. Free tier ~60 req/min. - League of Legends esports → Leaguepedia Cargo (
lol.fandom.com). Structured rows. CC-BY-SA — attribute Leaguepedia when you reuse the data.
CRITICAL
- Dota 2 only for match/team/league data (OpenDota). LoL uses Leaguepedia Cargo.
- Leaguepedia is aggressively rate-limited. The throttle comes back as an
in-body error (
Leaguepedia API error: ...) on an HTTP 200 — not a 4xx. Results are cached ~30 min; don't hammer it. Queries withorder_byhave been answered with that throttle body every time, so avoidorder_byinlol_cargo_queryand sort the rows yourself. - OpenDota has no date filter.
get_pro_matchesreturns the latest pro matches (100 per call at most). For older ones pass the response'snext_less_than_match_idasless_than_match_id. - Match Dota teams on
team_id, not name. OpenDota has separate records whose names differ only in case (mouz161707 from 2013,MOUZ9338413 now). - No odds here. Bookmaker odds for esports are not available keyless. For
implied-probability signals, use
kalshi get_esports_odds --game=cs2orpolymarket get_esports_events. - Personal use. Third-party ToS apply (OpenDota MIT; Leaguepedia CC-BY-SA).
Quick Start
CLI:
sports-skills esports get_pro_matches --limit=10
sports-skills esports get_pro_teams --limit=10
sports-skills esports get_leagues --tier=premium
sports-skills esports get_lol_tournaments --region=Korea --limit=5
sports-skills esports lol_cargo_query --tables=Teams --fields=Name,Region --limit=5
Python:
from sports_skills import esports
esports.get_pro_matches(limit=10)
esports.get_lol_tournaments(region="Brazil")
Commands
| Command | Description |
|---|---|
get_pro_matches | Latest Dota 2 pro matches, newest first; page back with less_than_match_id (OpenDota) |
get_leagues | Dota 2 leagues/tournaments, newest first, filter by tier (OpenDota) |
get_pro_teams | Top Dota 2 teams by rating (OpenDota) |
get_match | Detailed Dota 2 match by id (OpenDota) |
get_lol_tournaments | LoL esports tournaments starting since the 1st of the month two months back, newest first (Leaguepedia) |
lol_cargo_query | Raw Leaguepedia Cargo query (any table/fields) |
Leaguepedia Cargo reference
lol_cargo_query needs tables + fields. Common tables (fields vary — verify
with a small query first): Tournaments (Name, DateStart, DateEnd, League,
Region, Prizepool), MatchSchedule (Team1, Team2, Winner, DateTime_UTC, BestOf),
ScoreboardGames, Players, Teams. Full schema:
https://lol.fandom.com/wiki/Special:CargoTables. Row keys use the field names
you asked for (DateTime_UTC), even though Cargo itself returns them with spaces.
Troubleshooting
Leaguepedia API error: You've exceeded your rate limit→ you're being throttled. Wait and retry; the connector caches for ~30 min to help.- Empty
matches/teamsfrom OpenDota → transient; OpenDota is volunteer-run best-effort infra with no SLA. Retry.