# Rate limits and credits

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

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

novigapi.com plans set a per-minute ceiling and monthly credits: Free 20 a minute and 100 credits, Developer 60 and 10,000, Production 120 and 50,000, Scale 180 and 250,000. A call costs 1 credit per 100 rows requested, times the endpoint's weight; errors cost 0. For comparison, Novig's own keyed read limit refilled at 16 Hz at Base tier, checked 12 Nov 2026. (Source: [Novig docs: Throttling](https://docs.novig.com/api/throttling.md))

## What it returns

Two limits apply to every key on an account: a per-minute ceiling that protects the service, and monthly credits, which are what each plan sells. Credits reset at 00:00 UTC on the 1st of each month. There are no automatic overage charges: when credits run out you get a 429 until you upgrade, top up or the month resets.

Plans

| Plan | Price | Credits a month | Requests a minute | Stream | Webhooks |
| --- | --- | --- | --- | --- | --- |
| Free | $0 | 100 | 20 | 1 connection, delayed 300 s | No |
| Developer | $49/mo | 10,000 | 60 | 3 live connections | No |
| Production | $149/mo | 50,000 | 120 | 10 live connections | Signed, 5 endpoints |
| Scale | $499/mo | 250,000 | 180 | 15 live connections | Signed, 5 endpoints |


**Credit top-up:** 1,000 credits for $9, one time. They never expire, need no subscription, and are spent only after your monthly credits run out, on any plan.

### How credits are counted

Credit weights

| Endpoint | Weight | Cost |
| --- | --- | --- |
| /v1/markets | 1x | 1 credit per call per 100 rows requested |
| /v1/markets/{id} | 1x | 1 credit per call |
| /v1/events | 1x | 1 credit per call per 100 rows requested |
| /v1/orderbook/{id} | 1x | 1 credit per call |
| /v1/fair-price | 1x | 1 credit per call |
| /v1/player-props | 1x | 1 credit per call per 100 rows requested |
| /v1/players | 1x | 1 credit per call per 100 rows requested |
| /v1/teams | 1x | 1 credit per call per 100 rows requested |
| /v1/leagues | 1x | 1 credit per call per 100 rows requested |
| /v1/trades | 3x | 3 credits per call per 100 rows requested |
| /v1/ohlc/daily | 3x | 3 credits per call per 100 rows requested |
| /v1/results | 3x | 3 credits per call per 100 rows requested |
| /v1/line-moves | 3x | 3 credits per call per 100 rows requested |
| /v1/line-history | 5x | 5 credits per call per 100 rows requested |
| /v1/clv | 5x | 5 credits per call per 100 rows requested |
| /v1/bulk/csv | 10x | 10 credits per call per 100 rows requested |
| /v1/webhooks (manage) | 0 | Free |
| Errors and 304 Not Modified | 0 | Free |
| Stream | Time | 2 credits per started 285-second connection window |


Rows round up per 100 and are counted from the page size you ask for (`limit`, or the endpoint's default), so you know the price before you call. Every answer states it in the `X-Credits-Cost` header and `meta.credits_charged`.

## Parameters

This endpoint takes no parameters.

## Request

```bash
curl -s -i "https://novigapi.com/api/v1/markets?league=NBA&limit=250" \
  -H "Authorization: Bearer nv_..." | grep -i -E "^x-(credits|ratelimit)"
```

## Response

What a Developer key gets on request 61 inside one minute, trimmed. It costs no credits and comes with `Retry-After: 30`.

```json
{
  "error": {
    "plan": "developer",
    "limit": 60,
    "reset_at": "2026-11-12T17:25:00.000Z",
    "upgrade_url": "https://novigapi.com/upgrade?plan=production&source=rest",
    "agent_next_step": "Wait Retry-After seconds, then retry once.",
    "notify_user": false,
    "retryable": true,
    "retry_after_seconds": 30,
    "code": "RATE_LIMITED",
    "message": "Limit is 60 requests per minute on Developer. Retry in under a minute."
  }
}
```

## Fields

Response fields

| Field | Type | Description |
| --- | --- | --- |
| X-Credits-Cost (header) | integer | Credits this call cost. |
| X-Credits-Used (header) | integer | Credits used this month, including this call. |
| X-Credits-Remaining (header) | integer | Monthly credits left. |
| X-Credits-Source (header) | string | `topup` when part of the call was paid from top-up credits. |
| X-RateLimit-Limit (header) | integer | Your per-minute ceiling. |
| X-Quota-Warning (header) | string | Present from 80% of the month's credits; `meta.usage_notice` says the same in the body. |
| X-Quota-Reset-At, X-RateLimit-Remaining (headers) | string, integer | On the monthly 429: when credits reset, and 0. |
| error.reset_at | string | On a 429: when the minute or the month resets. |


## Credit cost

Reading your usage in the dashboard is free. Every API call's cost follows the weights above.

## Python

```python
import os
import requests

KEY = os.environ["NOVIGAPI_API_KEY"]  # nv_...
HEADERS = {"Authorization": f"Bearer {KEY}"}

import math

WEIGHTS = {"markets":1,"events":1,"player-props":1,"players":1,"teams":1,"leagues":1,"trades":3,"ohlc/daily":3,"results":3,"line-moves":3,"line-history":5,"clv":5,"bulk/csv":10}

def credits(endpoint, rows):
    return WEIGHTS.get(endpoint, 1) * max(1, math.ceil(rows / 100))

# A Developer plan polling one league's 300 markets every 30 s for a 3-hour game window:
calls = 3 * 3600 // 30
print(calls * credits("markets", 300), "credits")  # 360 calls x 3 = 1,080
```

## JavaScript

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

// Space requests to stay under the per-minute ceiling (60/min on Developer).
const PER_MINUTE = 60;
const gap = 60000 / PER_MINUTE;
let next = 0;
async function paced(url) {
  const wait = Math.max(0, next - Date.now());
  next = Math.max(Date.now(), next) + gap;
  await new Promise((r) => setTimeout(r, wait));
  return fetch(url, { headers });
}
```

## Notes and edge cases

- The per-minute ceiling counts all keys on the account together.
- Polling faster than about every 10 seconds buys nothing: Novig's edge caches markets for 10 seconds, so you would pay for the same data twice.
- For many markets at once, one [stream](https://novigapi.com/docs/endpoints/stream) connection is usually cheaper than polling.
- Free returns at most 100 rows per page and reads only the last 7 days of history; a call asking for more is served with the Free limit and `meta.plan_limit` says so.
- Free accounts get a warning email at 80% of monthly credits, and every plan gets an email when the limit is hit.

## Sources

- [Novig docs: Throttling](https://docs.novig.com/api/throttling.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.
