Our rating
Archive MCPplayer_ratings Our own rating (Elo-style, from every senior result) as a table for a discipline on any date, or one player's rating history. Not an official BWF figure.
/v1/ratings- 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
Our rating is an Elo-style number for every player in every discipline, made from who they beat and who beat them in every senior draw result, in order. Ask for a table on any date or for one player's history. Below the reference is the whole method: the formula with a real final worked through, doubles, new players, how a rating becomes a chance, how accurate it has been, and the limits.
See it in charts: how our rating worksTry it
Kept in this browser and filled in on every page. A key made in your account lands here by itself.
Press Run to call the API with your key. The answer appears here.
Parameters
disciplinetext- MS, WS, MD, WD or XD.
MSWSMDWDXD datedate- The ratings as they stood that day; today when left out.
playerpl_ id- One player's history instead of a table.
activetrue or false- Only players rated in the year before the date (default true).
pagewhole number- Which page. Default 1.
per_pagewhole number- Results a page, up to 200. Default 50.
cursortext- Meta.next_cursor from the page before.
Returns
rank- Position in the list.
player- The player: id, name and country.
rating- Our rating, starting at 1500.
matches- Matches played, or the matches themselves.
last_rated- The last day of the edition in which the rating last changed (for an edition still under way, the day it is due to end).
One number for how well a player is playing
The world ranking counts points for finishing places. Our rating counts who you beat. It is built from every senior draw result in order, the way chess ratings are, and it is our own model, never an official BWF figure.
See it in charts: how our rating worksIn short
- Everyone starts at 1500. A rating has no ceiling or floor: it rises with wins over strong players and falls with losses to weaker ones. Today the highest-rated active men's singles player is at 2,044, and in women's singles 2,397.
- It moves after every match. Beat someone rated above you and you gain more; lose to someone rated below you and you lose more. A win never lowers a rating and a loss never raises it.
- One rating per discipline. A player has separate ratings for singles, doubles and mixed, because skill in one does not carry over to another.
- Pairs are averaged. In doubles a pair is rated as the average of its two players, and both move by the same amount.
- Rebuilt whole every night. Every senior draw result since 1899 is replayed in order, 113,880 matches for 16,212 players, so a draw we add for 1985 corrects everything after it.
- It turns into a chance. Two ratings give each side's chance to win, fitted to real results: the favourite it names has won 71.2% of matches since 2010.
Who leads now
The highest-rated active player in each discipline today, from last night's build. The full tables are one call away, and the charts page draws their lines over three years.
| Discipline | Leader | Rating | Matches | 12 months | Next best |
|---|---|---|---|---|---|
| Men's singles | Viktor Axelsen DEN | 2,044 | 612 | +7 | Shi Yuqi, 2,033 (11 behind) |
| Women's singles | An Se-young KOR | 2,397 | 446 | +108 | Akane Yamaguchi, 2,177 (220 behind) |
| Men's doubles | Seo Seung-jae KOR | 2,210 | 419 | -52 | Muhammad Shohibul Fikri, 2,020 (190 behind) |
| Women's doubles | Liu Shengshu CHN | 2,132 | 258 | +19 | Lee So-hee, 2,099 (33 behind) |
| Mixed doubles | Huang Dongping CHN | 2,234 | 580 | -19 | Wei Yaxin, 2,095 (139 behind) |
The gap to second place turns into a chance like any other gap: in men's singles, Viktor Axelsen would be given 52% against Shi Yuqi today.
Why a rating as well as the world ranking
The world ranking answers "who has earned the most points in the last 52 weeks". It rewards playing often and going deep in the biggest events, and it is the list that decides seedings and entries. It is the right list for that job, and the API serves it at /v1/rankings.
A rating answers a different question: "how strong is this player now, judged by the results". It does not care how many tournaments someone entered or how many points a round is worth. It cares who they played and whether they won. So a player back from injury with few ranking points, but beating the best, rises fast in the rating while the ranking catches up over months.
| World ranking | Our rating | |
|---|---|---|
| Measures | Points earned for finishing places | Strength, from who you beat and lose to |
| What counts | The best tournaments in a rolling 52 weeks | Every rated senior match, ever, in order |
| Beating a top player | Worth the same as beating anyone in that round | Worth far more than beating a lower player |
| Playing less | Points drop off after 52 weeks | The rating stays where the last result left it |
| Doubles | Ranks the pair | Rates each player; a pair is the average |
| Turns into a chance | No | Yes, the chance either side wins |
What goes in, and what does not
The calculation, step by step
Before each match, both sides get an expected score: the share of the match they would win if the ratings were exactly right. The rating gap decides it.
EA = 1 / (1 + 10(RB - RA) / 400)RA' = RA + K × (SA - EA)SA = 1 for a win, 0 for a loss; K = 32 for a player's first 20 matches in the discipline, 20 afterWhen both players have the same K, what one gains the other loses, so rating points mostly pass between players rather than appear from nowhere. The size of the move depends on how surprising the result was. At K = 20:
| Rated above the opponent by | Expected score | Change for a win | Change for a loss |
|---|---|---|---|
| Level | 50% | +10.0 | -10.0 |
| 50 points | 57.1% | +8.6 | -11.4 |
| 100 points | 64% | +7.2 | -12.8 |
| 200 points | 76% | +4.8 | -15.2 |
| 300 points | 84.9% | +3.0 | -17.0 |
| 400 points | 90.9% | +1.8 | -18.2 |
| Rated 200 below | 24% | +15.2 | -4.8 |
The published chance before the match, from the fitted scale below, was 25.9% for Yushi Tanaka and 74.1% for Anders Antonsen.
New players settle quickly
A player's first 20 rated matches in a discipline move them with K = 32, 60% more than the K = 20 after that. Starting at 1500 is a guess, and the larger steps get a newcomer near their real level in a season rather than several. Once a player has a record, each result moves them less, so one bad day does not undo years of form.
Every rating comes with matches, the rated matches behind it. Below 20, read the number as rough. /v1/predict gives each player's count too, so you can weigh a chance built on a short record.
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.
PA = 1 / (1 + 10(RB - RA) / 320)91,343 matches since 2000, Brier score 0.1854| Rating gap | Chance on the 400 scale | Chance we publish (scale 320) | Fair price, decimal |
|---|---|---|---|
| 0 | 50% | 50% | 2.00 |
| 25 | 53.6% | 54.5% | 1.84 |
| 50 | 57.1% | 58.9% | 1.70 |
| 100 | 64% | 67.3% | 1.49 |
| 150 | 70.3% | 74.6% | 1.34 |
| 200 | 76% | 80.8% | 1.24 |
| 300 | 84.9% | 89.6% | 1.12 |
| 400 | 90.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.
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).
| Discipline | Matches | Favourite won | Brier score |
|---|---|---|---|
| Men's singles | 23,390 | 69.3% | 0.1966 |
| Women's singles | 18,407 | 72.8% | 0.1759 |
| Men's doubles | 16,986 | 70.3% | 0.1904 |
| Women's doubles | 15,842 | 73.5% | 0.1732 |
| Mixed doubles | 16,718 | 71% | 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.
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.
Dates, history and the active list
Ratings are kept per tournament: after each event a player played, the API stores their rating and match count, dated the tournament's last day (31 December of its year when the dates are not known). Ask for any date and you get the ratings as they stood on that day, made only from results before it. That makes old dates safe to backtest on: no later result can leak into them.
A table lists only active players by default: those rated in the 365 days before the date. A player who retired in 2019 keeps their last rating, but does not crowd today's table. Pass active=false to include everyone, which is how you find the strongest players of any era. The player pages on this site use the same active list for "3rd of 538 rated in the last 12 months".
Because ratings are rebuilt whole each night, adding an old draw can shift ratings after it by a little. Today's numbers are always the best the archive can give; if you store ratings yourself, store meta.model.built with them.
Using the endpoint
Two shapes from one address. Give discipline for a table, ranked by rating. Give player for one player's history, newest first, one row per tournament, with discipline to narrow it.
GET /v1/ratings?discipline=MSGET /v1/ratings?discipline=WS&date=2016-08-10GET /v1/ratings?discipline=XD&active=false&per_page=50GET /v1/ratings?player=pl_...&discipline=MDGET /v1/predict?player1=pl_...&player2=pl_...GET /v1/analysis/upsets?by=ratingEvery answer carries meta.model: the name, kind, starting rating, the chance scale, the matches it was fitted on, its Brier score and when it was built.
The answer, field by field
A table, GET /v1/ratings?discipline=MS&per_page=3, with today's real top three:
{
"data": [
{
"rank": 1,
"player": {
"id": "pl_9k1rzjad",
"name": "Viktor Axelsen",
"country": "DEN"
},
"rating": 2044,
"matches": 612,
"last_rated": "2025-10-26"
},
{
"rank": 2,
"player": {
"id": "pl_d1p4a658",
"name": "Shi Yuqi",
"country": "CHN"
},
"rating": 2033,
"matches": 469,
"last_rated": "2026-09-29"
},
{
"rank": 3,
"player": {
"id": "pl_hmfabfyf",
"name": "Anders Antonsen",
"country": "DEN"
},
"rating": 1994,
"matches": 453,
"last_rated": "2026-10-11"
}
],
"meta": {
"count": 3,
"next_cursor": "...",
"page": 1,
"per_page": 3,
"total": 548,
"total_pages": 183,
"next_page": 2,
"prev_page": null,
"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"
},
"discipline": "MS",
"date": "2026-10-12",
"active": true
}
}rank- Place in this table, 1 is the highest rating. Counts across pages.
playerid,nameand IOCcountry(null when unknown). Use the id with every player endpoint.rating- The rating after the last tournament the player played on or before
date, to one decimal. matches- Rated matches behind it in this discipline. Under 20, the rating is still settling.
last_rated- The day it last changed: that tournament's last day.
meta.model- What made these numbers: name, kind,
start,chance_scale,fitted_on_matches,brierandbuilt. meta.discipline- The discipline of the table.
meta.date- The day the table stands on; today when you left it out.
meta.active- True when only players rated in the 365 days before the date are listed.
meta.total- Players in the whole table, with the usual page fields.
A player's history, GET /v1/ratings?player=pl_9k1rzjad&discipline=MS, comes newest first, one row per tournament they played:
date- The tournament's last day, when the rating took this value.
discipline- MS, WS, MD, WD or XD. Leave
disciplineout to get every discipline the player has, interleaved by date. rating- The rating after that tournament.
matches- Rated matches in the discipline up to and including that tournament.
tournamentidandnameof the edition. Its draw is at/v1/tournaments/{id}/draw.
Recipes
GET /v1/ratings?discipline=WS&date=2019-08-25&per_page=1rating; its row says which tournament it came after.GET /v1/ratings?player=pl_...&discipline=MS&per_page=200GET /v1/ratings?player=pl_...&discipline=XDGET /v1/rankings?discipline=MSGET /v1/ratings?discipline=MD&date=1999-12-31&active=falseGET /v1/predict?player1=pl_...&player2=pl_...What it cannot see
- Margins. A narrow win and a thrashing count the same. That keeps the rating simple and hard to game, and loses a little information.
- Time away. A rating does not fade while a player is injured or retired; it waits. Their first results back move them as usual.
- Matches outside the draws. Results we do not hold a draw for are not counted, so a player who plays mostly below the senior tours may be under-rated.
- Eras. Ratings are relative to the players of the time. A 1,900 in 1995 and a 1,900 today are both far above their fields, not the same strength.
- Men against women. The pools never meet, so a men's singles rating and a women's singles rating are not comparable.
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 is the world number one not first in our rating?
- The ranking rewards points earned over a year, and the rating rewards who you beat. A player who wins often against the very best can sit above a player with more points from more events. When they differ, the rating is usually reacting faster to recent results.
- Why 1,500?
- It is the usual Elo starting point and only a label: what matters is the gap between two ratings, not the number itself.
- How often does it change?
- It is rebuilt every night from the draws, so a finished tournament shows in the ratings by the next morning.
- Can a player lose rating while winning a tournament?
- No. Every win adds and every loss takes away, so a player who wins every match of a tournament ends it higher.
- Is it the same as chess Elo?
- The updates are the same idea, with K of 32 then 20. The published chance uses a scale fitted to badminton results (320) rather than chess's 400.
- Is it official?
- No. It is our own model, made from the results in the archive. The official list is the BWF world ranking, at /v1/rankings.
More on the rating: how the win chance works, and the rating in charts.