Getting started
Limits
Daily allowance
| Free | Bettor | Sharp | Pro | |
|---|---|---|---|---|
| API optimizes per day | 10 | 50 | 250 | 500 |
| Bets per slate | 3 | 12 | 50 | 50 |
| Your own probability input | no | yes | yes | yes |
| Correlated risk figures | no | no | yes | yes |
- API optimizes are separate from optimizes in the app.
- Days run midnight to midnight US Eastern.
GET /v1/megives the exactresetsAt. - Calculators (implied probability, de-vig, Kelly) have no daily limit, and
GET /v1/meandGET /v1/sportsare never counted or limited.
What counts
Every optimize that passes the per-minute and one-at-a-time checks counts, including ones that fail validation or need an upgrade. Not counted: 429 BURST_LIMIT_EXCEEDED, 503 SERVICE_BUSY, malformed JSON and key errors. Retries count too; if you need the same answer again, send the same seed.
Per-minute limits
- Optimize: at most 10 a minute, and one at a time per account. A second optimize sent while the first is still running is refused at once.
- Calculators: 60 a minute, counted separately from optimize.
- Budgets refill gradually (one optimize every 6 seconds), so a script that paces itself is never refused.
Headers
Successful optimize responses, and DAILY_LIMIT_EXCEEDED, carry today’s state:
X-RateLimit-Limit: 50
X-RateLimit-Remaining: 47
X-RateLimit-Reset: 1791172800 (Unix seconds: next midnight US Eastern)When you hit a limit
| Status | error | Meaning | What to do |
|---|---|---|---|
| 429 | DAILY_LIMIT_EXCEEDED | Today's allowance is used up. | Stop until resetsAt. Never retry in a loop. |
| 429 | BURST_LIMIT_EXCEEDED | Too fast, or another optimize is still running. | Wait Retry-After seconds (usually 1 to 6), then retry. |
| 503 | SERVICE_BUSY | Server capacity or a temporary outage, not your allowance. | Wait Retry-After seconds, then retry. Not counted. |
The handling limits recipe has a ready-made retry loop.