Documentation.
ETF holdings, fund facts and security identity from primary sources. Version 1.1.0 of the API, read-only, JSON over HTTPS. This page is built from the OpenAPI file, which you can also load into your own tools.
Base URL
https://api.krabydata.com/v1. Every answer is JSON: { "data": ... }, lists add
"pagination", and an error is { "error": "code", "message": "..." }. Any website may call
the API from a browser (CORS is open for GET), but your key is then visible to your visitors: call it from your server
when you can.
Authentication
Send your key in a header on every request but /v1/health and /v1/stats:
Authorization: Bearer kd_...
A key is kd_ followed by 43 characters. It is shown once, when it is created; we keep only its hash
and cannot show it again. A key is never read from the query string, so it does not end up in logs or browser history.
A key is personal: one person or one product, not shared. Get a free key.
Limits and their headers
Each plan allows a number of requests per UTC day and per minute (see the plans). Every answer to a keyed request carries:
| Header | Meaning |
|---|---|
X-RateLimit-Limit | Requests your plan allows per UTC day. |
X-RateLimit-Remaining | Requests left today, this one counted. |
Retry-After | On a 429 only: seconds to wait, until the next minute or until midnight UTC. |
The day's count starts again at midnight UTC. Unlimited plans send no limit headers.
Errors
The status says what kind of problem it is, error says exactly which, and message says it
in words. Codes do not change within v1.
| Status | error | When |
|---|---|---|
| 400 | bad_request | The resolver was given none of symbol, ticker with mic, or isin. |
| 400 | bad_isin | An ISIN that is not two letters, nine characters and a check digit. |
| 400 | bad_date | A date that is not YYYY-MM-DD. |
| 400 | bad_sort | A sort field the fund list does not know. |
| 300 | ambiguous | Several funds share that ticker. The answer lists them in candidates; ask again by ISIN. |
| 401 | missing_key | No Authorization header, or not in the form Bearer <key>. |
| 401 | invalid_key | Not a KrabyData key, or a key that does not exist. |
| 403 | revoked_key | The key was revoked. |
| 403 | unknown_plan | The key's plan is no longer offered. Write to us. |
| 404 | not_found | No fund, security or route by that name. |
| 404 | not_licensed | A dataset your key may not see (see below). |
| 404 | no_holdings | No holdings stored for the fund on or before the date. |
| 404 | suspect_holdings | The only files for the date failed the weight check on write, and are held back. The message says why. |
| 405 | method_not_allowed | The API is read-only: GET only. |
| 429 | quota_exceeded | The plan's requests for the UTC day are used up. Retry-After says when midnight UTC comes. |
| 429 | rate_limited | Too many requests this minute. Retry-After says how many seconds to wait. |
| 500 | internal_error | Our fault. Nothing to change on your side; tell us if it lasts. |
What your key does not see, and why
KrabyData only passes on what its sources allow. PentaLab's own products see more than a customer's key; the difference is always the same, and it is stated here rather than discovered.
- Funds from issuers that have not agreed. Daily holdings files of Global X (Europe and US) and
VanEck Europe carry notices against reproduction and derivative works. Those funds answer 404
not_licensedand are left out of every list, until an issuer agrees in writing. - Their funds that file with the SEC. A Global X US fund also files Form N-PORT, which is public. Such a fund answers from its filings only: its ISIN, ticker, name, EDGAR ids, the fee in its SEC prospectus and its N-PORT dates. Its NAV, net assets, launch date and the issuer's daily files are not shown.
- The resolver uses public evidence only.
/v1/listings/resolveanswers from OpenFIGI's listings, the security master rows SEC filings name with the ticker they give, and lines of SEC filings that carry their own ISIN. A symbol that only an issuer's file connects to an ISIN answers as an unknown symbol would, with no hint that anything was left out. The same rule applies to/v1/securities/{isin}. - No CUSIP and no SEDOL. CUSIP Global Services and LSEG own those codes and license them
separately. Fields named
cusiporsedolnever appear in your answers. - FIGI with attribution. FIGIs are given, with
"attribution": "FIGI data from OpenFIGI"in the answer, which you should keep beside them.
How old the data is
Holdings from SEC Form N-PORT are dated at the filing's report period end. Funds file every month, but only the
third month of each quarter is made public, 60 days after the quarter ends, so the holdings are two to five months old.
Every such answer carries source.freshness saying so, and asOf with the date. Identity
answers are current.
Versions
The base path carries the major version. Within /v1, fields and routes may be added; nothing is removed,
renamed or changes meaning without a /v2, which would run beside /v1 for a notice period.
Read your JSON so that an unknown field is ignored. Questions: contact@krabydata.com.
Routes.
/v1/health
no key neededService status, for status pages and uptime checks
Needs no key. Whether the database answers, each source's latest holdings date, and each collector's last run.
Answers
| 200 | Up |
| 503 | The database does not answer |
Fields of a 200 answer
okbooleantimestring (date-time)databaseobjectokbooleanmsinteger
holdingsarray of objectsourcestringlatestAsOfstring (date)lastFetchedAtstring (date-time)
collectorsarray of objectcollectorstringstartedAtstring (date-time)finishedAtstring (date-time) or nullfundsintegerfilesintegerrowsintegererrorsinteger
lastRunobject or null The most recent of the collectors' runs
/v1/stats
no key neededWhat the service holds, for the site's front page
Needs no key. Funds, the holding lines of each fund's latest file, the securities in the master, and per source its funds and latest holdings date. Kept for a minute; the answer says when it was computed.
Answers
| 200 | The figures |
Fields of a 200 answer
dataobjectfundsintegerfundsWithHoldingsintegerholdingLinesinteger Lines of each fund's latest holdings filesecuritiesinteger ISINs in the security mastersourcesarray of objectsourcestringnamestringexternalDistributionboolean Whether external keys see this sourcefundsintegerfundsWithHoldingsintegerfundsWithFeesintegerholdingLinesintegerlatestAsOfstring (date) or null
asOfstring (date-time) When the figures were computed
/v1/issuers
Sources collected, with their counts, latest date and last run
An external key sees only the issuers whose data may be redistributed.
Answers
| 200 | The issuers |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataarray of objectidstringnamestringwebsitestring or nullnoticestring or nullexternalDistributionbooleanfundsintegerfundsWithHoldingsintegerlatestAsOfstring (date) or nulllastFetchedAtstring (date-time) or nulllinesLatestintegerlastRunobject or null
/v1/etfs
A page of funds
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
issuer | query | string | An issuer id from /v1/issuers (sec-nport, globalx...) |
q | query | string | Text found in the name, ticker or ISIN |
sort | query | string: ticker name issuer isin fees launched nav holdingsAsOf lines | |
dir | query | string: asc desc | Default asc |
limit | query | integer | Default 100 |
offset | query | integer | Default 0 |
Answers
| 200 | The page |
| 400 | A malformed parameter (bad_date, bad_isin, bad_sort, bad_request) |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
paginationobjectlimitintegeroffsetintegercountintegertotalinteger
dataarray of objectisinstringtickerstring or nullnamestringissuerstringshareClassstring or nullthemestring or nullsfdrstring or nullongoingChargesPctnumber or nullinceptionDatestring (date) or nullcountriesarray of stringnetAssetsnumber or nullnavnumber or nullnavAsOfstring (date) or nulldomicilestring or nullreplicationstring or nulldistributionFrequencystring or nullbaseCurrencystring or nullindexNamestring or nulldetailsAtstring (date-time) or nullholdingsobject or nullasOfstring (date)countinteger
identifiedWeightPctnumber or nulledgarobject or null A US fund's ids in SEC EDGARcikstringseriesIdstring or nullclassIdstring or null
/v1/etfs/{id}
One fund's facts
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
id required | path | string | The fund's ISIN, or its ticker when no other fund shares it (300 otherwise) |
Answers
| 200 | The fund |
| 300 | Several funds share that ticker; use the ISIN |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 404 | No such fund or security (not_found), or a dataset an external key may not see (not_licensed) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectisinstringtickerstring or nullnamestringissuerstringshareClassstring or nullthemestring or nullsfdrstring or nullongoingChargesPctnumber or nullinceptionDatestring (date) or nullcountriesarray of stringnetAssetsnumber or nullnavnumber or nullnavAsOfstring (date) or nulldomicilestring or nullreplicationstring or nulldistributionFrequencystring or nullbaseCurrencystring or nullindexNamestring or nulldetailsAtstring (date-time) or nullholdingsobject or nullasOfstring (date)countinteger
identifiedWeightPctnumber or nulledgarobject or null A US fund's ids in SEC EDGARcikstringseriesIdstring or nullclassIdstring or null
issuerNamestring or nullhistoryobjectdaysinteger Holdings dates storedfromstring (date) or null
sourceobject Where the numbers came from, and how old they areissuerstring or nullissuerNamestring or nullurlstring or nullfetchedAtstring (date-time) or nullsha256string or nullnoticestring or null The source's own terms noticeexternalDistributionbooleanfreshnessstring or null How old this source's data is (N-PORT two to five months)
/v1/etfs/{id}/holdings
A fund's holdings on a date
The latest file on or before date (today when omitted) whose weights passed the check on write. Lines keep the file's own identifiers; a line whose file gave no ISIN may carry one found by a rule, named in isinFrom.
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
id required | path | string | The fund's ISIN, or its ticker when no other fund shares it (300 otherwise) |
date | query | string (date) |
Answers
| 200 | The holdings |
| 300 | Several funds share that ticker; use the ISIN |
| 400 | A malformed parameter (bad_date, bad_isin, bad_sort, bad_request) |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 404 | No such fund (not_found), not licensed for an external key (not_licensed), no file on or before the date (no_holdings), or only files held back by the weight check (suspect_holdings, with the reason) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectetfobjectisinstringtickerstring or nullnamestringissuerstring
asOfstring (date)requestedDatestring (date) or nulltotalsobjectlinesintegersecuritiesintegerweightPctnumbersecuritiesWeightPctnumbercashWeightPctnumbercryptoWeightPctnumberotherWeightPctnumberidentifiedWeightPctnumber or null Share of the security weight whose lines carry an ISIN
sourceobject Where the numbers came from, and how old they areissuerstring or nullissuerNamestring or nullurlstring or nullfetchedAtstring (date-time) or nullsha256string or nullnoticestring or null The source's own terms noticeexternalDistributionbooleanfreshnessstring or null How old this source's data is (N-PORT two to five months)
attributionstring "FIGI data from OpenFIGI" when a line carries a FIGI (external keys)holdingsarray of objectlineintegerkindstring one ofsecurity,cash,crypto,othernamestringisinstring or nullisinFromstring or null The file, or the rule that found the ISIN. one offile,cusip,master-cusip,master-sedol,treasury,master-ticker,successorsedolstring or null Internal keys onlytickerstring or nulltickerFromstring or null one offile,mastercountrystring or nullfigistring or nullcusipstring or null Internal keys onlycurrencystring or nullsectorstring or nullassetCatstring or null N-PORT asset category (EC, EP, DBT...)weightPctnumber or nullsharesnumber or nullpricenumber or nullmarketValuenumber or null
/v1/etfs/{id}/holdings/dates
Every holdings date stored for a fund
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
id required | path | string | The fund's ISIN, or its ticker when no other fund shares it (300 otherwise) |
Answers
| 200 | The dates, newest first; a held-back date is listed with its reason and never served |
| 300 | Several funds share that ticker; use the ISIN |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 404 | No such fund or security (not_found), or a dataset an external key may not see (not_licensed) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectetfobjectisinstringtickerstring or nullnamestringissuerstring
datesarray of objectasOfstring (date)countintegerfetchedAtstring (date-time)suspectbooleansuspectReasonstring or null
/v1/etfs/{id}/holdings/open
Security lines of the latest file still without an ISIN, heaviest first, and why
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
id required | path | string | The fund's ISIN, or its ticker when no other fund shares it (300 otherwise) |
Answers
| 200 | The open lines |
| 300 | Several funds share that ticker; use the ISIN |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 404 | No such fund or security (not_found), or a dataset an external key may not see (not_licensed) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectetfobjectisinstringtickerstring or nullnamestringissuerstring
asOfstring (date)identifiedWeightPctnumber or nullopenLinesintegeropenWeightPctnumberopenarray of objectlineintegernamestringtickerstring or nullcusipstring or null Internal keys onlyassetCatstring or nullweightPctnumber or nullwhystring one oftie: preferred,tie: share classes,successor unconfirmed,venue unknown,no candidate,debt,no identifier,resolvablecandidatesarray of string
/v1/etfs/{id}/listings
Every venue a fund trades on, from OpenFIGI
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
id required | path | string | The fund's ISIN, or its ticker when no other fund shares it (300 otherwise) |
Answers
| 200 | The listings |
| 300 | Several funds share that ticker; use the ISIN |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 404 | No such fund or security (not_found), or a dataset an external key may not see (not_licensed) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectetfobjectisinstringtickerstring or nullnamestringissuerstring
listingsarray of objectfigistringisinstringtickerstringexchCodestring or null Bloomberg venue codemicstring or nullsymbolstring or null Yahoo-style symbol where one existsnamestring or nullsecurityTypestring or nullfetchedAtstring (date-time)
attributionstring alwaysFIGI data from OpenFIGI
/v1/listings/resolve
The ISIN behind a symbol, a ticker on a venue, or the listings of an ISIN
Give one of symbol (a Yahoo-style symbol: DFNS.MI, NESN.SW, AMZN, BRK-B), ticker with mic, or isin. A fund is found in its OpenFIGI listings, a share in the security master, then in holdings lines. When several ISINs answer, isin is null and candidates lists them: the API never guesses. An external key's answer rests on public evidence only: OpenFIGI listings, the master rows SEC N-PORT filings name with the ticker they give, and N-PORT lines that carry their own ISIN.
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
symbol | query | string | |
ticker | query | string | |
mic | query | string | ISO 10383 market identifier code |
isin | query | string |
Answers
| 200 | The answer, possibly empty |
| 400 | A malformed parameter (bad_date, bad_isin, bad_sort, bad_request) |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectisinstring or nullcandidatesarray of stringfundsarray of objectisinstringtickerstring or nullnamestringissuerstring
listingsarray of objectfigistringisinstringtickerstringexchCodestring or null Bloomberg venue codemicstring or nullsymbolstring or null Yahoo-style symbol where one existsnamestring or nullsecurityTypestring or nullfetchedAtstring (date-time)
securitiesarray of objectisinstringnamestring or nullcurrencystring or nulltickersarray of stringheldByFundsintegerlastSeenstring (date) or nullcusipstring or null Internal keys onlycountrystring or null
attributionstring alwaysFIGI data from OpenFIGI
/v1/securities/{isin}
One security from the master, with its succession
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
isin required | path | string |
Answers
| 200 | The security |
| 400 | A malformed parameter (bad_date, bad_isin, bad_sort, bad_request) |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 404 | No such fund or security (not_found), or a dataset an external key may not see (not_licensed) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectisinstringtickerstring or nullnamestring or nullcusipstring or null Internal keys onlyleistring or nullcountrystring or nullfirstSeenstring (date) or nulllastSeenstring (date) or nullheldByFundsinteger or nullsucceededByobject or nullisinstringeffectiveFromstring (date) or nullevidenceobject
succeedsarray of objectisinstringeffectiveFromstring (date) or nullevidenceobject
/v1/securities/{isin}/funds
The funds holding a security, from each fund's latest file on or before the date
Parameters
| Name | In | Type | Meaning |
|---|---|---|---|
isin required | path | string | |
date | query | string (date) |
Answers
| 200 | The funds, heaviest weight first |
| 400 | A malformed parameter (bad_date, bad_isin, bad_sort, bad_request) |
| 401 | No key (missing_key) or an unknown one (invalid_key) |
| 403 | A revoked key (revoked_key) |
| 429 | Over the daily quota (quota_exceeded, until midnight UTC) or the per-minute rate (rate_limited) |
Fields of a 200 answer
dataobjectisinstringnamestring or nullrequestedDatestring (date) or nullfundsarray of objectisinstringtickerstring or nullnamestringissuerstringasOfstring (date)weightPctnumber or nullsharesnumber or nullmarketValuenumber or null