API Reference
REST API for SEC EDGAR fund holdings and exposures. Base URL https://api.fundlens.io/v1.
Authentication
All requests require an API key, sent as the x-api-key header. Get one from your dashboard.
curl https://api.fundlens.io/v1/funds \
-H "x-api-key: your_api_key"Conventions
DatesstringYYYY-MM-DD, interpreted as UTC.Monetary valuesintegervalueUsd and assetsUnderManagement are in US dollars.Point-in-timeasOfDate (portfolio snapshot date) and filingDate (when the SEC made it public). Use available_as_of for lookahead-safe queries.SourceErrors402 means the request needs a subscription plan (Starter or Growth) — e.g. historical / point-in-time queries on a Free or Pay-As-You-Go key./fundsList Funds
Get a paginated list of all available funds with basic metadata.
Query parameters
limitintegeroffsetintegerResponse fields
fundsFund[]paginationobjecttickerstring | nullnamestringcikstringseriesIdstring | nullassetsUnderManagementnumber | nullholdingsCountinteger | nulllastFilingDatestring | nulldataAsOfstring | nulllimitintegeroffsetintegertotalintegercurl "https://api.fundlens.io/v1/funds?limit=20&offset=0" \
-H "x-api-key: your_api_key"{
"funds": [
{
"ticker": "VTI",
"name": "Vanguard Total Stock Market ETF",
"cik": "0000036405",
"seriesId": "S000002848",
"assetsUnderManagement": 1234567890000,
"holdingsCount": 503,
"lastFilingDate": "2024-10-28",
"dataAsOf": "2024-09-30"
}
],
"pagination": { "total": 5000, "limit": 20, "offset": 0 }
}/funds/:tickerGet Fund Details
Get metadata for a specific fund by ticker.
Response fields
tickerstring | nullnamestringcikstringseriesIdstring | nullassetsUnderManagementnumber | nullholdingsCountinteger | nulllastFilingDatestring | nulldataAsOfstring | nullcurl https://api.fundlens.io/v1/funds/VTI \
-H "x-api-key: your_api_key"{
"ticker": "VTI",
"name": "Vanguard Total Stock Market ETF",
"cik": "0000036405",
"seriesId": "S000002848",
"assetsUnderManagement": 1234567890000,
"holdingsCount": 503,
"lastFilingDate": "2024-10-28",
"dataAsOf": "2024-09-30"
}/funds/:ticker/holdingsGet Holdings
Get portfolio holdings for a fund's latest filing, or for a point-in-time date. Paginated.
Query parameters
limitintegeroffsetintegeras_ofdatesubscriptionYYYY-MM-DD). Returns the most recent filing whose portfolio date (asOfDate) is on or before this date.available_as_ofdatesubscriptionYYYY-MM-DD). Returns the most recent filing already published (SEC-accepted) on or before this date — what was knowable then. Combinable with as_of.Response fields
fundTickerstringfundIdentifierstringasOfDatestringfilingDatestringasOfDate (a filing is accepted after the period it covers). Gate historical decisions on this to avoid lookahead.accessionNumberstringtotalHoldingsintegertotalAssetsUsdnumber | nulltotAssets), in US dollars. This is gross assets — not net assets, and only an approximation of AUM. NAV per share and shares outstanding are not in N-PORT.currencystringholdingsHolding[]paginationobjectsourcestringnamestringcusipstring | nullisinstring | nullfigistring | nulltickerstring | nullvalueUsdnumbersharesinteger | nullweightPercentnumbersecurityTypestringsectorstring | nullindustrystring | nullcountrystring | nullcurl "https://api.fundlens.io/v1/funds/VTI/holdings?limit=10&as_of=2024-09-30" \
-H "x-api-key: your_api_key"{
"fundTicker": "VTI",
"fundIdentifier": "S000002848",
"asOfDate": "2024-09-30",
"filingDate": "2024-10-28",
"accessionNumber": "0001752724-24-241234",
"totalHoldings": 503,
"totalAssetsUsd": 450000000000,
"currency": "USD",
"holdings": [
{
"name": "Apple Inc",
"cusip": "037833100",
"isin": "US0378331005",
"figi": "BBG000B9XRY4",
"ticker": "AAPL",
"valueUsd": 89000000000,
"shares": 394000000,
"weightPercent": 7.21,
"securityType": "equity",
"sector": "technology",
"industry": "hardware",
"country": "US"
}
],
"pagination": { "limit": 10, "offset": 0, "total": 503 },
"source": "SEC EDGAR N-PORT"
}/funds/:ticker/holdings/historySubscriptionList Available Filings
List every available point-in-time filing for a fund. Enumerate snapshots, then pull each via the holdings endpoint.
Response fields
fundTickerstringfundIdentifierstringfilingsFiling[]sourcestringasOfDatestringfilingDatestringasOfDate (a filing is accepted after the period it covers). Gate historical decisions on this to avoid lookahead.accessionNumberstringtotalHoldingsintegertotalAssetsUsdnumber | nullcurl "https://api.fundlens.io/v1/funds/VTI/holdings/history" \
-H "x-api-key: your_api_key"{
"fundTicker": "VTI",
"fundIdentifier": "S000002848",
"filings": [
{ "asOfDate": "2024-09-30", "filingDate": "2024-10-28", "accessionNumber": "0001752724-24-241234", "totalHoldings": 503, "totalAssetsUsd": 450000000000 },
{ "asOfDate": "2024-06-30", "filingDate": "2024-07-29", "accessionNumber": "0001752724-24-176543", "totalHoldings": 501, "totalAssetsUsd": 442000000000 }
],
"source": "SEC EDGAR N-PORT"
}/funds/:ticker/exposuresGet Exposures
Aggregated sector, industry, security-type, and country exposure for a fund, computed from its holdings.
Query parameters
as_ofdatesubscriptionYYYY-MM-DD), on-or-before semantics.available_as_ofdatepaidYYYY-MM-DD).Response fields
fundTickerstringasOfDatestringfilingDatestringasOfDate (a filing is accepted after the period it covers). Gate historical decisions on this to avoid lookahead.exposuresobjectsourcestringnamestringweightPercentnumbercurl https://api.fundlens.io/v1/funds/VTI/exposures \
-H "x-api-key: your_api_key"{
"fundTicker": "VTI",
"asOfDate": "2024-09-30",
"filingDate": "2024-10-28",
"exposures": {
"sector": [
{ "name": "technology", "weightPercent": 32.5 },
{ "name": "healthcare", "weightPercent": 12.1 }
],
"industry": [{ "name": "semiconductors", "weightPercent": 8.2 }],
"securityType": [{ "name": "equity", "weightPercent": 99.2 }],
"country": [{ "name": "US", "weightPercent": 96.8 }]
},
"source": "SEC EDGAR N-PORT"
}Bulk export
For backtesting and bulk loading, we provide the full historical holdings dataset as a point-in-time-safe file export rather than thousands of paginated calls. Available on the Growth plan — email sales@fundlens.io with the tickers and window you need.
What you get
LayoutfundTicker=SPY/holdings.csv). Parquet on request.RowsasOfDate, filingDate, totalAssetsUsd) are denormalized onto every row.ColumnsfundTicker, fundIdentifier, accessionNumber, totalAssetsUsd, and currency.UnitsvalueUsd and totalAssetsUsd are in US dollars — no cents, no division to apply.manifest.jsonDATA_DICTIONARY.mdPoint-in-time lineage
filingDateavailable_as_offilingDate ≤ date. Every export row keeps filingDate so you can reproduce the gate offline.AmendmentsfundIdentifiersharestotalAssetsUsdmanifest.json
DATA_DICTIONARY.md
fundTicker=SPY/holdings.csv
fundTicker=QQQ/holdings.csv
fundTicker=VTI/holdings.csv
...
# holdings.csv columns
fundTicker,fundIdentifier,asOfDate,filingDate,
accessionNumber,source,totalHoldings,
totalAssetsUsd,currency,ticker,name,cusip,
isin,figi,shares,valueUsd,weightPercent,
securityType,sector,industry,country