Rainbow Six Siege (R6) API sdk - Get player stats, operators, maps, ranks, seasons, charms, and more. Full TypeScript support included. Last updated Y11S2 - Ranked 3.0.
npm i r6-data.jsNotice: Due to the abuse of the available APIs, it is necessary to register on r6.arenyze.com and create an API key to use this package.
Website where you can directly track your stats and also check all the info that r6-data.js provides. The entire website is based on r6-data.js.
Visit the official website: r6.arenyze.com
The entire SDK is accessed through the R6Client instance.
const { R6Client } = require('r6-data.js');
const r6 = new R6Client({
apiKey: 'YOUR_API_KEY' // Required
});By default the SDK talks to two hosts:
| Host | Used for |
|---|---|
https://public-api.arenyze.com/r6/api |
every stats and catalogue endpoint |
https://r6.arenyze.com/api |
the match replay endpoints |
Both accept the same API key. Either one can be pointed somewhere else — a staging deployment, a local instance — without changing anything else:
const r6 = new R6Client({
apiKey: 'YOUR_API_KEY',
baseUrl: 'http://localhost:3002/r6/api', // optional
siteBaseUrl: 'http://localhost:5000/api', // optional, replay routes
});The SDK provides complete TypeScript declarations!
import { R6Client, ProfileParams, PlayerProfileResponse } from 'r6-data.js';
const r6 = new R6Client({ apiKey: 'YOUR_API_KEY' });
const params: ProfileParams = {
nameOnPlatform: 'PlayerName',
platformType: 'uplay',
platform_families: 'pc'
};
const profile: PlayerProfileResponse = await r6.players.getProfile(params);Player Data V2 uses one profile request for account information, statistics, ban status, seasons, and rank history.
Migration to 3.3.0:
getAccountInfo,getIsBanned,getPlayerStats,getStats,getSeasonalStats, andgetPlayerComparisonswere replaced bygetProfile. Operator statistics and leaderboards remain dedicated requests.
Calls GET /r6/api/v2/profile.
Parameters:
nameOnPlatform(required): player username.platformType(required):uplay,psn, orxbl.platform_families(optional):pc,psn, orxbl; inferred fromplatformTypewhen omitted.
const profile = await r6.players.getProfile({
nameOnPlatform: 'PlayerName',
platformType: 'uplay',
platform_families: 'pc'
});
console.log(profile.account);
console.log(profile.stats);
console.log(profile.banned);
console.log(profile.seasons);
console.log(profile.history);
console.log(profile.meta);The response has this top-level shape:
Only stats is mandatory upstream. If an optional block is unavailable it is null, while meta.partial and meta.errors describe the missing data.
Calls GET /r6/api/v2/operators. Operator data has its own cache and filters, so it is intentionally separate from getProfile.
const result = await r6.players.getOperatorStats({
nameOnPlatform: 'PlayerName',
platformType: 'uplay',
seasonYear: 'Y11S2',
modes: 'ranked'
});
console.log(result.player);
console.log(result.filters);
console.log(result.operators.operators);Supported modes are all, ranked, standard, unranked, quick-match, casual, dual-front, and siege-cup.
Calls GET /r6/api/v2/leaderboard and returns rank-points leaderboard entries.
const leaderboard = await r6.players.getLeaderboard({
page: 1,
platform: 'pc'
});
for (const entry of leaderboard.entries) {
console.log(
`#${entry.position}`,
entry.id,
entry.rankPoints,
entry.kd,
entry.matchesPlayed
);
}Response:
{
"platform": "pc",
"page": 1,
"entries": [
{
"id": "player-id",
"kd": 1.42,
"matchesPlayed": 320,
"rankPoints": 5120,
"position": 1
}
]
}Methods related to game metrics, operators, seasons, maps, and specific game modes.
Calls GET /r6/api/v2/gamestats for current player-count estimates across Steam, Ubisoft Connect, PlayStation, and Xbox.
Example Request:
const gameStats = await r6.game.getGameStats();Example Response:
{
"steam": {
"concurrent": 33631,
"estimate": 33631
},
"crossPlatform": {
"totalRegistered": 85000000,
"monthlyActive": 15300000,
"trendsEstimate": 175666,
"platforms": {
"pc": 6885000,
"playstation": 5355000,
"xbox": 3060000
}
},
"ubisoft": {
"onlineEstimate": 127739
},
"lastUpdated": "2025-10-15T22:39:38.636Z"
}Calls GET /r6/api/v2/twitchstats for Rainbow Six Siege Twitch category metrics.
const twitch = await r6.game.getTwitchStats();
console.log(twitch.liveViewers.current);
console.log(twitch.channels.live);
console.log(twitch.watchTime.last7Days);
console.log(twitch.category.followers);Retrieve information about the maps, operators, seasons, weapons, and more. You can get a list of all entities or filter based on specific criteria.
Examples:
// Get all maps
const maps = await r6.game.getMaps();
// Filter maps by specific parameters
const mapsByName = await r6.game.getMaps({ name: 'Bank' });
const mapsByLocation = await r6.game.getMaps({ location: 'USA' });
const mapsByRelease = await r6.game.getMaps({ releaseDate: '2015-12-01' });
const mapsByPlaylist = await r6.game.getMaps({ playlists: 'ranked' });
const mapsByRework = await r6.game.getMaps({ mapReworked: true });
// Filter Operators
const ash = await r6.game.getOperators({ name: 'Ash' });
const recruit = await r6.game.getOperators({ safename: 'recruit' });
const byRealName = await r6.game.getOperators({ realname: 'Eliza Cohen' });
const byBirthplace = await r6.game.getOperators({ birthplace: 'Jerusalem, Israel' });
// Filter Seasons
const blackIce = await r6.game.getSeasons({ name: 'Black Ice' });
const byMap = await r6.game.getSeasons({ map: 'Yacht' });Available lookup methods:
getMaps(params?)getOperators(params?)getSeasons(params?)getWeapons(params?)getCharms(params?)getUniversalSkins(params?)getAttachment(params?)
Retrieve rank images, mmr boundaries, and data for different versions of Ranked systems.
v1: Until Y1S3v2: Y1S4v3: Y2S1 - Y4S2v4: Y4S3 - Y6S2v5: Y6S3 - Y7S3v6: Y7S4+ (Ranked 2.0)v7: Y11S2+ (Ranked 3.0)
const ranksV1 = await r6.game.getRanks({ version: 'v1' });
const filteredRanks = await r6.game.getRanks({ min_mmr: 2000, max_mmr: 2500, version: 'v1' });Search across all R6 entities simultaneously.
const searchResults = await r6.game.getSearchAll('black ice');
console.log('Search results summary:', searchResults.summary);
// Access specific result categories
console.log('Operator results:', searchResults.results.operators);
console.log('Weapon results:', searchResults.results.weapons);Retrieves the current status of the Rainbow Six Siege game servers.
Example Request:
const status = await r6.game.getServiceStatus();The createDiscordR6Webhook() function allows you to send Rainbow Six Siege player statistics directly to a Discord channel in beautifully formatted dynamic embeds. It automatically detects and formats data from Ubisoft API and Steam.
// Get the complete V2 player profile
const profile = await r6.players.getProfile({
nameOnPlatform: 'PlayerName',
platformType: 'uplay',
platform_families: 'pc'
});
// Send stats directly to Discord webhook
const webhookResult = await r6.webhooks.createDiscordR6Webhook(
'https://discord.com/api/webhooks/YOUR_WEBHOOK_ID/YOUR_WEBHOOK_TOKEN',
profile,
{
playerName: 'PlayerName',
title: 'Rainbow Six Siege Stats',
message: 'Here are the latest R6 stats!',
color: 0xF99E1A,
avatarUrl: 'https://example.com/avatar.png'
}
);Upload Rainbow Six Siege .rec replay files and read back the parsed match data
(scoreboard, kill feed, objective events, per-round breakdown, ...). These
methods are served by the website (https://r6.arenyze.com/api) rather than by
the public API host, and authenticate with the same API key used by the rest of
the SDK.
Notice: Replay storage is plan-limited (free, pro, ultra, ...). The number of replays you can keep is returned in the
quotafield of the upload response.
Uploads one or more .rec files belonging to the same match and returns the
parsed payload, the saved match summary, and your current quota. You can send up
to 20 files per request (e.g. one file per round).
Accepted inputs (single value or array):
- a file path string (read from disk)
- raw bytes (
Buffer/Uint8Array/ArrayBuffer) - a
Blob/File - an object:
{ path, name? }or{ name, data }
// Upload a whole match (all the round .rec files at once)
const result = await r6.matchReplay.uploadReplays([
'./replays/Match-2025-Round1.rec',
'./replays/Match-2025-Round2.rec',
'./replays/Match-2025-Round3.rec'
]);
console.log('Match ID:', result.matchID);
console.log('Rounds parsed:', result.rounds.length);
console.log('Saved match:', result.match);
console.log('Quota:', result.quota); // { plan, limit, used, remaining }
// A single file works too
await r6.matchReplay.uploadReplays('./replays/Match-2025-Round1.rec');
// Or raw bytes / Blob with a custom filename
await r6.matchReplay.uploadReplays({ name: 'round1.rec', data: buffer });Retrieves the parsed data of a previously uploaded match by its matchID
(the value returned in the upload response).
const replay = await r6.matchReplay.getMatch('the-match-id');
console.log('Match summary:', replay.match);
console.log('Match ID:', replay.matchID);
console.log('Rounds:', replay.rounds);Response shape:
{
"match": {
"match_id": "…",
"replay_match_id": "…",
"title": "Clubhouse",
"map": "Clubhouse",
"mode": "Bomb",
"match_type": "Ranked",
"rounds_count": 9,
"blue_score": 5,
"orange_score": 4,
"total_kills": 73,
"players_count": 10
// …started_at_utc, uploaded_at_utc, updated_at_utc
},
"matchID": "…",
"rounds": [ /* per-round header, scoreboard, kill feed, objective events */ ]
}import { R6Client, ReplayFileInput, UploadReplaysResult, MatchReplayResult } from 'r6-data.js';
const r6 = new R6Client({ apiKey: 'YOUR_API_KEY' });
const files: ReplayFileInput[] = ['./replays/round1.rec', './replays/round2.rec'];
const uploaded: UploadReplaysResult = await r6.matchReplay.uploadReplays(files);
const match: MatchReplayResult = await r6.matchReplay.getMatch(uploaded.matchID);The package functions throw an exception if an error occurs during API requests. Make sure to handle errors appropriately using try-catch blocks.
This package is fan made, so it has been created for only informational purposes.
{ "player": { "nameOnPlatform": "PlayerName", "platformType": "uplay", "platformFamilies": "pc" }, "stats": { "platform_families_full_profiles": [] }, "account": { "level": 250, "xp": 0, "profilePicture": "https://avatars.ubisoft.com/..." }, "banned": { "isBanned": false, "banAlerts": [] }, "seasons": {}, "history": {}, "meta": { "included": ["stats", "account", "banned", "seasons", "history"], "partial": false, "errors": {} } }