---
name: boxingapi
description: Boxing data from boxingapi.net: fights to come with prices, results of every kind, fighter records, world rankings, judges' cards, odds, upsets, statistics and the Olympic Games. Use when a user asks a factual boxing question or builds something on boxing data.
---

# BoxingAPI

BoxingAPI (boxingapi.net, operated by DeveloperData.net) is one JSON API and MCP server for the whole sport of boxing: professional, amateur, Olympic, women's, bare-knuckle, exhibition and influencer bouts, with fighters, rankings, judges' cards by name, and opening and closing odds. Results land within the hour; prices on the fights ahead are read every hour.

## When to use it, and when not

- Use it for facts: who won, how, when; a fighter's record and bouts; who is ranked where; who judged a fight and how they scored it; what the price was; the biggest upsets; ready-made statistics; Olympic medals.
- Do not use it for predictions or tips: no endpoint gives one. Our BXR rating and BXP points are tables built from results, not forecasts.
- Not held on any plan: punch statistics, round-by-round scoring, live in-fight data.

## Getting access

- A free key: sign in with Google at https://boxingapi.net/login. The key is shown once on the account page.
- Send it in a header, never in the address (a key in the address is refused with a 400):
  - `Authorization: Bearer YOUR_KEY`, or
  - `X-API-Key: YOUR_KEY`
- Base URL: `https://api.boxingapi.net/v1`. Every answer is one envelope: `data`, then `meta` (paging, the plan, `held_back` for fields a higher plan opens, `generated_at` in UTC).
- Ids are strings with a prefix and never change: `fi_` fighter, `bt_` bout, `fx_` fight to come, `jd_` judge, `rf_` referee, `ev_` event, `wh_` webhook.

## The calls that answer the common questions

The fights in the next 7 days, with the best price on each side (prices need Live):

```
curl "https://api.boxingapi.net/v1/fights/upcoming?days=7" -H "Authorization: Bearer YOUR_KEY"
```
```
{"data": [{"id": "fx_...", "date": "YYYY-MM-DD", "start_time_utc": "21:00", "a": {"id": "fi_...", "name": "...", "best_price": -250, "best_price_decimal": 1.4, "win_chance": 0.69}, "b": {...}, "books": 12, "props": 30, "prices_read_at": "..."}], "meta": {"plan": "Live", "count": 15}}
```

Yesterday's results (UTC); today's so far are `GET /v1/results/today`:

```
curl "https://api.boxingapi.net/v1/results/yesterday" -H "Authorization: Bearer YOUR_KEY"
```
```
{"data": [{"id": "bt_...", "date": "YYYY-MM-DD", "kind": "professional", "outcome": "win", "winner": {"id": "fi_...", "name": "..."}, "method": "UD", "round": 12, "titles": "..."}], "meta": {...}}
```

Find a fighter, then read the record (Live):

```
curl "https://api.boxingapi.net/v1/fighters?q=inoue" -H "Authorization: Bearer YOUR_KEY"
curl "https://api.boxingapi.net/v1/fighters/fi_xxxxxxxx" -H "Authorization: Bearer YOUR_KEY"
```
```
{"data": {"id": "fi_...", "name": "...", "country": "...", "record": {"wins": 0, "losses": 0, "draws": 0, "wins_inside_distance": 0}, "rating": {"bxr": 0, "bxp": 0.0}}, "meta": {...}}
```

A fighter's bouts: `GET /v1/fighters/{id}/bouts`; the fights booked for them: `GET /v1/fighters/{id}/next`. Head to head (Archive): `GET /v1/fighters/{id}/vs/{other}`.

Rankings, current month (free):

```
curl "https://api.boxingapi.net/v1/rankings?body=wbc&division=heavyweight" -H "Authorization: Bearer YOUR_KEY"
```
```
{"data": [{"body": "wbc", "division": "heavyweight", "month": "2026-10", "champion": {"name": "...", "id": "fi_..."}, "entries": [{"rank": 1, "name": "...", "id": "fi_...", "country": "..."}]}], "meta": {...}}
```

`body` is one of wbc, wba, ibf, wbo, board, bxr, bxp. Past months take `month=YYYY-MM` (Archive).

Bouts by date, kind, fighter or method: `GET /v1/bouts?date=2026-10-25&kind=professional`. Results the records split on: `GET /v1/bouts?disputed=true`. Title fights (Live): `GET /v1/title-fights?q=wbc+heavyweight`.

The judges' cards for a bout (Live): `GET /v1/bouts/{id}/cards`. A judge's record (Archive): `GET /v1/judges?q=name`, then `GET /v1/judges/{id}`. A referee (Archive): `GET /v1/referees?q=name`, then `GET /v1/referees/{id}` and `/bouts`.

Odds and upsets (Complete): `GET /v1/odds/{bout id}` for opening and closing prices; `GET /v1/upsets?year=2025` for underdog wins ranked by price.

Statistics: `GET /v1/stats/methods`, `/v1/stats/rounds`, `/v1/stats/unbeaten`, `/v1/stats/streaks`, `/v1/stats/finishers`, `/v1/stats/busiest`, `/v1/stats/rematches`, `/v1/stats/careers`, `/v1/stats/debuts`, `/v1/stats/titles`, `/v1/stats/kinds`, `/v1/stats/countries`, `/v1/stats/judges/agreement`, `/v1/stats/judges/margins`, `/v1/stats/ages`, `/v1/stats/heights`, `/v1/stats/favourites`, `/v1/stats/champions`, `/v1/stats/venues`, `/v1/stats/women`, `/v1/stats/movers`, `/v1/stats/activity`. How far the record agrees, field by field (free): `/v1/stats/quality`.

Events and the Olympics: `GET /v1/events?kind=amateur`, `GET /v1/olympics`, `GET /v1/olympics/{year}/medals`, `GET /v1/olympics/{year}/podiums`. The Youth Olympic Games (2010, 2014, 2018) are included and marked `youth: true`; `GET /v1/olympics?youth=false` leaves them out.

Your own usage, never counted: `GET /v1/usage`.

Every endpoint, with a real example answer: https://boxingapi.net/documentation. The whole API in one file: https://boxingapi.net/documentation/manual.md.

## The MCP server

`https://api.boxingapi.net/mcp`. Claude and ChatGPT connectors sign in with OAuth; other clients send `X-API-Key: YOUR_KEY`.

Tools: `my_usage`, `yesterdays_results`, `upcoming_fights`, `find_bouts`, `get_bout`, `find_fighter`, `get_fighter`, `get_rankings`, `fighter_rankings`, `get_upsets`, `win_streaks`, `head_to_head`, `find_events`, `event_bouts`, `todays_results`, `title_fights`, `fighter_next_fights`, `record_quality`. Each is described on https://boxingapi.net/documentation/mcp-tools.

## Limits

| Plan | Calls a day | Calls a minute | Reads |
| --- | --- | --- | --- |
| Free key | 50 | 10 | Yesterday's results, the fights ahead with prices held back, current rankings |
| Live | 5,000 | 60 | Prices, fighters, the last 12 months, cards, webhooks |
| Archive | 20,000 | 120 | All of history, judges and referees, most statistics, past ranking lists |
| Complete | 100,000 | 300 | Odds history, upsets, every statistic |

- Days reset at 00:00 UTC. Every answer carries the remaining calls in its headers.
- A field the plan does not open comes back as `null`, named in `meta.held_back` with the plan that opens it.
- Lists answer 50 records by default, up to 200 with `per_page`; use `page`, or `cursor` from `meta.next_cursor`.
- Write calls (webhooks) take a small JSON body.

## Errors

Every error is `{"error": {"code", "message", "docs"}}`; a plan refusal adds `plan` and `pricing`.

- 400 `bad_request`: a malformed parameter, or the key in the address. The message names it.
- 401 `unauthorized`: no key, or not a valid one.
- 403 `upgrade_required`: on a higher plan; `plan` names it. Tell the user which plan, do not retry.
- 404 `not_found`: no such endpoint or id.
- 422 `unknown_parameter`: the message lists the parameters the endpoint takes.
- 429 `rate_limited` (wait `Retry-After` seconds) or `quota_exceeded` (resets 00:00 UTC).
- 500 `server_error`: try once more.

## A typical workflow

1. Call `GET /v1/usage` (or `my_usage`) to learn the plan and what it opens.
2. Turn names into ids: `GET /v1/fighters?q=` for a fighter, `GET /v1/judges?q=` for a judge. Never guess an id.
3. Call the endpoint that answers the question with those ids and the narrowest filters (date, kind, body, division).
4. Page with `cursor` only when the user needs the whole list.
5. Answer from `data`, say when it was read (`meta.generated_at`, UTC), and if `meta.held_back` names a field, say which plan opens it.
