Skip to content

Whether your wallet can fuse now

GET
/api/fusion/can-fuse
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.

Who: a signed-in player.

Refusals:

  • A fusion takes at most 3 different card nonces.: nonces names more than 3 cards or one card twice.
nonces
string

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.

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.

object
blocked_players

With not_in_wallet, card_cooldown, below_match_floor or insufficient_matches: names of the cards that fail it.

Array<string>
can_fuse
required

true when the wallet may fuse now.

boolean
cards

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.

Array
cooldown_end

When your wallet’s fusion cooldown ends (RFC 3339). Only inside the cooldown.

string format: date-time
cooldown_remaining
required

Time left in your wallet’s fusion cooldown, <d>d <h>h; null outside it.

string | null
dirty_players

With dirty_stats: names of the cards whose trained stats are not saved on chain yet.

Array<string>
match_floor_required

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.

integer format: int64
min_matches_required

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.

integer format: int64
not_in_wallet

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.

Array<integer>
reason

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.

string
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": {
"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.

Media type text/plain
string
Example
Session expired or invalid