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_settle_interval_ms
required

How often, in milliseconds, the platform settles ended auctions (at least 60000).

integer format: int64
auction_settle_past_end_margin_seconds
required

Seconds after an auction ends before the platform first tries to settle it. Claim is offered only after this plus two settle rounds.

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
card_bans
required

The yellow card bans and the injuries: the switch, the yellow cards that make one ban, the injury chance and the days out. The numbers are the ones in force now.

object
injury_chance_bp_condition_floor
required

The same chance at condition 30 and below, in basis points (300 = 3%). Between condition 100 and 30 the chance moves in a straight line between the two.

integer format: int32
injury_chance_bp_full_condition
required

The chance that one foul the referee calls injures the player fouled at condition 100, in basis points (100 = 1%).

integer format: int32
injury_days_out
required

The days a card is out for 1, 2 and 3 or more injuries in one match, in that order. A change counts for matches that end after it; a card already injured keeps its end.

Array<integer>
live
required

Whether the bans govern now: yellow_cards_per_ban yellow cards in tournaments of more than 2 teams make a card miss its team’s next tournament match.

boolean
live_from

When the bans govern (RFC 3339, UTC); null while the switch is off. Every card starts at 0 yellow cards toward a ban at that moment.

string | null
yellow_cards_per_ban
required

The yellow cards that make one ban (3 unless the game settings say otherwise). A change counts for matches that end after it.

integer format: int32
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
competition_levels
required

The competition levels: the switch, the ranked ticket price, the XP factor and ELO K of each level.

object
competitive_daily_cap
required

How many competitive matches a card counts per day once the levels govern (rules.competitive_daily_cap, its own key, not the daily XP cap); 0 means no cap.

integer format: int64
elo_k
required

The ELO K each level moves ratings with.

object
bronze
required

The value for a paid Bronze tournament.

integer format: int64
gold
required

The value for a Gold tournament.

integer format: int64
ranked
required

The value for a ranked game.

integer format: int64
silver
required

The value for a Silver tournament.

integer format: int64
live
required

Whether the competition levels govern now.

boolean
live_from

When the competition levels govern (RFC 3339, UTC); null while the switch is off.

string | null
private_bronze_earns
required

Whether a private Bronze tournament (one with an invite list) earns XP, ELO and the competitive count like a public one.

boolean
ranked_ticket_price_foxsy
required

What one ranked game costs its starter, in whole FOXSY, once the levels govern.

integer format: int64
xp_factor_pct
required

The share of a match’s XP each level earns, in whole percent.

object
bronze
required

The value for a paid Bronze tournament.

integer format: int64
gold
required

The value for a Gold tournament.

integer format: int64
ranked
required

The value for a ranked game.

integer format: int64
silver
required

The value for a Silver tournament.

integer format: int64
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
fusion_mint
required

Whether a fusion makes a new card (POST /api/fusion/prepare) or draws one from the fusion pool as before.

object
live
required

Whether a fusion makes a new card now: the players contract has the new fusion and its live time has passed.

boolean
live_from

The players contract’s live time of the new fusion (RFC 3339, UTC); null while the contract has none.

string | null
paused
required

No fusion can be made now: the players contract speaks another fusion version than the server and its live time has passed, so it refuses a fusion of the pool and the server cannot sign a new card. live is false and live_from null meanwhile. It ends once both speak the same version.

boolean
google_login_enabled
required

true when the login offers “Continue with Google” (a wallet kept by Para, getpara.com). Off by default.

boolean
google_login_preview
required

true when “Continue with Google” is in preview: FoxLeague is trying it out and players do not see it. google_login_enabled stays false then. Off by default.

boolean
guest_explore_enabled
required

true when a visitor without a wallet may browse the public pages: tournaments, 1v1 challenges, marketplace listings, the leaderboard and the matches on air. Every join, buy, bid or create still needs the wallet connect. Off by default.

boolean
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
organizer_fees
required

The private tournament fee and the calendar deposit.

object
calendar_deposit_grace_minutes
required

Minutes after the create during which a cancel returns the deposit. A tournament whose create the chain confirmed late, less than this before its registration deadline, returns the whole payment when too few teams join.

integer format: int64
calendar_deposit_min_foxsy
required

The lowest deposit, in FOXSY.

integer format: int64
calendar_deposit_per_match_foxsy
required

FOXSY of deposit per scheduled game.

integer format: int64
live
required

Whether the organizer fees apply now.

boolean
live_from

When they apply (RFC 3339, UTC); null while the switch is off.

string | null
private_match_fee_foxsy
required

FOXSY per scheduled game of a private tournament.

integer format: int64
player_interest
required

“I’m interested in this player”: the switch and its two limits.

object
enabled
required

true when a manager can show interest in another team’s player. Off by default.

boolean
per_day
required

How many interests one manager can send in a UTC day.

integer format: int64
repeat_days
required

Days before the same manager can show interest in the same card to the same owner again.

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
private_tournament_prize_split
One of:

How a tournament’s prize pool is split, in percent.

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
ramp_enabled
required

true when the app offers Buy EGLD with card or bank: Ramp Network opens over the game with the player’s own wallet address and EGLD on MultiversX. The player pays Ramp directly; Ramp runs the payment and its identity check. Off by default; while it is false the card and bank buttons read coming soon.

boolean
ramp_preview
required

true when Buy EGLD with card or bank is in preview: FoxLeague is trying it out and players do not see it. ramp_enabled stays false then. Off by default.

boolean
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
challenge_authorization_ttl_seconds
required

How long a signed challenge authorization can be paid, in chain seconds, from the moment it is issued.

integer format: int64
challenge_create_and_join
required

Whether a paid 1v1 challenge is created with the creator’s one signed createAndJoin transaction: true means ask POST /api/tournaments/challenges/authorize first and pay with the signed terms; false means create it with POST /api/tournaments and pay the entry fee with a second transaction.

boolean
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 Champions FoxLeague: 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 Champions FoxLeague tournament’s snapshot date and its registration deadline (5760 is 4 days).

integer format: int64
leave_lock_live
required

true once a team may leave a tournament only if it keeps its min_teams. Its creator can then no longer delete a tournament that reached it.

boolean
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
one_v_one_unseated_cancel_minutes
required

Minutes after the challenge opened at which a paid 1v1 challenge that nobody holds a seat in is cancelled automatically, when the contract holds no entry fee for it (a fee in the contract gets its payer the seat instead). An entry fee that reaches the contract after the cancel is refunded.

integer format: int64
standard_create_and_join
required

Whether a paid standard tournament you play in is created with your one signed createAndJoin transaction: true means ask POST /api/tournaments/challenges/authorize first and pay with the signed terms; false means create it with POST /api/tournaments and pay the entry fee with a second transaction. Its own switch: challenge_create_and_join answers for 1v1 challenges.

boolean
standard_create_and_join_min_deadline_seconds
required

The least a paid standard tournament’s registration deadline may be ahead, in seconds, when POST /api/tournaments/challenges/authorize is asked for it: the authorization window, the chain’s finality margin and two intervals of the check that opens a paid tournament whose confirmation never arrived (about 13 minutes by default). A closer deadline is refused.

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
bronze_max
required

The highest entry fee of a paid Bronze tournament, in whole FOXSY. The create caps it one under silver_min.

integer format: int64
bronze_min
required

The lowest entry fee of a paid Bronze tournament, in whole FOXSY. It applies once the competition levels govern.

integer format: int64
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_settle_interval_ms": 60000,
"auction_settle_past_end_margin_seconds": 15,
"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": 48,
"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": 72000,
"fusion_cooldown_waiver_floor_seconds": 259200,
"fusion_cooldown_waiver_price_per_day": 75,
"fusion_cooldown_waiver_price_per_day_wei": "75000000000000000000",
"fusion_costs_foxsy": [
100,
200,
400,
800
],
"fusion_match_waiver_floor": 5,
"fusion_match_waiver_price_per_match": 20,
"fusion_match_waiver_price_per_match_wei": "20000000000000000000",
"fusion_min_matches": 20,
"google_login_enabled": false,
"google_login_preview": false,
"guest_explore_enabled": false,
"league_thresholds": {
"diamond_min": 2700,
"gold_min": 1600,
"platinum_min": 2000,
"silver_min": 1300
},
"level_xp_divisor": 200,
"marketplace_fee_percent": 10,
"marketplace_min_list_price_foxsy": 500,
"min_field_condition": 30,
"nft_bypass_threshold": 18,
"one_v_one_prize_split": {
"platform_fee_percent": 10,
"winner_percent": 90
},
"prematch_slide_durations_ms": {
"away_team": 10000,
"head_to_head": 10000,
"home_team": 10000,
"intro": 10000
},
"ramp_enabled": false,
"ramp_preview": false,
"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": [
"erd1jnc2mkcn0l3gnn5p3ft93re5sh3u8lgqpql3mssezls0e26mxrjqdyy6z7",
"erd1dykjj7pvq8206tnaacakuk0fqz22qlczyqrxmjdpmqlf0egg8wysm2cyun",
"erd1kgcksck36kt8d6fc0zp9dzlt04lpmufxfu8j9mujvu8zr4fzs0rqgnqxmn"
],
"relayer_max_gas_limit": 12500000,
"relayer_v3_enabled": true,
"relays_remaining_today": 4870,
"shop_prices_foxsy": {
"condition": 100,
"training": 20,
"xp_booster": 2000
},
"sync_cost_foxsy": 10,
"tournament_defaults": {
"challenge_authorization_ttl_seconds": 600,
"challenge_create_and_join": false,
"standard_create_and_join": false,
"standard_create_and_join_min_deadline_seconds": 780,
"deadline_grace_minutes": 30,
"groups_knockout_group_size": 4,
"knockout_min_participants": 2,
"league_knockout_enabled": false,
"leave_lock_live": 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,
"one_v_one_unseated_cancel_minutes": 20,
"swiss_min_participants": 3
},
"tournament_fee_bounds": {
"gold_min": 5000,
"silver_max": 5000,
"silver_min": 1000,
"bronze_max": 999,
"bronze_min": 100
},
"tournament_prize_split": {
"platform_fee_percent": 10,
"runner_up_percent": 30,
"third_percent": 15,
"winner_percent": 45
},
"training_defaults": {
"xp_threshold_per_level": 2000
},
"transfer_cooldown_hours": 504,
"transfer_cooldown_hours_unplayed": 1512,
"tx_signature_check_mode": "log",
"competition_levels": {
"competitive_daily_cap": 3,
"elo_k": {
"bronze": 9,
"gold": 17,
"ranked": 5,
"silver": 13
},
"live": false,
"live_from": "2026-11-09T14:00:00Z",
"private_bronze_earns": true,
"ranked_ticket_price_foxsy": 25,
"xp_factor_pct": {
"bronze": 50,
"gold": 100,
"ranked": 25,
"silver": 75
}
},
"card_bans": {
"live": false,
"live_from": "2026-11-13T14:00:00Z",
"yellow_cards_per_ban": 3,
"injury_chance_bp_full_condition": 100,
"injury_chance_bp_condition_floor": 300,
"injury_days_out": [
3,
9,
27
]
},
"fusion_mint": {
"live": false,
"live_from": "2026-11-20T14:00:00Z",
"paused": false
},
"organizer_fees": {
"live": false,
"live_from": null,
"private_match_fee_foxsy": 0,
"calendar_deposit_per_match_foxsy": 25,
"calendar_deposit_min_foxsy": 0,
"calendar_deposit_grace_minutes": 60
},
"private_tournament_prize_split": {
"platform_fee_percent": 20,
"runner_up_percent": 25,
"third_percent": 15,
"winner_percent": 40
},
"player_interest": {
"enabled": false,
"per_day": 5,
"repeat_days": 7
}
}