A wallet's match history
const url = 'https://foxleague.ai/api/matches/history?wallet_address=example';const options = {method: 'GET'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request GET \ --url 'https://foxleague.ai/api/matches/history?wallet_address=example'A wallet’s matches, newest created_at first: its ranked and casual matches plus its tournament and challenge matches once their broadcast ends. Matches that could not be played are left out. The answer is one page. The X-Total-Count response header holds how many matches there are in all (with result, how many of that result); ask for the next page with offset set to the number of rows already read until you hold that many. Scores, rating changes, penalties and decided_by are null until the match’s result is public. A tournament or challenge row carries no match id (id and tm_game_id are null): it is named by its public id, tournament_match_id.
Who: anyone, for any wallet, with more for a session. For a ranked or casual match whose result is not applied, its two players read its progress; anyone else reads status: "live" with tm_game_id, the timings, last_known_cycle and total_frames null or 0. A session header that is present but invalid answers 401.
Authorizations
Section titled “Authorizations ”- None
- session
Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”The wallet whose matches to list.
Rows per page, 1 to 50. Default 10.
Rows to skip. Default 0.
Only the matches the wallet won (win), lost (loss) or drew (draw). A penalty shootout counts by its penalties. A match whose replay is still playing is none of the three. Without it every match is listed.
Responses
Section titled “ Responses ”Success or a refusal: read success (the refusals are in the description).
object
A machine-readable reason next to error, set only where the caller must act differently. tx_pending: the payment was not refused but could not be verified yet; keep the transaction hash and confirm again with the same hash, never pay twice.
The answer. Present when success is true.
One row of a wallet’s match history.
object
The away team’s badge URI; null for an AI team or a team without one.
away_elo_at_match plus this match’s rating change (away_elo_after minus away_elo_at_match is the change the match applied; it is not the side’s current rating); null until the result is public and for an older tournament match whose away_elo_at_match is null.
The away side’s rating for this match. A ranked or casual match records it when the match is created. A tournament match records it when its result is applied after the broadcast, the rating its change is computed from; until then it is the side’s current rating. Null for an older tournament match whose rating was not recorded this way: its change is in away_elo_change.
The away side’s rating change in this match (away_elo_after minus away_elo_at_match, also for an older tournament match that answers neither); null until the result is public and when the match changed no rating.
Away goals in a penalty shootout; null without a shootout and until the result is public.
Away goals; null until the result is public.
Away team name.
The away player’s account id; null for an AI team.
When the match kicked off (RFC 3339). For a tournament or challenge match, its scheduled kickoff.
regular, extra_time or penalties; null until the result is public.
true for a match of a developer tournament, played by uploaded team code.
The date to show (RFC 3339): the end of a tournament or challenge match’s broadcast, otherwise when the match was created.
The transaction that paid the tournament’s prizes; null otherwise.
When the match ended (RFC 3339). For a tournament or challenge match, its kickoff plus the match’s length. Null before that; null for anyone but the two players while a ranked or casual match’s result is not applied.
Why the match was decided by forfeit, in plain words; null otherwise.
The home team’s badge URI; null for a team without one.
home_elo_at_match plus this match’s rating change (home_elo_after minus home_elo_at_match is the change the match applied; it is not the side’s current rating); null until the result is public and for an older tournament match whose home_elo_at_match is null.
The home side’s rating for this match. A ranked or casual match records it when the match is created. A tournament match records it when its result is applied after the broadcast, the rating its change is computed from; until then it is the side’s current rating. Null for an older tournament match whose rating was not recorded this way: its change is in home_elo_change.
The home side’s rating change in this match (home_elo_after minus home_elo_at_match, also for an older tournament match that answers neither); null until the result is public and when the match changed no rating.
Home goals in a penalty shootout; null without a shootout and until the result is public.
Home goals; null until the result is public.
Home team name.
The home player’s account id.
The match id of a ranked or casual match; null for a tournament or challenge match (see tournament_match_id).
true when the match was decided by forfeit; such a match has no stats.
The last viewer position saved for the match, in cycles (10 per second); 0 for anyone but the two players while a ranked or casual match’s result is not applied.
casual, ranked or tournament (1v1 challenges included).
When the broadcast of a ranked or casual match started playing (RFC 3339); null for a tournament or challenge match and before that; null for anyone but the two players while a ranked or casual match’s result is not applied.
When the replay became available (RFC 3339). For a tournament or challenge match, the end of its broadcast. Null before that; null for anyone but the two players while a ranked or casual match’s result is not applied.
When the replay was removed after its keeping period (RFC 3339); null while it is kept. Offer a replay only while this is null.
true once the result has counted: ratings, records, XP and condition.
finished once the match is over; rcg_ready for a ranked or casual match whose broadcast is ready but whose result is not applied; another value while the match is being played. Anyone but the two players reads live for a ranked or casual match whose result is not applied.
The match server’s game id of a ranked or casual match; null without a recording; null for anyone but the two players while its result is not applied; null for a tournament or challenge match.
Cycles in the recording; null when unknown; null for anyone but the two players while a ranked or casual match’s result is not applied.
The tournament id; null for a ranked or casual match.
A tournament or challenge match’s public id: its replay (GET /api/replay/tournament-match/{id}), statistics and files. null for a ranked or casual match.
The tournament’s size, 2 for a 1v1 challenge; null for a ranked or casual match.
Why the request was refused, in plain words. Present when success is false.
true when the request did what it asked. false is a refusal: read error.
Example
{ "data": [ { "away_badge": null, "away_elo_after": 1253, "away_elo_at_match": 1261, "away_elo_change": -8, "away_penalty": null, "away_score": 1, "away_team_name": "Night Owls", "away_user_id": 77, "created_at": "2026-10-01T09:12:03Z", "decided_by": "regular", "developer_mode": false, "displayed_at": "2026-10-01T09:12:03Z", "distribute_tx_hash": null, "finished_at": "2026-10-01T09:14:40Z", "forfeit_reason": null, "home_badge": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi/badge.png", "home_elo_after": 1262, "home_elo_at_match": 1254, "home_elo_change": 8, "home_penalty": null, "home_score": 2, "home_team_name": "Red Foxes", "home_user_id": 42, "id": 5123, "is_forfeit": false, "last_known_cycle": 6000, "match_type": "ranked", "playback_started_at": null, "rcg_ready_at": "2026-10-01T09:14:39Z", "replay_pruned_at": null, "results_applied": true, "status": "finished", "tm_game_id": 90412, "total_frames": 6000, "tournament_id": null, "tournament_match_id": null, "tournament_max_teams": null }, { "away_badge": null, "away_elo_after": null, "away_elo_at_match": 1248, "away_elo_change": null, "away_penalty": null, "away_score": 0, "away_team_name": "Iron FC", "away_user_id": null, "created_at": "2026-09-30T18:40:11Z", "decided_by": "regular", "developer_mode": false, "displayed_at": "2026-09-30T18:40:11Z", "distribute_tx_hash": null, "finished_at": "2026-09-30T18:42:50Z", "forfeit_reason": null, "home_badge": "ipfs://bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi/badge.png", "home_elo_after": 1250, "home_elo_at_match": 1250, "home_elo_change": 0, "home_penalty": null, "home_score": 0, "home_team_name": "Red Foxes", "home_user_id": 42, "id": 5098, "is_forfeit": false, "last_known_cycle": 6000, "match_type": "casual", "playback_started_at": null, "rcg_ready_at": "2026-09-30T18:42:49Z", "replay_pruned_at": null, "results_applied": true, "status": "finished", "tm_game_id": 90377, "total_frames": 6000, "tournament_id": null, "tournament_match_id": null, "tournament_max_teams": null } ], "success": true}result is not win, loss or draw. The body is empty.
No valid session. The body is plain text: Missing Authorization header, Invalid Authorization format, Invalid session token or Session expired or invalid. Sign in again.
Example
Session expired or invalidA server read failed. The body is empty.