Appearance
Rejection Reason Codes
When FAST rejects a bet via POST /v1/bets/validate or POST /v1/bets (sync mode), the response includes one or more reason codes in the reasonCodes array. A single bet can trigger multiple rejection reasons simultaneously.
Codes
| Code | Description | Example Trigger |
|---|---|---|
min_stake_not_met | Stake is below the 1 EUR minimum. Applies to every ruleset. | Bet stake is 0.50 EUR. |
max_stake_exceeded | Stake exceeds the maximum allowed percentage of the user's balance. On a funded account the percentage is always of the lower of the starting balance and the current balance (less the stake of open bets), so a winning run does not raise the limit and a losing one lowers it. | Ruleset max stake is 10%. User balance is 50 EUR. Bet stake is 6 EUR (12%). Funded, 10% on a 5,000 EUR account: 500 EUR at 5,000 and at 7,000, 380 EUR at 3,800. |
odds_limit_exceeded | Odds are above the maximum allowed. | Ruleset max odds is 5.0. Bet odds are 7.5. |
min_odds_not_met | Odds are below the minimum required. | Ruleset min odds is 1.5. Bet odds are 1.2. |
max_payout_exceeded | Potential payout exceeds the maximum payout multiplier limit. | Ruleset max payout multiplier is 10x. Stake is 5 EUR at odds 12.0 (60 EUR payout, 12x multiplier). |
max_selections_exceeded | Accumulator bet has too many selections. | Ruleset max accumulator selections is 5. Bet has 6 selections. |
max_win_exceeded | Potential win exceeds the absolute EUR cap per ticket. | Ruleset max win per ticket is 500 EUR. Bet at 10 EUR stake with odds 60.0 would win 590 EUR. |
lucky_bet_profit_limit | Single-bet profit exceeds the lucky bet profit percentage of the challenge target. | Ruleset lucky bet profit limit is 50% of target. Target is 100 EUR. Bet would profit 55 EUR (55%). |
max_drawdown_exceeded | Total cumulative loss has reached the maximum drawdown limit. Challenge fails or funded account is revoked. | Ruleset max drawdown is 100%. User started at 50 EUR, balance is 0 EUR. |
daily_drawdown_exceeded | Daily loss has reached the session stop limit. A cooldown period is triggered. | Ruleset daily drawdown is 5% of starting balance. User lost 2.60 EUR today on a 50 EUR starting balance (5.2%). |
cooldown_active | User is currently in a cooldown period from a previous daily drawdown breach. | User triggered daily drawdown at 14:00. Cooldown lasts until next calendar day. Bet placed at 16:00. |
payout_pending | A payout request on the funded account is waiting for the operator. The account takes no new bets until the request is executed or rejected. | User requests a 200 EUR payout at 10:00; the operator has not decided yet. Bet placed at 10:05. |
cashout_not_allowed_during_challenge | Cash-out bets are blocked during the challenge phase. Allowed during funded account phase. | User sends a bet with isCashOut: true while in an active challenge. |
Payout conditions on a funded account (below_min_payout, payout_interval, first_payout_deadline, open_bets, ...) are not bet rejection codes: they come back in the reasons of GET /v1/users/:userId/withdrawable and of a refused POST /v1/users/:userId/withdraw. See Withdrawals.
Flagged Settlements
Besides accepted and rejected, a bet event can be stored with status flagged. This is not a validation result on a placed bet: it marks a settlement that contradicts an earlier one for the same externalBetId (won after lost, lost after won, or any settlement after a void).
| Code | Description |
|---|---|
conflicting_settlement | The settlement was recorded without touching the balance, and a reconciliation flag was opened. Resolve it in the backoffice. |
settlement_mismatch | The settlement reports a stake or odds different from the accepted placement, or pays more than the accepted stake at the accepted odds. It was recorded without touching the balance, and a reconciliation flag was opened. Check what your sportsbook sent and resolve it in the backoffice. |
no_accepted_placement | A settlement for a bet FAST did not accept against a challenge or funded account: one it rejected, or one placed before the user had either. It is recorded for the audit trail and changes no balance. Keep sending these; nothing to resolve. |
program_closed | A settlement for a bet FAST accepted on a challenge or funded account that has closed since, most often a challenge that passed while the bet was still open. The pass stands without it; the result is recorded under the program that accepted the bet and changes no balance. Keep sending these; nothing to resolve. |
Response Example
json
{
"validationResult": {
"status": "rejected",
"reasonCodes": ["max_stake_exceeded", "odds_limit_exceeded"]
},
"correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}Mapping to User-Friendly Messages
Map reason codes to messages appropriate for your users:
javascript
const messages = {
min_stake_not_met: "Minimum stake is 1 EUR.",
max_stake_exceeded: "Bet amount is too high for your current balance.",
odds_limit_exceeded: "Odds are too high. Maximum allowed odds apply.",
min_odds_not_met: "Odds are too low. Minimum odds apply.",
max_payout_exceeded: "Potential payout exceeds the allowed limit.",
max_selections_exceeded: "Too many selections in accumulator.",
max_win_exceeded: "Potential win exceeds the maximum per ticket.",
lucky_bet_profit_limit: "Potential profit is too high for a single bet.",
max_drawdown_exceeded: "Total loss limit reached.",
daily_drawdown_exceeded: "Daily loss limit reached. Try again tomorrow.",
cooldown_active: "You are in a cooldown period. Try again later.",
payout_pending: "Your payout is being processed. Betting resumes once it is complete.",
cashout_not_allowed_during_challenge: "Cash-out is not allowed during challenges."
};