How to Use Fortnite API: Complete Developer Guide 2025

Learn how to use the Fortnite API to get player stats, FNCS tournament data, leaderboards, and match history. Step-by-step tutorial with code examples.

Author:
Cito Team

Introduction: Why Use a Fortnite API?

If you're building a Fortnite stats tracker, Discord bot, or competitive gaming application, you need reliable access to Fortnite player data, match history, and tournament information. A Fortnite API gives you programmatic access to this data without scraping websites or manually collecting stats.

In this comprehensive guide, you'll learn:

  • How to get started with a Fortnite API
  • Fetching player statistics and match history
  • Tracking FNCS tournaments and leaderboards
  • Building real-world applications with code examples
  • Best practices for caching and rate limiting

By the end, you'll have everything you need to integrate Fortnite data into your application.

Try It With Your Free Key

Before diving into the full tutorial, create a free key and test the API right away:

bash
curl -H "x-api-key: cito_live_your_key" \  https://api.citoapi.com/api/v1/fortnite/tournaments/live

Free key limits: 500 calls/month. Get your free account API key.

What Data Can You Get from a Fortnite API?

Before diving into code, let's understand what data is available:

Player Statistics

  • Lifetime stats: Total wins, kills, K/D ratio, matches played
  • Per-mode stats: Solo, Duo, Squad, and Arena breakdowns
  • Seasonal stats: Performance tracking by competitive season
  • Recent matches: Last 20+ games with detailed breakdowns

Competitive/FNCS Data

  • Tournament standings: Real-time leaderboards during events
  • Placement history: Player's tournament results over time
  • PR (Power Ranking) points: Competitive ranking scores
  • Earnings: Prize money won in official competitions

Match & Event Data

  • Live tournament feeds: Real-time updates during FNCS
  • Historical match data: Past game details with full stats
  • Elimination feeds: Who eliminated whom, with timestamps

Getting Started: Setting Up Your API Access

Step 1: Sign Up for an API Key

First, you'll need an API key. Sign up for Cito API to get instant access—no sales calls or enterprise contracts required.

  • Create an account at citoapi.com
  • Navigate to your dashboard
  • Generate an API key
  • Copy your key and store it securely
  • Step 2: Install Dependencies

    For this tutorial, we'll use JavaScript/Node.js, but the concepts apply to any language.

    bash
    mkdir fortnite-trackercd fortnite-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 fortniteAPI = axios.create({  baseURL: 'https://api.citoapi.com/api/v1/fortnite',  headers: {    'x-api-key': process.env.CITO_API_KEY,    'Content-Type': 'application/json'  }}); module.exports = fortniteAPI;

    Fetching Player Statistics

    The most common use case is looking up player stats. Here's how to get comprehensive player data:

    Basic Player Lookup

    JavaScript
    const api = require('./api'); async function getPlayerStats(username, platform = 'epic') {  try {    const response = await api.get(`/players/${encodeURIComponent(username)}`, {      params: { platform }    });     return response.data;  } catch (error) {    if (error.response?.status === 404) {      console.log('Player not found');      return null;    }    throw error;  }} // Example usageasync function main() {  const stats = await getPlayerStats('Ninja');   if (stats) {    console.log(`Player: ${stats.data.username}`);    console.log(`Total Wins: ${stats.data.stats.overall.wins}`);    console.log(`K/D Ratio: ${stats.data.stats.overall.kd}`);    console.log(`Matches Played: ${stats.data.stats.overall.matches}`);  }} main();

    Response Structure

    JSON
    {  "success": true,  "data": {    "accountId": "4735ce91...",    "username": "Ninja",    "platform": "epic",    "stats": {      "overall": {        "wins": 1423,        "kills": 89521,        "deaths": 12453,        "kd": 7.19,        "matches": 13876,        "winRate": 10.26,        "killsPerMatch": 6.45      },      "solo": {        "wins": 523,        "kills": 31245,        "kd": 6.89,        "matches": 5123,        "top10": 1823,        "top25": 2912      },      "duo": { ... },      "squad": { ... },      "arena": { ... }    },    "lastUpdated": "2025-01-30T12:00:00Z"  }}

    Getting Player Match History

    Want to show recent games? Here's how to fetch match history:

    JavaScript
    async function getMatchHistory(username, limit = 20) {  const response = await api.get(`/players/${encodeURIComponent(username)}/matches`, {    params: { limit }  });   return response.data;} // Display recent matchesasync function showRecentGames(username) {  const history = await getMatchHistory(username, 10);   console.log(`\nRecent matches for ${username}:\n`);   history.data.forEach((match, i) => {    console.log(`Game ${i + 1}: ${match.mode}`);    console.log(`  Placement: #${match.placement}`);    console.log(`  Kills: ${match.kills}`);    console.log(`  Damage: ${match.damageDealt}`);    console.log(`  Duration: ${match.duration}\n`);  });}

    Tracking FNCS Tournament Data

    Competitive Fortnite data is crucial for esports applications. Here's how to access FNCS tournament information:

    Listing Active Tournaments

    JavaScript
    async function getActiveTournaments() {  const response = await api.get('/tournaments', {    params: {      status: 'active',      region: 'NAE'    }  });   return response.data;} // Example: Show upcoming FNCS eventsasync function showFNCSTournaments() {  const tournaments = await getActiveTournaments();   tournaments.data.forEach(event => {    console.log(`${event.name}`);    console.log(`  Region: ${event.region}`);    console.log(`  Start: ${event.startDate}`);    console.log(`  Prize Pool: $${event.prizePool.toLocaleString()}`);    console.log(`  Format: ${event.format}\n`);  });}

    Getting Tournament Leaderboards

    JavaScript
    async function getTournamentLeaderboard(tournamentId, limit = 100) {  const response = await api.get(`/tournaments/${tournamentId}/leaderboard`, {    params: { limit }  });   return response.data;} // Display top players in a tournamentasync function showLeaderboard(tournamentId) {  const leaderboard = await getTournamentLeaderboard(tournamentId, 25);   console.log('FNCS Leaderboard:\n');  console.log('Rank | Player          | Points | Wins | Elims');  console.log('-----|-----------------|--------|------|------');   leaderboard.data.forEach(entry => {    console.log(      `${entry.rank.toString().padStart(4)} | ` +      `${entry.player.padEnd(15)} | ` +      `${entry.points.toString().padStart(6)} | ` +      `${entry.wins.toString().padStart(4)} | ` +      `${entry.eliminations.toString().padStart(5)}`    );  });}

    Building a Complete Stats Tracker

    Let's put it all together with a practical example—a player stats tracker:

    JavaScript
    const api = require('./api'); class FortniteTracker {  async getPlayerProfile(username) {    const [stats, history, rankings] = await Promise.all([      this.getStats(username),      this.getMatchHistory(username, 5),      this.getCompetitiveRankings(username)    ]);     return {      username,      stats: stats.data,      recentMatches: history.data,      competitive: rankings.data    };  }   async getStats(username) {    return api.get(`/players/${encodeURIComponent(username)}`);  }   async getMatchHistory(username, limit) {    return api.get(`/players/${encodeURIComponent(username)}/matches`, {      params: { limit }    });  }   async getCompetitiveRankings(username) {    return api.get(`/players/${encodeURIComponent(username)}/rankings`);  }   async comparePlayers(player1, player2) {    const [p1, p2] = await Promise.all([      this.getPlayerProfile(player1),      this.getPlayerProfile(player2)    ]);     return {      player1: p1,      player2: p2,      comparison: {        kdDiff: p1.stats.stats.overall.kd - p2.stats.stats.overall.kd,        winsDiff: p1.stats.stats.overall.wins - p2.stats.stats.overall.wins,        killsDiff: p1.stats.stats.overall.kills - p2.stats.stats.overall.kills      }    };  }} // Usageasync function main() {  const tracker = new FortniteTracker();   // Get full player profile  const profile = await tracker.getPlayerProfile('Bugha');  console.log(JSON.stringify(profile, null, 2));   // Compare two players  const comparison = await tracker.comparePlayers('Bugha', 'EpikWhale');  console.log('\nPlayer Comparison:');  console.log(`K/D Difference: ${comparison.comparison.kdDiff.toFixed(2)}`);} main();

    Building a Discord Bot with Fortnite Stats

    Discord bots are one of the most popular ways to use Fortnite APIs. Here's a quick implementation:

    JavaScript
    const { Client, GatewayIntentBits, EmbedBuilder } = require('discord.js');const api = require('./api'); const client = new Client({  intents: [    GatewayIntentBits.Guilds,    GatewayIntentBits.GuildMessages,    GatewayIntentBits.MessageContent  ]}); client.on('messageCreate', async (message) => {  if (message.author.bot) return;   // !fn stats <username>  if (message.content.startsWith('!fn stats ')) {    const username = message.content.slice(10).trim();     try {      const response = await api.get(`/players/${encodeURIComponent(username)}`);      const stats = response.data.data;       const embed = new EmbedBuilder()        .setTitle(`${stats.username}'s Fortnite Stats`)        .setColor(0x9146FF)        .addFields(          { name: 'Wins', value: stats.stats.overall.wins.toString(), inline: true },          { name: 'K/D', value: stats.stats.overall.kd.toFixed(2), inline: true },          { name: 'Matches', value: stats.stats.overall.matches.toString(), inline: true },          { name: 'Win Rate', value: `${stats.stats.overall.winRate.toFixed(1)}%`, inline: true },          { name: 'Kills', value: stats.stats.overall.kills.toLocaleString(), inline: true },          { name: 'Kills/Match', value: stats.stats.overall.killsPerMatch.toFixed(2), inline: true }        )        .setTimestamp();       message.reply({ embeds: [embed] });    } catch (error) {      message.reply('Player not found or API error occurred.');    }  }   // !fn leaderboard  if (message.content === '!fn leaderboard') {    const response = await api.get('/leaderboards/global', {      params: { limit: 10 }    });     const embed = new EmbedBuilder()      .setTitle('Top 10 Fortnite Players (Global)')      .setColor(0x9146FF);     let description = '';    response.data.data.forEach((player, i) => {      description += `**${i + 1}.** ${player.username} - ${player.prPoints} PR\n`;    });     embed.setDescription(description);    message.reply({ embeds: [embed] });  }}); client.login(process.env.DISCORD_TOKEN);

    Caching Best Practices

    To avoid hitting rate limits and improve performance, implement caching:

    JavaScript
    const NodeCache = require('node-cache'); // Cache with 5-minute TTLconst cache = new NodeCache({ stdTTL: 300 }); async function getPlayerStatsCached(username) {  const cacheKey = `player:${username.toLowerCase()}`;   // Check cache first  const cached = cache.get(cacheKey);  if (cached) {    console.log('Cache hit!');    return cached;  }   // Fetch from API  const response = await api.get(`/players/${encodeURIComponent(username)}`);   // Store in cache  cache.set(cacheKey, response.data);   return response.data;}

    When to Cache

    Data TypeRecommended TTL
    Player lifetime stats5-15 minutes
    Match history2-5 minutes
    Tournament standings30-60 seconds
    Live match dataNo cache (real-time)

    Error Handling

    Robust error handling ensures your app stays reliable:

    JavaScript
    async function safeApiCall(fn) {  try {    return await fn();  } catch (error) {    if (error.response) {      switch (error.response.status) {        case 404:          return { error: 'Player not found', code: 404 };        case 429:          console.log('Rate limited, retrying in 60s...');          await new Promise(r => setTimeout(r, 60000));          return safeApiCall(fn);        case 500:          return { error: 'Server error, try again later', code: 500 };        default:          return { error: 'Unknown error', code: error.response.status };      }    }    throw error;  }} // Usageconst stats = await safeApiCall(() =>  api.get(`/players/${username}`)); if (stats.error) {  console.log(`Error: ${stats.error}`);} else {  console.log(stats.data);}

    Common Use Cases

    1. Stats Website/App

    Build a Fortnite stats tracker like FortniteTracker.com with player lookups, leaderboards, and match history.

    2. Discord Bot

    Create commands for your gaming community to look up stats, compare players, and track FNCS tournaments.

    3. Competitive Team Tools

    Help esports teams analyze player performance, track improvement over time, and scout opponents.

    4. Streaming Overlays

    Display real-time stats on Twitch/YouTube streams using OBS browser sources.

    5. Fantasy Esports

    Build fantasy league platforms with live scoring during FNCS events.

    Pricing: What Does a Fortnite API Cost?

    Unlike enterprise APIs that require sales calls and $500+/month contracts, Cito API offers transparent pricing:

    PlanPriceRequests/MonthBest For
    Free$0500Learning & testing
    Starter$2550,000Side projects
    Builder$50250,000Production apps
    Business$2502,000,000High-traffic sites

    View full pricing →

    Getting Started Today

    Ready to build with Fortnite data? Here's your action plan:

  • Sign up for free - Get 500 free API calls/month
  • Copy your API key from the dashboard
  • Follow this tutorial to make your first requests
  • Read the full documentation for all endpoints
  • Build something awesome!
  • Conclusion

    Using a Fortnite API opens up countless possibilities for developers. Whether you're building a stats tracker, Discord bot, or competitive esports platform, having reliable access to player data, match history, and tournament information is essential.

    With Cito API, you get:

    • Instant access - No sales calls or enterprise contracts
    • Comprehensive data - Player stats, match history, FNCS tournaments
    • Developer-friendly - Clear docs, code examples, fair pricing
    • Reliable infrastructure - 99.9% uptime SLA

    Stop waiting weeks for API access. Get your free API key now and start building today.

    ---

    *Have questions? Check out our documentation or reach out on Discord.*

    ---

    Related reading:

    Start building with esports data today

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