Skip to main content

Error response format

All API errors return a JSON body:
{
  "detail": {"message": "Invalid API key", "code": "UNAUTHORIZED"}
}
Validation errors include field-level detail:
{
  "detail": [
    {
      "loc": ["body", "orders", 0, "orderStake"],
      "msg": "Input should be greater than 0",
      "type": "greater_than"
    }
  ]
}

HTTP status codes

StatusDescription
200Success
201Resource created
204Resource deleted (no content)
400Bad request — invalid parameters
401Unauthorized — missing or invalid API key
403Forbidden — API key inactive/expired, or resource belongs to a different client
404Not found — resource does not exist
409Conflict — duplicate requestUuid already in-flight
422Validation error — request body failed validation
429Rate limited — exceeded requests per minute
500Internal server error
503Service unavailable — database or dependency down

Order decline reasons

When placing orders via POST /place-orders, orders that fail business validation are returned in the declinedOrders array (not as HTTP errors). Each declined order includes a declineReason:
Decline reasonDescription
Stake exceeds limitorderStake is higher than the available bookmaker limit
Stake below minimumorderStake is below the bookmaker’s or account’s minimum
Invalid oddsorderPrice is not available or market is suspended
No active accountsNo active bookmaker accounts available for this market
Currency conversion failedCould not convert between order currency and bookmaker currency
Bookmaker not availableSpecified bookmaker doesn’t have odds for this fixture/outcome
Duplicate requestUuidThis requestUuid is already in-flight (5-minute dedup window)
Example declined order response:
{
  "status": "declined",
  "acceptedOrders": [],
  "declinedOrders": [
    {
      "requestUuid": "fb5f2dd9-c855-4ba9-8ef9-4c2278ca2f1d",
      "fixtureId": "id1000000861624412",
      "outcomeId": 161,
      "declineReason": "Order stake 15000.00 USD exceeds available limit 5000.00 USD"
    }
  ]
}

Common errors

Authentication (401)

Missing or invalid API key.
# Missing header → 401 {"detail": {"message": "Missing X-API-Key header", "code": "UNAUTHORIZED"}}
curl https://v2.55-tech.com/accounts

# Invalid key → 401 {"detail": {"message": "Invalid API key", "code": "UNAUTHORIZED"}}
curl -H "X-API-Key: wrong-key" https://v2.55-tech.com/accounts

Forbidden (403)

Returned in two cases:
  • Inactive or expired API key — your key exists but is disabled or past its expiry date
  • Wrong client — attempting to access a resource that belongs to a different client
{"detail": {"message": "API key is inactive", "code": "FORBIDDEN"}}
{"detail": {"message": "API key has expired", "code": "FORBIDDEN"}}
{"detail": {"message": "Access denied to this order", "code": "FORBIDDEN"}}

Duplicate request (409)

The requestUuid was already used within the last 5 minutes.
{"detail": "Duplicate request - requestUuid already in-flight"}

Validation error (422)

Request body contains invalid data. Check the loc field for the problematic path:
{
  "detail": [
    {
      "loc": ["body", "orders", 0, "fixtureId"],
      "msg": "Field required",
      "type": "missing"
    }
  ]
}

Rate limiting (429)

Exceeded requests per minute for your API key. Default limit: 60/min.
{"detail": "Rate limit exceeded"}
Implement exponential backoff: wait 1s, 2s, 4s, etc. 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. The emergency WebSocket channel broadcasts status changes.

Order expiry

Orders have a default expiresAt of 5 seconds from creation. If a bet hasn’t been placed within this window, the order status changes to EXPIRED. Set a custom expiresAt for longer-lived orders.