# GET /v1/orderbook/{id}

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

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

GET /v1/orderbook/{id} returns the resting bids on a Novig market, per outcome and price level, with quantity, order count and a sequence number. On paid plans it is at most about 10 seconds old. On 12 Nov 2026 Novig's public catalog cached order books at the edge for 5 seconds, the shortest cache it uses. (Source: [Novig API reference: Get the order book](https://docs.novig.com/api-reference/catalog/get-the-order-book.md))

## What it returns

The book by price level, best price first. Each level sums the resting quantity at that price and counts the orders behind it. `depth: full` means the levels come from our latest full book snapshot, taken at most once a minute per market while its book changes; `seq` is Novig's sequence number for that snapshot and only grows. When we hold no snapshot yet, `depth: top_only` returns the best bid from the catalog and `seq` is null.

Novig's book holds bids only. There are no resting asks: buying Over at 0.43 means filling against a resting Under bid at 0.57. So the depth you can buy into on one outcome is the bid depth on the other.

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| id | string (path) | Yes | Novig market id. |


## Request

```bash
curl -s "https://novigapi.com/api/v1/orderbook/01a1d00f-ec01-71c0-9776-0facc97e44a7" \
  -H "Authorization: Bearer nv_..."
```

## Response

The best level on each side is the real best bid on Cooper Flagg 1.5 steals on 12 Nov 2026 (0.39 Over, 0.57 Under); the deeper levels and `seq` are illustrative. A busy book has many more levels: Novig's NYG and WSH moneyline held 68 and 75 resting orders when we measured it.

```json
{
  "data": {
    "market_id": "01a1d00f-ec01-71c0-9776-0facc97e44a7",
    "seq": 48213,
    "depth": "full",
    "outcomes": [
      {
        "outcome_id": "01a1d00f-ec01-71c0-9776-0fb0230cbd18",
        "name": "Over 1.5",
        "bids": [
          {
            "price": 0.39,
            "qty": 18938,
            "orders": 1
          },
          {
            "price": 0.38,
            "qty": 25000,
            "orders": 3
          },
          {
            "price": 0.35,
            "qty": 12000,
            "orders": 1
          }
        ]
      },
      {
        "outcome_id": "01a1d00f-ec01-71c0-9776-0fc320d7d309",
        "name": "Under 1.5",
        "bids": [
          {
            "price": 0.57,
            "qty": 7500,
            "orders": 1
          },
          {
            "price": 0.55,
            "qty": 10400,
            "orders": 2
          }
        ]
      }
    ],
    "observed_at": "2026-11-12T17:23:56.000Z",
    "source_age_seconds": 32,
    "edge_cached": true
  },
  "meta": {
    "observed_at": "2026-11-12T17:23:56.000Z",
    "source_age_seconds": 6,
    "edge_cached": true,
    "plan": "developer",
    "credits_charged": 1,
    "credits_remaining": 9874,
    "credit_policy": "credits_v1"
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| market_id | string | Novig market id. |
| seq | integer or null | Novig's book sequence number for the snapshot. Higher means newer. Null with `depth: top_only`. |
| depth | string | `full` (every price level, from our latest book snapshot) or `top_only` (the best bid from the catalog). |
| outcomes[].outcome_id | string | Novig outcome id. |
| outcomes[].name | string or null | Outcome label. |
| outcomes[].bids[].price | number | Bid price as a probability. Levels are sorted best first. |
| outcomes[].bids[].qty | integer | Contracts resting at that price, summed over its orders. One contract pays $0.01 if it wins, so 18,938 is $189.38 of payout. |
| outcomes[].bids[].orders | integer | Resting orders at that price. |
| 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, whatever the size of the answer. A thin book and a book with 250 resting orders cost the same. 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}"}

mid = "01a1d00f-ec01-71c0-9776-0facc97e44a7"
book = requests.get(f"https://novigapi.com/api/v1/orderbook/{mid}", headers=HEADERS, timeout=10).json()["data"]
over, under = book["outcomes"]

# Buying Over fills against resting Under bids. Depth available up to an Over price of 0.45:
max_price = 0.45
contracts = sum(level["qty"] for level in under["bids"] if 1 - level["price"] <= max_price)
print(book["depth"], "seq", book["seq"], "Over contracts available at or under", max_price, "=", contracts)
```

## JavaScript

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

const mid = "01a1d00f-ec01-71c0-9776-0facc97e44a7";
let lastSeq = 0;
async function poll() {
  const { data: book } = await (await fetch("https://novigapi.com/api/v1/orderbook/" + mid, { headers })).json();
  if (book.seq !== lastSeq) {
    lastSeq = book.seq;
    const [over, under] = book.outcomes;
    console.log("seq " + book.seq, "best Over bid " + over.bids[0]?.price, "best Under bid " + under.bids[0]?.price);
  }
}
setInterval(poll, 10000);
```

## Notes and edge cases

- An outcome with no resting bids returns `bids: []`; the other outcome's ask is then null in [GET /v1/markets](https://novigapi.com/docs/endpoints/markets).
- Quantities are in Novig API contracts, each paying $0.01. Divide by 100 to get dollars of payout.
- Our book is a snapshot polled from Novig's public route, at most once a minute per market, not a tick feed. The best bid in [GET /v1/markets](https://novigapi.com/docs/endpoints/markets) refreshes more often. For change events use the [stream](https://novigapi.com/docs/endpoints/stream), which pushes within 5 to 30 seconds.
- Every `GOLIVE` voids resting orders on that event, so expect books to empty and refill at tip-off.

## Sources

- [Novig API reference: Get the order book](https://docs.novig.com/api-reference/catalog/get-the-order-book.md)
- [Novig API docs](https://docs.novig.com)
- [Novig docs: Monetary representations](https://docs.novig.com/api/concepts/money.md)
- [Novig docs: Lifecycle channel](https://docs.novig.com/api/streaming/lifecycle.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.
