# AlliSports Data feed

Live medal table, results and schedule of university games, starting with the
**West African University Games 2026** (Obafemi Awolowo University, Ile-Ife, 2–12 October 2026).

## Getting started

1. **Get a key.** Ask AlliSports Data (Alli Media Hub) for a feed key, named after your site.
   It looks like `asd_…` and is shown once: keep it secret, on your server.
2. **Send it in the `x-api-key` header** with every request.
3. **Call the feed from your server**, never from visitors' browsers (that would expose your key).

```bash
curl https://data.allimediahub.com/api/waug/2026/medal-table \
  -H "x-api-key: asd_your_key"
```

```javascript
// Node.js 18+ (server side)
const res = await fetch('https://data.allimediahub.com/api/waug/2026/medal-table', {
  headers: { 'x-api-key': process.env.ALLISPORTS_KEY },
})
const { data } = await res.json()
console.log(data.rows[0].university.name, data.rows[0].medals.gold)
```

```php
<?php // e.g. in a WordPress plugin or theme (server side)
$response = wp_remote_get('https://data.allimediahub.com/api/waug/2026/medal-table', [
  'headers' => ['x-api-key' => ALLISPORTS_KEY],
]);
$table = json_decode(wp_remote_retrieve_body($response), true);
echo $table['data']['rows'][0]['university']['name'];
```

## What the data means

- **provisional**: entered at the venue by our staff, not yet confirmed.
  **official**: confirmed by the WAUG Technical Committee. **disputed**: under review; its medals are
  withheld and it is left out of the medal table until settled. `includesProvisional` on every
  response tells you whether any number in it is not yet confirmed.
- The **medal table is calculated** from the results on every request: gold, then silver, then
  bronze; tied universities share a rank and the next rank is skipped (1, 1, 3).
- Judo, taekwondo, boxing and wrestling award **two bronzes** (`bronze_1`, `bronze_2`).
- Times are **UTC**; events also carry `startsAtLocal` in Nigeria time (WAT, UTC+1).

## Staying up to date

Results change every few minutes during the games. Poll
`/results?updatedSince=<generatedAt of your last call>` every 15–30 seconds to get only what
changed, and refresh the medal table when anything did.

## Fair use

Each key may make **60 requests a minute** and **10,000 a day**. Every response carries the IETF
`RateLimit-Policy` and `RateLimit` headers (`r` = requests left, `t` = seconds until the window
resets). Over the limit you get `429` with a `Retry-After` header. Errors are
[RFC 9457](https://www.rfc-editor.org/rfc/rfc9457) problem documents.

## Our promise

`apiVersion` 1 only grows: we may add fields and endpoints, but never rename, remove or change the
meaning of one. Please credit **"Data: AlliSports Data"** where you show it.

## Changelog

- **2026-09-28** — `apiVersion` 1: medal table, results (`updatedSince`), schedule, events,
  sports, universities.

## Endpoints

Base address: `https://data.allimediahub.com`. Every endpoint needs the `x-api-key` header.

### The medal table

`GET /api/{series}/{edition}/medal-table`

Calculated from the recorded results on every request: ranked by gold, then silver, then bronze; tied universities share a rank and the next rank is skipped (1, 1, 3). Disputed events are left out until settled.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |
| `status` | query | no | `all` / `official` | official = count confirmed results only. |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": {
    "status": "all",
    "rows": [
      {
        "rank": 1,
        "university": {
          "code": "OAU",
          "name": "Obafemi Awolowo University",
          "country": "NG"
        },
        "medals": {
          "gold": 1,
          "silver": 1,
          "bronze": 1,
          "total": 1
        },
        "provisionalMedals": 1
      }
    ],
    "totals": {
      "gold": 1,
      "silver": 1,
      "bronze": 1
    },
    "disputedEvents": 1
  }
}
```

Errors: `401` No key, or the key is unknown or revoked; `429` Over the fair-use limit; wait `Retry-After` seconds.

### Every event and its current result

`GET /api/{series}/{edition}/results`

During the games, poll with `updatedSince` (the `generatedAt` of your last call) to get only what changed.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |
| `sport` | query | no | string | Sport code, see /sports. Example: `ATH`. |
| `status` | query | no | `all` / `official` | official = count confirmed results only. |
| `updatedSince` | query | no | string (date-time) | Only results changed after this time. Example: `2026-10-03T14:00:00.000Z`. |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": [
    {
      "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
      "sport": {
        "code": "JUD",
        "name": "Judo"
      },
      "gender": "men",
      "category": "−73 kg",
      "kind": "individual",
      "medalRule": "standard",
      "startsAt": "2026-10-03T14:00:00.000Z",
      "startsAtLocal": "2026-10-03T15:00:00+01:00",
      "venue": "string",
      "status": "scheduled",
      "result": {
        "version": 1,
        "status": "provisional",
        "entrants": 1,
        "updatedAt": "2026-10-03T14:05:12.000Z",
        "confirmedAt": "string",
        "medals": [
          {
            "slot": "gold",
            "colour": "gold",
            "university": {
              "code": "OAU",
              "name": "Obafemi Awolowo University"
            },
            "athleteName": "Ada Okafor"
          }
        ]
      }
    }
  ]
}
```

Errors: `401` No key, or the key is unknown or revoked; `429` Over the fair-use limit; wait `Retry-After` seconds.

### The schedule

`GET /api/{series}/{edition}/events`

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |
| `sport` | query | no | string | Sport code, see /sports. Example: `ATH`. |
| `date` | query | no | string (date) | A day in Nigeria time. Example: `2026-10-03`. |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": [
    {
      "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
      "sport": {
        "code": "JUD",
        "name": "Judo"
      },
      "gender": "men",
      "category": "−73 kg",
      "kind": "individual",
      "medalRule": "standard",
      "startsAt": "2026-10-03T14:00:00.000Z",
      "startsAtLocal": "2026-10-03T15:00:00+01:00",
      "venue": "string",
      "status": "scheduled"
    }
  ]
}
```

Errors: `401` No key, or the key is unknown or revoked; `429` Over the fair-use limit; wait `Retry-After` seconds.

### One event, its result and its history

`GET /api/{series}/{edition}/events/{eventId}`

The history lists every version of the result, with the reason for each correction.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |
| `eventId` | path | yes | string (uuid) |  |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": {
    "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
    "sport": {
      "code": "JUD",
      "name": "Judo"
    },
    "gender": "men",
    "category": "−73 kg",
    "kind": "individual",
    "medalRule": "standard",
    "startsAt": "2026-10-03T14:00:00.000Z",
    "startsAtLocal": "2026-10-03T15:00:00+01:00",
    "venue": "string",
    "status": "scheduled",
    "result": {
      "version": 1,
      "status": "provisional",
      "entrants": 1,
      "updatedAt": "2026-10-03T14:05:12.000Z",
      "confirmedAt": "string",
      "medals": [
        {
          "slot": "gold",
          "colour": "gold",
          "university": {
            "code": "OAU",
            "name": "Obafemi Awolowo University"
          },
          "athleteName": "Ada Okafor"
        }
      ]
    },
    "history": [
      {
        "version": 1,
        "status": "provisional",
        "reason": "string",
        "createdAt": "string",
        "confirmedAt": "string"
      }
    ]
  }
}
```

Errors: `401` No key, or the key is unknown or revoked; `404` No such event; `429` Over the fair-use limit; wait `Retry-After` seconds.

### Sports and their codes

`GET /api/{series}/{edition}/sports`

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": [
    {
      "code": "JUD",
      "name": "Judo",
      "events": 1
    }
  ]
}
```

Errors: `401` No key, or the key is unknown or revoked; `429` Over the fair-use limit; wait `Retry-After` seconds.

### Universities taking part, with their medal counts

`GET /api/{series}/{edition}/universities`

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": [
    {
      "code": "OAU",
      "name": "Obafemi Awolowo University",
      "country": "NG",
      "medals": {
        "gold": 1,
        "silver": 1,
        "bronze": 1,
        "total": 1
      }
    }
  ]
}
```

Errors: `401` No key, or the key is unknown or revoked; `429` Over the fair-use limit; wait `Retry-After` seconds.

### One university and every medal it has won

`GET /api/{series}/{edition}/universities/{code}`

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |
| `code` | path | yes | string |  Example: `OAU`. |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": {
    "code": "OAU",
    "name": "Obafemi Awolowo University",
    "country": "NG",
    "medals": {
      "gold": 1,
      "silver": 1,
      "bronze": 1,
      "total": 1
    },
    "medalList": [
      {
        "event": {
          "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
          "sport": {
            "code": "JUD",
            "name": "Judo"
          },
          "gender": "men",
          "category": "−73 kg"
        },
        "slot": "gold",
        "colour": "gold",
        "athleteName": "string",
        "status": "provisional"
      }
    ]
  }
}
```

Errors: `401` No key, or the key is unknown or revoked; `404` No such university in these games; `429` Over the fair-use limit; wait `Retry-After` seconds.

### Every match with its live score

`GET /api/{series}/{edition}/matches`

Team sports recorded on the pad (football first). Poll every 15–30 seconds during play; the minute can be counted locally from `clock`.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": {
    "matches": [
      {
        "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
        "eventId": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
        "sport": "FBL",
        "event": "Men's football",
        "phase": "Group A",
        "stage": "string",
        "startsAt": "2026-10-03T15:00:00.000Z",
        "venue": "string",
        "status": "scheduled",
        "home": {
          "code": "OAU",
          "name": "Obafemi Awolowo University"
        },
        "away": {
          "code": "OAU",
          "name": "Obafemi Awolowo University"
        },
        "score": {
          "home": 1,
          "away": 1
        },
        "halfTime": {
          "home": 1,
          "away": 1
        },
        "penalties": {
          "home": 1,
          "away": 1
        },
        "winner": "home",
        "awarded": {
          "home": 1,
          "away": 1,
          "reason": "string"
        },
        "official": true,
        "extraTime": true,
        "periodScores": [
          {
            "period": "string",
            "home": 1,
            "away": 1
          }
        ],
        "lead": [
          1
        ],
        "clock": {
          "period": "H1",
          "running": true,
          "periodStartedAt": "string",
          "startMinute": 1,
          "length": 1
        },
        "marks": [
          {
            "side": "home",
            "type": "goal",
            "minute": 1,
            "addedMinute": 1
          }
        ]
      }
    ]
  }
}
```

Errors: `401` No key, or the key is unknown or revoked; `429` Over the fair-use limit; wait `Retry-After` seconds.

### One match: play-by-play and line-ups

`GET /api/{series}/{edition}/matches/{matchId}`

Line-ups appear once both team sheets are locked (an hour before kick-off by default).

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |
| `matchId` | path | yes | string (uuid) |  |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": {
    "match": {
      "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
      "eventId": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
      "sport": "FBL",
      "event": "Men's football",
      "phase": "Group A",
      "stage": "string",
      "startsAt": "2026-10-03T15:00:00.000Z",
      "venue": "string",
      "status": "scheduled",
      "home": {
        "code": "OAU",
        "name": "Obafemi Awolowo University"
      },
      "away": {
        "code": "OAU",
        "name": "Obafemi Awolowo University"
      },
      "score": {
        "home": 1,
        "away": 1
      },
      "halfTime": {
        "home": 1,
        "away": 1
      },
      "penalties": {
        "home": 1,
        "away": 1
      },
      "winner": "home",
      "awarded": {
        "home": 1,
        "away": 1,
        "reason": "string"
      },
      "official": true,
      "extraTime": true,
      "periodScores": [
        {
          "period": "string",
          "home": 1,
          "away": 1
        }
      ],
      "lead": [
        1
      ],
      "clock": {
        "period": "H1",
        "running": true,
        "periodStartedAt": "string",
        "startMinute": 1,
        "length": 1
      },
      "marks": [
        {
          "side": "home",
          "type": "goal",
          "minute": 1,
          "addedMinute": 1
        }
      ]
    },
    "timeline": [
      {
        "type": "goal",
        "period": "H1",
        "side": "home",
        "minute": 1,
        "addedMinute": 1,
        "player": {
          "name": "string",
          "shirt": 1
        },
        "other": {
          "name": "string",
          "shirt": 1
        }
      }
    ],
    "lineups": {
      "home": [
        {}
      ],
      "away": [
        {}
      ]
    },
    "box": {},
    "crew": [
      {
        "role": "string",
        "name": "string",
        "level": "string"
      }
    ]
  }
}
```

Errors: `401` No key, or the key is unknown or revoked; `404` No such match; `429` Over the fair-use limit; wait `Retry-After` seconds.

### Group tables and the knockout rounds of a team event

`GET /api/{series}/{edition}/events/{eventId}/competition`

Worked out from the matches with the event's own points and tie-breaker order; `notes` say how teams level on points were separated.

| Parameter | In | Required | Type | Description |
| --- | --- | --- | --- | --- |
| `series` | path | yes | string | Games series. Example: `waug`. |
| `edition` | path | yes | string | Games year. Example: `2026`. |
| `eventId` | path | yes | string (uuid) |  |

Example response:

```json
{
  "apiVersion": "1",
  "generatedAt": "2026-10-03T14:05:12.000Z",
  "games": {
    "series": "waug",
    "edition": 2026,
    "name": "West African University Games 2026"
  },
  "includesProvisional": true,
  "data": {
    "event": {
      "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
      "name": "string",
      "sport": "string"
    },
    "rules": {
      "points": {
        "win": 1,
        "draw": 1,
        "loss": 1
      },
      "tieBreakers": [
        "string"
      ]
    },
    "groups": [
      {
        "id": "string",
        "name": "string",
        "advance": 1,
        "complete": true,
        "rows": [
          {
            "position": 1,
            "team": {
              "code": "OAU",
              "name": "Obafemi Awolowo University"
            },
            "played": 1,
            "won": 1,
            "drawn": 1,
            "lost": 1,
            "goalsFor": 1,
            "goalsAgainst": 1,
            "goalDifference": 1,
            "points": 1,
            "conduct": 1,
            "qualifies": true,
            "needsLots": true,
            "live": true
          }
        ],
        "notes": [
          "string"
        ],
        "matches": [
          {
            "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
            "eventId": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
            "sport": "FBL",
            "event": "Men's football",
            "phase": "Group A",
            "stage": "string",
            "startsAt": "2026-10-03T15:00:00.000Z",
            "venue": "string",
            "status": "scheduled",
            "home": {
              "code": "OAU",
              "name": "Obafemi Awolowo University"
            },
            "away": {
              "code": "OAU",
              "name": "Obafemi Awolowo University"
            },
            "score": {
              "home": 1,
              "away": 1
            },
            "halfTime": {
              "home": 1,
              "away": 1
            },
            "penalties": {
              "home": 1,
              "away": 1
            },
            "winner": "home",
            "awarded": {
              "home": 1,
              "away": 1,
              "reason": "string"
            },
            "official": true,
            "extraTime": true,
            "periodScores": [
              {
                "period": "string",
                "home": 1,
                "away": 1
              }
            ],
            "lead": [
              1
            ],
            "clock": {
              "period": "H1",
              "running": true,
              "periodStartedAt": "string",
              "startMinute": 1,
              "length": 1
            },
            "marks": [
              {
                "side": "home",
                "type": "goal",
                "minute": 1,
                "addedMinute": 1
              }
            ]
          }
        ]
      }
    ],
    "bestPlaced": {},
    "rounds": [
      {
        "id": "string",
        "name": "string",
        "level": "penalties",
        "placement": 1,
        "matches": [
          {
            "id": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
            "eventId": "0192f3a0-7c1d-7b2e-9f10-5a3b2c1d4e5f",
            "sport": "FBL",
            "event": "Men's football",
            "phase": "Group A",
            "stage": "string",
            "startsAt": "2026-10-03T15:00:00.000Z",
            "venue": "string",
            "status": "scheduled",
            "home": {
              "code": "OAU",
              "name": "Obafemi Awolowo University"
            },
            "away": {
              "code": "OAU",
              "name": "Obafemi Awolowo University"
            },
            "score": {
              "home": 1,
              "away": 1
            },
            "halfTime": {
              "home": 1,
              "away": 1
            },
            "penalties": {
              "home": 1,
              "away": 1
            },
            "winner": "home",
            "awarded": {
              "home": 1,
              "away": 1,
              "reason": "string"
            },
            "official": true,
            "extraTime": true,
            "periodScores": [
              {
                "period": "string",
                "home": 1,
                "away": 1
              }
            ],
            "lead": [
              1
            ],
            "clock": {
              "period": "H1",
              "running": true,
              "periodStartedAt": "string",
              "startMinute": 1,
              "length": 1
            },
            "marks": [
              {
                "side": "home",
                "type": "goal",
                "minute": 1,
                "addedMinute": 1
              }
            ]
          }
        ]
      }
    ]
  }
}
```

Errors: `401` No key, or the key is unknown or revoked; `404` No such event, or no competition settings yet; `429` Over the fair-use limit; wait `Retry-After` seconds.

## Data types

### MedalTableResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | MedalTable |  |

### Games

| Field | Type | Description |
| --- | --- | --- |
| `series` | string |  |
| `edition` | integer |  |
| `name` | string |  |

### MedalTable

| Field | Type | Description |
| --- | --- | --- |
| `status` | `all` / `official` |  |
| `rows` | array of MedalTableRow |  |
| `totals` | object |  |
| `disputedEvents` | integer |  |

### MedalTableRow

| Field | Type | Description |
| --- | --- | --- |
| `rank` | integer | Ties share a rank; the next rank is skipped |
| `university` | object |  |
| `medals` | MedalCounts |  |
| `provisionalMedals` | integer |  |

### UniversityRef

| Field | Type | Description |
| --- | --- | --- |
| `code` | string |  |
| `name` | string |  |

### MedalCounts

| Field | Type | Description |
| --- | --- | --- |
| `gold` | integer |  |
| `silver` | integer |  |
| `bronze` | integer |  |
| `total` | integer |  |

### Problem

| Field | Type | Description |
| --- | --- | --- |
| `type` | string |  |
| `title` | string |  |
| `status` | integer |  |
| `detail` | string |  |

### ResultsResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | array of EventWithResult |  |

### SportRef

| Field | Type | Description |
| --- | --- | --- |
| `code` | string |  |
| `name` | string |  |

### Result

| Field | Type | Description |
| --- | --- | --- |
| `version` | integer |  |
| `status` | `provisional` / `disputed` / `official` | provisional: entered at the venue, not yet confirmed. official: confirmed by the Technical Committee. disputed: under review; medals withheld. |
| `entrants` | integer or null |  |
| `updatedAt` | string |  |
| `confirmedAt` | string or null |  |
| `medals` | array of Medal |  |

### Medal

| Field | Type | Description |
| --- | --- | --- |
| `slot` | `gold` / `silver` / `bronze_1` / `bronze_2` | Two-bronze events (judo, taekwondo, boxing, wrestling) use bronze_1 and bronze_2. |
| `colour` | `gold` / `silver` / `bronze` |  |
| `university` | UniversityRef |  |
| `athleteName` | string or null |  |

### Event

| Field | Type | Description |
| --- | --- | --- |
| `id` | string (uuid) |  |
| `sport` | SportRef |  |
| `gender` | `men` / `women` / `mixed` / `open` |  |
| `category` | string |  |
| `kind` | `individual` / `team` |  |
| `medalRule` | `standard` / `two_bronze` |  |
| `startsAt` | string or null | UTC |
| `startsAtLocal` | string or null | The same moment in Nigeria time (WAT) |
| `venue` | string or null |  |
| `status` | `scheduled` / `in_progress` / `finished` / `cancelled` |  |

### EventsResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | array of Event |  |

### EventResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | EventDetail |  |

### ResultVersion

| Field | Type | Description |
| --- | --- | --- |
| `version` | integer |  |
| `status` | `provisional` / `disputed` / `official` / `superseded` |  |
| `reason` | string or null | Why a correction was made |
| `createdAt` | string |  |
| `confirmedAt` | string or null |  |

### SportsResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | array of Sport |  |

### UniversitiesResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | array of University |  |

### UniversityResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | UniversityDetail |  |

### UniversityMedal

| Field | Type | Description |
| --- | --- | --- |
| `event` | object |  |
| `slot` | `gold` / `silver` / `bronze_1` / `bronze_2` | Two-bronze events (judo, taekwondo, boxing, wrestling) use bronze_1 and bronze_2. |
| `colour` | `gold` / `silver` / `bronze` |  |
| `athleteName` | string or null |  |
| `status` | `provisional` / `official` |  |

### MatchesResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | object |  |

### MatchSummary

| Field | Type | Description |
| --- | --- | --- |
| `id` | string (uuid) |  |
| `eventId` | string (uuid) |  |
| `sport` | string | FBL football, BKB basketball |
| `event` | string |  |
| `phase` | string |  |
| `stage` | string or null | The group or round id, when set |
| `startsAt` | string |  |
| `venue` | string or null |  |
| `status` | `scheduled` / `live` / `finished` |  |
| `home` | object |  |
| `away` | object |  |
| `score` | object or null | Null before kick-off |
| `halfTime` | object or null |  |
| `penalties` | object or null | The shoot-out score, when there was one |
| `winner` | `home` / `away` / `null` |  |
| `awarded` | object or null | A result awarded by the Technical Committee (e.g. a forfeit) |
| `official` | boolean | The referee has confirmed the match report |
| `extraTime` | boolean | Extra time (or basketball overtime) was played |
| `periodScores` | array or null | Basketball: points scored in each quarter and overtime |
| `lead` | array or null | Basketball: home minus away after every basket (the lead line) |
| `clock` | MatchClock |  |
| `marks` | array of object |  |

### MatchClock

| Field | Type | Description |
| --- | --- | --- |
| `period` | `H1` / `H2` / `ET1` / `ET2` / `PSO` / `Q1` / `Q2` / `Q3` / `Q4` / `OT1` / `OT2` / `OT3` / `OT4` / `OT5` / `OT6` / `OT7` / `OT8` / `OT9` / `null` |  |
| `running` | boolean |  |
| `periodStartedAt` | string or null | When the running period started. Minute = startMinute + whole minutes since, plus 1; past `length`, it is added time (45+2). |
| `startMinute` | integer |  |
| `length` | integer |  |

### MatchResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | MatchDetail |  |

### MatchDetail

| Field | Type | Description |
| --- | --- | --- |
| `match` | MatchSummary |  |
| `timeline` | array of object |  |
| `lineups` | object or null | Shown once both team sheets are locked |
| `box` | object or null | Basketball: each player’s points and fouls, team fouls this period |
| `crew` | array of object | The officials and their level (basketball) |

### CompetitionResponse

| Field | Type | Description |
| --- | --- | --- |
| `apiVersion` | `1` |  |
| `generatedAt` | string |  |
| `games` | Games |  |
| `includesProvisional` | boolean | True when any number in `data` comes from a result not yet confirmed. |
| `data` | Competition |  |

### Competition

| Field | Type | Description |
| --- | --- | --- |
| `event` | object |  |
| `rules` | object |  |
| `groups` | array of object |  |
| `bestPlaced` | object or null |  |
| `rounds` | array of object |  |
