---
title: "NCAA tournament bracket (men's + women's)"
method: GET
path: "/v1/ncaab/tournament"
tags: ["ncaab"]
---

# NCAA tournament bracket (men's + women's)

`GET /v1/ncaab/tournament`

## Request

- Base URL: `https://api.bigballsdata.com`
- URL: `https://api.bigballsdata.com/v1/ncaab/tournament`
- Auth: one of:
  - API key in header `x-api-key`
  - HTTP bearer

March Madness bracket games (seeds, rounds, scores and winners) for NCAAB (men's) and NCAAW (women's) (migration 278). `?season=` is required: the table is additive across tournament years but today holds season 2025 only (134 rows: 67 men's + 67 women's), which is the bracket PLAYED between 17 March and 7 April 2026. A season label is the year the season BEGAN, not the year it was played, so `?season=2026` is a tournament that has not been played yet; it returns an empty list with a `meta.note` explaining that rather than a bare empty 200. `round` is the feed's own observed numbering: 0 = First Four, 1 through 5 = Round of 64 through Elite Eight, 6 = Championship. `?limit=` defaults to 200 so that one request returns a whole bracket; any short page carries a `meta.note` saying how many games matched. Region labels are not populated on any row currently held, so `?region=` matches nothing; select a stage with `?round=` instead.

## Query parameters

- `season` integer, required
- `gender` 'men' | 'women'
- `round` integer
- `region` string
- `limit` integer
- `offset` integer
- `page` integer

## Response `200`

ok. `data` is an array of bracket games (empty when the filter genuinely matches nothing, or when the season has no data yet; `meta.note` says which). `meta` carries `count` (rows in this page), `total` (rows matching the filter), `limit` and `offset`.

- object: The standard response wrapper. Only `data` is guaranteed. `error` is absent (not null) on 16 of 40 live 200 responses measured 2026-09-18, so test for the KEY before reading it; this block declared it required until then. On a non-2xx, `error` is present and `data` is absent.
  - `data` object[], required
    - `gender` 'men' | 'women'
    - `season` integer
    - `round` integer
    - `region_id` integer, nullable
    - `region_label` string, nullable
    - `bracket_location` integer, nullable
    - `scheduled_at` string, date-time, nullable
    - `venue` string, nullable
    - `status` string, nullable
    - `status_state` string
    - `home_team` object
      - `school` string, nullable: School name, e.g. "NC State".
      - `name` string, nullable: Mascot only, e.g. "Wolfpack".
      - `full_name` string, nullable: School + mascot, e.g. "NC State Wolfpack". Use this to render a bracket.
      - `abbreviation` string, nullable: The school's own short form, e.g. "NCSU". Stable across seasons; not a joinable BBS team id; no bridge exists between bracket rows and /v1/teams.
      - `seed` string, nullable
      - `score` integer, nullable
      - `winner` boolean, nullable
    - `away_team` object
      - `school` string, nullable: School name, e.g. "TCU".
      - `name` string, nullable: Mascot only, e.g. "Horned Frogs".
      - `full_name` string, nullable: School + mascot, e.g. "TCU Horned Frogs". Use this to render a bracket.
      - `abbreviation` string, nullable: The school's own short form, e.g. "TCU". Stable across seasons; not a joinable BBS team id.
      - `seed` string, nullable
      - `score` integer, nullable
      - `winner` boolean, nullable
    - `updated_at` string, date-time
  - `meta` object: Response metadata. NOTHING here is guaranteed: measured over 38 live envelopes on 2026-09-18, `cached` and `request_id` appeared in 29, `source` in 28, `cache_age_ms` in 9 and `confidence` in 6. This block previously declared all five REQUIRED, which no response has ever satisfied. Treat every field as optional and branch on its absence. Routes add their own keys here (`count`, `limit`, `offset`, `note`, `total`, and per-endpoint ones), so do not assume a closed set.
    - `date_window` object: Present when ?date= was applied. The exact window the filter used, so an omission at a day boundary is visible. start_utc is inclusive, end_utc exclusive. timezone is UTC, or the zone named by ?tz=, in which case the window is that local day. Boxing card dates are published event dates, so timezone and bounds are null there.
      - `date` string
      - `timezone` string, nullable
      - `start_utc` string, date-time, nullable
      - `end_utc` string, date-time, nullable
      - `note` string
    - `source` 'official-league' | 'aggregator-paid' | 'aggregator-free' | 'community-scraper' | 'forecast' | 'mixed' | 'cache' | 'none' | 'unknown-source' | 'stored' | 'catalogue' | 'gateway' | 'coverage-snapshot': Opaque source-tier label. Customers never see the vendor identity. `forecast` marks a weather forecast (GET /v1/matches/{id}/weather).
    - `confidence` number, float
    - `cached` boolean
    - `cache_age_ms` integer
    - `request_id` string
    - `fields_missing` string[]
    - `note` string: Present only when the result needs explaining: the page is shorter than `total` (says how to fetch the rest), the season is not one we hold (names the seasons that are), or the filter cannot match at all (`?region=`, which has no populated data).
    - `count` integer: Rows in this page.
    - `total` integer: Rows matching the filter, before limit/offset.
    - `limit` integer
    - `offset` integer
  - `error` ApiError
    - `code` string, required
    - `message` string, required
    - `details` unknown

## Other responses

- `400`: Invalid query parameters: a missing ?season=, an out-of-range ?round=, or an out-of-range ?limit/?offset.

---

[API](https://skmtc.dev/bigballsdata/apis/big-ball-sports-api.md) · [All operations](https://skmtc.dev/bigballsdata/apis/big-ball-sports-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bigballsdata/apis/big-ball-sports-api/revisions/31fb54ac414e?raw)
