Valorant API

Documentation

API Valorant compatible avec le format d'HenrikDev : rang, RR, placement, matchs, leaderboard, stats de session. Les données viennent de Riot en direct à chaque requête.

URL de base : https://val-api.kbouu.com · Régions : eu, na, ap, kr, br, latam · Plateformes : pc, console.

Dans un Riot ID, le # devient un / et les espaces s'écrivent %20 : Mon Pseudo#EUW → /Mon%20Pseudo/EUW.

Quel outil pour quel usage ?

Tu veux…Utilise
Une commande !rank dans ton chat Twitch (Nightbot, StreamElements, WizeBot) mmr.kbouu.com : il génère la commande pour ton bot et renvoie le message déjà formaté pour le chat. Pas de clé à gérer.
Afficher ton rang ou ta session sur ton stream (overlay OBS) Un service intermédiaire qui appelle l'API côté serveur (voir Overlays). Ne mets jamais ta clé dans la page de l'overlay.
Un bot Discord, un site, une application L'API directement, avec ta clé dans l'en-tête Authorization, depuis ton serveur (voir Exemples).

Clé API

Toutes les routes /valorant/… demandent une clé. Crée-la dans ton panel, puis envoie-la dans l'en-tête Authorization :

curl -H "Authorization: $VAL_API_KEY" \
  "https://val-api.kbouu.com/valorant/v3/mmr/eu/pc/Mon%20Pseudo/EUW"

Ta clé est personnelle, comme un mot de passe :

  • garde-la côté serveur, dans une variable d'environnement (ex. VAL_API_KEY), jamais dans le code ni dans un dépôt git ;
  • ne la mets jamais dans du code exécuté chez les visiteurs (page web, overlay OBS, extension) ni dans une commande de bot visible par d'autres : n'importe qui pourrait la lire et utiliser ton quota ;
  • si elle a fuité, clique sur « Régénérer » dans ton panel : l'ancienne cesse aussitôt de fonctionner.

Le paramètre ?api_key= est aussi accepté, mais déconseillé : la clé finit dans les historiques et les liens partagés.

Limites

Chaque clé a une limite par minute et un quota par jour (visibles dans ton panel). Chaque réponse contient :

X-RateLimit-Limit      requêtes autorisées par minute
X-RateLimit-Remaining  requêtes restantes dans la minute
X-RateLimit-Reset      secondes avant que la fenêtre se libère
X-Quota-Limit          requêtes autorisées par jour (remis à zéro à minuit UTC)
X-Quota-Remaining      requêtes restantes aujourd'hui

Chaque appel à l'API compte pour 1, quelle que soit la route. Au-delà des limites, l'API répond 429 (avec Retry-After pour la limite par minute) : attends le délai indiqué avant de réessayer. Besoin de plus ? Demande à un administrateur.

Erreurs

Même format qu'HenrikDev :

{"errors": [{"code": 22, "message": "Account not found", "status": 404, "details": null}]}
StatutSignification
401Clé API absente
403Clé API invalide, révoquée ou suspendue
429Limite par minute ou quota journalier atteint (voir les en-têtes X-RateLimit-* / X-Quota-*)
400Paramètre invalide (région, plateforme, période…)
404Joueur, partie ou ressource introuvable
500Erreur interne ou Riot indisponible

Stats de session

Calculées sur les parties de la période, en direct :

GET /valorant/v1/stats/{region}/{name}/{tag}          → toutes les stats (JSON)
GET /valorant/v1/stats/{region}/{name}/{tag}/{stat}   → une stat (texte brut)
ParamètreValeurs
periodtoday (défaut, depuis minuit), 24h, 7d, 30d, since (depuis since), last (les last dernières parties)
tzFuseau pour « aujourd'hui », défaut Europe/Paris
sinceDébut de session : timestamp unix ou date ISO, ex. 2026-09-27T20:00
modecompetitive (défaut), unrated, swiftplay, deathmatch, teamdeathmatch, spikerush, premier, all
lastNombre de parties avec period=last (1 à 100, défaut 20)
formatStat seule : text (défaut) ou json
# Bilan de la session en cours (depuis 20 h), en JSON
curl -H "Authorization: $VAL_API_KEY" \
  "https://val-api.kbouu.com/valorant/v1/stats/eu/Mon%20Pseudo/EUW?period=since&since=2026-09-27T20:00"

# Une seule stat, en texte brut : 3W/1L
curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v1/stats/eu/Mon%20Pseudo/EUW/record"

Riot conserve environ 100 parties par joueur : c'est la limite pour les longues périodes. Le format texte des stats seules est pratique pour un service qui relaie la valeur telle quelle (message de chat, overlay).

Liste des stats

StatDescription
matchesNombre de parties
winsVictoires
lossesDéfaites
drawsMatchs nuls
recordBilan, ex. 3W/1L
winratePourcentage de victoires (nuls exclus)
rrRR gagnés/perdus sur la période (compétitif uniquement)
killsKills
deathsMorts
assistsAssists
kdaK/D/A, ex. 57/40/27
kdRatio kills/morts
kda_ratio(kills + assists) / morts
hsPourcentage de tirs à la tête
bodyshotsPourcentage de tirs au corps
legshotsPourcentage de tirs aux jambes
adrDégâts moyens par round
acsScore de combat moyen par round
damageDégâts infligés
damage_receivedDégâts reçus
first_bloodsPremiers kills du round
roundsRounds joués
streakSérie en cours, ex. W3 ou L2
top_agentAgent le plus joué
top_mapMap la plus jouée
last_matchRésumé de la dernière partie

Exemples

Une commande /rank pour un bot Discord : elle interroge /valorant/v3/mmr, qui renvoie le rang, le RR, le dernier gain et le placement au leaderboard en un seul appel, puis répond par exemple Mon Pseudo#EUW : Immortal 2 #412, 187 RR (+18).

JavaScript (discord.js)

// Bot Discord (discord.js v14) : commande /rank riot_id:"Pseudo#TAG"
// npm install discord.js   ·   VAL_API_KEY et DISCORD_TOKEN dans les variables d'environnement
import { Client, GatewayIntentBits } from "discord.js";

const API = "https://val-api.kbouu.com";
const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.on("interactionCreate", async (interaction) => {
  if (!interaction.isChatInputCommand() || interaction.commandName !== "rank") return;
  const [name, tag] = interaction.options.getString("riot_id").split("#");
  const url = `${API}/valorant/v3/mmr/eu/pc/${encodeURIComponent(name)}/${encodeURIComponent(tag)}`;
  const res = await fetch(url, { headers: { Authorization: process.env.VAL_API_KEY } });
  const body = await res.json();
  if (!res.ok) return interaction.reply(body.errors?.[0]?.message ?? "Erreur");

  const c = body.data.current;
  const place = c.leaderboard_placement ? ` #${c.leaderboard_placement.rank}` : "";
  const change = c.last_change >= 0 ? `+${c.last_change}` : `${c.last_change}`;
  await interaction.reply(`${name}#${tag} : ${c.tier.name}${place}, ${c.rr} RR (${change})`);
});

client.login(process.env.DISCORD_TOKEN);

Python (discord.py)

# Bot Discord (discord.py 2.x) : commande /rank riot_id:"Pseudo#TAG"
# pip install discord.py aiohttp   ·   VAL_API_KEY et DISCORD_TOKEN dans les variables d'environnement
import os
from urllib.parse import quote

import aiohttp
import discord
from discord import app_commands

API = "https://val-api.kbouu.com"
client = discord.Client(intents=discord.Intents.default())
tree = app_commands.CommandTree(client)


@tree.command(description="Rang Valorant d'un joueur")
async def rank(interaction: discord.Interaction, riot_id: str, region: str = "eu"):
    name, _, tag = riot_id.partition("#")
    url = f"{API}/valorant/v3/mmr/{region}/pc/{quote(name)}/{quote(tag)}"
    async with aiohttp.ClientSession() as session:
        async with session.get(url, headers={"Authorization": os.environ["VAL_API_KEY"]}) as res:
            body = await res.json()
            ok = res.status == 200
    if not ok:
        return await interaction.response.send_message(body["errors"][0]["message"])

    c = body["data"]["current"]
    place = f" #{c['leaderboard_placement']['rank']}" if c["leaderboard_placement"] else ""
    await interaction.response.send_message(f"{riot_id} : {c['tier']['name']}{place}, {c['rr']} RR ({c['last_change']:+d})")


@client.event
async def on_ready():
    await tree.sync()  # enregistre la commande /rank auprès de Discord


client.run(os.environ["DISCORD_TOKEN"])

Dans les deux cas, déclare la commande /rank avec une option texte riot_id. La clé et le jeton Discord restent sur la machine qui fait tourner le bot.

Overlays de stream

Un overlay OBS est une page web : tout son contenu est lisible par n'importe qui. Il ne doit donc jamais contenir ta clé. Fais-le passer par un service intermédiaire :

overlay (page web)  →  ton service (garde la clé)  →  https://val-api.kbouu.com/valorant/…

Le service appelle l'API avec la clé et ne renvoie à l'overlay que ce qu'il affiche (rang, RR, bilan de la session…). Pour limiter les appels, il peut garder la réponse quelques secondes avant de redemander. Les stats de session sont faites pour ce genre d'affichage.

Comptes

GET/valorant/v1/account/{name}/{tag}

Compte : PUUID, région, niveau, carte de joueur.

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v1/account/Mon%20Pseudo/EUW"
GET/valorant/v2/account/{name}/{tag}

Compte, format v2 (carte, titre, plateformes).

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v2/account/Mon%20Pseudo/EUW"
GET/valorant/v1/by-puuid/account/{puuid}

Compte à partir d'un PUUID (existe aussi en v2).

Rang & MMR

GET/valorant/v3/mmr/{region}/{platform}/{name}/{tag}

Rang actuel, RR, dernier gain, placement leaderboard, pic, saisons. Recommandé.

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v3/mmr/eu/pc/Mon%20Pseudo/EUW"
GET/valorant/v2/mmr/{region}/{name}/{tag}

Rang actuel + détail par saison (format v2).

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v2/mmr/eu/Mon%20Pseudo/EUW"
GET/valorant/v1/mmr/{region}/{name}/{tag}

Rang actuel (format v1).

GET/valorant/v2/mmr-history/{region}/{platform}/{name}/{tag}

Évolution du RR partie par partie (20 dernières).

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v2/mmr-history/eu/pc/Mon%20Pseudo/EUW"
GET/valorant/v1/mmr-history/{region}/{name}/{tag}

Évolution du RR (format v1).

GET/valorant/v2/stored-mmr-history/{region}/{platform}/{name}/{tag}

Historique RR enregistré par l'API (au-delà des 20 dernières).

Paramètres : page, size, season

Stats (routes)

GET/valorant/v1/stats/{region}/{name}/{tag}

Toutes les stats sur une période, en JSON (bilan, RR, K/D, HS %, ADR, agents, maps, parties).

Paramètres : period, tz, since, mode, last

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v1/stats/eu/Mon%20Pseudo/EUW?period=today"
GET/valorant/v1/stats/{region}/{name}/{tag}/{stat}

Une seule stat, en texte brut (pratique pour un service qui relaie la valeur telle quelle). Ajoute ?format=json pour du JSON.

Paramètres : period, tz, since, mode, last, format

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v1/stats/eu/Mon%20Pseudo/EUW/record"

Matchs

GET/valorant/v4/matches/{region}/{platform}/{name}/{tag}

Dernières parties, détail complet (format v4).

Paramètres : mode, map, size (max 10), start

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v4/matches/eu/pc/Mon%20Pseudo/EUW?size=3"
GET/valorant/v3/matches/{region}/{name}/{tag}

Dernières parties (format v3).

Paramètres : mode, map, size (max 10)

GET/valorant/v4/match/{region}/{match_id}

Une partie (format v4).

GET/valorant/v2/match/{match_id}

Une partie (format v2).

GET/valorant/v1/stored-matches/{region}/{name}/{tag}

Parties enregistrées par l'API.

Paramètres : mode, map, page, size

Leaderboard

GET/valorant/v3/leaderboard/{region}/{platform}

Classement en direct. Avec name + tag : recherche d'un joueur.

Paramètres : size (max 1000), page, start_index, name, tag, puuid, season

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v3/leaderboard/eu/pc?size=10"
GET/valorant/v2/leaderboard/{region}

Classement complet (tous les joueurs).

Paramètres : name, tag, puuid, season

GET/valorant/v1/leaderboard/{region}

1000 premiers joueurs (format v1).

Paramètres : name, tag, season

Jeu & serveurs

GET/valorant/v1/version/{region}

Version du jeu.

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v1/version/eu"
GET/valorant/v1/status/{region}

Maintenances et incidents Riot.

GET/valorant/v1/queue-status/{region}

Files de jeu ouvertes, maps, règles.

GET/valorant/v1/content

Contenu du jeu (agents, maps, skins, cartes, titres…).

GET/valorant/v2/store-featured

Bundles du magasin.

GET/valorant/v1/crosshair/generate

Image PNG d'un code de réticule.

Paramètres : id

curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v1/crosshair/generate?id=0;P;c;5;h;0;0l;4;0o;2;0a;1;0f;0;1b;0"
POST/valorant/v1/raw

Données Riot brutes (matchdetails, matchhistory, mmr, competitiveupdates).

Paramètres : corps JSON : type, value, region, queries

Premier (partiel)

GET/valorant/v1/premier/{team_id}/history

Historique d'une équipe Premier.

GET/valorant/v1/premier/search

Recherche parmi les équipes vues dans des parties récupérées.

Paramètres : name, tag