Whether your wallet can fuse now
const url = 'https://foxleague.ai/api/fusion/can-fuse';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/fusion/can-fuse \ --header 'Authorization: Bearer <token>'Whether your wallet may fuse now. After each fusion your wallet waits out a fusion cooldown: inside it the answer is can_fuse: false with the time left. Otherwise it answers can_fuse: true with match counts. With nonces they are the match gate of the cards’ rarity (rarity_match_gate in /api/config). Without nonces they are fusion_min_matches and fusion_match_waiver_floor of /api/config, which apply only to a rarity without its own row there: every rarity has its own row since 12 October 2026.
With nonces it also checks those cards and lists them in cards; reason then names the first failed check: not_in_wallet (a card your wallet does not hold right now: listed on the marketplace or in an auction, sent away or not arrived yet; read from the chain, the nonces in not_in_wallet), ownership_unreadable (no chain answer while FoxLeague’s records do not show every card free in your wallet; try again in a moment), dirty_stats (trained stats not yet saved on chain), card_cooldown (a card’s own fusion wait), below_match_floor (too few matches really played) or insufficient_matches (too few competitive matches, waived ones included). The contract makes the final check when you fuse.
From the start of the yellow card bans and injuries (card_bans.live_from in /api/config) an injured or a suspended card cannot be fused: with nonces naming one, past the not_in_wallet and ownership_unreadable checks, the answer is a refusal with a code (below). A fusion never clears an injury or a ban: one sent to the contract without this check gives a new card that carries them (injured_until and bans_pending of the card).
From the players contract’s fusion live time (fusion_mint.live in /api/config) a fusion makes a new card through POST /api/fusion/prepare instead: without nonces the answer is can_fuse: false with reason: fusion_mint_live, unless your wallet is inside its fusion cooldown (that answer comes first). While no fusion can be made (fusion_mint.paused in /api/config) the answer without nonces is can_fuse: false with reason: fusion_updating, before any other check.
Who: a signed-in player.
Refusals:
A fusion takes at most 3 different card nonces.:noncesnames more than 3 cards or one card twice.<name> is injured until <end> and cannot be fused.(codecard_injured): from the start of the injuries, a card ofnoncesis injured;<end>reads like16 Nov 14:05 UTC.<name> is suspended (it misses its team's next tournament match) and cannot be fused.(codecard_suspended): from the start of the bans, a card ofnonceshas a ban to serve.- The server’s error answer when a card of
noncesis injured or suspended and the start of the bans and injuries could not be read: try again in a moment. Fusion now makes a brand new card. Reload the page to fuse the new way. Nothing was signed.(codefusion_mint_live): a call withnoncesonce fusion makes a new card.Fusion is being updated. Nothing was signed. Try again later.(codefusion_updating): a call withnonceswhile no fusion can be made (fusion_mint.pausedin/api/config).
Authorizations
Section titled “Authorizations ”Parameters
Section titled “ Parameters ”Query Parameters
Section titled “Query Parameters ”Comma-separated NFT nonces of cards to check, for example 123,456,789. A card your wallet does not hold right now is answered with reason: not_in_wallet and its nonce in not_in_wallet. From the start of the bans and injuries an injured or a suspended card is refused (codes card_injured, card_suspended).
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
With not_in_wallet, card_cooldown, below_match_floor or insufficient_matches: names of the cards that fail it.
true when the wallet may fuse now.
With nonces and past the ownership check (absent with not_in_wallet, ownership_unreadable and dirty_stats): each checked card as {nonce, name, competitive_matches, fusion_match_credit, fusion_ready_at, in_cooldown, below_match_floor, eligible, min_matches_required, match_floor_required}; the last two are the match gate of the card’s rarity.
When your wallet’s fusion cooldown ends (RFC 3339). Only inside the cooldown.
Time left in your wallet’s fusion cooldown, <d>d <h>h; null outside it.
With dirty_stats: names of the cards whose trained stats are not saved on chain yet.
Of those, matches every input card must have really played: with nonces the floor of the cards’ rarity, without them fusion_match_waiver_floor. Absent inside the cooldown and with not_in_wallet, ownership_unreadable or dirty_stats.
Competitive matches every input card needs, waived ones included: with nonces the gate of the cards’ rarity, without them fusion_min_matches. Absent inside the cooldown and with not_in_wallet, ownership_unreadable or dirty_stats.
With not_in_wallet: the nonces your wallet does not hold right now (listed on the marketplace or in an auction, sent away or not arrived yet), as the chain says. FoxLeague’s records never refuse a card by themselves: without a chain answer the check passes when they show every card free in your wallet; otherwise it answers ownership_unreadable.
With nonces: not_in_wallet, ownership_unreadable (neither the chain nor the records could say whether your wallet holds the cards), dirty_stats, card_cooldown, below_match_floor or insufficient_matches; absent otherwise.
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": { "can_fuse": true, "cooldown_remaining": null, "match_floor_required": 5, "min_matches_required": 20 }, "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