How to Use League of Legends Esports API: Complete Developer Guide 2025
Learn how to access LCS, LEC, LCK, and Worlds data with a LoL esports API. Step-by-step tutorial with code examples for player stats, live matches, and tournament brackets.
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 Now (No Signup Required)
Test the API instantly with our demo key:
curl -H "Authorization: Bearer pk_demo_cito_live_a06c129e0a9ce1c39c3035bd187541c4" \
https://api.citoapi.com/api/v1/lol/leagues
Demo key limits: 50 calls/day, read-only. Get your free production key for 500 calls/month.
What LoL Esports Data Is Available?
The Cito API provides 102 endpoints 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-tracker
cd lol-esports-tracker
npm init -y
npm install axios dotenv
Create a .env file:
CITO_API_KEY=your_api_key_here
Step 3: Create Your API Client
// api.js
const axios = require('axios');
require('dotenv').config();
const lolAPI = axios.create({
baseURL: 'https://api.citoapi.com/api/v1/lol',
headers: {
'Authorization': Bearer ${process.env.CITO_API_KEY}
}
});
module.exports = lolAPI;
Fetching League Standings
The most common starting point — get current standings for any league:
const api = require('./api');async function getStandings(leagueId) {
const { data } = await api.get(/leagues/${leagueId}/standings);
return data;
}
// Get LCS standings
async 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();
Example Output
LCS Standings: 1. Cloud9 14W - 4L
2. Team Liquid 13W - 5L
3. FlyQuest 12W - 6L
...
Getting Player Stats
Look up any pro player's statistics:
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');
Tracking Live Matches
Get real-time data during LCS, LEC, and LCK broadcasts:
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 broadcast
setInterval(showLive, 30000);
Building a Complete Stats Tracker
Let's combine everything into a practical class:
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;
}
}
// Usage
const tracker = new LoLTracker(api);
const lcs = await tracker.getLeagueOverview('lcs');
console.log(JSON.stringify(lcs, null, 2));
Accessing Worlds & MSI Data
International tournaments are a huge draw. Access brackets, standings, and match data:
// Get Worlds bracket
const bracket = await api.get('/tournaments/worlds-2025/bracket');
console.log('Worlds 2025 Bracket:', bracket.data);
// Get tournament stats and MVP
const 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 data
const history = await api.get('/history/worlds');
history.data.forEach(year => {
console.log(${year.year}: ${year.winner} defeated ${year.runnerUp});
});
Champion Meta & Analytics
Track which champions are dominating professional play:
// Current meta tier list
const 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 |
| Basic | $20 | 50,000 | Side projects & Discord bots |
| Pro | $50 | 250,000 | Production apps |
| Business | $200 | 2,000,000 | High-traffic platforms |
Get Started Today
Conclusion
League of Legends has the richest esports ecosystem in the world, and now you can access all of it 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 102 endpoints covering every aspect of professional LoL.
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:
- Build a LoL Esports Discord Bot in 10 Minutes — Add live match scores to your Discord server
- Build a LoL Fantasy Esports App — Player projections and live scoring
- Riot API vs Third-Party APIs — Compare your options
Ready to Build?
Get your API key and start building with esports data in minutes.