# Esports

> Esports data — Dota 2 (OpenDota) and League of Legends esports (Leaguepedia). Pro matches, tournaments, teams, and structured LoL competitive data. Use when: user asks about Dota 2 pro matches/teams/leagues, or LoL esports tournaments/rosters/results. Don't use when: user asks about esports betting/odds — use the `kalshi` (get_esports_odds) or `polymarket` (get_esports_events) skills (no keyless bookmaker-odds source exists). Don't use for non-Dota/LoL titles (only Dota 2 and LoL are covered).

- Skill: `machina-sports/esports` (Agent Skill)
- Install (CLI): `npx skillmds add machina-sports/esports`
- Raw SKILL.md: https://api.skillmd.com/api/skills/machina-sports/esports/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: machina-sports (https://skillmd.com/u/machina-sports)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/machina-sports/esports

---


# Esports 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.
- **No odds here.** Bookmaker odds for esports are not available keyless. For
  implied-probability signals, use `kalshi get_esports_odds --game=cs2` or
  `polymarket get_esports_events`.
- **Personal use.** Third-party ToS apply (OpenDota MIT; Leaguepedia CC-BY-SA).

## Quick Start

CLI:
```bash
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:
```python
from sports_skills import esports

esports.get_pro_matches(limit=10)
esports.get_lol_tournaments(region="Brazil")
```

## Commands

| Command | Description |
|---|---|
| `get_pro_matches` | Recent Dota 2 professional matches (OpenDota) |
| `get_leagues` | Dota 2 leagues/tournaments, 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` | Recent LoL esports tournaments (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>.

## 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`/`teams` from OpenDota → transient; OpenDota is volunteer-run
  best-effort infra with no SLA. Retry.

