BWF Badminton APIbwfbadminton.com ↗
Access BWF tournament calendars, world rankings, draw brackets, and match results for all disciplines via 5 structured endpoints.
What is the BWF Badminton API?
The BWF Badminton API provides 5 endpoints covering the full lifecycle of BWF tournament data — from calendar listings and draw structures to per-match scores and world rankings. The get_tournament_draw_bracket endpoint alone returns every round (R64 through Final) across all five disciplines (MS, WS, MD, WD, XD) in a single call, while get_rankings gives the latest published BWF World Rankings with points, previous rank, and tournaments played.
curl -X GET 'https://api.parse.bot/scraper/9b6754e3-5d0f-436a-91b8-ec4da53973b7/list_tournaments?year=2025&category=20' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace bwfbadminton-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: BWF Badminton API — bounded, re-runnable; every call capped."""
from parse_apis.BWF_Badminton_Tournament___Match_Data_API import BWF, Discipline, Category, ParseError
client = BWF()
# List tournaments for 2025
for tournament in client.tournaments.list(year=2025, category=Category.SUPER_1000, limit=3):
print(tournament.tournament_name, tournament.date_start, tournament.location)
# Construct a known tournament and list its draws
wc = client.tournament(tournament_code="EA80B0AF-6613-4D74-8C79-27BF45DD2ABA")
for draw in wc.draws.list(limit=3):
print(draw.name, draw.size, draw.stage_name)
# Get matches filtered by discipline
for match in wc.matches.list(date="2025-08-31", discipline=Discipline.MS, limit=3):
print(match.player_1_name, match.score_string, match.round)
# Get world rankings for Men's Singles
for ranking in client.rankings.list(discipline=Discipline.MS, limit=3):
print(ranking.rank, ranking.player_name, ranking.country, ranking.points)
# Get full draw bracket for a tournament
bracket = client.draw_brackets.get(tournament_code="EA80B0AF-6613-4D74-8C79-27BF45DD2ABA")
print(bracket.total_disciplines, bracket.tournament_code)
# Typed error handling
try:
for t in client.tournaments.list(year=2025, limit=1):
print(t.tournament_name)
except ParseError as e:
print(f"error: {e.code}")
print("exercised: tournaments.list / draws.list / matches.list / rankings.list / draw_brackets.get")
List BWF tournaments for a given year. Returns tournament names, dates, locations, categories, prize money, and tournament codes needed for draw and match queries. Supports filtering by BWF category tier. Paginates as a single page containing all tournaments for the year.
| Param | Type | Description |
|---|---|---|
| year | integer | Year to fetch tournaments for. |
| category | string | Comma-separated category IDs to filter. Accepted values: 20, 21, 22, 23, 24, 25, 26, 27. These map to BWF tournament tiers. Omitting returns all categories. |
{
"type": "object",
"fields": {
"year": "integer, the queried year",
"tournaments": "array of tournament objects with tournament_id, tournament_code, tournament_name, tournament_category, date_start, date_end, location, country, prize_money, live_status, url",
"total_tournaments": "integer, count of tournaments returned"
},
"sample": {
"data": {
"year": 2025,
"tournaments": [
{
"url": "https://bwfworldtour.bwfbadminton.com/tournament/5222/petronas-malaysia-open-2025/results/",
"country": "Malaysia",
"date_end": "2025-01-12",
"location": "Kuala Lumpur, Malaysia",
"date_start": "2025-01-07",
"live_status": "post",
"prize_money": "1,450,000",
"tournament_id": 5222,
"tournament_code": "BD7DDFAC-145A-4865-B58A-C00977D5A3C3",
"tournament_name": "PETRONAS Malaysia Open 2025",
"tournament_category": "HSBC BWF World Tour Super 1000"
}
],
"total_tournaments": 43
},
"status": "success"
}
}About the BWF Badminton API
Tournament Calendar and Draw Access
The list_tournaments endpoint returns all BWF tournaments for a given year, including tournament_name, tournament_code, date_start, date_end, location, tournament_category, and prize money. Optionally filter by category tier using comma-separated category IDs (20–27), which map to BWF tour levels such as Super 1000, Super 750, and lower-tier events. The tournament_code UUID returned here is the key input for all other tournament-scoped endpoints.
The get_tournament_draws endpoint takes a tournament_code and returns each available discipline bracket with fields including name, code, type, size, stage_type, and stage_name. This tells you which disciplines are being contested and what stage the draw is at before querying further.
Match Results and Bracket Data
The get_tournament_matches endpoint returns detailed match objects filtered by date or date range (date, date_start, date_end) and optionally by discipline. Each match object includes match_id, player names and countries, seeds, per-game scores, match duration, round, discipline_full, and court assignment. This is the right endpoint for day-by-day result tracking or post-tournament analysis.
For a full bracket view, get_tournament_draw_bracket returns the complete bracket for all disciplines in one call, organized as nested objects keyed by discipline code and round name (R64, R32, R16, QF, SF, Final). Each match node includes player names, countries, seeds, game scores, match status, and winner. This structure suits bracket visualization or seeding analysis across an entire tournament.
World Rankings
The get_rankings endpoint returns the latest published BWF World Rankings. Accepts a single discipline code (MS, WS, MD, WD, XD), a comma-separated list, or defaults to all disciplines. Each entry includes rank, previous_rank, player_name, player_id, country, country_code, points, and tournaments_played. For doubles disciplines, player_name contains both partners. Use the limit parameter to cap results per discipline.
The BWF Badminton API is a managed, monitored endpoint for bwfbadminton.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when bwfbadminton.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official bwfbadminton.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a live tournament bracket tracker showing round-by-round results across all five BWF disciplines.
- Monitor BWF World Rankings week-over-week by comparing
rankandprevious_rankfields across disciplines. - Aggregate yearly tournament schedules by category tier using
list_tournamentswith category ID filters. - Display day-by-day match results during a tournament using
get_tournament_matcheswith adatefilter. - Analyze player seeding versus actual results by correlating seed data from
get_tournament_draw_bracketwith final standings. - Populate a fantasy badminton app with current rankings, points, and tournament counts from
get_rankings. - Generate tournament preview content by pulling draw sizes and stage types from
get_tournament_draws.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does BWF have an official developer API?+
What does get_tournament_matches return, and how do I narrow results to one discipline?+
match_id, match_code, player names, countries, seeds, per-game scores, match duration, round, discipline_full, court, and the dates queried. Pass the discipline parameter (e.g. MS, WD, XD) to filter results to a single event type. You must supply either a date or a date_start/date_end pair alongside the required tournament_code.Are historical rankings for past weeks available?+
get_rankings endpoint returns the latest published BWF World Rankings week only. Historical week-by-week ranking snapshots are not currently exposed. You can fork this API on Parse and revise it to add a historical rankings endpoint if your use case requires tracking rank movement over time.Does the API include player profiles, head-to-head records, or career statistics?+
How does pagination work for list_tournaments?+
list_tournaments endpoint returns all tournaments for the queried year in a single page — there is no multi-page cursor or offset. The total_tournaments field tells you how many records were returned. For multi-year coverage, call the endpoint once per year.