- Understanding Market Navigation
- Betfair Price Increments
- Common Error Codes
- Currency Parameters
- Locale Specification
- CompetitionId & Event Mapping Data
- CompetitionIds - Soccer Markets
- SelectionId's - Soccer Markets
- MarketType & Market Name Mappings
- Racecourse Abbreviations
- Runner Metadata Description
- Time Zones & Time Format
- Virtual Bets
- Account Statement - Resettlement Lifecycle
- Regulator Codes
- EventTypeIds List
Understanding Market Navigation
Recreating Website Navigation?
Please note: if you want to recreate the exact navigation hierarchy used by the Betfair website, please use the Navigation Data for Applications service.
In the Betfair Exchange API, navigating markets uses the concepts of faceted search. You've probably seen faceted search used on sites like eBay or Amazon where you pick a category, for example, "Shoes" and then you see a list of shoes. Then, you can narrow your search by facets. For example, by colour or price. In a similar way, Betting API lets you find markets you're interested in and then get data back about a facet of those markets.
Using the set of navigation operations, you can easily create a menu tree of markets in whatever hierarchy you want. You can listEventTypes to get the Sports as the top of your menu. Or, you could call "listCountries" and use markets in a country as the root of the tree.
There is also listMarketCatalogue so if you didn't care about creating a visual navigation, you could simply call listMarketCatalogue with a MarketFilter defining the markets you're interested in and get back information about those markets.
Betfair Price Increments
Below is a list of price increments per price 'group'. Placing a bet outside of these increments will result in an INVALID_ODDS error.
The Betfair Price increment used for a market is defined by the PriceLadderType returned within the Market Description (listMarketCatalogue / Market Definition (Exchange Stream API).
CLASSIC
Price | Increment |
---|---|
1.01 → 2 | 0.01 |
2→ 3 | 0.02 |
3 → 4 | 0.05 |
4 → 6 | 0.1 |
6 → 10 | 0.2 |
10 → 20 | 0.5 |
20 → 30 | 1 |
30 → 50 | 2 |
50 → 100 | 5 |
100 → 1000 | 10 |
FINEST
Price | Increment |
---|---|
1.01 → 1000 | 0.01 |
LINE_RANGE
Price | Increment (Interval) |
---|---|
0.1 → 1000 | Specified by Market Line Range Info |
Common Error Codes
Meaning | FaultCode | Client/Server | Associated HTTP Transport Response Code | Comments |
DSC-0008 | JSONDeserialisationParseFailure | Client | 400 | |
DSC-0009 | ClassConversionFailure | Client | 400 | Invalid format for the parameter, for example, passing a string where a number was expected. Can also happen when a value is passed that does not match any valid enum. |
DSC-0015 | SecurityException | Client | 403 | The credentials supplied in the request were invalid |
DSC-0018 | MandatoryNotDefined | Client | 400 | A parameter marked as mandatory was not provided |
DSC-0019 | Timeout | Server | 504 | The request has timed out |
DSC-0021 | NoSuchOperation | Client | 404 | The operation specified does not exist |
DSC-0023 | NoSuchService | Client | 404 | |
DSC-0024 | RescriptDeserialisationFailure | Client | 400 | Exception during deserialization of RESCRIPT request |
DSC-0034 | UnknownCaller | Client | 400 | A valid and active App Key hasn't been provided in the request. Please check that your App Key is active. Please see Application Keys for further information regarding App Keys. |
DSC-0035 | UnrecognisedCredentials | Client | 400 | |
DSC-0036 | InvalidCredentials | Client | 400 | |
DSC-0037 | SubscriptionRequired | Client | 403 | The user is not subscribed to the App Key provided |
DSC-0038 | OperationForbidden | Client | 403 | The App Key sent with the request is not permitted to access the operation |
Currency Parameters
Guide to available currencies and minimum bet sizes.
Minimum BSP Liability - relates to LIMIT_ON_CLOSE & MARKET_ON_CLOSE Betfair Starting price (BSP) bets.
Minimum Bet Payout - relates to the Ability to place lower minimum stakes at larger prices feature.
Currency name | Symbol | Currency Code | Min Bet Size | Min Deposit Size | Minimum BSP Liability | Minimum Bet Payout |
---|---|---|---|---|---|---|
UK Sterling | £ | GBP | 1 | 10 | 10 | 10 |
Euro | € | EUR | 1 | 15 | 10 | 20 |
US Dollar | US$ | USD | 1 | 15 | 20 | 20 |
Hong Kong Dollars | HK$ | HKD | 10 | 150 | 125 | 125 |
Australian Dollar | AUD | AUD | 1 | 30 | 30 | 30 |
Canadian Dollar | CAD | CAD | 2 | 25 | 30 | 30 |
Danish Kroner | DKK | DKK | 15 | 150 | 150 | 150 |
Norwegian Kronor | NOK | NOK | 10 | 150 | 150 | 150 |
Swedish Krona | SEK | SEK | 15 | 150 | 150 | 150 |
Singapore Dollar | SGD | SGD | 2 | 30 | 30 | 30 |
Romanian Leu | RON | RON | 5 | 25 (Paysafe) 40 (Card) | 50 | 50 |
Brazilian Real | R$ | BRL | 5 | 40 | 50 | 50 |
Mexican Peso | MXN | MXN | 30 | 50 | 300 | 300 |
Nuevo Sol | PEN | PEN | 5 | 50 | 50 | 50 |
Hungary Forint | HUF | HUF | 400 | 25 | 4000 | 4000 |
Iceland Kron | ISK | ISK | 350 | 25 | 1750 | 1750 |
New Zealand Dollars | NZD | NZD | 2 | 25 | 10 | 10 |
Argentine Peso | ARS | ARS | 100 | 50 | 500 | 500 |
Lari | GEL | GEL | 10 | 50 | 50 | 50 |
Locale Specification
The locale specification determines the language returned for names of sports and markets. It is an optional parameter you can specify when you want to retrieve names in a language that differs from the language specified for the account. For example, if the account language is specified as English, you can use the locale parameter to retrieve non-English sports or market names.
The following languages are available, but please be aware not all markets in all languages are fully translated:
Language | Locale Code |
---|---|
English Danish Swedish German Italian Spanish Russia Latam Spanish Romanian Brazilian Portuguese Portuguese Finish Hungarian Norweigan | en da sv de it es ru ES_419 ro pt_br pt fi hu nn |
CompetitionId & Event Mapping Data
A collection of files showing the mapping relationship between an EventId and its Competition.
These files are available from 2018-2022 only for Soccer, Tennis, Cricket, Golf, and Other Sports.
Soccer
Tennis
Cricket
Golf
Other Sports
CompetitionIds - Soccer Markets
The below spreadsheet contains a list of competitionId's for Soccer markets.
SelectionId's - Soccer Markets
The below spreadsheet includes all selection names and their selectionId's used on the Betfair Exchange since 2019.
MarketType & Market Name Mappings
The below spreadsheet shows the possible mapping relationship between market name and marketType across all sports.
Racecourse Abbreviations
Racecourse abbreviations lists for Horse Racing and Greyhounds are available via the spreadsheet below:
Runner Metadata Description
The RUNNER_METADATA returned by listMarketCatalogue for Horse Racing (when available) is described in the table below.
Parameter | Description | Example |
---|---|---|
WEIGHT_UNITS | The unit of weight used. | pounds |
ADJUSTED_RATING | Adjusted ratings are race-specific ratings that reflect weights allocated in the race and, in some circumstances, the age of the horse. Collectively they represent the chance each runner has on form. https://www.timeform.com/Racing/Articles/How_the_ratings_for_a_race_are_calculated Please note: this data is only returned for those with a Premium Timeform subscription | 79 |
DAM_YEAR_BORN | The year the horse’s mother's birth | 1997 |
DAYS_SINCE_LAST_RUN | The number of days since the horse last ran | 66 |
WEARING | Any extra equipment the horse is wearing | tongue strap |
DAMSIRE_YEAR_BORN | The year in which the horse's grandfather was born on its mother's side | 1988 |
SIRE_BRED | The country where the horse's father was bred | IRE |
TRAINER_NAME | The name of the horse's trainer | Fergal O'Brien |
STALL_DRAW | The stall number the horse is starting from | 10 |
SEX_TYPE | The sex of the horse | f |
OWNER_NAME | The owner of the horse | Mr M. C. Fahy |
SIRE_NAME | The name of the horse's father | Revoque |
FORECASTPRICE_NUMERATOR | The forecast price numerator | 13 |
FORECASTPRICE_DENOMINATOR | The forecast price denominator | 8 |
JOCKEY_CLAIM | The reduction in the weight that the horse carries for a particular jockey was applicable. | 5 |
WEIGHT_VALUE | The weight of the horse | 163 |
DAM_NAME | The name of the horse's mother | Rare Gesture |
AGE | The age of the horse | 7 |
COLOUR_TYPE | The colour of the horse | b |
DAMSIRE_BRED | The country where the horse's grandfather was born | IRE |
DAMSIRE_NAME | The name of the horse's grandfather | Shalford |
SIRE_YEAR_BORN | The year the horse's father was born | 1994 |
OFFICIAL_RATING | The horses official rating | 97 |
FORM | The horses recent form | 212246 |
BRED | The country in which the horse was born | IRE |
runnerId | The runnerId for the horse | 62434983 |
JOCKEY_NAME | The name of the jockey. Please note: This field will contain 'Reserve' in the event that the horse has been entered into the market as a reserve runner. Any reserve runners will be withdrawn from the market once it has been confirmed that they will not run. | Paddy Brennan |
DAM_BRED | The country where the horse's mother was born | IRE |
COLOURS_DESCRIPTION | The textual description of the jockey silk | Royal blue and black check, white sleeves and cap |
COLOURS_FILENAME | A relative URL to an image file corresponding to the jockey silk. You must add the value of this field to the base URL: https://content.betfair.com/feeds_images/Horses/SilkColours/ Please note - silk cloth images aren't provided for US Racing. The saddlecloth images used for US racing can be view via https://sn4.cdnbf.net/exchange/plus/images/app/common/assets/images/saddlecloths-sprite_2608_.gif | c20231018wet/00001775.jpg |
CLOTH_NUMBER | The number on the saddle-cloth | 5 |
CLOTH_NUMBER ALPHA | The number on the saddle cloth. For US Racing where the runner is paired, this field will display the cloth number of the paired runner e.g. "1A" | 1A |
Terms of use: Please refer to http://form.timeform.betfair.com/termsofuse regarding the above data.
Time Zones & Time Format
All times are returned in GMT and are in ISO 8601 (http://en.wikipedia.org/wiki/ISO_8601) format. They can be converted to your local timezone using the timezone field returned by the getAccountDetails operation or into the local market timezone using the timezone returned for the event by listMarketCatalogue
To synchronize with the Betfair server time we recommend that you use the pool of NTP servers listed via http://www.pool.ntp.org/zone/europe
The following table lists the time zones returned by the API along with their meaning.
Location | Abbreviation | Notes |
---|---|---|
Africa/Johannesburg | RSA | |
America/Costa_Rica | SJMT | |
America/Indiana/Indianapolis | IEST | North America Indiana East |
America/Santiago | SMT | |
Asia/Bangkok | THAI | |
Asia/Calcutta | INT | |
Asia/Dubai | UAE | |
Australia/Adelaide | ACST | |
Australia/Darwin | ANST | |
Australia/Perth | AWST | |
Australia/Queensland | AQST | |
Australia/Sydney | AEST | |
Brazil/East | BRT | |
Brazil/West | AMT | |
CET | CET | Central European Time |
EET | EET | Eastern European Time |
Etc/GMT-5 | PKT | |
Europe/London | UKT | |
Europe/Moscow | MSK | |
GMT/UTC | GMT/UTC | Greenwich Mean Time/Coordinated Universal Time |
Hongkong | HK | |
Jamaica | KMT | |
Japan | JPT | |
NZ | NZT | New Zealand |
US/Alaska | AKST | |
US/Arizona | AST | |
US/Central | CST | |
US/Eastern | EST | |
US/Hawaii | HST | |
US/Mountain | MST | |
US/Pacific | PST |
Virtual Bets
The Betfair Exchange tries to match bets against the bets placed by other users as well as equivalent bets where possible.
For example, if a customer backs Player A in a tennis match at odds of 2.0, the exchange matches any lay bet at odds of 2.0 or better on Player A. In addition, the Exchange also calculates all possible matches that are equivalent to a lay bet on Player A. So, if a customer backs Player B at odds of 2.0 or better, the Exchange matches it with the back bet on Player A. The Betfair Exchange uses a 'cross matching' algorithm to display the best possible prices (bets) available by taking into account the back and lay offers (unmatched bets) across all selections.
You can return virtual bets in the response when using the Exchange API by including the virtualise":"true" in the listMarketBook request e.g. [{"jsonrpc": "2.0", "method": "SportsAPING/v1.0/listMarketBook", "params": {"marketIds":["1.114101556"],"priceProjection":{"priceData":["EX_BEST_OFFERS"],"virtualise":"true"}}, "id": 1}]
You should subscribe to the EX_BEST_OFFERS_DISP Market Data Filter if using the Exchange Stream API
One of the easiest ways to understand how we generate virtual bets for cross-matching is to work through a couple of examples.
Consider the following market and what would happen if we placed a very large back bet at 1.01 on The Draw:
Without cross matching, this bet would be matched in three portions;
1) £150 at 5.0,
2) £250 at 3.0,
and £999 at 1.01 with anything remaining being left unmatched.
With cross matching we can do better.
We have a back bet on Newcastle for £120 at 2.0 and a back bet on Chelsea for £150 at 3.0 (shown in pink on the available to lay side of the market).
These two bets can be matched against a back bet on The Draw at a price of 6.0, since 2.0, 3.0, and 6.0 form a 100% book. To ensure that the book is balanced, we choose the stakes to be inversely proportional to the prices.
This means that we take the full £120 at 2.0 on Newcastle, only £80 at 3.0 on Chelsea, and £40 at 6.0 on The Draw, which is the first virtual bet
We now have a back bet on Newcastle for £75 at 2.5 and a back bet on Chelsea for £70 at 3.0 (again shown in pink on the available to lay side of the market).
These two bets can be matched against a back bet on The Draw at a price of 3.75, since 2.5, 3.0, and 3.75 also form a 100% book.
Balancing the stakes means that we need to take the full £75 at 2.5 on Newcastle, only £62.50 at 3.0 on Chelsea, and £50 at 3.75 on The Draw, which is the second virtual bet. Since 3.75 is less than 5.0, the £150 at 5.0 would be matched first followed by £50 at 3.75. If we continued this process we would get further matching at 1.50 and 1.05, but for the purposes of displaying the market view we have the best 3 prices for the available to back bets on The Draw, and so we can stop calculating the virtual bets. The virtual bets are just the bets that would have been matched had we received a sufficiently large back bet at 1.01; in this example, £40 at 6.0 and £50 at 3.75. We take these virtual bets and merge them with the existing bets on the market to generate the following market view (with the virtual bets shown in green)
The process is repeated to obtain the virtual lay bets (available to back bets) for Newcastle and Chelsea.
Here we have a slightly different market (as before, chosen to make the numbers nice) and consider what would happen if we placed a very large lay bet at 1000 on The Draw.
Without cross-matching, this bet would be matched in three portions; 1) £100 at 10.0, 2) £50 at 50.0, and £2 at 1000 with anything remaining being left unmatched. With cross-matching we can do better. We have a lay bet on Newcastle for £300 at 2.0 and a lay bet on Chelsea for £150 at 3.0 (shown in blue on the available to back side of the market). These two bets can be matched against a lay bet on The Draw at a price of 6.0, since 2.0, 3.0, and 6.0 form a 100% book. To ensure that the book is balanced, we choose the stakes to be inversely proportional to the prices. This means that we take only £225 at 2.0 on Newcastle, the full £150 at 3.0 on Chelsea, and £75 at 6.0 on The Draw, which is the first virtual bet.
Assuming these bets got matched, the market would look like this:
We now have a lay bet on Newcastle for £75 at 2.0 and a lay bet on Chelsea for £250 at 2.4 (again shown in blue on the available to back side of the market). These two bets can be matched against a lay bet on The Draw at a price of 12.0, since 2.0, 2.4, and 12.0 also form a 100% book. Balancing the stakes means that we need to take the full £75 at 2.0 on Newcastle, only £62.50 at 2.4 on Chelsea, and £12.50 at 12.0 on The Draw, which is the second virtual bet.
This leaves the following market:
This time we can't continue the process since there is no valid price for a virtual bet on The Draw that would result in a 100% book, so we can stop calculating the virtual bets. Again, the virtual bets are just the bets that would have been matched had we received a sufficiently large lay bet at 1000; in this example, £75 at 6.0 and £12.50 at 12.0. We take these virtual bets and merge them with the existing bets on the market to generate the following market view (with the virtual bets shown in orange):
Account Statement - Resettlement Lifecycle
The below demonstrates the resettlement lifecycle and how this is represented via the getAccountStatement output.
In the first file, the back bet on Landskrona was settled as winner, and so we see two entries for that bet:
- The initial debit (RESULT_NOT_APPLICABLE)
- The profit from winning the bet (RESULT)
In the second example, the market was unsettled, and we see four entries:
- The two entries described above are still present but tagged with RESULT_ERR
- An entry to revert the commission payed (tagged with COMMISSION_REVERSAL and RESULT_FIX)
- An entry to undo the payout from the winning bet (tagged with RESULT_FIX)
In the third example, we resettle the market with the back bet on Landskrona as a loser, and we see 5 entries:
- The four entries described above
- An entry describing the losing bet (RESULT_LOST)
Regulator Codes
The below regulator codes are used in the reglulators field provided in the listMarketCatalogue Market Description and the Exchange Stream API marketDefinition.
Abbreviation | Full Description |
---|---|
MR_ESP | SPANISH GAMBLING AUTHORITY |
MR_INT | GIBRALTER REGULATOR |
MR_ITA | AMMINISTRAZIONE AUTONOMA DEI MONOPOLI DI STATO |
MR_NJ | NJRC - NEW JERSEY RACING COMMISSION |
MR_TGC | THE TASMANIAN GAMING COMMISSION |
EventTypeIds List
The below file contains a complete list of EventTypeIds
- Understanding Market Navigation
- Betfair Price Increments
- Common Error Codes
- Currency Parameters
- Locale Specification
- CompetitionId & Event Mapping Data
- CompetitionIds - Soccer Markets
- SelectionId's - Soccer Markets
- MarketType & Market Name Mappings
- Racecourse Abbreviations
- Runner Metadata Description
- Time Zones & Time Format
- Virtual Bets
- Account Statement - Resettlement Lifecycle
- Regulator Codes
- EventTypeIds List