Your upcoming tournament matches
const url = 'https://foxleague.ai/api/tournaments/upcoming-matches';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
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/tournaments/upcoming-matches \ --header 'Authorization: Bearer <token>'Returns your tournament matches whose broadcast has not ended yet plus your recently finished ones, soonest first. The answer is one page. The X-Total-Count response header holds how many matches there are in all; ask for the next page with offset set to the number of rows already read until you hold that many. Each row gives the kickoff, the time your strategy locks for that match (lead_minutes before kickoff) and a phase: upcoming, locked, live or finished. A next-round match is listed once the match that puts you in it has finished. The opponent is named by the same rule. A match’s score appears once its broadcast ends.
Who: a signed-in player.
Refusals:
Not registered: the wallet has no player account.
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”Rows per page, 1 to 200. Default 50.
Rows to skip. Default 0.
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.
object
Minutes before kickoff at which a match’s strategy locks.
Your matches, soonest first: one page of them (see limit and offset).
One of your tournament matches, from before its lock until its broadcast ends.
object
The away side’s goals; null until the match’s broadcast ends.
true in a developer tournament, played by uploaded team binaries.
The formation taken for this match once it is locked, else your current one.
The group in a groups stage; null otherwise.
The home side’s goals; null until the match’s broadcast ends.
true when your team plays at home.
true while live; once finished, true when a replay can be watched.
true from strategy_locks_at on: later tactics changes do not apply to this match.
Your developer team’s logo in a developer tournament; null otherwise.
Your developer team’s name in a developer tournament; null otherwise.
A squad as a tournament match takes it: formation, starters, substitutes and player details.
object
Formation, for example 4-3-3.
The eleven starters as NFT nonces, in lineup order.
The eighteen cards of the squad.
One card of a squad as a tournament match takes it.
object
Accuracy as recorded on chain.
The card’s condition now, 0 to 100.
Control as recorded on chain.
The player’s country number, when known (upcoming rows only).
Defense as recorded on chain.
true for the eleven starters.
The level as recorded on chain.
The player’s name.
The card’s NFT nonce.
The player’s portrait, when known (upcoming rows only).
The player’s position.
Power as recorded on chain.
Common, Uncommon, Rare, Epic or Legendary.
The card’s shirt number, when known (upcoming rows only).
Speed as recorded on chain.
Stamina as recorded on chain.
Vision as recorded on chain.
The seven substitutes as NFT nonces.
The wallet that owns the squad.
The opponent’s badge; null like opponent_name or when the team has none.
The opponent’s team name; null until the opponent is known (from the start for group, league and first-round matches, otherwise once the match that decides the opponent has finished or from kickoff).
upcoming before the lock, locked from the lock to kickoff, live from kickoff until the end of its broadcast, finished after it.
The round, for example Final; null when the round has no name.
Kickoff (RFC 3339).
When your squad and tactics lock for this match: kickoff minus lead_minutes (RFC 3339).
The tournament.
The match’s public id (matches[].id of the tournament): watch it while it is live (GET /api/live/tournament-match/{id}), then its replay, statistics and files by it.
The tournament’s title.
Your team badge: an IPFS URI or an older inline image; null when none.
Your team name; null when you have no team.
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": { "lead_minutes": 30, "matches": [ { "away_score": 2, "developer_mode": false, "formation": "4-3-3", "group_name": "League", "home_score": 1, "is_home": false, "is_watchable": true, "locked": true, "my_dev_badge": null, "my_dev_name": null, "my_lineup": { "formation": "4-3-3", "lineup": [ 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031 ], "players": [ { "accuracy": 64, "condition": 100, "control": 70, "country": 31, "defense": 40, "is_starter": true, "level": 6, "name": "Rufus Vale", "nonce": 1021, "portrait_uri": "ipfs://bafkreiportrait1021", "position": "GK", "power": 54, "rarity": "Rare", "speed": 62, "stamina": 63, "vision": 69 }, { "accuracy": 74, "condition": 90, "control": 45, "country": 25, "defense": 42, "is_starter": true, "level": 9, "name": "Milo Thorne", "nonce": 1022, "portrait_uri": "ipfs://bafkreiportrait1022", "position": "DEF", "power": 54, "rarity": "Common", "speed": 46, "stamina": 66, "vision": 69 }, { "accuracy": 43, "condition": 76, "control": 48, "country": 39, "defense": 43, "is_starter": true, "level": 11, "name": "Arlo Brask", "nonce": 1023, "portrait_uri": "ipfs://bafkreiportrait1023", "position": "DEF", "power": 61, "rarity": "Uncommon", "speed": 41, "stamina": 54, "vision": 57 }, { "accuracy": 72, "condition": 78, "control": 68, "country": 36, "defense": 46, "is_starter": true, "level": 9, "name": "Basil Halden", "nonce": 1024, "portrait_uri": "ipfs://bafkreiportrait1024", "position": "DEF", "power": 61, "rarity": "Rare", "speed": 53, "stamina": 38, "vision": 42 }, { "accuracy": 57, "condition": 70, "control": 68, "country": 26, "defense": 44, "is_starter": true, "level": 3, "name": "Cyrus Mercer", "nonce": 1025, "portrait_uri": "ipfs://bafkreiportrait1025", "position": "DEF", "power": 63, "rarity": "Common", "speed": 53, "stamina": 43, "vision": 47 }, { "accuracy": 60, "condition": 73, "control": 67, "country": 24, "defense": 71, "is_starter": true, "level": 4, "name": "Dorian Quill", "nonce": 1026, "portrait_uri": "ipfs://bafkreiportrait1026", "position": "MID", "power": 39, "rarity": "Epic", "speed": 54, "stamina": 41, "vision": 53 }, { "accuracy": 43, "condition": 88, "control": 40, "country": 31, "defense": 69, "is_starter": true, "level": 12, "name": "Emil Rowan", "nonce": 1027, "portrait_uri": "ipfs://bafkreiportrait1027", "position": "MID", "power": 54, "rarity": "Uncommon", "speed": 74, "stamina": 47, "vision": 38 }, { "accuracy": 47, "condition": 88, "control": 42, "country": 4, "defense": 63, "is_starter": true, "level": 7, "name": "Felix Stroud", "nonce": 1028, "portrait_uri": "ipfs://bafkreiportrait1028", "position": "MID", "power": 41, "rarity": "Common", "speed": 58, "stamina": 44, "vision": 72 }, { "accuracy": 61, "condition": 77, "control": 50, "country": 52, "defense": 62, "is_starter": true, "level": 4, "name": "Gideon Tavish", "nonce": 1029, "portrait_uri": "ipfs://bafkreiportrait1029", "position": "MID", "power": 46, "rarity": "Rare", "speed": 52, "stamina": 43, "vision": 40 }, { "accuracy": 61, "condition": 84, "control": 49, "country": 58, "defense": 55, "is_starter": true, "level": 10, "name": "Hugo Ulric", "nonce": 1030, "portrait_uri": "ipfs://bafkreiportrait1030", "position": "FWD", "power": 46, "rarity": "Legendary", "speed": 67, "stamina": 59, "vision": 38 }, { "accuracy": 40, "condition": 96, "control": 74, "country": 32, "defense": 65, "is_starter": true, "level": 9, "name": "Ivo Voss", "nonce": 1031, "portrait_uri": "ipfs://bafkreiportrait1031", "position": "FWD", "power": 68, "rarity": "Uncommon", "speed": 74, "stamina": 51, "vision": 38 }, { "accuracy": 73, "condition": 85, "control": 70, "country": 41, "defense": 67, "is_starter": false, "level": 10, "name": "Jasper Wren", "nonce": 1032, "portrait_uri": "ipfs://bafkreiportrait1032", "position": "GK", "power": 66, "rarity": "Common", "speed": 66, "stamina": 49, "vision": 50 }, { "accuracy": 55, "condition": 85, "control": 47, "country": 18, "defense": 71, "is_starter": false, "level": 7, "name": "Kian Yarrow", "nonce": 1033, "portrait_uri": "ipfs://bafkreiportrait1033", "position": "DEF", "power": 60, "rarity": "Common", "speed": 68, "stamina": 38, "vision": 62 }, { "accuracy": 56, "condition": 72, "control": 47, "country": 35, "defense": 49, "is_starter": false, "level": 4, "name": "Lionel Zane", "nonce": 1034, "portrait_uri": "ipfs://bafkreiportrait1034", "position": "DEF", "power": 52, "rarity": "Uncommon", "speed": 54, "stamina": 49, "vision": 52 }, { "accuracy": 71, "condition": 84, "control": 54, "country": 20, "defense": 53, "is_starter": false, "level": 12, "name": "Marek Ashby", "nonce": 1035, "portrait_uri": "ipfs://bafkreiportrait1035", "position": "MID", "power": 55, "rarity": "Common", "speed": 44, "stamina": 42, "vision": 56 }, { "accuracy": 38, "condition": 98, "control": 48, "country": 52, "defense": 71, "is_starter": false, "level": 2, "name": "Nils Corvin", "nonce": 1036, "portrait_uri": "ipfs://bafkreiportrait1036", "position": "MID", "power": 40, "rarity": "Rare", "speed": 51, "stamina": 39, "vision": 53 }, { "accuracy": 68, "condition": 83, "control": 64, "country": 55, "defense": 68, "is_starter": false, "level": 2, "name": "Otto Dace", "nonce": 1037, "portrait_uri": "ipfs://bafkreiportrait1037", "position": "FWD", "power": 56, "rarity": "Common", "speed": 61, "stamina": 66, "vision": 52 }, { "accuracy": 64, "condition": 78, "control": 56, "country": 8, "defense": 57, "is_starter": false, "level": 12, "name": "Pavel Ember", "nonce": 1038, "portrait_uri": "ipfs://bafkreiportrait1038", "position": "FWD", "power": 61, "rarity": "Uncommon", "speed": 71, "stamina": 72, "vision": 49 } ], "substitutes": [ 1032, 1033, 1034, 1035, 1036, 1037, 1038 ], "wallet_address": "erd15feryxhrdz9m6y09mr8wrerwzgj6f8ntxvhxyrdlm5aahn0t09nl4ujy86" }, "opponent_badge": "ipfs://bafkreilavyf6rmpafqfjzczbttofjyu7jsjc3ibofbcixgy4dbp", "opponent_name": "Ember Town", "phase": "finished", "round_label": "Matchday 3", "scheduled_at": "2026-09-30T20:00:00Z", "strategy_locks_at": "2026-09-30T19:30:00Z", "tournament_id": 377, "tournament_match_id": "Qx7_kP2mZr9-aB3cD4eF5g", "tournament_title": "Autumn League" }, { "away_score": null, "developer_mode": false, "formation": "4-3-3", "group_name": null, "home_score": null, "is_home": true, "is_watchable": false, "locked": false, "my_dev_badge": null, "my_dev_name": null, "my_lineup": null, "opponent_badge": "ipfs://bafkrei6bs5e4rynnefjqxirhxo77zbka74ztj2wyuhvauvzhmas", "opponent_name": "Riverside Rovers", "phase": "upcoming", "round_label": "Quarterfinal", "scheduled_at": "2026-10-02T18:00:00Z", "strategy_locks_at": "2026-10-02T17:30:00Z", "tournament_id": 412, "tournament_match_id": "Rk2-ZpQ9wLm4_nB7vC1xYa", "tournament_title": "Friday Night Cup" } ], "my_team_badge": "ipfs://bafkreij7ufrdl3erbfqfoeqh5av2ricphkqdlmttns4lrwbqcab", "my_team_name": "Harbor Foxes" }, "success": true}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 invalid