> ## Documentation Index
> Fetch the complete documentation index at: https://docs.0xinsider.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> The Markdown of an API reference page leaves out the OpenAPI schema.
> Every object an endpoint returns or a webhook carries, with each field's type, presence and meaning, is on https://docs.0xinsider.com/api-reference/objects.md.
> The full OpenAPI 3.1 spec names each operation's and each webhook's exact parameters, request body and response schema: https://docs.0xinsider.com/api-reference/openapi.json.

# List props

> List the player props of one league's games, with the player, stat and line on each row.

Use this endpoint to read a league's player props in one paged list, for example every NFL passing-yards line this week or every prop on one player. To read all of one game's markets, props and game lines together, use [List game markets](https://docs.0xinsider.com/api-reference/endpoint/list-game-markets.md).

The games are the ones [List games](https://docs.0xinsider.com/api-reference/endpoint/list-games.md) serves for the league. Polymarket files NFL props under a game's `-player-props` and `-first-td-scorer` events and NBA props under the game event itself; this endpoint returns both, and each row names its game.

## Parameters

| Parameter | Meaning |
| - | - |
| `league` | Required. A league tag as `coverage.leagues` on [List games](https://docs.0xinsider.com/api-reference/endpoint/list-games.md) spells it, for example `nfl` or `nba`. Matching is case-insensitive. An unknown league is a `400` with `error.code` `bad_request` and `error.reason` `invalid_query`. |
| `starts_after`, `starts_before` | Optional. RFC 3339 bounds on the game's scheduled start, both inclusive. A game with no published start is left out whenever either bound is set. |
| `player` | Optional. Part of the player's name, for example `goff`. Case and accents are ignored, so `jokic` matches `Nikola Jokić`. A row with no player never matches. |
| `stat` | Optional. Polymarket market types to keep, such as `passing_yards` or `points`. Repeat the parameter or send a comma-separated list. Matching is case-insensitive, and an unknown type returns an empty page. |
| `status` | Optional. `active` (the default), `closed`, or `all`. A prop is `closed` once Polymarket has closed trading or it has resolved. |
| `max_spread_c` | Optional. Keep only props where one outcome's best ask minus its best bid is at most this many cents, for example `2`. Above 0 and at most 100, in steps of 0.01. It reads the same order books `expand=quotes` serves, so you can send it with or without quotes. A prop whose book we do not hold yet is left out and counted on `coverage.rows_without_book`. If we cannot read the order book of the first prop a page has to check, the read answers `503` with `error.reason` `read_model_warming` and a `Retry-After`, so retry the same request after it. Any other value is a `400` with `error.reason` `invalid_query`. |
| `min_book_usd_within_2c` | Optional. Keep only props where one outcome's book holds at least this many dollars on each side within 2 cents of its midpoint, for example `500`. A whole number from 1 to 10,000,000, the same measure and range as the `market_price_moved` webhook's filter of the same name. `expand=quotes` shows the two sums as `book_depth_within_2c`. With `max_spread_c`, one outcome must pass both. A prop whose book or depth we do not hold yet is left out and counted on `coverage.rows_without_book`. An unreadable first book answers the same `503` as with `max_spread_c`. Any other value is a `400` with `error.reason` `invalid_query`. |
| `limit` | Optional. How many props to return, from 1 to 200. The default is 50, and a value outside the range is clamped. |
| `cursor` | Optional. The `next_cursor` value from the previous response. Send it with the same filters. |
| `expand` | Optional. `quotes` adds each outcome's `quote`, the same object [List game markets](https://docs.0xinsider.com/api-reference/endpoint/list-game-markets.md) returns. It adds 1 to the request cost, on every plan. |

## Key response fields

| Field | Meaning |
| - | - |
| `league` | The league you asked for, lowercased. |
| `data[].condition_id` | Polymarket's id for the market. |
| `data[].event_slug` | The event the market is filed under: an NFL game's `-player-props` or `-first-td-scorer` event, or an NBA game. |
| `data[].game_event_slug`, `starts_at`, `competitors` | The game the prop belongs to, as [List games](https://docs.0xinsider.com/api-reference/endpoint/list-games.md) lists it, its scheduled start (`null` when none is published), and its competitors. Polymarket does not say which team a player is on, so neither does the row. |
| `data[].player.name` | The player, as Polymarket's market label names them: the label before its first `: ` (`Jared Goff` from `Jared Goff: Passing Yards O/U 245.5`), or the whole label when it has none (`Dallas Goedert` on a first-touchdown market). A goalscorer market is read from its question, whose label puts the stat first. It is the name the event page shows. |
| `data[].player_unavailable_reason` | `null` when `player` is set. `missing_provider_title` when Polymarket gave the market no label to read a name from; `player` is then `null`. |
| `data[].stat` | Polymarket's market type, for example `passing_yards`, `receptions`, `anytime_touchdowns` or `points`. |
| `data[].line` | The line as a number, for example `245.5`. `null` on a yes/no prop such as an anytime touchdown. |
| `data[].title`, `group_item_title` | Polymarket's question and market label, as published. |
| `data[].outcomes` | Both outcomes in Polymarket's index order (`Over` and `Under`, or `Yes` and `No`), each with its `label` and CLOB `token_id`, and its `quote` with `expand=quotes`. |
| `data[].outcomes[].quote` | Only with `expand=quotes`. The outcome's price with its basis and the time it was observed, its best bid and best ask with theirs, and `book_depth_within_2c`, the dollars resting within 2 cents of the midpoint on each side, as on [List game markets](https://docs.0xinsider.com/api-reference/endpoint/list-game-markets.md). This endpoint does not start live order books. Instead, each read starts a fetch of the league's order books from Polymarket after the response, at most every 10 seconds, so a prop we are not streaming carries a book from about the next read: `book_source` is `clob_rest`. A prop with no book yet reads `book_unavailable_reason: cache_miss`; read again after a few seconds. A book we could not read from our cache reads `cache_unavailable`: nothing is known about it, and a read a few seconds later may answer. A price we do not hold yet is fetched after the response, so the next read usually has it. |
| `data[].status`, `resolved_at` | `active` or `closed`, by the same rule as the `status` filter, and when the market resolved (`null` until it does). |
| `as_of` | When the game list behind this page was assembled. |
| `coverage.sources_unavailable` | The game sources that could hold this league's games and did not answer for this read, named as on [List games](https://docs.0xinsider.com/api-reference/endpoint/list-games.md): `<sport>:<half>`, such as `Basketball:upcoming` or `all sports:live`. An empty list means every source answered. While one is listed, the page can be missing that source's games, so read again before you treat a short or empty page as the whole board. |
| `coverage.rows_without_book` | With `max_spread_c` or `min_book_usd_within_2c`, how many props this page passed over because we did not hold an order book for them yet, or, with `min_book_usd_within_2c`, its depth. They are not in `data`. Each read starts a fetch of the league's order books after the response. `next_cursor` never comes back to a prop a page passed over, so when this is above 0, read from the first page again after a few seconds to check those props. That does not help a closed prop, whose books we do not fetch, or a prop with an outcome Polymarket has not given a token id yet. `null` without either filter. |
| `has_more`, `next_cursor` | Whether another page exists, and the cursor that reads it. A page can hold fewer than `limit` rows, or none, while `has_more` is `true`: a `player`, `max_spread_c` or `min_book_usd_within_2c` filter that matches few rows stops after about 100 ms of reads and resumes on the next page. Keep following `next_cursor` until `has_more` is `false`. |

Rows are ordered by game slug, then `stat`, then player name, then `line` (a prop with no line first), then `condition_id`.

## Example

```bash theme={null}
curl -sS \
  -H "Authorization: Bearer $OXINSIDER_API_KEY" \
  'https://api.0xinsider.com/api/v1/props?league=nfl&stat=passing_yards&expand=quotes'
```

The `list_props` MCP tool calls this endpoint with the same parameters. Pass `stat` and `expand` as arrays, for example `["passing_yards"]` and `["quotes"]`.

## What it does not return

* Game lines such as spreads, totals and team totals. Use [List game markets](https://docs.0xinsider.com/api-reference/endpoint/list-game-markets.md).
* Which team a player is on. Polymarket does not publish it.
* Settlement payouts or a 50-50 result. [List game markets](https://docs.0xinsider.com/api-reference/endpoint/list-game-markets.md) carries each market's `settlement`.
* Prices, unless you send `expand=quotes`.

## Caching

The response carries a weak semantic `ETag`. Send it back as `If-None-Match` for a `304` with an empty body. `request_id` and `cost` are excluded from the validator. With `expand=quotes`, the `ETag` changes whenever a quote does.


## API Specification

The full API specification for this endpoint is available in the [documentation index](https://docs.0xinsider.com/llms.txt).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.