# GET /v1/results

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

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

GET /v1/results returns settled Novig markets with settle time, closing price and, where known, the winning outcome, by league and date. Novig's markets.csv marks a market finalized but not which side won, checked 12 Nov 2026, so each row says its source: the daily file, a public read or Novig's keyed history route. (Source: [Novig docs: Markets CSV](https://docs.novig.com/public-data/markets.md))

## What it returns

One row per settled market, newest first, from three sources named in `source`. Novig's public catalog drops a market when it closes and keeps every outcome ungraded while it is listed, so most rows come from Novig's daily markets.csv (`csv`): the market is finalized and `close_price` is the day's close, but the file does not say which side won. A grade seen on a public read is `api_public`; with a signed Novig key, the history route supplies the winner (`api_signed`). Without `since`, the last 7 days come back.

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| league | string | No | League code. |
| since | string (ISO 8601) | No | Only markets settled at or after this time. Free reads only the last 7 days. |
| limit | integer | No | Rows per page, 1 to 1,000. Default 100. Free returns at most 100. |
| cursor | string | No | `meta.next_cursor` from the previous page. |


## Request

```bash
curl -s "https://novigapi.com/api/v1/results?league=NBA&since=2026-11-13T00:00:00Z&limit=1" \
  -H "Authorization: Bearer nv_..."
```

## Response

The market id and description are real (Cooper Flagg 1.5 steals, 12 Nov 2026). The settlement shown is illustrative, because the capture was taken before the game: a row from markets.csv, dated the end of the Eastern day it was finalized, with the day's close and no winner. A row is dated by `settled_at`, so `observed_at` is that time. For one market, [GET /v1/markets/{id}](https://novigapi.com/docs/endpoints/market) carries the same row in `result`.

```json
{
  "data": [
    {
      "market_id": "01a1d00f-ec01-71c0-9776-0facc97e44a7",
      "league": "NBA",
      "description": "Cooper Flagg 1.5 STEALS",
      "winning_outcome_id": null,
      "winning_outcome": null,
      "settled_at": "2026-11-14T04:59:59.000Z",
      "close_price": 0.41,
      "source": "csv",
      "observed_at": "2026-11-14T04:59:59.000Z",
      "source_age_seconds": 0,
      "edge_cached": true
    }
  ],
  "meta": {
    "observed_at": "2026-11-14T04:59:59.000Z",
    "source_age_seconds": 0,
    "edge_cached": true,
    "next_cursor": "eyJhdCI6IjIwMjYtMTEtMTRUMDQ6NTk6NTkuMDAwWiIsImlkIjoiMDFhMWQwMGYtZWMwMS03MWMwLTk3NzYtMGZhY2M5N2U0NGE3In0",
    "limit": 1,
    "count": 1,
    "plan": "developer",
    "credits_charged": 3,
    "credits_remaining": 9874,
    "credit_policy": "credits_v1"
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| market_id | string | Novig market id. |
| league | string or null | League code, from our catalog or else from the CSV's report ticker. |
| description | string or null | Novig's label. Null when the market settled before our collector first listed it. |
| winning_outcome_id | string or null | The outcome that won. Null on `csv` rows, which do not say, and on voids. |
| winning_outcome | string or null | Its label, such as `Under 1.5`. |
| settled_at | string or null | When the grade was seen; for `csv` rows, the end of the Eastern day in the file. |
| close_price | number or null | The closing price we hold: the day's close from markets.csv, or the last price before settlement. |
| source | string | `csv` (markets.csv: finalized, no winner), `api_public` (a grade seen on a public read) or `api_signed` (Novig's keyed history route). |
| 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 3x: 3 credits per call per 100 rows requested (the `limit` you send, default 100, maximum 1,000; Free pages hold at most 100 rows). A default page costs 3 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}"}

r = requests.get("https://novigapi.com/api/v1/results", params={"league": "NBA", "since": "2026-11-12T00:00:00Z"}, headers=HEADERS, timeout=10)
for res in r.json()["data"]:
    winner = res["winning_outcome"] or "winner not published"
    print(res["description"], "->", winner, "close", res["close_price"], res["source"])
```

## JavaScript

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

const res = await fetch("https://novigapi.com/api/v1/results?league=NBA&since=2026-11-13T00:00:00Z", { headers });
const { data } = await res.json();
const r = data.find((x) => x.market_id === "01a1d00f-ec01-71c0-9776-0facc97e44a7");
console.log(r ? (r.winning_outcome ?? "finalized, winner not published (" + r.source + ")") : "not settled yet");
```

## Notes and edge cases

- Protected props can void or settle at the pregame price if the player sits; a null winner on a non-`csv` row means no side won. See [protected props](https://novigapi.com/guides/novig-protected-props).
- Markets that closed before our collector listed them still appear from markets.csv, with `description: null` and the league taken from the CSV's report ticker.
- Results are for research and record keeping. They are not official Novig settlement statements.

## Sources

- [Novig docs: Markets CSV](https://docs.novig.com/public-data/markets.md)
- [Novig docs: Event lifecycle](https://docs.novig.com/api/concepts/event-lifecycle.md)
- [Novig docs: Participation Protection](https://docs.novig.com/api/concepts/participation-protection.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.
