# GET /v1/player-props

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

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

GET /v1/player-props returns every open Novig prop for one player: each stat and line with bids, asks, last trade and fair prices, as market rows. On paid plans it is at most about 10 seconds old. On 12 Nov 2026 Novig listed about 180 market types, most of them player props. (Source: [Novig API reference: List market types](https://docs.novig.com/api-reference/catalog/list-market-types.md))

## What it returns

Novig puts the player's name only inside a market description, such as `Cooper Flagg 1.5 STEALS`, and has no public player endpoint. We parse and resolve those names, so you can ask for a player by slug and get every line, ladder rungs included.

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| player | string | Yes | Player slug from [GET /v1/players](https://novigapi.com/docs/endpoints/players), such as `cooper-flagg`. |
| league | string | Yes | 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/player-props?league=NBA&player=cooper-flagg&limit=3" \
  -H "Authorization: Bearer nv_..."
```

## Response

Three of Cooper Flagg's real props from 12 Nov 2026 (DAL @ MIN). Each row is the same market object as [GET /v1/markets](https://novigapi.com/docs/endpoints/markets). Note 0.5 blocks: no trades yet, so `last` is null, but both sides have bids, so `fair` is 0.5625.

```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
    },
    {
      "market_id": "01a1d00f-ebd0-7162-997b-eb2fbec437a6",
      "event_id": "01a1cac7-5c83-7e41-ba84-afe1af0c1ca6",
      "league": "NBA",
      "market_type": "BLOCKS",
      "description": "Cooper Flagg 0.5 BLOCKS",
      "strike": 0.5,
      "status": "OPEN",
      "player_slug": "cooper-flagg",
      "team_slug": null,
      "stat_slug": "blocks",
      "starts_at": "2026-11-13T01:05:00.000Z",
      "fee_coefficient": 0.06,
      "fee_charged": "WHEN_LIVE",
      "maker_credit": 0.25,
      "volume": 0,
      "open_interest": 0,
      "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-ebd0-7162-997b-eb325759ff49",
          "name": "Over 0.5",
          "status": "PENDING",
          "bid": 0.545,
          "bid_qty": 12500,
          "ask": 0.58,
          "fair": 0.5625,
          "last": null,
          "spread_pp": 3.5,
          "american": -129,
          "decimal": 1.7778
        },
        {
          "outcome_id": "01a1d00f-ebd0-7162-997b-eb479b61693f",
          "name": "Under 0.5",
          "status": "PENDING",
          "bid": 0.42,
          "bid_qty": 8571,
          "ask": 0.455,
          "fair": 0.4375,
          "last": null,
          "spread_pp": 3.5,
          "american": 129,
          "decimal": 2.2857
        }
      ],
      "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": null,
    "limit": 3,
    "count": 3,
    "player": {
      "league": "NBA",
      "slug": "cooper-flagg",
      "name": "Cooper Flagg",
      "team_slug": null
    },
    "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.player | object or null | The player record: `league`, `slug`, `name` and `team_slug` (null until a team link is confirmed). |
| 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 typical NBA player has 20 to 40 markets on a game day, so one default page holds them all. 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}"}

import pandas as pd

r = requests.get("https://novigapi.com/api/v1/player-props", params={"league": "NBA", "player": "cooper-flagg"}, headers=HEADERS, timeout=10)
rows = []
for m in r.json()["data"]:
    over, under = m["outcomes"]
    rows.append({"stat": m["stat_slug"], "line": m["strike"], "over_bid": over["bid"], "over_ask": over["ask"], "fair_over": over["fair"], "volume": m["volume"]})
print(pd.DataFrame(rows).sort_values(["stat", "line"]).to_string(index=False))
```

## JavaScript

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

const res = await fetch("https://novigapi.com/api/v1/player-props?league=NBA&player=cooper-flagg", { headers });
const { data } = await res.json();
const byStat = {};
for (const m of data) (byStat[m.stat_slug] ??= []).push({ line: m.strike, fairOver: m.outcomes[0].fair });
console.log(byStat);
```

## Notes and edge cases

- Ladders are separate markets: 1.5 and 2.5 steals plus blocks each have their own id, book and fair price.
- `_PROTECTED` props settle at the pregame price if the player sits out the second half. They trade at different prices from the standard prop; compare like with like. See [protected props](https://novigapi.com/guides/novig-protected-props).
- Name resolution is by description. A rare name clash across leagues is why `league` is required.
- To narrow to one stat, filter on `stat_slug` in your code; the endpoint returns every open prop for the player, up to 500, soonest start first.
- Many rungs have a bid on one side only and return `fair: null`. Filter on `fair` before you rank lines.

## Sources

- [Novig API reference: List market types](https://docs.novig.com/api-reference/catalog/list-market-types.md)
- [Novig API reference: List markets](https://docs.novig.com/api-reference/catalog/list-markets.md)
- [Novig docs: Participation Protection](https://docs.novig.com/api/concepts/participation-protection.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.
