# GET /v1/bulk/csv

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

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

GET /v1/bulk/csv returns Novig trades, line moves, settled results or a day of OHLC as one CSV file, up to 10,000 rows per call, filtered by market, league or date. Daily rows appear after Novig publishes its files, about 5 a.m. ET. Novig's raw trades.csv was about 209 MB for 11 Nov 2026, so filter before you download. (Source: [Novig exchange data files (data.novig.com)](https://data.novig.com))

## What it returns

The same rows as [trades](https://novigapi.com/docs/endpoints/trades), [line moves](https://novigapi.com/docs/endpoints/webhooks), [results](https://novigapi.com/docs/endpoints/results) and [daily OHLC](https://novigapi.com/docs/endpoints/ohlc-daily), as a CSV file with a header row, so a spreadsheet or pandas can load them directly. Novig's free files at data.novig.com are the source of truth for daily history, but they identify markets by id only.

If you do not need names, read Novig's files directly; they are free. See [reading Novig's public CSVs](https://novigapi.com/novig-public-data-csv).

## Parameters

Query and path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| dataset | string | No | `trades` (default), `line_moves`, `results` or `ohlc`. |
| market_id | string | No | With `trades` or `ohlc`: only this market. |
| league | string | No | With `line_moves` or `results`: only this league. |
| date | string (YYYY-MM-DD) | For ohlc | With `ohlc`: the Eastern trading day. Required for that dataset. |
| since | string (ISO 8601) | No | With `trades`, `line_moves` or `results`: only rows at or after this time. |
| limit | integer | No | Rows per file, 1 to 10,000. Default 1,000. |
| cursor | string | No | With `trades`: the cursor for the next file. |


## Request

```bash
curl -s "https://novigapi.com/api/v1/bulk/csv?dataset=ohlc&date=2026-11-11&limit=5000" \
  -H "Authorization: Bearer nv_..." -D headers.txt -o novigapi-ohlc-2026-11-11.csv
```

## Response

The body is CSV, not JSON. This shows the response headers for a 5,000-row file; the CSV's first line names the columns, which are the same fields the matching JSON endpoint returns. Prices are probabilities, not Novig's cents. Cells that start with =, +, - or @ (other than numbers) are prefixed with ' so spreadsheets never run them.

```json
{
  "Content-Type": "text/csv; charset=utf-8",
  "Content-Disposition": "attachment; filename=\"novigapi-ohlc.csv\"",
  "X-Row-Count": "5000",
  "X-Credits-Cost": "500",
  "X-Credits-Remaining": "9874"
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| Header row | CSV | Every field present in the rows, in first-seen order. Objects are written as JSON. |
| X-Row-Count (header) | integer | Rows in the file. |
| X-Credits-Cost (header) | integer | What the file cost. |
| Content-Disposition (header) | string | `attachment; filename="novigapi-<dataset>.csv"`. |


## Credit cost

Weighted 10x: 10 credits per call per 100 rows requested (the `limit` you send, default 1,000, maximum 10,000; Free pages hold at most 100 rows). A default page costs 100 credits. Bulk CSV is on Production and Scale; other plans get 403 `UPGRADE_REQUIRED`. Ask for the rows you need: a 10,000-row file costs 1000 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}"}

import io
import pandas as pd

params = {"dataset": "ohlc", "date": "2026-11-11", "limit": 5000}
r = requests.get("https://novigapi.com/api/v1/bulk/csv", params=params, headers=HEADERS, timeout=60)
r.raise_for_status()
df = pd.read_csv(io.StringIO(r.text))
print(r.headers.get("X-Row-Count"), "rows,", r.headers.get("X-Credits-Cost"), "credits")
print(df[df["league"] == "NFL"].sort_values("daily_volume", ascending=False).head(10))
```

## JavaScript

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

import { writeFile } from "node:fs/promises";

const res = await fetch("https://novigapi.com/api/v1/bulk/csv?dataset=results&league=NBA&since=2026-11-01T00:00:00Z", { headers });
if (!res.ok) throw new Error("novigapi " + res.status);
await writeFile("novig-results-nba.csv", Buffer.from(await res.arrayBuffer()));
console.log(res.headers.get("x-row-count") + " rows saved");
```

## Notes and edge cases

- Novig's markets.csv held about 118,860 rows on 11 Nov 2026, roughly 67,900 of them parlay (COMBO) rows, which our OHLC rows leave out.
- A day's OHLC appears once Novig publishes it, about 5 a.m. ET the next morning.
- Rows identify no trader, as in Novig's files.

## Sources

- [Novig exchange data files (data.novig.com)](https://data.novig.com)
- [Novig docs: Exchange Data](https://docs.novig.com/public-data/overview.md)
- [Novig docs: Markets CSV](https://docs.novig.com/public-data/markets.md)
- [Novig docs: Trades CSV](https://docs.novig.com/public-data/trades.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.
