# GET /v1/leagues

> Independent. Not affiliated with, endorsed by or sponsored by Novig.

Canonical: https://novigapi.com/docs/endpoints/leagues
Facts checked: 2026-11-12

GET /v1/leagues lists every league in Novig's catalog with its code, sport and open market and event counts, to drive every other filter. Counts refresh with the market list, at most about 10 seconds behind on paid plans. On 12 Nov 2026 Novig's public catalog listed 39 leagues. (Source: [Novig API reference: List leagues](https://docs.novig.com/api-reference/catalog/list-leagues.md))

## What it returns

The league codes every other endpoint accepts. Novig's own list changes rarely and is cached at its edge for an hour; the counts are ours and update with each sweep.

The 39 codes Novig listed on 12 Nov 2026: `NFL`, `NBA`, `MLB`, `NHL`, `NCAAF`, `NCAAB`, `NCAAWB`, `NCAABSB`, `WNBA`, `UFC`, `Boxing`, `CFL`, `MLS`, `FIFA Club World Cup`, `EPL`, `Bundesliga`, `Serie A`, `La Liga`, `Liga MX`, `Ligue 1`, `Champions League`, `Europa League`, `WTA`, `ATP`, `PGA`, `TGL`, `League of Legends`, `Counter Strike 2`, `Dota 2`, `Valorant`, `WBC`, `FIFA World Cup`, `Olympics Hockey Men`, `KBO`, `NPB`, `UEFA Nations League`, `F1`, `NASCAR`, `ENTERTAINMENT`.

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| limit | integer | No | Rows per page, 1 to 1,000. Default 100. Free returns at most 100. |
| cursor | string | No | `meta.next_cursor` from the previous page. |


## Request

```bash
curl -s "https://novigapi.com/api/v1/leagues" \
  -H "Authorization: Bearer nv_..."
```

## Response

Trimmed to one league; the full list is sorted by open markets, most first. The code and sport are real. `open_events` is the 12 NBA events in Novig's catalog in the 12 Nov 2026 capture, four of them that night and the rest in late December; `open_markets` is the NBA count from our collector's sweep that afternoon.

```json
{
  "data": [
    {
      "code": "NBA",
      "sport": "BASKETBALL",
      "name": "NBA",
      "open_markets": 4100,
      "open_events": 12,
      "observed_at": "2026-11-12T17:23:56.000Z",
      "source_age_seconds": 30,
      "edge_cached": true
    }
  ],
  "meta": {
    "observed_at": "2026-11-12T17:23:56.000Z",
    "source_age_seconds": 6,
    "edge_cached": true,
    "next_cursor": null,
    "limit": 100,
    "count": 1,
    "plan": "developer",
    "credits_charged": 1,
    "credits_remaining": 9874,
    "credit_policy": "credits_v1"
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| code | string | League code to pass as `league` elsewhere. Some contain spaces, such as `Serie A`; URL-encode them. |
| name | string | Display name. |
| sport | string or null | Sport, such as `BASKETBALL`. Null where Novig's list gives none. |
| open_markets | integer | Open markets in our copy of the catalog. |
| open_events | integer | Events that are pregame, in game or delayed. |
| observed_at | string (ISO 8601) or null | When our collector last read this row from Novig. |
| source_age_seconds | integer or null | Seconds between that read and our answer. |
| edge_cached | boolean | True when the value came through Novig's public CDN, which may serve a copy up to its cache time (5 to 10 seconds) older. |
| meta.next_cursor | string or null | Pass as `cursor` to get the next page. Null on the last page. |
| meta.limit, meta.count | integer | The page size used and the rows on this page. |
| meta.observed_at | string (ISO 8601) | When our collector read the oldest row in this answer from Novig's public catalog. Each row also carries its own `observed_at`. |
| meta.source_age_seconds | integer | Seconds between that read and our response. On paid plans this stays at about 10 or less. |
| meta.edge_cached | boolean | True when Novig's edge cache served any of the reads, so the source copy may itself be a few seconds old. |
| meta.plan, credits_charged, credits_remaining, credit_policy | string, integer | Your plan, what this call cost, the credits left this month and the credit rules version. |


## Credit cost

1 credit per call per 100 rows requested (the `limit` you send, default 100, maximum 1,000; Free pages hold at most 100 rows). A default page costs 1 credit. The whole list fits in one default page. Errors and 304 Not Modified cost 0; the `X-Credits-Cost` header and `meta.credits_charged` state the price of every call.

## Python

```python
import os
import requests

KEY = os.environ["NOVIGAPI_API_KEY"]  # nv_...
HEADERS = {"Authorization": f"Bearer {KEY}"}

leagues = requests.get("https://novigapi.com/api/v1/leagues", headers=HEADERS, timeout=10).json()["data"]
print([l["code"] for l in leagues if l["open_markets"]])
```

## JavaScript

```javascript
const KEY = process.env.NOVIGAPI_API_KEY; // nv_...
const headers = { Authorization: "Bearer " + KEY };

const res = await fetch("https://novigapi.com/api/v1/leagues", { headers });
const { data } = await res.json();
const select = data.map((l) => '<option value="' + encodeURIComponent(l.code) + '">' + l.name + "</option>").join("");
```

## Notes and edge cases

- Codes are case-sensitive and match Novig's: `Boxing` and `ENTERTAINMENT` are written exactly that way.
- Cache this response for an hour on your side; it changes far less often than prices.
- A league can be listed with no open markets between seasons.

## Sources

- [Novig API reference: List leagues](https://docs.novig.com/api-reference/catalog/list-leagues.md)
- [Novig docs: Universe model](https://docs.novig.com/api/concepts/universe-model.md)
- [Novig API docs](https://docs.novig.com)

---

Get a free API key: https://novigapi.com/sign-up . Docs: https://novigapi.com/docs . MCP: https://novigapi.com/api/mcp . Operated by Stunning Couches LLC. Independent. Not affiliated with, endorsed by or sponsored by Novig.
