What are the rate limits of the fund data API?
Monthly requests per plan (15 to 60,000), a per-minute burst limit (10 to 600), the X-RateLimit and X-Burst headers on every response, and what a 429 with reason burst, quota_exhausted or overage_cap means.Updated 12 September 2026 · by FundFacts APIShort answer
Two limits: a monthly allowance (Free 15, Starter 500, Pro 9,000, Scale 60,000 requests) and a burst limit per minute (10, 30, 120 and 600 respectively; 1,200 on Enterprise). Every response carries X-RateLimit-Limit / -Remaining / -Reset for the month and X-Burst-Limit / -Remaining for the minute. A 429 rate_limited response includes reason (burst, quota_exhausted or overage_cap) and Retry-After in seconds.
Headers on every response
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests per month on your plan |
X-RateLimit-Remaining | Left this month after this call (0 while on overage) |
X-RateLimit-Reset | Unix time of the next monthly reset (first of the month, UTC) |
X-Burst-Limit / X-Burst-Remaining | Requests allowed per minute, and how many are left |
Retry-After | Only on 429: seconds to wait |
The same numbers are in the quota object of the JSON body.
The 429 body
json{ "error": { "code": "rate_limited", "reason": "burst", "message": "…", "retryAfter": 42, "resetAt": "2026-10-01T00:00:00.000Z" } }
burst: slow down; waitRetry-After(60 seconds at most).quota_exhausted: the monthly allowance is used and the plan has no overage (Free, Starter); wait for the reset or upgrade.overage_cap: Pro or Scale ran past the allowance up to the cap (two months' subscription); upgrade or wait.
What is counted
One request per ISIN answered on /funds/{isin}, POST /funds, /portfolio and /overlap; 5 per document on /extract; 1 or 2 per factsheet. /search, /me, /changes and the demo endpoint are free. Rejected calls (401, 429) and invalid ISINs are not counted.
Client rules
Read X-RateLimit-Remaining and stop before zero; on 429 sleep Retry-After; never retry 4xx otherwise; retry 502 upstream_error at most twice with a minute between. The SDKs do the burst retry for you.
Verify it yourself
The demo endpoint returns the live payload for a fund that is already in the store, without a key. Everything on this page can be checked against it.bashcurl -s https://fundfactsapi.com/api/v1/demo/funds/IE00B4L5Y983 | jq '{name, asOf: .data.dataAsOf, ter: .data.headlineMetrics.ter, risk: .data.riskRating, top: .data.topHoldings[:3]}'