Skip to content

Error Codes ​

All FAST API error responses use a consistent format with machine-readable error codes, human-readable messages, and a correlation ID for tracing.

Response Format ​

json
{
  "error": "error_code",
  "message": "Human-readable description",
  "correlationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

HTTP Status Codes ​

StatusError CodeDescription
400validation_errorRequest body is missing required fields or contains invalid values.
400missing_idempotency_keyWithdrawal or stake refund sent without the required X-Idempotency-Key header.
401unauthorizedAPI key is missing, invalid, or expired. JWT token is missing or expired.
402purchase_declined, withdrawal_declined, cancel_declinedYour approval URL declined the action.
403approval_requiredA widget-initiated purchase, withdrawal, refund or cancel on a production tenant with no approval URL configured.
404not_foundRequested resource does not exist (user, challenge, funded account).
409Specific codeBusiness rule conflict, e.g. active_challenge_exists, tier_disabled. See below.
422mapping_errorAdapter mapping failed to translate the incoming payload. Check mapping configuration.
429rate_limitedRequest rate exceeded a limit (endpoint category, or 30 bet events per user per minute).
429purchase_cooldownPurchase attempted before midnight UTC after a failed or cancelled challenge.
500internal_errorUnexpected server error. Include the correlationId when contacting support.
503maintenance_modeFAST is in maintenance mode. Write operations are blocked. Read operations continue.
503service_unavailableIdempotency store unavailable on a withdrawal or stake refund. Retry with the same key.

Error Code Strings ​

Error CodeHTTP StatusWhen It Occurs
validation_error400Missing userId, invalid challengeTierId, malformed JSON, invalid date format.
unauthorized401No X-API-Key header, invalid key hash, expired JWT, missing X-Super-Admin-Key.
missing_idempotency_key400POST /v1/users/:userId/withdraw, /challenge/refund-stake or /funded/refund-stake without X-Idempotency-Key.
insufficient_withdrawable_balance400Withdrawal grossAmount exceeds what can be taken now (payout.withdrawableGross).
invalid_amount400Withdrawal amount that rounds to 0 cents.
below_min_payout400Withdrawal share below the tier's fundedMinPayout.
payout_interval400Withdrawal before the tier's gap after the previous executed payout has passed.
max_payouts_reached400Withdrawal on an account that has used every payout it allows.
first_payout_deadline400First withdrawal after the tier's fundedFirstPayoutDays deadline. The account is ended shortly after with funded_account.revoked.
no_profit400Withdrawal with the virtual balance not above the funded amount.
open_bets400 / 409The account's last payout before every open bet has settled (400 on the request, 409 on confirm).
payout_pending400Withdrawal while another request waits for the operator's decision.
payout_amount_changed409Confirming a last payout whose amount changed since the request; it has been updated, confirm again.
confirmation_required400Stake refund or cancellation sent without "confirm": true.
approval_required403Widget money action on a production tenant with no approval URL.
not_found404User has no active challenge or funded account. Requested resource ID does not exist.
no_pending_choice404Continue or refund-stake when no challenge is awaiting the choice.
active_challenge_exists409POST /v1/challenges/purchase when the user already has an active challenge.
challenge_awaiting_choice409Purchase while a passed challenge awaits continue/refund.
active_funded_account_exists409Purchase while the user has an active funded account.
tier_not_found / tier_disabled409Purchase of a missing or disabled tier.
idempotency_conflict409An X-Idempotency-Key reused with a different body.
purchase_cooldown429Purchase before midnight UTC after a failed or cancelled challenge. Response includes cooldownUntil.
mapping_error422Adapter mapping cannot extract required fields from the bet payload.
rate_limited429Per-minute request limit exceeded for the endpoint category, or more than 30 bet events for one user in a minute.
internal_error500Unhandled exception in the API. Database connection failure. Queue processing error.
maintenance_mode503Super admin activated maintenance mode. All write endpoints return this until maintenance is lifted.

Rate Limit Error ​

The endpoint-category 429 response includes additional fields (the per-user bet limit returns only error, message and correlationId, with no Retry-After):

json
{
  "error": "rate_limited",
  "message": "Too many requests. Limit: 500/min for this endpoint.",
  "retryAfter": 42,
  "correlationId": "uuid"
}

Headers:

Retry-After: 42
X-RateLimit-Limit: 500
X-RateLimit-Remaining: 0
X-RateLimit-Reset: 1706000042

Correlation ID ​

Every response includes a correlationId. This ID is consistent across the request lifecycle - it appears in FAST's server logs, webhook deliveries, and error responses. Always log it for debugging and include it in support requests.

BLACKLINE CONSULTING d.o.o.