# GET /v1/clv

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

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

GET /v1/clv returns the opening and closing fair prices of a Novig market, or of a player's props from the last 30 days, so you can measure closing line value against the price you took. The close is our last quote at or before the start. Novig's game-market fee starts only once live, checked 12 Nov 2026. (Source: [Novig API docs: Trading fees](https://docs.novig.com/api/concepts/fees.md))

## What it returns

Closing line value is the best single test of whether you beat a market. Ask for one two-outcome market, or one player's markets that started in the last 30 days; we return each outcome's fair price at our first recorded quote (`open_fair`) and at our last quote at or before the start (`close_fair`), with the move between them in `clv_pp`. Compare `close_fair` with the price you took.

```
your clv_pp = (close_fair - entry_price) x 100 ; clv_pct = (close_fair / entry_price - 1) x 100
```
Positive means you bought cheaper than the closing fair price. The API's own clv_pp is (close_fair - open_fair) x 100: what buying at the open fair price would have earned.

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| market_id | string | No | One market. Send this or `player`. |
| player | string | No | Player slug: that player's two-outcome markets that started in the last 30 days, newest first. |
| 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/clv?market_id=01a1d00f-ec01-71c0-9776-0facc97e44a7" \
  -H "Authorization: Bearer nv_..."
```

## Response

Cooper Flagg 1.5 steals with its real pregame bids on 12 Nov 2026 (0.39 Over, 0.57 Under), so the closing fair Over is 0.41. The open quote and the times are illustrative. Someone who bought Over at 0.40 has +1.0 point of CLV, +2.5%. `won` stays null until a graded result is known.

```json
{
  "data": [
    {
      "market_id": "01a1d00f-ec01-71c0-9776-0facc97e44a7",
      "description": "Cooper Flagg 1.5 STEALS",
      "starts_at": "2026-11-13T01:05:00.000Z",
      "outcome_id": "01a1d00f-ec01-71c0-9776-0fb0230cbd18",
      "outcome_name": "Over 1.5",
      "open_fair": 0.425,
      "open_at": "2026-11-12T15:02:11.000Z",
      "close_fair": 0.41,
      "close_at": "2026-11-13T01:04:52.000Z",
      "clv_pp": -1.5,
      "won": null,
      "method": "fair price from both sides' bids: open = first recorded quote, close = last recorded quote at or before the start time",
      "observed_at": "2026-11-13T01:04:52.000Z",
      "source_age_seconds": 0,
      "edge_cached": true
    },
    {
      "market_id": "01a1d00f-ec01-71c0-9776-0facc97e44a7",
      "description": "Cooper Flagg 1.5 STEALS",
      "starts_at": "2026-11-13T01:05:00.000Z",
      "outcome_id": "01a1d00f-ec01-71c0-9776-0fc320d7d309",
      "outcome_name": "Under 1.5",
      "open_fair": 0.575,
      "open_at": "2026-11-12T15:02:11.000Z",
      "close_fair": 0.59,
      "close_at": "2026-11-13T01:04:52.000Z",
      "clv_pp": 1.5,
      "won": null,
      "method": "fair price from both sides' bids: open = first recorded quote, close = last recorded quote at or before the start time",
      "observed_at": "2026-11-13T01:04:52.000Z",
      "source_age_seconds": 0,
      "edge_cached": true
    }
  ],
  "meta": {
    "observed_at": "2026-11-13T01:04:52.000Z",
    "source_age_seconds": 0,
    "edge_cached": true,
    "next_cursor": null,
    "limit": 50,
    "count": 2,
    "plan": "developer",
    "credits_charged": 5,
    "credits_remaining": 9874,
    "credit_policy": "credits_v1"
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| market_id, description, starts_at | string | The market, its label and scheduled start. |
| outcome_id, outcome_name | string | The outcome. |
| open_fair, open_at | number or null, string or null | Fair price at our first two-sided quote, and when. |
| close_fair, close_at | number or null, string or null | Fair price at our last two-sided quote at or before the start, and when. Null when one side never had a bid. |
| clv_pp | number or null | (close_fair - open_fair) x 100: how far the fair price moved from open to close, in percentage points. |
| won | boolean or null | True or false once a graded result names the winner; null before, and on results from markets.csv. |
| method | string | How open and close are taken, in words. |
| 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

Weighted 5x: 5 credits 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 5 credits. 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}"}

bets = [{"market_id": "01a1d00f-ec01-71c0-9776-0facc97e44a7", "outcome_id": "01a1d00f-ec01-71c0-9776-0fb0230cbd18", "entry_price": 0.40}]
for b in bets:
    rows = requests.get("https://novigapi.com/api/v1/clv", params={"market_id": b["market_id"]}, headers=HEADERS, timeout=10).json()["data"]
    close = next((r["close_fair"] for r in rows if r["outcome_id"] == b["outcome_id"]), None)
    if close is not None:
        print(round((close - b["entry_price"]) * 100, 2), "pp", round((close / b["entry_price"] - 1) * 100, 2), "%")
```

## JavaScript

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

const bet = { market_id: "01a1d00f-ec01-71c0-9776-0facc97e44a7", outcome_id: "01a1d00f-ec01-71c0-9776-0fb0230cbd18", entry_price: 0.4 };
const { data } = await (await fetch("https://novigapi.com/api/v1/clv?market_id=" + bet.market_id, { headers })).json();
const close = data.find((r) => r.outcome_id === bet.outcome_id)?.close_fair;
if (close != null) console.log(((close - bet.entry_price) * 100).toFixed(1) + " pp");
```

## Notes and edge cases

- The close is the last fair price at or before the scheduled start, because Novig voids resting orders at `GOLIVE` and live prices measure something else.
- Only two-outcome markets have a fair price, so three-way markets return no rows.
- CLV ignores fees. A taker fill while live paid fee = 0.06 x P x (1 - P) x contracts x $0.01 on top (0.06 x P x (1 - P) per $1 of payout); account for it with the [fee calculator](https://novigapi.com/novig-fee-calculator).
- A market with no two-sided close (one side never bid) returns `close_fair: null` and no CLV.

## Sources

- [Novig API docs: Trading fees](https://docs.novig.com/api/concepts/fees.md)
- [Novig docs: Lifecycle channel](https://docs.novig.com/api/streaming/lifecycle.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.
