# Size an odds API plan with measured data points

> Use the X-Datapoints header to estimate sports odds API usage, check daily and monthly limits, and choose the delivery and display rights your project needs.

Published 2026-10-15. Updated 2026-10-15. Canonical: https://therundown.io/blog/odds-api-plan-sizing

Start with a measurement, then choose your freshness and display rights. A provider's request count and TheRundown's data points are different units. This worked example shows the arithmetic without presenting it as customer usage or a promise about your future bill.

## Measure a narrow request

Follow the [quickstart](/docs/quickstart) with a Free key and select an upcoming date. Free supports five-minute-delayed pre-match main lines from DraftKings, BetMGM and FanDuel; its limits are 20,000 points per UTC day and 200,000 per UTC calendar month.

Save response headers with the JSON. Use a server-side environment variable for your key; do not put it in browser code or URLs.

```bash
# Choose a date with upcoming NFL regular-season events.
EVENT_DATE=2026-10-18
curl --fail-with-body --silent --show-error \
  --header "X-TheRundown-Key: $THERUNDOWN_API_KEY" \
  --dump-header response-headers.txt \
  --output events.json \
  "https://therundown.io/api/v2/sports/2/events/$EVENT_DATE?market_ids=1,2,3&affiliate_ids=19,22,23&main_line=true&hide_closed=true"
```

The date is an example, not a guaranteed slate. Check the status and response before continuing. Read `X-Datapoints` from that response; a missing header is unknown usage, not zero. Event responses include non-odds rows as well as returned price rows. An expanded prop or alternate-line request can return a different count.

## A reproducible 30-day example

Suppose a measured response reports **200 data points** and your application makes **96 comparable requests per day**. That is **19,200 points per day** and **576,000 over 30 days**. The daily figure fits Free, but the 30-day figure exceeds its monthly allowance.

This Python script reads your saved header and performs the calculation locally. Change the request frequency and projection length to match your workload. It makes no network calls and prints no API key.

```python
from pathlib import Path

headers = Path("response-headers.txt").read_text()
values = [
    line.split(":", 1)[1].strip()
    for line in headers.splitlines()
    if line.lower().startswith("x-datapoints:")
]
if not values or not values[-1].isascii() or not values[-1].isdigit():
    raise SystemExit("A numeric X-Datapoints header is required")

points_per_response = int(values[-1])
requests_per_day = 96
projection_days = 30
per_day = points_per_response * requests_per_day
print(f"Daily projection: {per_day:,} data points")
print(f"{projection_days}-day projection: {per_day * projection_days:,} data points")
```

For the example header `X-Datapoints: 200`, the output is:

```text
Daily projection: 19,200 data points
30-day projection: 576,000 data points
```

Actual UTC calendar months have 28–31 days. Missing prices, changing event counts, retries, additional endpoints and live updates change consumption. Measure several representative responses across the workload and include those differences. The [snapshot usage estimator](/pricing/api#calculator) lets you explore explicit assumptions; actual response headers and account meters remain authoritative.

## Choose features and rights as well as volume

| Your requirement                                                           | Starting monthly plan | Important boundary                                                 |
| -------------------------------------------------------------------------- | --------------------- | ------------------------------------------------------------------ |
| Delayed pre-match main lines from three books, within both caps            | Free, $0              | Five-minute delay; internal or personal use                        |
| More published sources, props or in-play REST for internal or personal use | Starter, $49          | 60-second delay; 25 million monthly points; no WebSocket           |
| Commercial end-user display or opening and closing lines                   | Pro, $149             | 30-second delay; 125 million monthly points; no WebSocket          |
| Real-time REST or WebSocket delivery                                       | Ultra, $399           | 500 million monthly points; one connection and three subscriptions |

A quota fit does not establish feature eligibility, source coverage or permission to display data to your customers. Check your required sources, sport, market and event scope on actual responses. Additional volume and concurrent connections are available on [Super, Mega and Max](/pricing/api#volume-plans); Enterprise is contact-sales.

Monthly and annual self-serve paid plans start hard-capped; optional overage requires opt-in. Weekly plans have separate metered-overage terms. Narrowing requests conserves included points but does not reduce the subscription's fixed fee. See the [current plans](/pricing/api) and [usage rules](https://docs.therundown.io/rate-limits).

## Validate the integration before switching

Compare event identity, market period, participant, signed line, price format, open/closed state and effective data delay. Preserve `closed_at` as the closure signal; an old update timestamp alone does not close a price. A REST snapshot estimate cannot be reused as a WebSocket update estimate.

Use the existing migration guides for [The Odds API](/blog/migrate-from-the-odds-api), [OpticOdds](/blog/migrate-from-opticodds) and [SportsGameOdds](/blog/migrate-from-sportsgameodds), then compare the same bounded scope before cutting over. No customer benchmark, equal-coverage claim or universal credit conversion is implied by this worked example.

## Questions

### How do I estimate sports odds API usage?

Measure the actual X-Datapoints header on representative requests, multiply by how often each request runs, and check both the daily and monthly allowance. A sample snapshot is not a prediction of every future response.

### Does the smallest plan that fits my usage include every feature?

No. Free and Starter are for internal or personal use. Commercial end-user display and opening/closing lines start on Pro. Real-time REST and WebSocket require Ultra or above. Coverage and volume must also fit.

### Can I estimate WebSocket usage from REST snapshot frequency?

No. Repeated REST snapshots bill their returned rows, while streaming usage depends on delivered updates. Measure the transport and scope you will actually run.
