Docs/ Requests & rate limits

Requests & rate limits

The monthly request allowance, burst limits, overage, the quota headers and 429 handling.

How requests are counted

Each plan comes with a number of requests per calendar month (UTC). One request is counted per ISIN that receives an answer — found or not found — on GET /funds/{isin}, POST /funds, POST /portfolio and GET /overlap, whether the payload is served from the 24-hour store or loaded fresh. /search, /me and the demo endpoint are free. Invalid ISINs, pending entries, and 401 / 429 responses never cost anything. Requests are counted per account, across all keys.

Plans

PlanPriceRequests / monthBurst / minuteBatch sizeBeyond the allowance
Free$0150101429 until the reset
Starter$9 / month1,5003010$0.015 per request, capped at $18.00
Pro$49 / month9,00012050$0.015 per request, capped at $98.00
Scale$249 / month60,000600200$0.015 per request, capped at $498.00
Enterprise$0.01 / requestUnlimited (metered)12001,000$0.01 per request

Overage lets a paid account keep running after its monthly requests are used up: each extra request is billed at $0.015 on the next invoice, up to twice the plan price per month (ask us to raise the cap). The Free plan stops at its allowance. Pricing has the full comparison.

Headers and the quota object

HeaderMeaning
X-RateLimit-LimitRequests per month (absent on metered plans).
X-RateLimit-RemainingRequests left this month after this call; 0 while running on overage.
X-RateLimit-ResetUnix time (seconds) of the next monthly reset.
X-Burst-LimitRequests allowed per minute across all endpoints.
X-Burst-RemainingRequests left in the current minute.
Retry-After429 only: seconds to wait (60 for a burst; until the reset when the monthly requests are used up).

Every successful response also carries a quota object: { limit, remaining, used, overageUsed, resetAt, burst: { limit, remaining } }.

Handling 429

A 429 rate_limited response carries reason: burst (slow down; retry after 60 seconds), quota_exhausted (Free plan: wait for the reset or upgrade) or overage_cap (paid plans: upgrade or contact us). Batch calls are refused as a whole when the remaining headroom is smaller than the number of ISINs sent, so nothing is half-charged.

429 Too Many Requestsjson
{
"error": {
"code": "rate_limited",
"message": "Monthly requests exhausted for the Free plan (150 requests / month). Upgrade at /dashboard/billing or wait for the reset on 2026-10-01.",
"plan": "free",
"reason": "quota_exhausted",
"limit": 150,
"retryAfter": 1834000,
"resetAt": "2026-10-01T00:00:00.000Z"
}
}