All systems normalData updated just nowStatusChangelogSupport
badmintonapi

Win chance

Odds MCP win_chance

The chance each side wins from our rating, with a fair price and their head-to-head. Singles or doubles, on any date.

GET/v1/predict
113,880
senior matches rated, replayed in order every night
3,288
ratings active in the last 12 months, five disciplines
71.2%
of the rating's favourites won, 91,343 matches since 2010
320
the chance scale, fitted nightly to every match since 2010

Give two players, or two pairs, and the API returns the chance each side wins from our rating as it stood on the day you choose, with a fair price and their head to head. Below the reference: how ratings become a chance, how often that chance has come true, and how to read it beside a bookmaker's price.

See it in charts: how our rating works

Try it

Kept in this browser and filled in on every page. A key made in your account lands here by itself.

Answer

Press Run to call the API with your key. The answer appears here.

Parameters

player1pl_ idrequired
player2pl_ idrequired
partner1pl_ id
Doubles: player1's partner.
partner2pl_ id
Doubles: player2's partner.
disciplinetext
MS, WS, MD, WD or XD. MSWSMDWDXD
datedate
The ratings as they stood that day.
hosttext
The host country's IOC code, like DEN: a side whose players are all from it is moved by the home figure in meta.model.home_edge (rating points; null when testing found none, and it can be below 0).
gamestext
In play at one game all: the first two games from side 1, like 21-15,18-21; adds the chance of the deciding game.

Returns

discipline
MS, WS, MD, WD or XD.
date
The day, YYYY-MM-DD.
host
The host given: code, and home_side (1 or 2, the side whose players are all from it; null when neither or both).
side1
Side 1: players, rating, continent (the one its players share, else null), chance and fair price.
side2
Side 2: players, rating, continent, chance and fair price.
head_to_head
Meetings between the two sides and the wins of each.
age_gap_years
Singles: how many years older side 2 is than side 1 on the date (below 0 when side 1 is older), when both birth dates are known; the chance includes the age term (meta.model.age). Null in doubles or when a date is missing.
decider
With games at one game all: each side's chance of the deciding game (side1, side2), fair_price for each, which side won the second game and by how many points; null without games.
How the chance works

Where the win chance comes from

The chance is our rating turned into a probability. This is how that is done, how well it has matched results, and how to read it next to a price.

See it in charts: how our rating works

Doubles and mixed

A pair's rating is the average of its two players' ratings in that discipline. The expected score uses the two pair averages, and after the match both players on a side move by the same amount. A player who changes partner keeps their own rating, so a new pair starts from what each partner has earned, not from 1500.

Men's doubles, women's doubles and mixed are rated apart: a mixed specialist and a men's doubles specialist are judged only on their own events. For a chance, /v1/predict takes player1 and partner1 against player2 and partner2, with the discipline.

From ratings to a chance

The ratings move on the classic Elo scale of 400: a 400-point gap means the stronger side is expected to win ten times as often as the weaker. In badminton a rating gap wins more often than that: best of three games to 21 gives the better player many chances to show it. So the chance we publish uses its own scale, fitted every night to every rated match since 2010: the scale that would have scored those matches best. A match where any player has fewer than 10 rated matches in the event uses a second scale (225), fitted the same way on those matches alone: a rating built on few results is read differently, and in practice a newcomer drawn against an established player loses more often than the gap alone says, so that scale comes out the sharper of the two.

Published chance of APA = 1 / (1 + 10(RB - RA) / 320)
Fitted on91,343 matches since 2000, Brier score 0.1854
Rating gapChance on the 400 scaleChance we publish (scale 320)Fair price, decimal
050%50%2.00
2553.6%54.5%1.84
5057.1%58.9%1.70
10064%67.3%1.49
15070.3%74.6%1.34
20076%80.8%1.24
30084.9%89.6%1.12
40090.9%94.7%1.06

The scale is in every answer as meta.model.chance_scale, the newcomer scale as meta.model.chance_scale_newcomer with newcomer_below_matches, and the matches they were fitted on and their Brier score, so you can reproduce any chance from two ratings yourself.

The fair price

fair_price is one divided by the chance: the decimal price at which backing that side would break even if the chance were exactly right. A 62.5% chance is a fair price of 1.60. A bookmaker's price carries a margin, so a market price is shorter than fair on both sides; when a market price is longer than our fair price, our rating thinks that side is under-rated by the market.

That is a starting point, not a bet. The market knows about injuries, form inside a tournament and conditions; the rating knows only results. Compare the two with /v1/odds/{id} before you act on either.

How accurate it is

Every match is scored with the ratings as they stood before it was played, so this is a fair test: nothing from the match or after it leaks in. Across 91,343 senior draw matches since 2010, the side our rating made favourite won 71.2%, with a Brier score of 0.1854 (the average squared gap between chance and result: 0 is perfect, 0.25 is a coin toss).

DisciplineMatchesFavourite wonBrier score
Men's singles23,39069.3%0.1966
Women's singles18,40772.8%0.1759
Men's doubles16,98670.3%0.1904
Women's doubles15,84273.5%0.1732
Mixed doubles16,71871%0.1869

A chance is only useful if it means what it says: of all the matches where the favourite was given 70%, about 70% should be won. This is how that has held since 2010, band by band.

Favourite's chanceMatchesExpected and won
50 to 55% 13,725 51.8% won, 52.3% expected
55 to 60% 11,188 56.8% won, 57.4% expected
60 to 65% 10,256 62.1% won, 62.4% expected
65 to 70% 9,520 67% won, 67.5% expected
70 to 75% 8,905 73.5% won, 72.5% expected
75 to 80% 8,222 76.6% won, 77.5% expected
80 to 85% 7,911 81.8% won, 82.5% expected
85 to 90% 7,615 86.7% won, 87.5% expected
90 to 95% 7,591 90% won, 92.5% expected
95 to 100% 6,410 95% won, 97.3% expected

WonExpected

Against the betting market: on the 10,675 of those matches with a closing price, the market's favourite won 75.3% (Brier 0.1660) and ours won 74% (Brier 0.1757). The closing market is sharper, as it should be: it sees team news and money, the rating sees only results. The rating is a fair, independent second opinion, and most useful where there is no price at all.

Using it well

  • Check the matches behind each rating. Every player comes with matches. A player with no rated match is taken at 1500, and the chance says so in meta.note.
  • Use the date for the past. date gives the chance as it would have been on that day, from results before it only, so a backtest is honest.
  • Singles needs no discipline. For two singles players it is worked out from the first player; doubles needs discipline and both partners.
  • Read it beside the head to head. head_to_head counts their meetings in the discipline; a long one-sided record the rating does not show can mean a match-up it misses.

The answer, field by field

Today's top two in men's singles, GET /v1/predict?player1=pl_9k1rzjad&player2=pl_d1p4a658:

{
    "data": {
        "discipline": "MS",
        "date": "2026-10-12",
        "side1": {
            "players": [
                {
                    "id": "pl_9k1rzjad",
                    "name": "Viktor Axelsen",
                    "country": "DEN",
                    "rating": 2044,
                    "matches": 612,
                    "last_rated": "2025-10-26"
                }
            ],
            "rating": 2044,
            "chance": 0.5198,
            "fair_price": 1.92
        },
        "side2": {
            "players": [
                {
                    "id": "pl_d1p4a658",
                    "name": "Shi Yuqi",
                    "country": "CHN",
                    "rating": 2033,
                    "matches": 469,
                    "last_rated": "2026-09-29"
                }
            ],
            "rating": 2033,
            "chance": 0.4802,
            "fair_price": 2.08
        },
        "head_to_head": {
            "meetings": 13,
            "side1_wins": 9,
            "side2_wins": 4
        }
    },
    "meta": {
        "model": {
            "name": "Badminton API rating",
            "kind": "Elo-style, from every senior draw result in order; our own model, not an official BWF figure",
            "start": 1500,
            "chance_scale": 320,
            "fitted_on_matches": 91343,
            "brier": 0.1854,
            "built": "2026-10-12T04:40:45Z"
        },
        "note": "A player never rated starts at 1500; a chance built on few rated matches is rough. Compare it with the market at /v1/odds/{id}."
    }
}
discipline
The discipline the chance is for. For singles without one, it is worked out from the first player.
date
The day the ratings stand on; today when you left it out.
side1.players
Each player on the side: id, name, country, their own rating (null if never rated), matches behind it and last_rated.
side1.rating
The side's rating: the player's own in singles, the average of the two in doubles. A never-rated player counts as 1500.
side1.chance
The chance this side wins, 0 to 1, on the fitted scale. The two sides add up to 1.
side1.fair_price
One divided by the chance: the decimal price with no margin.
head_to_head
Their meetings in this discipline (from the first player on each side): meetings, side1_wins, side2_wins. Not used in the chance.
meta.model
The model: chance_scale, fitted_on_matches, brier and built, so any chance can be checked by hand.

Recipes

A doubles matchBoth partners on each side, and the discipline.GET /v1/predict?player1=pl_...&partner1=pl_...&player2=pl_...&partner2=pl_...&discipline=XD
The chance before a match years agoSet date to the day before it: only results before that day are used.GET /v1/predict?player1=pl_...&player2=pl_...&date=2021-07-31
Rating against the marketGet the closing prices for the same match and compare their implied chance with ours.GET /v1/odds/mt_...
Every surprise the rating sawThe wins it gave the lowest chance, across the archive or a span of years.GET /v1/analysis/upsets?by=rating&from=2015

Words used here

Elo
A rating system made for chess, where points pass from loser to winner and the amount depends on how expected the result was.
Expected score
The share of the match a side would win if the ratings were exactly right; the rating moves by the gap between this and the result.
K
How far one result can move a rating: 32 for a player's first 20 matches in a discipline, 20 after.
Scale
The rating gap at which the stronger side is ten times as likely to win. Ratings move on 400; the published chance uses 320, fitted to results.
Active
Rated in the 365 days before the date asked for. Tables list only active players unless active=false.
Brier score
The average of (chance minus result) squared over many matches. 0 is perfect, 0.25 is what always saying 50% scores. Lower is better.
Calibration
Whether chances mean what they say: of matches given 70%, about 70% should be won.
Fair price
One divided by the chance, in decimal odds, with no bookmaker's margin.

Questions

Why does the chance differ from the bookmaker's?
The rating sees only results; the market also sees injuries, form within a tournament and money. Differences are worth a look, not proof that one side is wrong.
Can I get the chance for a match that was played years ago?
Yes. Pass date as the day before the match and you get the chance from the ratings that stood then.
Does the head to head change the chance?
No. The chance comes from the ratings alone; the head to head is given beside it for you to weigh.
How is the scale chosen?
Each night the scale that gives the lowest Brier score on every rated match since 2000 is chosen, and it is in meta.model.chance_scale.

More on the rating: how our rating works, and the rating in charts.