What happens if I send a stock, bond or index ISIN?
The API only knows funds. A valid ISIN that is a stock, bond, certificate or index returns 404 fund_not_found with an empty data skeleton and is counted as one request. How to tell the cases apart and avoid spending requests.Updated 12 September 2026 · by FundFacts APIShort answer
A syntactically valid ISIN that is not a covered fund (a share, bond, certificate, index or a delisted fund) returns 404 fund_not_found with the empty data skeleton, and it counts as one request because the documents were searched. A malformed ISIN returns 400 invalid_isin and costs nothing. Validate the format locally first, treat 404 as "not a fund" rather than as a bug, and do not retry it.
The two errors
| Status | error.code | When | Counted |
|---|---|---|---|
| 400 | invalid_isin | Not 12 characters, wrong pattern or bad check digit | No |
| 404 | fund_not_found | Valid ISIN, but no fund documents found: stock, bond, index, structured product, delisted or not-yet-covered fund | Yes |
json{ "error": { "code": "fund_not_found", "message": "No public fund data could be retrieved for US0378331005" } }
Why a 404 is counted
The API cannot know an ISIN is a stock without trying: it resolves the ISIN against the fund-house adapters and searches the published documents. That work is the same as for a fund that exists, so it is counted once. Pending and invalid entries are not.
Avoiding it
- Validate locally. 12 characters, two letters, nine alphanumerics, one Luhn check digit; the ISIN validator page shows the algorithm and the SDKs include it.
- Know the prefixes. Fund ISINs are mostly IE, LU, FR, DE, GB, CH, AT, NL, BE, DK, FI, SE, NO, IT, ES; a US-prefixed ISIN is usually a stock, though US-listed ETFs also exist.
- Search first.
GET /search?q=(free) confirms a fund is in the store before you spend a request. - Remember the answer. Store the 404 and do not re-send the ISIN; review the list weekly in case a new adapter now covers it.
A real fund that returns 404
It happens when the fund house is not yet covered or the share class is delisted. Report it with the ISIN; adapters are added by demand. For a PDF you already have, POST /extract (Pro and above) returns the same JSON shape.
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]}'