Appearance
User Progress
Query the current state of a user's challenge or funded account. Use this to build progress displays in your sportsbook UI.
Endpoint
GET /v1/users/:userId/progressbash
curl -H "X-API-Key: your-api-key" \
https://api.fundedfast.eu/v1/users/user-001/progressResponse Types
The response type field indicates the user's current state: challenge, challenge_passed, funded_account, or none.
Challenge Response
json
{
"type": "challenge",
"challengeId": "uuid",
"currentBalance": 72.50,
"targetBalance": 100.00,
"startingBalance": 50.00,
"daysElapsed": 8,
"daysRemaining": 12,
"activeDays": 6,
"totalBetsPlaced": 34,
"totalBetsAccepted": 31,
"totalBetsRejected": 3,
"minBetsRequired": 10,
"minActiveDays": 5,
"status": "active",
"cooldownUntil": null,
"reserved": 10.00,
"currency": "EUR",
"correlationId": "uuid"
}Challenge Passed Response
When the user reaches the target, the challenge stops in passed_pending_choice and waits for the user to decide. No funded account exists yet.
json
{
"type": "challenge_passed",
"challengeId": "uuid",
"programBalance": 2000.00,
"targetBalance": 2000.00,
"ownStake": 100.00,
"bonusAmount": 900.00,
"refundableOwnStake": 100.00,
"choices": ["continue", "refund"],
"status": "passed_pending_choice",
"currency": "EUR",
"correlationId": "uuid"
}Show the user both choices and call the matching endpoint:
| Choice | Endpoint | Effect |
|---|---|---|
continue | POST /v1/users/:userId/challenge/continue | Creates the funded account and marks the challenge completed. No body, no approval. |
refund | POST /v1/users/:userId/challenge/refund-stake | Ends the challenge as refunded and voids the bonus. Body {"confirm": true} and an X-Idempotency-Key header are required. FAST sends challenge.stake_refunded and challenge.bonus_voided; you pay refundableOwnStake back to the user. |
Both return 404 no_pending_choice if the challenge is not awaiting a choice. The user cannot buy a new challenge until this one is resolved.
Funded Account Response
json
{
"type": "funded_account",
"fundedAccountId": "uuid",
"currentBalance": 5250.00,
"fundedAmount": 5000.00,
"ownStake": 100.00,
"nonWithdrawableBonus": 900.00,
"refundableOwnStake": 0,
"stakeRefundable": false,
"earnedProfit": 200.00,
"withdrawableProfit": 200.00,
"rawProfit": 250.00,
"isWithdrawable": true,
"profitSplitPercent": 80,
"payoutCapPercent": null,
"totalPayoutCap": null,
"payoutCount": 0,
"totalWithdrawn": 0,
"maxPayouts": null,
"firstPayoutDeadlineAt": "2026-11-14T10:00:00.000Z",
"status": "active",
"reserved": 25.00,
"openStake": 25.00,
"currency": "EUR",
"payout": { "...": "the payout state, as in GET /withdrawable" },
"correlationId": "uuid"
}On a funded account rawProfit is the ledger balance above the funded amount and earnedProfit the user's split of it. What a payout can actually take is measured on the virtual balance (ledger less open stake) and is in payout, the same payout state GET /v1/users/:userId/withdrawable returns: withdrawableProfit is its withdrawableNow (the user's share a request may ask for now) and isWithdrawable its canRequest. firstPayoutDeadlineAt is the date by which the first payout must be requested, or the account ends; null with no deadline or once a payout has executed. See Withdrawals.
No Active Record
json
{
"type": "none",
"message": "No active challenge or funded account",
"correlationId": "uuid"
}The reserved Field
The reserved field represents the total stake amount in accepted but unsettled bets. This is money currently at risk in pending bets.
Use it to show the user their effective available balance:
Available balance = currentBalance - reservedDisplay example:
Balance: 72.50 EUR
Pending bets: 10.00 EUR
Available: 62.50 EURKey Fields
| Field | Description |
|---|---|
currentBalance | Current shadow ledger balance |
targetBalance | Balance required to complete the challenge |
daysRemaining | Calendar days until challenge expires |
activeDays | Days with qualifying bet activity |
totalBetsAccepted | Total accepted bets placed during this challenge |
minBetsRequired | Minimum accepted bets needed to complete the challenge |
minActiveDays | Minimum active days needed to complete the challenge |
cooldownUntil | ISO 8601 timestamp if user is in cooldown, null otherwise |
reserved | Stake locked in unsettled bets |
isWithdrawable | Whether the funded account user can request a payout now |
withdrawableProfit | Funded: the user's share a payout request may ask for now (0 while anything blocks) |
firstPayoutDeadlineAt | Funded: request the first payout by then or the account ends |
profitSplitPercent | User's share of profit on withdrawal (e.g., 80) |
User History
Fetch all past challenges and funded accounts:
bash
curl -H "X-API-Key: your-api-key" \
https://api.fundedfast.eu/v1/users/user-001/historyUser Ruleset
Fetch the active ruleset to display bet limits in your UI:
bash
curl -H "X-API-Key: your-api-key" \
https://api.fundedfast.eu/v1/users/user-001/ruleset