Two currencies, always
For any bet there are only ever two currencies in play:- Account currency — the currency of the bookmaker account (
accounts.currencyId). Everything the bookmaker actually touches is in this currency: the placed stake, the balance, the settlement payout. - Order currency — what you express the order in (
orderCurrency, defaultUSD). Everything on the order is in this currency.
Which field is in which currency
| Object | Field | Currency |
|---|---|---|
| Order | orderStake, filledStake, remainingStake | order currency (orderCurrency) |
| Bet | placedStake, settlementAmount | account currency (placedCurrency) |
| Account | balance, credit | account currency (currencyId) |
orderStake, filledStake, and remainingStake are always in the same currency and directly comparable. On a bet, placedCurrency always equals the account’s currencyId.
Exchange rates: currencyValue
Rates live on the currencies channel/table. The convention is:
currencyValue is units of that currency per 1 USD. USD itself has currencyValue = 1. To convert between currencies A and B:
currencyValue:
currencyInfo on reads
GET /orders, GET /bets, and GET /accounts enrich each row with a currencyInfo object so you can compute USD without a second lookup:
- On an order,
currencyInfodescribes itsorderCurrency. - On a bet,
currencyInfodescribes itsplacedCurrency. - On an account,
currencyInfodescribes itscurrencyId(so you can convertbalance/creditto USD).
updatedAt is the ISO 8601 timestamp of the rate snapshot. currencyInfo is nullable — it is null when no exchange rate is available for that currency. The stored placedStake / placedCurrency are never rewritten — currencyInfo is additive, for display/conversion only.
Worked example
OrderorderStake = 100, orderCurrency = USD, filled on a Betfair EUR account where 1 USD ≈ 0.92 EUR:
bets.placedStake = 92,placedCurrency = EUR(what was sent to Betfair).- Converted back:
92 EUR ÷ 0.92 = 100 USD. orders.filledStake = 100,remainingStake = 0, statusFILLED.
Betslip limits: native + USD
GET /betslip (and the betslip WebSocket payload) returns both the native limit and a USD equivalent for every bookmaker, so you can compare across accounts in different currencies:
limit/limitMinare inlimitCurrency(the account currency).limitUsd/limitMinUsdare the same values normalized to USD.
Stake-limit cascade
The effective min/max stake for a placement is resolved in priority order (first non-null wins):Where conversion does NOT happen
- Balances & credits (
accounts.balance,accounts.credit) are reported raw in the account’s native currency — there is no USD-normalized balance. - Settlement amounts (
bets.settlementAmount) come straight from the bookmaker in native (account) currency.
Next steps
Order Placement
How modes, pricing, and limits drive fills.
Errors
Handle decline reasons and error responses.