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.

Author:
Cito Team

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:

bash
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

bash
mkdir lol-esports-trackercd lol-esports-trackernpm init -ynpm install axios dotenv

Create a .env file:

env
CITO_API_KEY=your_api_key_here

Step 3: Create Your API Client

JavaScript
// 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;

Fetching League Standings

The most common starting point — get current standings for any league:

JavaScript
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();

Example Output

text
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:

JavaScript
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:

JavaScript
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);

Building a Complete Stats Tracker

Let's combine everything into a practical class:

JavaScript
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));

Accessing Worlds & MSI Data

International tournaments are a huge draw. Access brackets, standings, and match data:

JavaScript
// 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}`);});

Champion Meta & Analytics

Track which champions are dominating professional play:

JavaScript
// 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 TypeRecommended TTL
League standings5 minutes
Player career stats15 minutes
Team rosters1 hour
Live match dataNo cache (real-time)
Tournament brackets2 minutes during events
Champion meta1 hour
Historical data24 hours

Pricing

PlanPriceRequests/MonthBest For
Free$0500Learning & testing
Starter$2550,000Side projects & Discord bots
Builder$50250,000Production apps
Business$2502,000,000High-traffic platforms
View full pricing

Get 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 community
  • Conclusion

    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:

    Start building with esports data today

    Free tier available. Same API shape across Call of Duty, Fortnite, LoL, Dota 2, and more.