Skip to content

Shop prices and your quotas

GET
/api/shop/status
curl --request GET \
--url 'https://foxleague.ai/api/shop/status?wallet_address=example' \
--header 'Authorization: Bearer <token>'

The shop card for the signed-in wallet: prices in whole FOXSY, your XP booster, your training quota and the Common pack’s price, weekly cap and availability.

Who: a signed-in player, for their own wallet.

Refusals:

  • Wallet mismatch: sign with the correct wallet: wallet_address is not the session wallet.
wallet_address
required
string

Your wallet; it must be the session 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
common_pack_available
required

true when the Common pack is on sale: price and weekly cap above 0, at least 5 Common players free in the pool and at least 5 left in the contract’s pack budget window.

boolean
common_pack_bought_this_week
required

Common packs you bought in the last 7 days.

integer format: int64
common_pack_epoch_remaining
required

Common players left in the contract’s current pack budget window (the field keeps its name).

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 (5 players), whole FOXSY.

integer format: int64
common_pack_remaining_this_week
required

Common packs you may still buy in the current 7 days.

integer format: int64
cooldown_waiver_floor_hours
required

The part of a transfer lock that cannot be waived, in hours.

integer format: int32
foxsy_balance

Not sent. Read your FOXSY balance from your wallet on chain.

integer | null format: int64
prices
required

Product prices.

object
condition_recovery
required

Price of a full recovery (0 to 100) of one player; you pay for the missing points, rounded up.

integer format: int64
training_slot
required

Price of one training slot.

integer format: int64
xp_booster
required

Price of one XP booster.

integer format: int64
training
required

Your training allowance.

object
daily_free
required

Free trainings per day.

integer format: int64
premium_cap
required

Extra trainings per day on top of the free ones, paid from banked slots.

integer format: int64
premium_used_today
required

Training slot purchases verified in the last 24 hours, for display only.

integer format: int64
slots_banked
required

Training slots you bought and have not used; they do not expire.

integer format: int64
used_today
required

Trainings since the last daily reset.

integer format: int64
xp_booster_active
required

true while your XP booster runs.

boolean
xp_booster_duration_hours
required

How long a booster lasts, in hours.

integer format: int32
xp_booster_expires_at

When your booster ends (RFC 3339); null when none runs.

string | null
xp_booster_multiplier_pct
required

The booster’s XP multiplier in percent: 200 means 2x.

integer format: int32
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": {
"common_pack_available": true,
"common_pack_bought_this_week": 1,
"common_pack_epoch_remaining": 340,
"common_pack_per_wallet_per_week": 2,
"common_pack_price_foxsy": 2500,
"common_pack_remaining_this_week": 1,
"cooldown_waiver_floor_hours": 72,
"prices": {
"condition_recovery": 100,
"training_slot": 20,
"xp_booster": 250
},
"training": {
"daily_free": 5,
"premium_cap": 12,
"premium_used_today": 0,
"slots_banked": 10,
"used_today": 3
},
"xp_booster_active": true,
"xp_booster_duration_hours": 24,
"xp_booster_expires_at": "2026-10-02T08:40:00+00:00",
"xp_booster_multiplier_pct": 200
},
"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