# GET /v1/players

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

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

GET /v1/players lists players who have Novig props, with name, slug, league and their open market count, searchable by name. It refreshes with the market list, at most about 10 seconds behind on paid plans. Novig's daily CSVs carry no player or team names, checked 12 Nov 2026, so this is the join key. (Source: [Novig docs: Exchange Data](https://docs.novig.com/public-data/overview.md))

## What it returns

A directory built from Novig's market descriptions. Every player who has had a prop gets a stable slug, which you pass to [player props](https://novigapi.com/docs/endpoints/player-props), [markets](https://novigapi.com/docs/endpoints/markets) and [CLV](https://novigapi.com/docs/endpoints/clv).

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| league | string | No | League code, such as `NBA`. |
| q | string | No | Part of a name, case-insensitive, up to 80 characters: the start of the first or any later name, such as `flagg`. |
| 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/players?league=NBA&q=flagg" \
  -H "Authorization: Bearer nv_..."
```

## Response

Real name and start time from Novig's catalog on 12 Nov 2026; the open market count is illustrative. `team_slug` stays null until a team link is confirmed: Novig's public catalog names the game, not the player's side. Player rows are reference data, so they carry no honesty fields and `meta.observed_at` is null.

```json
{
  "data": [
    {
      "league": "NBA",
      "slug": "cooper-flagg",
      "name": "Cooper Flagg",
      "team_slug": null,
      "open_markets": 31,
      "last_market_at": "2026-11-13T01:05:00.000Z"
    }
  ],
  "meta": {
    "observed_at": null,
    "source_age_seconds": null,
    "edge_cached": null,
    "next_cursor": null,
    "limit": 50,
    "count": 1,
    "plan": "developer",
    "credits_charged": 1,
    "credits_remaining": 9874,
    "credit_policy": "credits_v1"
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| league | string | League code. |
| slug | string | Stable player slug. |
| name | string | Name as Novig writes it. |
| team_slug | string or null | The player's team slug once resolved; null until then. |
| open_markets | integer | Open markets about this player right now. |
| last_market_at | string or null | Start time of the player's latest market, open or closed. |
| 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. 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}"}

r = requests.get("https://novigapi.com/api/v1/players", params={"league": "NBA", "q": "flagg"}, headers=HEADERS, timeout=10)
for p in r.json()["data"]:
    print(p["slug"], p["name"], p["open_markets"], "open props")
```

## JavaScript

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

const res = await fetch("https://novigapi.com/api/v1/players?league=NBA&q=" + encodeURIComponent("flagg"), { headers });
const { data } = await res.json();
const slug = data[0]?.slug; // "cooper-flagg"
```

## Notes and edge cases

- Slugs are lowercase with hyphens and never change once issued. If two players share a name in one league, the later one gets a suffix.
- Names follow Novig's spelling, accents and suffixes included.
- Novig's official API has a keyed participants route; we do not use keyed routes, so names come from public market descriptions.

## Sources

- [Novig docs: Exchange Data](https://docs.novig.com/public-data/overview.md)
- [Novig API reference: List event participants](https://docs.novig.com/api-reference/catalog/list-event-participants.md)
- [Novig API reference: List markets](https://docs.novig.com/api-reference/catalog/list-markets.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.
