Patch 7.1.0 is live — Clean up of duplicated endpoints & improvement of Typescript SDK.
api-fortnite
← Back to Docs

Replay Parser

Parse Fortnite .replay files to extract match statistics, player lobbies, storm zones, map objects, ground loot, and match timelines. Supports both client replays (uploaded by you) and tournament server replays (fetched from Epic by match ID).

Overview

The Replay Parser reads binary .replay files and returns structured JSON. There are two ways to use it:

  • Upload: You supply a .replay file as multipart/form-data. Useful when you have files locally or from your own capture pipeline.
  • Fetch-and-Parse:You supply a tournament match ID. We call Epic's datastorage API, download the replay, parse it, and return the result. No file handling on your end.

Upload base path

https://prod.api-fortnite.com/api/v1/parsing

Fetch-and-parse base path

https://prod.api-fortnite.com/api/v1/replays

All requests require an x-api-key header with a valid API key.

Credit System

Parsing operations consume daily credits from your plan quota. Credits reset at midnight UTC.

PlanCredits / Day
Free10
Starter100
Pro500
CustomUnlimited

Upload endpoint costs

EndpointCostNotes
/parsing/stats1Free plan access — fastest
/parsing5Single file, full parse
/parsing/lobby5Single file, full parse
/parsing/map5Single file, full parse
/parsing/zones5Single file, full parse
/parsing/timeline5Single file, full parse
/parsing/loot5Single file, full parse
/parsing/multiple/stats5Batch stats
/parsing/multiple10Batch full parse
/parsing/multiple/map10Batch map parse
/parsing/multiple/loot10Batch loot parse
/parsing/broadcast20All data combined

Fetch-and-parse endpoint costs

EndpointCostNotes
/replays/{matchId}2Raw .replay download
/replays/{matchId}/metadata0Chunk manifest, no parsing
/replays/{matchId}/parse/stats1Stats only
/replays/{matchId}/parse5Full parse
/replays/{matchId}/parse/lobby5Full player lobby
/replays/{matchId}/parse/map5Map context
/replays/{matchId}/parse/zones5Storm zones
/replays/{matchId}/parse/timeline5Match timeline
/replays/{matchId}/parse/loot5Ground loot
/replays/{matchId}/parse/broadcast20Everything — recommended for tournaments
Example: Pro plan, FNCS day with 6 games using /parse/broadcast: 6 × 20 = 120 credits consumed out of 500.

Server vs Client Replays

This is the most important distinction to understand before building with the parser.

Client replays

Recorded locally by a player's game client. Saved to %LOCALAPPDATA%\FortniteGame\Saved\Demos\on Windows. Contains the recording player's own summary statistics written at match end, plus cosmetic data.

Server replays

Recorded by the game server. Epic stores them centrally for tournament and competitive events. Contains replicated state for all players— not just one player's perspective. No per-client stats like accuracy or materials, but full per-player damage/kills/reboots. The isServerReplay field is true and root-level stats is null.

FieldClientServer
stats.accuracy
stats.matsFarm / matsUsed
stats.damageStructures
stats.assist (revives)
stats.eliminations / damage / placement✗ (use per-player fields)
Per-player kills + placementPartial✓ all players
Per-player damageDealt / damageTaken✓ all players
Per-player headshots / teamKills✓ all players
Per-player rebootCount✓ all players
Cosmetics (skin, back bling, etc.)
Storm zones / bus path
Supply drops / llamas / reboot vans
Timeline kill/knock events
Timeline damage cue events

How to Obtain Replays

Client replays

Fortnite saves replays automatically. Users can also download them from the in-game Replays menu. For replays stored server-side by Epic, use the Replay Service API (requires OAuth token).

Tournament / server replays

Use the Fetch-and-Parse endpoints— just provide the match ID and we handle the rest. To find match IDs, call Epic's tournament sessions endpoint:

GET https://fngw-mcp-gc-livefn.ol.epicgames.com/fortnite/api/game/v2/events/v2/sessions/{eventId}/{windowId}
  ?page=0&rank=0&teamAccountIds={accountId}

Each session entry contains a "replayId" field.

See EPIC_ENDPOINTS.md for the full list of tournament endpoints and auth requirements. Once you have a match ID, pass it directly to /api/v1/replays/{matchId}/parse/broadcast.

Upload Endpoints

All upload endpoints accept multipart/form-data with the file under the key file.

POST /parsing/stats

POST/api/v1/parsing/stats
1 credit Free plan

Fastest parse — extracts only the summary stats block. Skips all replicated state (players, map, zones). Use when you only need the recording player's final numbers.

Server replays: stats is null. Use /lobby instead.
{
  "name": "FNGameUSW_00-...",
  "replayId": "...",
  "version": "++Fortnite+Release-34.00",
  "isServerReplay": false,
  "stats": {
    "eliminations": 3, "damage": 412, "accuracy": 0.28,
    "placement": 4, "assist": 1, "damageTaken": 200,
    "damageStructures": 50, "matsFarm": 300, "matsUsed": 150,
    "totalPlayers": 100
  }
}

POST /parsing

POST/api/v1/parsing
5 credits

Full parse of a single replay. Returns ReplaySnapshot — owner stats for client replays, or per-player stats array for server replays.

POST /parsing/lobby

POST/api/v1/parsing/lobby
5 credits

Full lobby snapshot — all players with stats, cosmetics, death info, and team data. For server replays: damageDealt, damageTaken, headshots, rebootCount populated. Cosmetics null.

POST /parsing/map

POST/api/v1/parsing/map
5 credits

Bus flight path, drop window, storm circle positions, supply drops, llamas, and reboot vans.

POST /parsing/zones

POST/api/v1/parsing/zones
5 credits

All storm phases with timing, circle positions, and damage per tick. Includes one-phase look-ahead.

POST /parsing/timeline

POST/api/v1/parsing/timeline
5 credits

Chronological event feed for the recording player: kills, knocks, own death, damage dealt/taken, heals, item pickups. Times relative to bus drop (referenceTime).

Server replays: damage cue events (damageDealt, damageTaken) are not available.

POST /parsing/loot

POST/api/v1/parsing/loot
5 credits

Ground loot snapshot — all items that existed on the map near the player, with pickup status and timing.

POST /parsing/broadcast

POST/api/v1/parsing/broadcast
20 credits

All-in-one payload. Combines every data type in a single request — equivalent to calling all other endpoints simultaneously. Use for tournament broadcasting pipelines or full match archival.

Batch endpoints

POST/api/v1/parsing/multiple

Batch full parse — 10 credits

POST/api/v1/parsing/multiple/stats

Batch stats only — 5 credits

POST/api/v1/parsing/multiple/map

Batch map parse — 10 credits

POST/api/v1/parsing/multiple/loot

Batch ground loot — 10 credits

All batch endpoints accept multiple files in one multipart/form-data request. Files are parsed in parallel. Returns an array in the same order as the files sent.

Fetch-and-Parse Endpoints

Pass a tournament match ID — we call Epic's datastorage API, download the replay chunks, assemble the binary, and parse it. Same response shapes as the upload endpoints. Match IDs come from Epic's tournament events API.

GET /replays/{matchId}

GET/api/v1/replays/{matchId}
2 credits

Downloads the raw .replay binary. Returns application/octet-stream with filename {matchId}.replay. Use for archival — store it yourself for later re-parsing or offline analysis.

GET /replays/{matchId}/metadata

GET/api/v1/replays/{matchId}/metadata
Free

Returns Epic's chunk manifest without downloading or parsing. Shows Events, DataChunks, Checkpoints arrays with timing info. Useful for inspecting replay structure.

GET /replays/{matchId}/parse/broadcast

GET/api/v1/replays/{matchId}/parse/broadcast
20 credits

The primary endpoint for tournament pipelines. Downloads the replay from Epic and returns the full broadcast payload — all players, zones, map, loot, and timeline in one call.

curl -H "x-api-key: YOUR_KEY" \
  "https://prod.api-fortnite.com/api/v1/replays/FNCOMP-USW1-FNCS-GAME1/parse/broadcast"

All parse sub-endpoints

EndpointCostResponse
/parse/stats1Stats only
/parse5ReplaySnapshot
/parse/lobby5ParsedLobby
/parse/map5ParsedMap
/parse/zones5ParsedZones
/parse/timeline5ParsedTimeline
/parse/loot5ParsedLoot
/parse/broadcast20ParsedBroadcast (everything)

Data Availability Matrix

Field/stats/parsing/lobby/map/zones/timeline/loot/broadcast
name / replayId / version
isServerReplay
stats (owner summary)
players[] (all players)S
players[].cosmeticsCC
players[].damageDealt / rebootCountSSS
Bus path
Storm zones
Supply drops / llamas
Ground loot
Timeline events
Damage cue eventsCC

✓ = always present  ·  S = server replays only  ·  C = client replays only  ·  — = not included

Response Shape Reference

PlayerStats (owner summary — client replays only)

FieldTypeDescription
eliminationsintTotal kills
damageintTotal damage dealt to players
accuracyfloatShot accuracy (0.0–1.0)
placementintFinal placement (1 = Victory Royale)
assistintRevives given to teammates
damageTakenintTotal damage received
damageStructuresintDamage dealt to structures
matsFarmintMaterials farmed
matsUsedintMaterials used for building
totalPlayersintTotal players in the match

LobbyPlayer

FieldTypeServerClientDescription
playerIdstring?Epic account ID
displayNamestring?Display name
platformstring?WIN / PSN / XBL / Switch / Mobile
isBotboolTrue for NPC bots
isReplayOwnerboolRecording player
teamIndexint?Team number (0-based)
levelint?Account level
placementint?Final placement
killsuint?Eliminations
teamKillsuint?Team total kills
damageDealtfloat?Total damage dealt
damageTakenfloat?Total damage taken
headshotsint?Headshot count
rebootCountuint?Times rebooted teammates
disconnectedbool?Disconnected mid-match
deathTimedouble?Seconds from match start
deathX / deathYdouble?World coordinates of death
deathTagsstring[]?Gameplay tags describing death cause
cosmeticsobject?Skin, back bling, glider, pickaxe, emotes

ZonePhase

FieldTypeDescription
phaseintPhase number (1–9 typically)
currentX/Y/Radiusdouble?Current safe zone (null for phase 1)
nextX/Y/RadiusdoubleCircle this phase shrinks into
nextNextX/Y/Radiusdouble?Following circle (look-ahead)
startShrinkTimefloatSeconds from replay start when shrinking begins
finishShrinkTimefloatSeconds from replay start when shrink completes
damagefloat?Damage per tick outside the zone

BusPath

FieldTypeDescription
startX / startYdoubleBus entry point
endX / endYdoubleBus exit point
dropWindowStartX/YdoubleStart of the player drop window
dropWindowEndX/YdoubleEnd of the player drop window
skinstring?Bus skin name if a special event is active

TimelineEvent

Event type values: kill · knock · death · damageDealt · damageTaken · healed · pickup

FieldPresent onDescription
typeallEvent type string
tallSeconds from replay start
x / ykill, knock, death, damage, pickupWorld position
victimkill, knockVictim display name
killerkill, knock, deathKiller display name
weaponTagskill, knock, deathGameplay tags of weapon used
distancekill, knockDistance to victim (Unreal units)
amountdamageDealt, damageTakenDamage amount
isCriticaldamageDealtHeadshot
isShielddamageDealtHit shield
isFataldamageDealt, damageTakenKilling blow
healthDelta / shieldDeltadamageTaken, healedHP/shield change
health / shielddamageTaken, healedValues after event
itemIdpickupItem definition ID

Map Objects

MapSupplyDrop

FieldTypeDescription
x / ydoubleWorld coordinates (landing position)
lootedboolWhether the crate was opened
lootedTimedouble?Seconds from match start when looted
balloonPoppedboolWhether the balloon was shot
balloonPoppedTimedouble?Seconds when balloon was popped

MapPickup (ground loot)

FieldTypeDescription
itemIdstring?Item definition ID
x / y / zdoubleWorld coordinates
pickedUpboolWhether this item was picked up
pickedUpTimedouble?Seconds from match start when picked up
fromContainerboolTrue if from chest, supply drop, or llama
countintStack size

Coordinate System

All x / y values use Unreal Engine world coordinates (Unreal Units). The map is centered at (0, 0). Coordinates range roughly from -131072 to 131072on both axes depending on the season's map bounds.

The worldBounds object in /parsing/map gives the exact bounds for the specific match. To normalize to 0–1 for overlay rendering:

normalizedX = (x - worldBounds.minX) / (worldBounds.maxX - worldBounds.minX)
normalizedY = (y - worldBounds.minY) / (worldBounds.maxY - worldBounds.minY)
Fortnite's Y axis increases downward in map rendering — you may need to invert Y depending on your coordinate system.