Skip to content

A wallet's match history

GET
/api/matches/history
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.

wallet_address
required
string

The wallet whose matches to list.

limit
integer format: int64

Rows per page, 1 to 50. Default 10.

offset
integer format: int64

Rows to skip. Default 0.

result
string

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.

Success or a refusal: read success (the refusals are in the description).

Media type application/json
object
code

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.

string | null
data

The answer. Present when success is true.

Array<object>

One row of a wallet’s match history.

object
away_badge

The away team’s badge URI; null for an AI team or a team without one.

string | null
away_elo_after

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.

integer | null format: int32
away_elo_at_match

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.

integer | null format: int32
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.

integer | null format: int32
away_penalty

Away goals in a penalty shootout; null without a shootout and until the result is public.

integer | null format: int32
away_score

Away goals; null until the result is public.

integer | null format: int32
away_team_name
required

Away team name.

string
away_user_id

The away player’s account id; null for an AI team.

integer | null format: int32
created_at
required

When the match kicked off (RFC 3339). For a tournament or challenge match, its scheduled kickoff.

string format: date-time
decided_by

regular, extra_time or penalties; null until the result is public.

string | null
developer_mode
required

true for a match of a developer tournament, played by uploaded team code.

boolean
displayed_at
required

The date to show (RFC 3339): the end of a tournament or challenge match’s broadcast, otherwise when the match was created.

string format: date-time
distribute_tx_hash

The transaction that paid the tournament’s prizes; null otherwise.

string | null
finished_at

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.

string | null format: date-time
forfeit_reason

Why the match was decided by forfeit, in plain words; null otherwise.

string | null
home_badge

The home team’s badge URI; null for a team without one.

string | null
home_elo_after

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.

integer | null format: int32
home_elo_at_match

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.

integer | null format: int32
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.

integer | null format: int32
home_penalty

Home goals in a penalty shootout; null without a shootout and until the result is public.

integer | null format: int32
home_score

Home goals; null until the result is public.

integer | null format: int32
home_team_name
required

Home team name.

string
home_user_id

The home player’s account id.

integer | null format: int32
id

The match id of a ranked or casual match; null for a tournament or challenge match (see tournament_match_id).

integer | null format: int32
is_forfeit
required

true when the match was decided by forfeit; such a match has no stats.

boolean
last_known_cycle
required

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.

integer format: int32
match_type
required

casual, ranked or tournament (1v1 challenges included).

string
playback_started_at

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.

string | null format: date-time
rcg_ready_at

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.

string | null format: date-time
replay_pruned_at

When the replay was removed after its keeping period (RFC 3339); null while it is kept. Offer a replay only while this is null.

string | null format: date-time
results_applied
required

true once the result has counted: ratings, records, XP and condition.

boolean
status
required

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.

string
tm_game_id

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.

integer | null format: int64
total_frames

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.

integer | null format: int32
tournament_id

The tournament id; null for a ranked or casual match.

integer | null format: int64
tournament_match_id

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.

string | null
tournament_max_teams

The tournament’s size, 2 for a 1v1 challenge; null for a ranked or casual match.

integer | null format: int32
error

Why the request was refused, in plain words. Present when success is false.

string | null
success
required

true when the request did what it asked. false is a refusal: read error.

boolean
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.

Media type text/plain
string
Example
Session expired or invalid

A server read failed. The body is empty.