# GET /v1/markets

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

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

GET /v1/markets lists Novig markets with best bid, ask, last trade, fair price, volume, open interest and the fee object, filtered by league, event, type or player. On paid plans data is at most about 10 seconds old. On 12 Nov 2026 Novig's public catalog cached market lists at the edge for 10 seconds. (Source: [Novig API reference: List markets](https://docs.novig.com/api-reference/catalog/list-markets.md))

## What it returns

One row per Novig market, ordered by start time and then market id, with every outcome's best bid, the computed ask, the last trade, our fair price and its odds. Player, team and stat slugs are resolved from Novig's descriptions for you. Without `status`, open markets come back. Use it to pull a league's whole board, then call [GET /v1/markets/{id}](https://novigapi.com/docs/endpoints/market) or [GET /v1/orderbook/{id}](https://novigapi.com/docs/endpoints/orderbook-snapshot) for detail.

Novig's catalog is large: a full sweep of open markets on 12 Nov 2026 was about 38,400 markets. Filter by league and market type rather than paging through everything.

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| league | string | No | League code from [GET /v1/leagues](https://novigapi.com/docs/endpoints/leagues), such as `NBA`. |
| event_id | string | No | Only markets for this event. |
| market_type | string | No | One Novig market type, such as `POINTS` or `SPREAD`. |
| player | string | No | Player slug, such as `cooper-flagg`. |
| team | string | No | Team slug, such as `phoenix-suns`. |
| status | string | No | `open`, `closed`, `settled`, `suspended` or `all`. |
| 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/markets?league=NBA&player=cooper-flagg&limit=2" \
  -H "Authorization: Bearer nv_..."
```

## Response

Two real NBA markets from Novig's public catalog on 12 Nov 2026. For Cooper Flagg 1.5 steals, the bids are 0.39 (Over) and 0.57 (Under), so the Over ask is 1 - 0.57 = 0.43 and its fair price is (0.39 + 0.43) / 2 = 0.41. The `meta` credit figures are an example Developer account.

```json
{
  "data": [
    {
      "market_id": "01a1d00f-ec01-71c0-9776-0facc97e44a7",
      "event_id": "01a1cac7-5c83-7e41-ba84-afe1af0c1ca6",
      "league": "NBA",
      "market_type": "STEALS",
      "description": "Cooper Flagg 1.5 STEALS",
      "strike": 1.5,
      "status": "OPEN",
      "player_slug": "cooper-flagg",
      "team_slug": null,
      "stat_slug": "steals",
      "starts_at": "2026-11-13T01:05:00.000Z",
      "fee_coefficient": 0.06,
      "fee_charged": "WHEN_LIVE",
      "maker_credit": 0.25,
      "volume": 198265,
      "open_interest": 146324,
      "first_seen": "2026-11-12T17:29:44.454Z",
      "closed_at": null,
      "event_description": "Dallas Mavericks @ Minnesota Timberwolves",
      "event_status": "OPEN_PREGAME",
      "outcomes": [
        {
          "outcome_id": "01a1d00f-ec01-71c0-9776-0fb0230cbd18",
          "name": "Over 1.5",
          "status": "PENDING",
          "bid": 0.39,
          "bid_qty": 18938,
          "ask": 0.43,
          "fair": 0.41,
          "last": 0.415,
          "spread_pp": 4,
          "american": 144,
          "decimal": 2.439
        },
        {
          "outcome_id": "01a1d00f-ec01-71c0-9776-0fc320d7d309",
          "name": "Under 1.5",
          "status": "PENDING",
          "bid": 0.57,
          "bid_qty": 7500,
          "ask": 0.61,
          "fair": 0.59,
          "last": 0.585,
          "spread_pp": 4,
          "american": -144,
          "decimal": 1.6949
        }
      ],
      "observed_at": "2026-11-12T17:23:56.000Z",
      "source_age_seconds": 6,
      "edge_cached": true
    },
    {
      "market_id": "01a1d01d-abda-7b01-adac-9b18792a43fb",
      "event_id": "01a1cac7-5c83-7e41-ba84-afe1af0c1ca6",
      "league": "NBA",
      "market_type": "STEALS_BLOCKS",
      "description": "Cooper Flagg 2.5 STEALS_BLOCKS",
      "strike": 2.5,
      "status": "OPEN",
      "player_slug": "cooper-flagg",
      "team_slug": null,
      "stat_slug": "steals-blocks",
      "starts_at": "2026-11-13T01:05:00.000Z",
      "fee_coefficient": 0.06,
      "fee_charged": "WHEN_LIVE",
      "maker_credit": 0.25,
      "volume": 31768,
      "open_interest": 31768,
      "first_seen": "2026-11-12T17:29:44.454Z",
      "closed_at": null,
      "event_description": "Dallas Mavericks @ Minnesota Timberwolves",
      "event_status": "OPEN_PREGAME",
      "outcomes": [
        {
          "outcome_id": "01a1d01d-abda-7b01-adac-9b2f0658ca6b",
          "name": "Over 2.5",
          "status": "PENDING",
          "bid": 0.41,
          "bid_qty": 91821,
          "ask": 0.57,
          "fair": 0.49,
          "last": 0.41,
          "spread_pp": 16,
          "american": 104,
          "decimal": 2.0408
        },
        {
          "outcome_id": "01a1d01d-abda-7b01-adac-9b3e8fecf2ca",
          "name": "Under 2.5",
          "status": "PENDING",
          "bid": 0.43,
          "bid_qty": 51627,
          "ask": 0.59,
          "fair": 0.51,
          "last": 0.59,
          "spread_pp": 16,
          "american": -104,
          "decimal": 1.9608
        }
      ],
      "observed_at": "2026-11-12T17:23:56.000Z",
      "source_age_seconds": 6,
      "edge_cached": true
    }
  ],
  "meta": {
    "observed_at": "2026-11-12T17:23:56.000Z",
    "source_age_seconds": 6,
    "edge_cached": true,
    "next_cursor": "eyJzIjoiMjAyNi0xMS0xM1QwMTowNTowMC4wMDAwMDBaIiwiaWQiOiIwMWExZDAxZC1hYmRhLTdiMDEtYWRhYy05YjE4NzkyYTQzZmIifQ",
    "limit": 2,
    "count": 2,
    "plan": "developer",
    "credits_charged": 1,
    "credits_remaining": 9874,
    "credit_policy": "credits_v1"
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| market_id | string | Novig market id (UUID). |
| event_id | string | The game or event the market belongs to. |
| league | string | League code, such as `NBA` or `NFL`. |
| market_type | string | Novig market type, such as `STEALS`, `SPREAD` or `RECEIVING_YARDS_PROTECTED`. |
| description | string | Novig's own label, such as `Cooper Flagg 1.5 STEALS`. |
| strike | number or null | The line. Novig serves it as a string; we return a number. |
| status | string | `OPEN` while listed, `CLOSED` once it leaves Novig's catalog. |
| player_slug | string or null | Player slug resolved from the description, such as `cooper-flagg`. Null on game and team markets. |
| team_slug | string or null | Team slug on team markets such as team totals. Null on game lines, whose sides are the outcomes. |
| stat_slug | string or null | Stat slug on player props, without the `_PROTECTED` suffix, such as `steals`. |
| starts_at | string (ISO 8601) | Scheduled start in UTC, converted from Novig's `startsTs` in milliseconds. |
| fee_coefficient | number | Novig's `market.fee.coefficient`, 0.06 on every schedule checked 12 Nov 2026. |
| fee_charged | string or null | Novig's `market.fee.charged`: `WHEN_LIVE` (taker pays only while the event is `OPEN_INGAME`) or `ALWAYS` (major US league futures). Null until our collector has stored it for the market. |
| maker_credit | number or null | Novig's `market.fee.makerCredit`: the maker's share of the taker fee, 0.25 on game markets and 0.5 on futures since 22 Oct 2026. |
| volume | integer | Contracts traded, all time. One Novig API contract pays $0.01 if it wins. |
| open_interest | integer | Contracts outstanding, netted per wallet by Novig. |
| first_seen, closed_at | string or null | When our collector first listed the market, and when it left Novig's catalog (null while open). |
| event_description, event_status | string or null | The event's label, such as `Dallas Mavericks @ Minnesota Timberwolves`, and its status, such as `OPEN_PREGAME`. |
| outcomes[].outcome_id | string | Novig outcome id. |
| outcomes[].name | string | Outcome label, such as `Over 1.5` or `PHX +13.5`. |
| outcomes[].status | string or null | `PENDING` until the outcome is graded (Novig's to-be-decided status), then Novig's grade. |
| outcomes[].bid | number or null | Best resting bid, as a probability from 0 to 1. Null when nobody is bidding. |
| outcomes[].bid_qty | integer or null | Contracts resting at the best bid. One contract pays $0.01. |
| outcomes[].ask | number or null | Price to buy now: 1 minus the best bid on the other outcome. Novig's book holds bids only. Two-outcome markets only. |
| outcomes[].fair | number or null | Fair price: (bid + (1 - other bid)) / 2. Null unless both outcomes have a bid. |
| outcomes[].last | number or null | Last traded price. |
| outcomes[].spread_pp | number or null | Ask minus bid, in percentage points. |
| outcomes[].american, outcomes[].decimal | number or null | The fair price (or the last price when there is no fair) as American and decimal odds. |
| 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 50, maximum 1,000; Free pages hold at most 100 rows). A default page costs 1 credit. A page of 500 costs 5. See [rate limits and credits](https://novigapi.com/docs/endpoints/rate-limits). 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}"}

params = {"league": "NBA", "market_type": "STEALS", "limit": 100}
rows = []
while True:
    r = requests.get("https://novigapi.com/api/v1/markets", params=params, headers=HEADERS, timeout=10)
    r.raise_for_status()
    page = r.json()
    rows.extend(page["data"])
    if not page["meta"]["next_cursor"]:
        break
    params["cursor"] = page["meta"]["next_cursor"]

for m in rows:
    over = m["outcomes"][0]
    print(m["description"], over["bid"], over["ask"], over["fair"])
```

## JavaScript

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

const url = new URL("https://novigapi.com/api/v1/markets");
url.searchParams.set("league", "NBA");
url.searchParams.set("market_type", "STEALS");

const res = await fetch(url, { headers });
if (!res.ok) throw new Error("novigapi " + res.status);
const { data, meta } = await res.json();
for (const m of data) {
  const [over, under] = m.outcomes;
  console.log(m.description, over.fair, under.fair, meta.source_age_seconds + " s old");
}
```

## Notes and edge cases

- Novig's book holds bids only, so `ask` is always derived: 1 minus the best bid on the other outcome. When the other side has no bid, `ask` is null.
- `fair` needs a bid on both sides. One-sided markets, such as Cooper Flagg 11.5 rebounds plus assists on 12 Nov 2026 (only an Under bid of 0.23), return `fair: null`.
- Prices are probabilities from 0 to 1. Novig's app shows them as percentages, so 0.41 is 41%.
- `_PROTECTED` market types are separate markets with their own book. See [protected props](https://novigapi.com/guides/novig-protected-props).
- Fees are not in the price. Novig's taker fee is fee = 0.06 x P x (1 - P) x contracts x $0.01 (P is the fill price as a probability; one contract pays $0.01), so 0.06 x P x (1 - P) per $1 of payout. Game markets charge it only while the event is live (`fee_charged: WHEN_LIVE`); futures in NFL, NCAAF, NCAAB, NCAAWB, MLB, NBA, WNBA and NHL charge it in every phase (`ALWAYS`); golf, tennis, UFC, F1 and NASCAR futures and series winners never do. Makers never pay it (Novig docs, Trading fees, checked 12 Nov 2026).
- Do not poll faster than about every 10 seconds: Novig's edge cache means a faster poll returns the same data and still costs credits.

## Sources

- [Novig API reference: List markets](https://docs.novig.com/api-reference/catalog/list-markets.md)
- [Novig API docs](https://docs.novig.com)
- [Novig API docs: Trading fees](https://docs.novig.com/api/concepts/fees.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.
