https://api.dev.bifrostgaming.com/v1/graphqlpartnerGetMatchData
v1Returns the full match report for a given match ID. Supports two output formats: Bifrost (default) and CRCON. The Bifrost format is identical to the public match JSON on the Frostbite stats website. The CRCON format is structurally identical to CRCON's get_map_scoreboard API response, including Steam profile/ban data and weapon type classifications — ideal for tools and integrations built around the CRCON ecosystem.
Operation Type
Query
Rate Limit: 120 requests per 60 seconds per partner (2 req/s)
Rate limits are enforced per partnerId via Redis using a fixed 60-second window. You can issue up to 120 requests per minute (an average of 2 requests per second), which allows processing the full list of 50 match IDs from partnerGetMatchIds in well under a minute.
Important usage notes
- This endpoint does NOT require an encrypted payload. Pass your partnerId and partnerEncryptionKey directly as query variables.
- Two output formats are available: Bifrost (default) and CRCON. Omit the format parameter or pass "bifrost" for the Frostbite stats format. Pass format: "crcon" for the CRCON-compatible format.
- The Bifrost format is identical to the Frostbite stats website public match JSON endpoint.
- The CRCON format is structurally identical to CRCON's get_map_scoreboard API response. It includes Steam profile data (avatars, profile URLs, country), VAC/game ban information, weapon type classifications (infantry, armor, etc.), weapon side mappings, team confidence detection, and CRCON-style map metadata.
- Returns null (not an error) if the match ID does not exist or has no report data.
- Match reports are pre-computed at match finalization and served from static files on disk for high performance. If the static file is unavailable, the API falls back to querying the database directly. Both Bifrost and CRCON static files are pre-generated.
- The license field (Bifrost format) requires visible attribution to Frostbite (https://frostbite.bifrostgaming.com) when displaying data publicly.
- Rate limit: 120 requests per 60 seconds (2 req/s average). When processing a batch from partnerGetMatchIds, a ~500ms delay between calls will comfortably stay within the limit. The rate limit applies regardless of format.
- Player stats include weapon breakdowns (killsByWeapon, deathsByWeapon), nemesis tracking (mostKilled, killedMostBy), and distance records for kills.
Input Fields
| Field | Type | Required | Description |
|---|---|---|---|
partnerId | String! | Required | Your unique partner identifier, provided when your partner account was created. |
partnerEncryptionKey | String! | Required | Your partner encryption key (Base64-encoded). This is used to verify your identity — it is NOT used to encrypt a payload for this endpoint. |
matchId | String! | Required | The unique match identifier (UUID format). Obtain match IDs from partnerGetMatchIds. |
format | String | Optional | Output format. "bifrost" (default) returns the Frostbite stats format. "crcon" returns a CRCON-compatible get_map_scoreboard response with Steam profiles, VAC ban data, weapon type classifications, and team confidence scores. |
Code Examples
# Bifrost format (default)
curl -X POST https://api.dev.bifrostgaming.com/v1/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "query PartnerGetMatchData($partnerId: String!, $partnerEncryptionKey: String!, $matchId: String!, $format: String) { partnerGetMatchData(partnerId: $partnerId, partnerEncryptionKey: $partnerEncryptionKey, matchId: $matchId, format: $format) }",
"variables": {
"partnerId": "your-partner-id",
"partnerEncryptionKey": "your-base64-encryption-key",
"matchId": "1bddf7cf-a78c-51ae-a095-456674dd2fee"
}
}'
# CRCON format (add format: "crcon")
curl -X POST https://api.dev.bifrostgaming.com/v1/graphql \
-H "Content-Type: application/json" \
-d '{
"query": "query PartnerGetMatchData($partnerId: String!, $partnerEncryptionKey: String!, $matchId: String!, $format: String) { partnerGetMatchData(partnerId: $partnerId, partnerEncryptionKey: $partnerEncryptionKey, matchId: $matchId, format: $format) }",
"variables": {
"partnerId": "your-partner-id",
"partnerEncryptionKey": "your-base64-encryption-key",
"matchId": "1bddf7cf-a78c-51ae-a095-456674dd2fee",
"format": "crcon"
}
}'Postman Collection
Download a ready-to-use Postman collection for this endpoint. Import it into Postman to start testing immediately.
How to import into Postman
- Open Postman and click Import (top-left)
- Drag and drop the downloaded
.jsonfile, or click Upload Files and select it - Click Import to confirm
- The collection appears in your sidebar — expand it and select the request
- In the Body tab, update the placeholder values (
your-partner-id, etc.) with your actual credentials - Click Send
The collection uses Postman's GraphQL body type, which provides syntax highlighting and variable editing. Make sure your Postman version is 7.2+ for GraphQL support.
Success Response200
{
"data": {
"partnerGetMatchData": {
"license": {
"notice": "Use of these game stats on a public facing website requires that you visibly attribute them to Frostbite, with a link to https://frostbite.bifrostgaming.com",
"warning": "Your origin IP may be blocked and other measures taken if you do not attribute correctly"
},
"match": {
"matchId": "1bddf7cf-a78c-51ae-a095-456674dd2fee",
"gameType": "HLL",
"serverName": "D-DAY 24/7 | NEWCOMERS WELCOME",
"mapId": "utahbeach_offensive_us",
"mapName": "Utah Beach (Day, Allies Off.)",
"gamemode": "Offensive",
"matchTime": "2026-03-20 11:25:28",
"durationSeconds": 3152,
"durationFormatted": "52:32",
"alliedFaction": "USA",
"axisFaction": "Germany",
"alliedScore": 5,
"axisScore": 0,
"winner": "Allies",
"totalPlayers": 97,
"totalKills": 1053
},
"teams": [
{ "team": "Allies", "faction": "USA", "playerCount": 50, "totalKills": 513, "totalDeaths": 470, "totalTeamkills": 19, "score": 5 },
{ "team": "Axis", "faction": "Germany", "playerCount": 47, "totalKills": 540, "totalDeaths": 440, "totalTeamkills": 21, "score": 0 }
],
"players": [
{
"playerId": "76561198012345678",
"playerName": "OGren Kiesel",
"level": 210,
"team": "Allies",
"faction": "USA",
"primaryRole": "Rifleman",
"kills": 42, "deaths": 18, "kdRatio": 2.33,
"teamkills": 1, "teamkillsReceived": 0,
"combatScore": 840, "offenseScore": 320, "defenseScore": 120, "supportScore": 210,
"timePlayedSeconds": 3152,
"killStreak": 8, "deathStreak": 3,
"killsByWeapon": [
{ "weapon": "M1 GARAND", "count": 22, "headshots": 8, "avgDistance": 67.3 },
{ "weapon": "MK2 GRENADE", "count": 5, "headshots": 0, "avgDistance": 12.1 }
],
"mostKilled": [{ "playerId": "76561198087654321", "playerName": "Feind_Hans", "count": 4 }],
"killedMostBy": [{ "playerId": "76561198099887766", "playerName": "Sniper_Wolf", "count": 3 }]
}
],
"killFeed": [
{
"eventTime": "2026-03-20 10:33:16", "matchSecond": 0,
"killerId": "76561198012345678", "killerName": "OGren Kiesel", "killerTeam": "Allies",
"victimId": "76561198087654321", "victimName": "Feind_Hans", "victimTeam": "Axis",
"weapon": "M1 GARAND", "isTeamkill": false, "isHeadshot": true, "distance": 84.2
}
],
"weaponStats": [{ "weapon": "M1 GARAND", "kills": 98, "headshots": 32, "avgDistance": 61.4, "primaryTeam": "Allies" }],
"highlights": {
"topKiller": { "playerName": "OGren Kiesel", "kills": 42 },
"topWeapon": { "weapon": "M1 GARAND", "kills": 98 },
"longestKill": { "distance": 312.5, "weapon": "M1903 SPRINGFIELD" },
"shortestKill": { "distance": 0.3, "weapon": "MK2 GRENADE" }
},
"killTimeline": [{ "intervalStart": 0, "intervalEnd": 300, "totalKills": 42, "alliedKills": 22, "axisKills": 20 }]
}
}
}Error Responses
Response Fields
| Field | Type | Required | Description |
|---|---|---|---|
── Bifrost format (default) ── | Required | ||
license | Object | Required | Attribution notice and usage warning. You must visibly credit Frostbite when displaying this data publicly. |
match | Object | Required | Match metadata: matchId, gameType, serverName, mapId, mapName, gamemode, matchTime, duration, factions, scores, winner, totalPlayers, totalKills. |
teams | [Object] | Required | Array of team stats (Allies/Axis): faction, playerCount, totalKills, totalDeaths, totalTeamkills, score. |
players | [Object] | Required | Array of per-player stats sorted by kills. Includes kills, deaths, K/D, roles, combat/offense/defense/support scores, weapon breakdowns (killsByWeapon, deathsByWeapon), nemesis data (mostKilled, killedMostBy), and kill distance records. |
killFeed | [Object] | Required | Chronological array of every kill event: killer, victim, weapon, distance, headshot, teamkill, timestamp. |
weaponStats | [Object] | Required | Aggregated weapon statistics: weapon name, total kills, headshots, average distance, primary team. |
highlights | Object | Required | Match highlights: topKiller, topWeapon, longestKill, shortestKill. |
killTimeline | [Object] | Required | Kill counts aggregated into 5-minute intervals for timeline visualisation. |
── CRCON format (format: "crcon") ── | Required | The response is the CRCON scoreboard object directly — structurally identical to the result field in CRCON's get_map_scoreboard response. | |
id | String | Required | Match ID. |
creation_time | String | Required | ISO 8601 timestamp of when the report was generated. |
start / end | String | Required | ISO 8601 match start and end timestamps. |
server_number | String | Required | Server identifier. |
map_name | String | Required | RCON map name (e.g. "utahbeach_offensive_us"). |
result | Object | Required | Score object: { axis: number, allied: number }. |
game_layout | Object | Required | Empty object (reserved for future use). |
player_stats[] | [Object] | Required | Array of per-player stats in CRCON format. Includes kills, deaths, kills_by_type (grouped by weapon type), teamkills, streaks, combat/offense/defense/support scores, weapons map, most_killed/death_by nemesis maps, team confidence (side/confidence/ratio), and steaminfo (profile, bans, country). |
player_stats[].steaminfo | Object | Required | Steam profile and ban data: profile (personaname, avatars, profileurl, country), bans (VACBanned, NumberOfVACBans, DaysSinceLastBan, CommunityBanned, NumberOfGameBans), has_bans flag. |
player_stats[].team | Object | Required | Team detection: { side: "allies"|"axis"|"unknown", confidence: "strong"|"mixed", ratio: number }. Uses CRCON's weapon-side algorithm. |
map | Object | Required | CRCON map object with id, name, tag, pretty_name, shortname, allies/axis faction info, orientation, game_mode, attackers, environment, image_name. |