Set your team formation
const url = 'https://foxleague.ai/api/teams/formation';const options = { method: 'POST', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"formation":"example","wallet_address":"example"}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request POST \ --url https://foxleague.ai/api/teams/formation \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "formation": "example", "wallet_address": "example" }'Saves your team’s formation and answers the team. The formations you can pick are 4-4-2, 4-3-3, 5-3-2, 4-3-3w, 4-3-3b, 4-4-2o, 4-2-3-1 and 5-2-3. Your saved starters keep their shirts, so a formation they do not fit is refused: save a new formation together with a lineup that fits it through POST /api/teams/lineup with formation.
Who: a signed-in player with a team.
Refusals:
Invalid formation: the value is not a known formation.This formation is coming soon. Pick another formation.: the formation is known but cannot be picked yet.User not found: the wallet has no account.<name> is a <line>. Slot requires <line> in <formation>. Save the formation together with a lineup that fits it.: a starter of your saved lineup is not a card of his slot’s line in the new formation.
A wallet without a team gets HTTP 404 with an empty body. If the team cannot be saved on our side, the answer is HTTP 500 with an empty body.
Authorizations
Section titled “Authorizations ”Request Body required
Section titled “Request Body required ”The formation to save.
object
One of 4-4-2, 4-3-3, 5-3-2, 4-3-3w, 4-3-3b, 4-4-2o, 4-2-3-1 and 5-2-3.
Your wallet address. The body needs it, but the session decides which team changes.
Example generated
{ "formation": "example", "wallet_address": "example"}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
The team badge, usually an ipfs:// address (some older teams carry an inline image); null when none.
The badge’s ipfs:// address; null when none.
The best XI of every formation the team can pick, best first (equal ones in the order of the formation list): its first entry is best_xi_ovr in best_xi_formation. Empty when no card it owns fits a slot.
The best XI of one formation.
object
false when the cards cannot fill that formation: the OVR is then the average of the cards it holds.
A formation a team can pick in Tactics, as a Team.formation id such as 4-3-3.
The best XI OVR in that formation, one decimal.
The formation that best XI is built in, such as 4-3-3. null with best_xi_ovr.
The team’s OVR, one decimal: its best XI OVR, the average OVR of the strongest XI it can field from the cards it owns now (for every formation in Tactics the best card of each position for its slots, each card in its own position, the highest average kept; cards listed for sale count). No lineup choice moves it. The same number every page and the OVR range use. null when no card it owns fits a slot.
The coach name; null when not set.
When the team was created (RFC 3339).
The saved formation.
Team id.
NFT nonces of the 11 starters, as an array. Empty until a lineup is saved.
Team name.
NFT nonces of the bench, as an array.
The owner’s user id.
true when the team carries the verified mark.
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": { "badge": "ipfs://bafybeihkoviema7g3gxyt6la7vd5ho32ictqbilu3wnlo3rs7ewhnp7lly", "badge_ipfs_uri": "ipfs://bafybeihkoviema7g3gxyt6la7vd5ho32ictqbilu3wnlo3rs7ewhnp7lly", "best_xi_by_formation": [ { "complete": true, "formation": "4-3-3", "ovr": 52.6 }, { "complete": true, "formation": "4-3-3w", "ovr": 52.6 }, { "complete": true, "formation": "4-3-3b", "ovr": 52.6 }, { "complete": true, "formation": "4-4-2", "ovr": 52.1 }, { "complete": true, "formation": "4-4-2o", "ovr": 52.1 }, { "complete": true, "formation": "4-2-3-1", "ovr": 51.8 }, { "complete": true, "formation": "5-3-2", "ovr": 51.3 }, { "complete": true, "formation": "5-2-3", "ovr": 50.9 } ], "best_xi_formation": "4-3-3", "best_xi_ovr": 52.6, "coach_name": "Ada Moraru", "created_at": "2026-09-16T08:02:44.517093Z", "formation": "4-3-3", "id": 398, "lineup": [ 1301, 1234, 1240, 1255, 1262, 1270, 1288, 1290, 1302, 1311, 1325 ], "name": "Fox Rovers", "substitutes": [ 1330, 1342, 1356, 1361, 1377, 1389, 1394 ], "user_id": 412, "verified": false }, "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 invalidThe wallet has no team yet. The body is empty.
The formation could not be saved on our side. The body is empty.