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}]}
| Statut | Signification |
|---|---|
| 401 | Clé API absente |
| 403 | Clé API invalide, révoquée ou suspendue |
| 429 | Limite par minute ou quota journalier atteint (voir les en-têtes X-RateLimit-* / X-Quota-*) |
| 400 | Paramètre invalide (région, plateforme, période…) |
| 404 | Joueur, partie ou ressource introuvable |
| 500 | Erreur 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ètre | Valeurs |
|---|---|
period | today (défaut, depuis minuit), 24h, 7d, 30d,
since (depuis since), last (les last dernières parties) |
tz | Fuseau pour « aujourd'hui », défaut Europe/Paris |
since | Début de session : timestamp unix ou date ISO, ex. 2026-09-27T20:00 |
mode | competitive (défaut), unrated, swiftplay, deathmatch,
teamdeathmatch, spikerush, premier, all |
last | Nombre de parties avec period=last (1 à 100, défaut 20) |
format | Stat 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
| Stat | Description |
|---|---|
matches | Nombre de parties |
wins | Victoires |
losses | Défaites |
draws | Matchs nuls |
record | Bilan, ex. 3W/1L |
winrate | Pourcentage de victoires (nuls exclus) |
rr | RR gagnés/perdus sur la période (compétitif uniquement) |
kills | Kills |
deaths | Morts |
assists | Assists |
kda | K/D/A, ex. 57/40/27 |
kd | Ratio kills/morts |
kda_ratio | (kills + assists) / morts |
hs | Pourcentage de tirs à la tête |
bodyshots | Pourcentage de tirs au corps |
legshots | Pourcentage de tirs aux jambes |
adr | Dégâts moyens par round |
acs | Score de combat moyen par round |
damage | Dégâts infligés |
damage_received | Dégâts reçus |
first_bloods | Premiers kills du round |
rounds | Rounds joués |
streak | Série en cours, ex. W3 ou L2 |
top_agent | Agent le plus joué |
top_map | Map la plus jouée |
last_match | Ré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
/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"/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"/valorant/v1/by-puuid/account/{puuid}Compte à partir d'un PUUID (existe aussi en v2).
Rang & MMR
/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"/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"/valorant/v1/mmr/{region}/{name}/{tag}Rang actuel (format v1).
/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"/valorant/v1/mmr-history/{region}/{name}/{tag}Évolution du RR (format v1).
/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)
/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"/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
/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"/valorant/v3/matches/{region}/{name}/{tag}Dernières parties (format v3).
Paramètres : mode, map, size (max 10)
/valorant/v4/match/{region}/{match_id}Une partie (format v4).
/valorant/v2/match/{match_id}Une partie (format v2).
/valorant/v1/stored-matches/{region}/{name}/{tag}Parties enregistrées par l'API.
Paramètres : mode, map, page, size
Leaderboard
/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"/valorant/v2/leaderboard/{region}Classement complet (tous les joueurs).
Paramètres : name, tag, puuid, season
/valorant/v1/leaderboard/{region}1000 premiers joueurs (format v1).
Paramètres : name, tag, season
Jeu & serveurs
/valorant/v1/version/{region}Version du jeu.
curl -H "Authorization: $VAL_API_KEY" "https://val-api.kbouu.com/valorant/v1/version/eu"/valorant/v1/status/{region}Maintenances et incidents Riot.
/valorant/v1/queue-status/{region}Files de jeu ouvertes, maps, règles.
/valorant/v1/contentContenu du jeu (agents, maps, skins, cartes, titres…).
/valorant/v2/store-featuredBundles du magasin.
/valorant/v1/crosshair/generateImage 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"/valorant/v1/rawDonnées Riot brutes (matchdetails, matchhistory, mmr, competitiveupdates).
Paramètres : corps JSON : type, value, region, queries
Premier (partiel)
/valorant/v1/premier/{team_id}/historyHistorique d'une équipe Premier.
/valorant/v1/premier/searchRecherche parmi les équipes vues dans des parties récupérées.
Paramètres : name, tag