Skip to content

Public game settings

GET
/api/config
curl --request GET \
--url https://foxleague.ai/api/config

Answers the game’s public settings: fees, prices, cooldowns, league limits, prize splits and the defaults the app’s forms start from. The body is the settings object itself, without the success envelope. Amounts in whole FOXSY are for display; to build a payment, use the matching _wei string.

Who: anyone.

Refusals: none.

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

Media type application/json

The game’s public settings, loaded by the app at start.

object
aging_maturity_age
required

Age in years from which a card’s condition recovers more slowly each day.

integer format: int64
aging_max_age
required

Age in years at which recovery reaches its slowest rate, aging_regen_min_points_per_day.

integer format: int64
aging_regen_min_points_per_day
required

Condition points a card recovers per day at aging_max_age.

integer format: int64
aging_starting_age
required

A card’s age in years when it is minted. A card grows one year older every 52 days.

integer format: int64
auction_duration_seconds
required

How long an auction runs, in seconds.

integer format: int64
auction_enabled
required

true when auction listings are available.

boolean
auction_min_increment_percent
required

The smallest raise over the current bid, in percent.

integer format: int64
auction_relist_cooldown_seconds
required

Seconds before a card can go up for auction again after an auction.

integer format: int64
auction_snipe_extension_seconds
required

Seconds a late bid adds to an auction.

integer format: int64
auction_snipe_window_seconds
required

A bid in this many final seconds of an auction extends it by auction_snipe_extension_seconds.

integer format: int64
common_pack_available
required

true when the Common pack is on sale now.

boolean
common_pack_epoch_remaining
required

Common cards left in the contract’s current pack budget; 0 when it cannot be read.

integer format: int64
common_pack_per_wallet_per_week
required

Common packs one wallet may buy in any 7 days.

integer format: int64
common_pack_price_foxsy
required

Price of a Common pack in whole FOXSY.

integer format: int64
common_pack_unavailable_reason

Why the Common pack is not on sale: closed, pool (too few free cards), budget (the current pack budget is spent) or unknown (the budget could not be read). null while it is on sale.

string | null
condition_loss_per_match
required

Condition points a card loses in a tournament or 1v1 challenge match. Older cards lose more.

integer format: int64
condition_loss_per_match_ranked
required

Condition points a card loses in a ranked or casual match. Older cards lose more.

integer format: int64
condition_regen_points_per_day
required

Condition points a card recovers per day until aging_maturity_age.

integer format: int64
dex_swap_enabled
required

true when the app offers an in-app swap to buy FOXSY.

boolean
dex_swap_max_foxsy
required

The most FOXSY one in-app swap may buy, in whole FOXSY.

integer format: int64
dex_swap_slippage_bps
required

Price tolerance of the in-app swap, in basis points.

integer format: int64
faucet_remaining_this_hour

Never present on mainnet.

integer | null format: int64
foxsy_decimals
required

Decimals of the FOXSY token: 18.

integer format: int32
foxsy_token_id
required

The FOXSY token identifier, FOXSY-5d5f3e on mainnet.

string
fusion_card_cooldown_seconds
required

Seconds a card made by fusion waits before it can be fused again.

integer format: int64
fusion_cooldown_seconds
required

Minimum seconds between two fusions of one wallet; 0 means no wait.

integer format: int64
fusion_cooldown_waiver_floor_seconds
required

The last part of a card’s fusion cooldown, in seconds, that cannot be bought off.

integer format: int64
fusion_cooldown_waiver_price_per_day
required

Price to shorten a card’s fusion cooldown (fusion_ready_at) by one day, in whole FOXSY; 0 means this waiver is off. Every started day above fusion_cooldown_waiver_floor_seconds can be bought: all of them or any number from 1.

integer format: int64
fusion_cooldown_waiver_price_per_day_wei
required

The same price in FOXSY wei, as a decimal string.

string
fusion_costs_foxsy
required

Fusion cost in whole FOXSY for each step, in order: Common to Uncommon, Uncommon to Rare, Rare to Epic, Epic to Legendary.

Array<integer>
fusion_match_waiver_floor
required

Matches a card must really play before the rest of fusion_min_matches can be bought. It applies only to a rarity without its own row in rarity_match_gate (row_set false). Every rarity has its own row since 12 October 2026: read the card’s rarity there (floor).

integer format: int64
fusion_match_waiver_price_per_match
required

Price of one bought match toward fusion_min_matches, in whole FOXSY; 0 means this waiver is off. It applies only to a rarity without its own row in rarity_match_gate (row_set false). Every rarity has its own row since 12 October 2026: read the card’s rarity there (price_per_match).

integer format: int64
fusion_match_waiver_price_per_match_wei
required

The same price in FOXSY wei, as a decimal string.

string
fusion_min_matches
required

Competitive matches each of the three cards needs before it can be fused. It applies only to a rarity without its own row in rarity_match_gate (row_set false). Every rarity has its own row since 12 October 2026: read the card’s rarity there (gate).

integer format: int64
league_thresholds
required

The lowest ELO of each league.

object
diamond_min
required

Lowest ELO of the Diamond league.

integer format: int32
gold_min
required

Lowest ELO of the Gold league.

integer format: int32
platinum_min
required

Lowest ELO of the Platinum league.

integer format: int32
silver_min
required

Lowest ELO of the Silver league.

integer format: int32
level_xp_divisor
required

A card’s level is floor(sqrt(experience / level_xp_divisor)), at least 1.

integer format: int64
marketplace_fee_percent
required

Platform fee on a marketplace sale, in percent.

integer format: int64
marketplace_min_list_price_foxsy
required

The lowest reserve price an auction listing accepts, in whole FOXSY; 0 means no minimum.

integer format: int64
min_field_condition
required

The lowest condition at which a card can play a match or train.

integer format: int64
nft_bypass_threshold
required

Player cards a team needs to play: 18. A wallet holding this many can register without buying the starter squad.

integer format: int64
one_v_one_prize_split
required

How a 1v1 challenge prize pool is split.

object
platform_fee_percent
required

Platform fee, in percent.

integer format: int64
winner_percent
required

The winner’s share, in percent.

integer format: int64
prematch_slide_durations_ms
required

Durations of the pre-match show slides.

object
away_team
required

Away team slide, in milliseconds.

integer format: int64
head_to_head
required

Head to head slide, in milliseconds.

integer format: int64
home_team
required

Home team slide, in milliseconds.

integer format: int64
intro
required

Intro slide, in milliseconds.

integer format: int64
rarity_match_gate
required

The match gate of each card rarity and whether its transfer lock rules apply yet.

object
live_from

When the rarity lock rules start, as an RFC 3339 time in UTC; null when the setting is not a valid time.

string | null
rarities
required

One entry per rarity, Common first.

Array<object>

The match gate of one rarity.

object
floor
required

Of those, the matches it must really play.

integer format: int64
gate
required

Competitive matches a card of this rarity needs before it can be fused or listed, bought matches included.

integer format: int64
level
required

The rarity’s level on chain: 0 for Common up to 4 for Legendary.

integer format: int32
price_per_match
required

Price of one bought match for this rarity, in whole FOXSY; 0 means matches cannot be bought for it.

integer format: int64
price_per_match_wei
required

The same price in FOXSY wei, as a decimal string.

string
rarity
required

The rarity name.

string
row_set
required

true when the contract holds this rarity’s own gate; false means fusion_min_matches, fusion_match_waiver_floor and fusion_match_waiver_price_per_match apply.

boolean
waiver_enabled
required

true when matches can be bought for this rarity.

boolean
rows_live
required

true once the game contract holds its own gate for every rarity.

boolean
rules_live
required

true when rows_live is true and live_from has passed: a card sent from one wallet to another from now on gets the rarity lock.

boolean
transfer_lock_hours_per_missing_match
required

Hours each missing match adds to the transfer lock of a card sent before it reached its gate. Each match bought for that card later takes as many hours off, down to the matches it must really play.

integer format: int64
rarity_next
required

The rarity a fusion makes from each rarity, as an object: Common gives Uncommon, Uncommon gives Rare, Rare gives Epic, Epic gives Legendary. The new card is drawn at random from the contract’s pool of cards of that rarity for the position you choose: choosing the position does not choose the card.

registration_fee_egld
required

The registration fee in FOXSY, the same value as registration_fee_foxsy despite its name.

number format: double
registration_fee_foxsy
required

The registration fee in FOXSY, for display.

number format: double
registration_fee_foxsy_wei
required

The registration fee in FOXSY wei that a relayed registration must pay exactly, as a decimal string.

string
registration_fee_wei
required

The registration fee in FOXSY wei, as a decimal string: the exact amount to pay.

string
relayer_addresses
required

FoxLeague’s relayer addresses, one per shard in shard order. A relayed registration names the relayer of the wallet’s shard.

Array<string>
relayer_max_gas_limit
required

The highest gas limit a relayed registration may carry.

integer format: int64
relayer_v3_enabled
required

true when FoxLeague can pay the network fee of your registration through POST /api/onboarding/relay.

boolean
relays_remaining_today

How many more relayed registrations the platform accepts before its cap is reached.

integer | null format: int64
shop_prices_foxsy
required

Shop prices.

object
condition
required

Price of a full condition recovery (0 to 100) for one card. A partial recovery costs its share, rounded up.

integer format: int64
training
required

Price of one training slot.

integer format: int64
xp_booster
required

Price of an XP booster.

integer format: int64
swap_sc_foxsy_balance_wei

Never present on mainnet.

string | null
sync_cost_foxsy
required

Fee to sync one card’s stats to chain, in whole FOXSY.

integer format: int64
tournament_defaults
required

Starting values of the creation forms.

object
deadline_grace_minutes
required

The shortest 1v1 challenge deadline, in minutes, the creation form offers.

integer format: int64
groups_knockout_group_size
required

Teams per group in the groups and knockout format.

integer format: int64
knockout_min_participants
required

Fewest teams a knockout tournament needs.

integer format: int64
league_knockout_enabled
required

Whether the tournament create form offers League + Knockout: false hides it; true shows it to everyone, to be chosen by an admin only.

boolean
league_knockout_min_invite_window_minutes
required

The shortest time, in minutes, between a League + Knockout tournament’s snapshot date and its registration deadline (5760 is 4 days).

integer format: int64
match_stagger_minutes
required

Minutes between rounds that the creation form proposes.

integer format: int64
one_v_one_max_active_per_user
required

Open 1v1 challenges one player may have at a time.

integer format: int64
one_v_one_prize_delivery_seconds
required

Seconds after a 1v1 challenge match’s broadcast ends before its prize is paid.

integer format: int64
swiss_min_participants
required

Fewest teams a Swiss tournament needs.

integer format: int64
tournament_fee_bounds
required

Entry fee limits per tournament tier.

object
gold_min
required

Lowest entry fee of a Gold tournament.

integer format: int64
silver_max
required

Highest entry fee of a Silver tournament.

integer format: int64
silver_min
required

Lowest entry fee of a Silver tournament.

integer format: int64
tournament_prize_split
required

How a tournament prize pool is split.

object
platform_fee_percent
required

Platform fee, in percent.

integer format: int64
runner_up_percent
required

The runner-up’s share, in percent.

integer format: int64
third_percent
required

The third place’s share, in percent.

integer format: int64
winner_percent
required

The winner’s share, in percent.

integer format: int64
training_defaults
required

Training settings.

object
xp_threshold_per_level
required

Training XP an attribute needs to gain one point.

integer format: int64
transfer_cooldown_hours
required

Hours a card sent directly from another wallet waits before it can play, for a card that had reached its rarity’s gate at the transfer. A card sent before it reached its gate waits longer (see rarity_match_gate). A marketplace purchase starts no wait: the buyer keeps what is left of a wait the card already had.

integer format: int64
transfer_cooldown_hours_unplayed
required

The wait, in hours, that a card sent directly from another wallet before the rarity rules started on 12 October 2026 (rarity_match_gate.live_from) got when it had fewer than fusion_min_matches competitive matches at the transfer; kept for the locks still running from then. Such a lock is never made longer but takes the length of the rarity rules when that is shorter (the card’s own transfer_cooldown_hours holds it). Since then a card sent before it reached its rarity’s gate waits transfer_cooldown_hours plus rarity_match_gate.transfer_lock_hours_per_missing_match per missing match.

integer format: int64
tx_signature_check_mode
required

What the app does before it broadcasts a transaction you signed whose signature does not match it: off (no check), log (the transaction is still sent and the operator is told) or block (nothing is sent, you are asked to sign again).

string
Example
{
"aging_maturity_age": 30,
"aging_max_age": 39,
"aging_regen_min_points_per_day": 24,
"aging_starting_age": 18,
"auction_duration_seconds": 86400,
"auction_enabled": true,
"auction_min_increment_percent": 5,
"auction_relist_cooldown_seconds": 172800,
"auction_snipe_extension_seconds": 300,
"auction_snipe_window_seconds": 300,
"common_pack_available": true,
"common_pack_epoch_remaining": 140,
"common_pack_per_wallet_per_week": 2,
"common_pack_price_foxsy": 2500,
"common_pack_unavailable_reason": null,
"condition_loss_per_match": 10,
"condition_loss_per_match_ranked": 5,
"condition_regen_points_per_day": 24,
"dex_swap_enabled": true,
"dex_swap_max_foxsy": 50000,
"dex_swap_slippage_bps": 100,
"foxsy_decimals": 18,
"foxsy_token_id": "FOXSY-5d5f3e",
"fusion_card_cooldown_seconds": 1209600,
"fusion_cooldown_seconds": 86400,
"fusion_cooldown_waiver_floor_seconds": 259200,
"fusion_cooldown_waiver_price_per_day": 250,
"fusion_cooldown_waiver_price_per_day_wei": "250000000000000000000",
"fusion_costs_foxsy": [
500,
1000,
2500,
5000
],
"fusion_match_waiver_floor": 5,
"fusion_match_waiver_price_per_match": 100,
"fusion_match_waiver_price_per_match_wei": "100000000000000000000",
"fusion_min_matches": 20,
"league_thresholds": {
"diamond_min": 2700,
"gold_min": 1600,
"platinum_min": 2000,
"silver_min": 1300
},
"level_xp_divisor": 200,
"marketplace_fee_percent": 5,
"marketplace_min_list_price_foxsy": 100,
"min_field_condition": 30,
"nft_bypass_threshold": 18,
"one_v_one_prize_split": {
"platform_fee_percent": 5,
"winner_percent": 95
},
"prematch_slide_durations_ms": {
"away_team": 10000,
"head_to_head": 10000,
"home_team": 10000,
"intro": 10000
},
"rarity_match_gate": {
"live_from": "2026-10-12T16:30:18Z",
"rarities": [
{
"floor": 5,
"gate": 5,
"level": 0,
"price_per_match": 0,
"price_per_match_wei": "0",
"rarity": "Common",
"row_set": true,
"waiver_enabled": false
},
{
"floor": 5,
"gate": 15,
"level": 1,
"price_per_match": 20,
"price_per_match_wei": "20000000000000000000",
"rarity": "Uncommon",
"row_set": true,
"waiver_enabled": true
},
{
"floor": 15,
"gate": 45,
"level": 2,
"price_per_match": 100,
"price_per_match_wei": "100000000000000000000",
"rarity": "Rare",
"row_set": true,
"waiver_enabled": true
},
{
"floor": 45,
"gate": 135,
"level": 3,
"price_per_match": 100,
"price_per_match_wei": "100000000000000000000",
"rarity": "Epic",
"row_set": true,
"waiver_enabled": true
},
{
"floor": 135,
"gate": 405,
"level": 4,
"price_per_match": 100,
"price_per_match_wei": "100000000000000000000",
"rarity": "Legendary",
"row_set": true,
"waiver_enabled": true
}
],
"rows_live": true,
"rules_live": true,
"transfer_lock_hours_per_missing_match": 6
},
"rarity_next": {
"Common": "Uncommon",
"Epic": "Legendary",
"Rare": "Epic",
"Uncommon": "Rare"
},
"registration_fee_egld": 5000,
"registration_fee_foxsy": 5000,
"registration_fee_foxsy_wei": "5000000000000000000000",
"registration_fee_wei": "5000000000000000000000",
"relayer_addresses": [
"erd1pn9sh2kw4wv0ewvlkpp37svkukh9wxw7v4d7q7k98cv7tm49eae922gpfa",
"erd1f7kfgpqxgmvdpsdj05s6grka6gfputqftf78r57xr0v3zxupyu5v3u70sv",
"erd1ug68eu5y0mydn8fhfsgawxel2w2me46vk59hp4aupc4jy8wx9s3zt3gmse"
],
"relayer_max_gas_limit": 12500000,
"relayer_v3_enabled": true,
"relays_remaining_today": 4870,
"shop_prices_foxsy": {
"condition": 100,
"training": 99,
"xp_booster": 249
},
"sync_cost_foxsy": 10,
"tournament_defaults": {
"deadline_grace_minutes": 30,
"groups_knockout_group_size": 4,
"knockout_min_participants": 2,
"league_knockout_enabled": false,
"league_knockout_min_invite_window_minutes": 5760,
"match_stagger_minutes": 15,
"one_v_one_max_active_per_user": 1,
"one_v_one_prize_delivery_seconds": 180,
"swiss_min_participants": 3
},
"tournament_fee_bounds": {
"gold_min": 5000,
"silver_max": 5000,
"silver_min": 100
},
"tournament_prize_split": {
"platform_fee_percent": 5,
"runner_up_percent": 30,
"third_percent": 15,
"winner_percent": 50
},
"training_defaults": {
"xp_threshold_per_level": 2000
},
"transfer_cooldown_hours": 504,
"transfer_cooldown_hours_unplayed": 1512,
"tx_signature_check_mode": "log"
}