Error response format
ABP returns errors in two shapes, depending on where the error originates:-
Auth / rate-limit middleware errors use an
errorkey: -
Application / route errors (validation, not-found, etc.) use the FastAPI-standard
detailkey:
422) include field-level detail with a loc path:
HTTP status codes
| Status | Description |
|---|---|
200 | Success |
201 | Resource created |
204 | Resource deleted (no content) |
400 | Bad request — invalid or missing parameters |
401 | Unauthorized — invalid or inactive API key |
403 | Forbidden — missing API key header, or resource belongs to a different client |
404 | Not found — resource does not exist |
409 | Conflict — every order in the request is a duplicate (see below) |
422 | Validation error — request body failed validation |
429 | Rate limited — exceeded requests per second |
500 | Internal server error |
501 | Not implemented — futures markets (futureId) are not yet supported |
503 | Service unavailable — database or dependency down |
Order decline reasons
When placing orders viaPOST /place-orders, orders that fail business validation are returned in the declinedOrders array (not as HTTP errors). Each declined order includes a declineReason:
| Decline reason | Description |
|---|---|
| Stake exceeds limit | orderStake is higher than the available bookmaker limit |
| Stake below minimum | orderStake is below the bookmaker’s or account’s minimum |
| Invalid odds | orderPrice is not available or the market is suspended |
| No active accounts | No active bookmaker accounts available for this market |
| Currency conversion failed | Could not convert between order currency and bookmaker currency |
| Bookmaker not available | Specified bookmaker doesn’t have odds for this fixture/outcome |
| Odds temporarily unavailable | Odds could not be fetched in time; retry |
Duplicate
requestUuids are not returned as decline reasons. A duplicate is silently skipped; if every order in the request is a duplicate, the request returns 409 instead (see below).Common errors
Authentication (401 / 403)
Forbidden (403)
Returned when the API key header is missing, when the key is not allowed for the requested endpoint/sport/bookmaker, or when you attempt to access a resource that belongs to a different client.Duplicate request (409)
Returned only when every order in the request is a duplicate — eachrequestUuid was already processed or is in progress within the last 30 minutes. If only some orders are duplicates, those are skipped and the rest are processed normally.
Validation error (422)
Request body contains invalid data. Check theloc field for the problematic path:
Rate limiting (429)
Exceeded requests per second for your client. Default limit: 100/second (configurable per client).retry_after interval before retrying.
Resilience patterns
ABP implements several resilience mechanisms that may affect your integration:Circuit breakers
Per-bookmaker circuit breakers prevent cascading failures. If a bookmaker is experiencing issues, orders targeting that bookmaker may be declined until the circuit recovers. Opens after consecutive failures, automatically tests recovery, and resumes normal operation once the bookmaker responds successfully.Emergency mode
In rare cases, the system may temporarily pause order processing during maintenance or upstream issues. Theemergency WebSocket channel broadcasts status changes.
Order expiry
Orders have a defaultexpiresAt of 5 seconds from creation (capped at 24 hours maximum). If a bet hasn’t been placed within this window, the order status changes to EXPIRED. Set a custom expiresAt for longer-lived orders.
Next steps
Order Placement
Understand fills, partial stakes, and decline reasons.
WebSocket
Track order and bet status in real time.