Errors always use the same envelope: { "error": { "code", "message", ... } }. Retry only 502 (twice, a minute apart); never retry a 4xx.
| Status | Code | When |
|---|---|---|
| 400 | invalid_isin | The ISIN is not syntactically valid (format + checksum), or a batch / portfolio / overlap call contained no valid ISIN. |
| 400 | invalid_body | POST body is not the expected JSON shape (batch: { isins: [] }; portfolio: { positions: [{ isin, weight }] }). |
| 400 | invalid_query | Search: ?q= is missing or shorter than two characters. |
| 400 | batch_too_large | More ISINs than the plan's batch size (Free 1, Starter 10, Pro 50, Scale 200, Enterprise 1,000). Includes batchMax. |
| 401 | missing_api_key | No Authorization: Bearer header (or X-Api-Key) was sent. |
| 401 | invalid_api_key | The key is malformed or unknown. |
| 401 | revoked_api_key | The key exists but was revoked from the dashboard. |
| 404 | fund_not_found | No public data could be retrieved for this ISIN (not a fund/ETF, delisted, or not covered yet). The response still contains the empty `data` skeleton. |
| 403 | plan_required | The endpoint needs a higher plan: changes, webhooks and export need Scale; extract needs Pro. Includes `required`. |
| 404 | not_cached | Demo endpoint only: the ISIN has not been loaded yet. Use an API key to load it. |
| 404 | not_found | Webhooks: no such endpoint on this account. |
| 429 | rate_limited | Monthly credits (and overage cap) exhausted, or the per-minute burst limit hit. `reason` is credits_exhausted | overage_cap | burst; includes retryAfter (seconds) and resetAt; the Retry-After header is also set. |
| 502 | upstream_error | The fund data could not be retrieved (temporary upstream outage). Retry later; the request is counted. |
404 Not Found — json{"error": {"code": "fund_not_found","message": "No published fund documents could be found for this ISIN. It may not be a UCITS fund/ETF, or its issuer may not be covered yet."},"isin": "US0378331005","cached": false,"generatedAt": "2026-09-09T08:12:44.000Z","data": {"…": "empty skeleton"}}