# GET /v1/teams

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

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

GET /v1/teams lists teams by league with the full name Novig uses in event descriptions and a stable slug that the markets filter takes. It refreshes with the event list, at most about 10 seconds behind on paid plans. Novig's daily CSVs carry no team names, checked 12 Nov 2026, so we resolve them. (Source: [Novig docs: Exchange Data](https://docs.novig.com/public-data/overview.md))

## What it returns

Novig writes full names in event descriptions (`Charlotte Hornets @ Phoenix Suns`) and abbreviations in game-line labels (`PHX +13.5`, `CHA @ PHX t104.5 1H`). We list each team once per league with a slug; pass it as `team` to [GET /v1/markets](https://novigapi.com/docs/endpoints/markets), which matches team markets and every market on that team's games.

## Parameters

Query and path parameters

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


## Request

```bash
curl -s "https://novigapi.com/api/v1/teams?league=NBA" \
  -H "Authorization: Bearer nv_..."
```

## Response

Trimmed to two rows, in league and slug order. Both teams appear in Novig's 12 Nov 2026 NBA catalog. Team rows are reference data, so they carry no honesty fields and `meta.observed_at` is null.

```json
{
  "data": [
    {
      "league": "NBA",
      "slug": "philadelphia-76ers",
      "name": "Philadelphia 76ers"
    },
    {
      "league": "NBA",
      "slug": "phoenix-suns",
      "name": "Phoenix Suns"
    }
  ],
  "meta": {
    "observed_at": null,
    "source_age_seconds": null,
    "edge_cached": null,
    "next_cursor": "bzI",
    "limit": 2,
    "count": 2,
    "plan": "developer",
    "credits_charged": 1,
    "credits_remaining": 9874,
    "credit_policy": "credits_v1"
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| league | string | League code. |
| slug | string | Stable team slug. |
| name | string | Full name from Novig's event description. |
| 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 50, maximum 1,000; Free pages hold at most 100 rows). A default page costs 1 credit. 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}"}

teams = requests.get("https://novigapi.com/api/v1/teams", params={"league": "NBA", "limit": 100}, headers=HEADERS, timeout=10).json()["data"]
name_to_slug = {t["name"]: t["slug"] for t in teams}
print(name_to_slug.get("Phoenix Suns"))  # phoenix-suns
```

## JavaScript

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

const res = await fetch("https://novigapi.com/api/v1/teams?league=NBA&limit=100", { headers });
const { data } = await res.json();
const suns = data.find((t) => t.name === "Phoenix Suns");
const markets = await (await fetch("https://novigapi.com/api/v1/markets?league=NBA&team=" + suns.slug, { headers })).json();
console.log(markets.data.length + " open markets on Suns games");
```

## Notes and edge cases

- College leagues reuse short names across conferences; always filter by `league` and use slugs.
- Game lines such as `PHX +13.5` carry no `team_slug`: both teams are outcomes. Team markets such as team totals carry the team's slug, and the markets `team` filter also matches games by their home and away names.

## Sources

- [Novig docs: Exchange Data](https://docs.novig.com/public-data/overview.md)
- [Novig API reference: List events](https://docs.novig.com/api-reference/catalog/list-events.md)
- [Novig docs: Universe model](https://docs.novig.com/api/concepts/universe-model.md)

---

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.
