Dutching data explained: back prices grouped into dutches
OddsRelay · · Updated · 4 min read
Dutching backs every outcome of one market, usually at different venues, with the stakes split so whichever outcome wins returns the same amount. The data it needs is one back price per outcome, taken from prices that belong together, so the sum can be done before a single bet goes on.
What is dutching?
Take a Premier League match result: home, draw and away. A dutch backs all three, each at the venue pricing it best. In a two-way market, such as a tennis match winner, it backs both players.
The arithmetic is short. Add up 1 / price across the legs. Divide 100 by that sum and you have the return for every 100 units staked across the dutch. Each leg's stake is that return divided by the leg's price.
| Outcome | Venue | Price | 1 / price | Stake per 100 |
|---|---|---|---|---|
| Arsenal | William Hill | 2.90 | 0.3448 | 33.46 |
| Draw | Paddy Power | 3.50 | 0.2857 | 27.72 |
| Chelsea | Smarkets (back) | 2.50 | 0.4000 | 38.81 |
| Sum | 1.0305 |
Example prices. 100 ÷ 1.0305 = 97.04, so each outcome returns 97.04 for 100 staked. Stakes are rounded to two decimals.
The gap below 100 is what covering the market costs: here 2.96 for every 100 staked, whichever outcome wins. The figure is only as good as the prices it was worked from.
How dutching differs from laying
Lay-based matched betting backs one outcome at a bookmaker and lays the same outcome on an exchange. It needs a back price, a lay price and the money available behind the lay (why lay liquidity matters explains that last one). In the UK & Ireland the lay side comes from Betfair, Smarkets, Matchbook and BETDAQ.
Dutching needs no lay at all. It swaps one back and one lay for several backs, one per outcome, so it wants breadth across a whole market. An exchange can still take part: its back price is a leg like any bookmaker's. The lay odds glossary entry sets out the other side if you need it.
What the dutching board sends
OddsRelay's dutching feed keeps the matched boards' event-grouped shape with two differences. There is no lay key, because dutching is back-only. And every back offer carries a dutch_id, eight hex characters naming the dutch the leg belongs to. A dutch is two or three legs, one per outcome, each at a different venue.
{
"meta": {
"feed_type": "dutching",
"region": "uk",
"odds_format": "decimal",
"processed_at": "2026-09-20T11:42:08.513Z",
"last_seen": {
"william_hill": { "soccer": "2026-09-20T11:42:06Z" },
"paddy_power": { "soccer": "2026-09-20T11:42:03Z" },
"smarkets": { "soccer": "2026-09-20T11:42:07Z" }
},
"count": 1,
"version": "v2",
"next_cursor": null
},
"data": [{
"event_id": "or_evt_917dd44bce05",
"sport_key": "soccer_epl",
"sport_title": "Premier League",
"commence_time": "2026-09-20T14:00:00Z",
"home_team": "Arsenal",
"away_team": "Chelsea",
"markets": [{
"key": "h2h",
"outcomes": [
{ "name": "Arsenal", "back": [{ "bookmaker": "william_hill", "price": 2.9, "link": null, "dutch_id": "3f9a61c2" }] },
{ "name": "Draw", "back": [{ "bookmaker": "paddy_power", "price": 3.5, "link": null, "dutch_id": "3f9a61c2" }] },
{ "name": "Chelsea", "back": [{ "bookmaker": "smarkets", "price": 2.5, "link": null, "dutch_id": "3f9a61c2" }] }
]
}]
}]
}The feed sends the legs and their prices. The return figure and the stakes are your arithmetic, and the dutching calculator does the stake split if you want to check a dutch by hand. Each leg's link points at the event on its venue when the venue has one.
The board serves decimal odds and ISO dates only, so convert on your side if your product shows fractional or American odds (the American odds guide has the conversion). Send Accept-Encoding: gzip (curl's --compressed does it). A client that explicitly refuses gzip, as Python's urllib does by default, gets a 400 on this board.
Group by dutch_id before you add anything up
Taking the highest price per outcome and summing them is the obvious move, and the wrong one here. An outcome's back array can hold legs from more than one dutch, and the legs of a dutch are the prices that belong together. Group one market's offers by dutch_id first, then do the sum per group.
// Group one market's legs by dutch_id, then work out each dutch.
const dutches = new Map();
for (const outcome of market.outcomes) {
for (const leg of outcome.back) {
if (!dutches.has(leg.dutch_id)) dutches.set(leg.dutch_id, []);
dutches.get(leg.dutch_id).push({ outcome: outcome.name, venue: leg.bookmaker, price: leg.price });
}
}
for (const [id, legs] of dutches) {
const sum = legs.reduce((s, leg) => s + 1 / leg.price, 0);
const returnPer100 = 100 / sum; // 97.04 for the example above
const stakes = legs.map((leg) => ({ ...leg, stake: returnPer100 / leg.price }));
console.log(id, returnPer100.toFixed(2), stakes);
}Filtering to the markets you work
The dutching board takes the same filters as the other matched boards: sports, bookmakers, exchanges, markets and a kick-off window. On this board the bookmaker and exchange lists both name venues of either kind, and a dutch survives the filter only when every one of its legs is at a venue you named. Name the bookmakers you hold accounts with and every dutch you get back is built from those venues alone. Naming fewer venues also lowers the call's token price, as the filters and tokens guide explains, and the matched-board filters guide has the full trimming rule.
Prices move between reading and placing
Dutching is more exposed to price movement than a single back and lay. The position depends on two or three prices at two or three venues holding while you place two or three bets, and one leg shortening changes the sum for all of them.
The reply tells you how old its prices can be. meta.processed_at is the board's time, and meta.last_seen gives, per venue and sport, when that venue was last read, so now minus that time is an upper bound on a leg's age. The freshness guide covers both.
Work the stakes out from the prices on the betting slips you are about to confirm, not from the prices you read. The feed tells you where a dutch exists. The slip tells you whether it still does.
Call the dutching board yourself
Every plan includes the dutching board. Request access for a key, and check live coverage first to see which venues and sports are live. The API reference has the full response shape.