Introduction: Why Use a League of Legends Esports API?
League of Legends is the biggest esport in the world. The LCS, LEC, LCK, and LPL draw millions of viewers every week, and Worlds regularly breaks viewership records. If you're building a stats tracker, Discord bot, fantasy esports app, or content site, you need programmatic access to LoL esports data.
In this guide, you'll learn how to:
- Set up API access and make your first request
- Fetch player statistics, team rosters, and match data
- Track live LCS, LEC, and LCK matches in real-time
- Access Worlds tournament brackets and standings
- Build a working stats tracker with code examples
By the end, you'll have everything you need to integrate League of Legends esports data into your application.
Try It With Your Free Key
Create a free key, then test the API instantly:
curl -H "x-api-key: cito_live_your_key" \ https://api.citoapi.com/api/v1/lol/leagues
Free key limits: 500 calls/month. Get your free account API key.
What LoL Esports Data Is Available?
The Cito API provides a broad endpoint catalog for League of Legends esports. Here's what you can access:
Leagues & Standings
- All leagues: LCS, LEC, LCK, LPL, CBLOL, PCS, and more
- Standings: Current rankings with win/loss records
- Schedules: Upcoming matches for any league
- History: Past seasons and results
Teams & Rosters
- All teams: Every professional LoL team
- Current rosters: Active players with roles
- Roster history: Past lineups and transfers
- Team stats: Win rates, average game time, champion pools
- Head-to-head: Direct matchup records between teams
Players & Stats
- Player profiles: Bio, team, role, nationality
- Career stats: KDA, CS/min, vision score, damage per minute
- Champion pool: Most-played champions with win rates
- Earnings: Prize money won across tournaments
- Player comparison: Side-by-side stat comparisons
Matches & Live Data
- Live matches: Currently playing games with real-time stats
- Match details: Full game breakdowns with timelines
- Game stats: Gold graphs, objective control, build paths
- VOD links: Post-match replay access
Tournaments
- Worlds: Brackets, standings, match history
- MSI: International tournament data
- Regional playoffs: LCS/LEC/LCK championship brackets
Champions & Meta
- Pro pick rates: Champion priority across leagues
- Meta tier list: Current professional meta
- Patch impact: How patches affect champion priorities
Getting Started: Your First API Call
Step 1: Get Your API Key
Sign up at citoapi.com — it takes 60 seconds. No sales calls, no enterprise contracts.
Step 2: Set Up Your Project
mkdir lol-esports-trackercd lol-esports-trackernpm init -ynpm install axios dotenv
CITO_API_KEY=your_api_key_here
// api.jsconst axios = require('axios');require('dotenv').config(); const lolAPI = axios.create({ baseURL: 'https://api.citoapi.com/api/v1/lol', headers: { 'x-api-key': process.env.CITO_API_KEY }}); module.exports = lolAPI;
const api = require('./api'); async function getStandings(leagueId) { const { data } = await api.get(`/leagues/${leagueId}/standings`); return data;} // Get LCS standingsasync function main() { const standings = await getStandings('lcs'); console.log('LCS Standings:\n'); standings.data.forEach((team, i) => { console.log(`${(i + 1).toString().padStart(2)}. ${team.name.padEnd(20)} ${team.wins}W - ${team.losses}L`); });} main();
LCS Standings: 1. Cloud9 14W - 4L 2. Team Liquid 13W - 5L 3. FlyQuest 12W - 6L ...
async function getPlayerStats(playerId) { const { data } = await api.get(`/players/${playerId}/stats`); return data;} async function showPlayerCard(playerId) { const stats = await getPlayerStats(playerId); const player = stats.data; console.log(`${player.name} (${player.team})`); console.log(`Role: ${player.role}`); console.log(`KDA: ${player.kda}`); console.log(`CS/min: ${player.csPerMin}`); console.log(`DPM: ${player.damagePerMin}`); console.log(`Vision: ${player.visionScore}`); console.log(`Win Rate: ${player.winRate}%`);} showPlayerCard('faker');
async function getLiveMatches() { const { data } = await api.get('/live'); return data;} async function showLive() { const live = await getLiveMatches(); if (live.data.length === 0) { console.log('No live matches right now.'); return; } live.data.forEach(match => { console.log(`[${match.league}] ${match.team1.name} vs ${match.team2.name}`); console.log(` Score: ${match.team1.score} - ${match.team2.score}`); console.log(` Game ${match.currentGame} | ${match.status}`); });} // Poll every 30 seconds during broadcastsetInterval(showLive, 30000);
class LoLTracker { constructor(api) { this.api = api; } async getTeamProfile(slug) { const [team, roster, stats] = await Promise.all([ this.api.get(`/teams/${slug}`), this.api.get(`/teams/${slug}/roster`), this.api.get(`/teams/${slug}/stats`) ]); return { info: team.data, roster: roster.data, stats: stats.data }; } async compareTeams(slug1, slug2) { const [t1, t2, h2h] = await Promise.all([ this.getTeamProfile(slug1), this.getTeamProfile(slug2), this.api.get(`/teams/${slug1}/h2h/${slug2}`) ]); return { team1: t1, team2: t2, headToHead: h2h.data }; } async getLeagueOverview(leagueId) { const [standings, schedule, teams] = await Promise.all([ this.api.get(`/leagues/${leagueId}/standings`), this.api.get(`/leagues/${leagueId}/schedule`), this.api.get(`/leagues/${leagueId}/teams`) ]); return { standings: standings.data, upcomingMatches: schedule.data, teams: teams.data }; } async getTournamentBracket(tournamentId) { const { data } = await this.api.get(`/tournaments/${tournamentId}/bracket`); return data; }} // Usageconst tracker = new LoLTracker(api);const lcs = await tracker.getLeagueOverview('lcs');console.log(JSON.stringify(lcs, null, 2));
// Get Worlds bracketconst bracket = await api.get('/tournaments/worlds-2025/bracket');console.log('Worlds 2025 Bracket:', bracket.data); // Get tournament stats and MVPconst stats = await api.get('/tournaments/worlds-2025/stats');const mvp = await api.get('/tournaments/worlds-2025/mvp');console.log('Tournament MVP:', mvp.data); // Historical Worlds dataconst history = await api.get('/history/worlds');history.data.forEach(year => { console.log(`${year.year}: ${year.winner} defeated ${year.runnerUp}`);});
// Current meta tier listconst meta = await api.get('/champions/meta');meta.data.forEach(champ => { console.log(`${champ.name}: ${champ.pickRate}% pick, ${champ.banRate}% ban, ${champ.winRate}% WR`);}); // How did the latest patch change the meta?const patchImpact = await api.get('/champions/patches/14.10');console.log('Biggest winners:', patchImpact.data.winners);console.log('Biggest losers:', patchImpact.data.losers);
Caching Best Practices
LoL esports data has different freshness requirements:
| Data Type | Recommended TTL |
|---|
| League standings | 5 minutes |
| Player career stats | 15 minutes |
| Team rosters | 1 hour |
| Live match data | No cache (real-time) |
| Tournament brackets | 2 minutes during events |
| Champion meta | 1 hour |
| Historical data | 24 hours |
Pricing
| Plan | Price | Requests/Month | Best For |
|---|
| Free | $0 | 500 | Learning & testing |
| Starter | $25 | 50,000 | Side projects & Discord bots |
| Builder | $50 | 250,000 | Production apps |
| Business | $250 | 2,000,000 | High-traffic platforms |
View full pricingGet Started Today
Sign up for free — 500 API calls/month, no credit card
Copy your API key from the dashboard
Explore the LoL endpoint catalog in the dashboard sandbox
Read the LoL API docs for detailed endpoint reference
Build something awesome for the LoL communityConclusion
League of Legends has the richest esports ecosystem in the world, and now you can access the practical product rows programmatically. Whether you're building a stats site, a Discord bot for your viewing party, or a full fantasy esports platform, the Cito API gives you endpoint coverage for professional LoL workflows.
No Riot API key application process. No enterprise sales calls. No $2,000/month minimums. Just sign up, get your key, and start building.
Get your free API key now and start building with LoL esports data today.
---
Related reading: