ABP is built for production trading. Per-bookmaker circuit breakers, automatic retries, and a two-tier emergency system keep a single failing bookmaker from cascading into a wider outage. This page explains the behaviours that can affect your integration and how to respond to them.
System status
Status & uptime
Live system status is exposed at
GET /status (unauthenticated). Poll it for health, or subscribe to the status and emergency WebSocket channels for push notifications.Rate limits
Rate limits are enforced per client (resolved from yourx-api-key) using a sliding window. The default is 100 requests per second and is configurable per client via the rps field.
Every throttled response includes standard headers so you can pace your client:
A
429 response body:
retry_after — is all that’s needed. There’s no benefit to exponential backoff for rate limiting; just wait out the window.
POST /place-orders accepts many orders per request), prefer the WebSocket over polling, and request a higher rps via support if your workload needs more headroom. WebSocket connection caps are listed under WebSocket → Connection limits.
Circuit breakers
ABP runs a per-bookmaker circuit breaker. If a bookmaker starts failing, its breaker opens and orders targeting it are declined (Bookmaker not available) instead of hanging.
- Opens after consecutive failures to a bookmaker.
- Half-opens automatically after a cooldown to test recovery.
- Closes and resumes normal routing once the bookmaker responds successfully.
Retry with backoff
Transient bookmaker failures are retried automatically with exponential backoff, and ABP fetches fresh odds before each retry pass. Retries are bounded by your order’sexpiresAt, so a slow bookmaker can never block an order past its expiry.
Order expiry
EXPIRED (or PARTIALLY_FILLED if some stake landed). Set a longer expiresAt for less time-sensitive orders, or a shorter one for tighter price discipline.
Emergency mode (two-tier)
In rare cases — maintenance or an upstream incident — ABP can pause order processing. There are two tiers:
Status changes are broadcast on the
emergency WebSocket channel. When emergency mode is active, POST /place-orders returns a decline rather than queuing work.
Reliable WebSocket delivery
For state you cannot afford to miss (order fills, settlements), enablereliableDelivery: true at login to get at-least-once delivery with acknowledgments and replay. A seq gap signals a missed message; recover via replay or reconcile through GET /orders / GET /bets. See WebSocket.
Your responsibilities
To stay resilient on the client side:- Treat declines as normal flow — handle
declinedOrdersand decline reasons rather than assuming every order fills. - Reconcile on reconnect — after a WebSocket drop, replay from your last
seqor re-query the REST endpoints. - Honour idempotency — reuse the same
requestUuidon retries so reconnect storms can’t double-stake. See Core Concepts. - Back off on 429 — see Rate limits above.
Support & incidents
When reporting an incident, include the affected
orderId / requestUuid, the bookmaker slug, and a UTC timestamp — it dramatically speeds up diagnosis.
Next steps
WebSocket
Real-time updates with reliable delivery and replay.
Errors
Status codes and decline reasons.