Skip to main content
Press ⌘K to search

ETF endpoints separate exchange-traded products from the broader registered-fund directory. ETF identity comes from the active security-type reference feed; market figures use the exact listed ticker; assets, allocation, and holdings come from the linked Form NPORT-P series.

Use the shared /v1/stocks/{ticker}/… routes for ETF prices, quotes, institutional holders, short interest, short volume, off-exchange volume, fails-to-deliver, fund owners, and options. The /v1/securities/{ticker}/… spelling remains a compatibility alias. Use SEC filings for registrant-scoped disclosures; these can include sibling funds.

/v1/etfs

Search ETFs by ticker, fund name, or sponsor. A result can exist without a linked NPORT-P series; in that case the SEC fund fields are null rather than guessed. When SEC states no series name, name falls back to the listing's own registered security name. That applies only to a listing's own primary ticker, so a filer's name is never borrowed for the other tickers it owns.

Matching is substring-based across ticker, fund name, and sponsor, so a short query returns every related listing rather than a single exact hit. Results are ordered by net assets, largest first.

Parameters: query (required); limit (default 20, max 500).

curl "https://api.equibles.com/v1/etfs?query=SPY" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
response = requests.get(
    "https://api.equibles.com/v1/etfs",
    params={"query": "SPY"},
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(response.json())
const response = await fetch("https://api.equibles.com/v1/etfs?query=SPY", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await response.json());
{
  "totalMatches": 19,
  "data": [
    {
      "ticker": "SPY",
      "name": "Spdr S&P 500 ETF Trust",
      "sponsor": "State Street(R) SPDR(R) S&P 500(R) ETF Trust",
      "structure": "Unit investment trust",
      "netAssets": 781188872106.76,
      "holdingCount": 504,
      "reportPeriodDate": "2026-06-30"
    },
    {
      "ticker": "SPYM",
      "name": "State Street(R) SPDR(R) Portfolio S&P 500(R) ETF",
      "sponsor": "SPDR SERIES TRUST",
      "structure": "Open-end fund",
      "netAssets": 153918706143.48,
      "holdingCount": 511,
      "reportPeriodDate": "2026-06-30"
    }
  ]
}

The array above is abridged to the first two of the 19 matches; a real call returns every match up to `limit`.

/v1/etfs/

Return the dedicated ETF profile: latest settled close and date, session change, total-return windows, 52-week range, average volume, net and total assets, concentration, asset/country allocation, and ten largest stored holdings. priceIsIntraday is false; use the plan-entitled quote endpoint when you need delayed or real-time intraday data. When a split prevents a full-year raw-price comparison, range52WeekIsPartial is true, range52WeekStartDate states the first comparable date, and the high/low cover only that available interval.

coverageNote identifies each data source and states that expense ratio and benchmark are not inferred from holdings filings.

Allocation arrays contain the seven largest groups plus an Other remainder when more than eight groups exist, so omitted tail categories are never silently lost.

Parameters: {ticker} (path — exact ETF ticker, for example SPY).

curl "https://api.equibles.com/v1/etfs/SPY" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
response = requests.get(
    "https://api.equibles.com/v1/etfs/SPY",
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(response.json())
const response = await fetch("https://api.equibles.com/v1/etfs/SPY", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await response.json());
{
  "ticker": "SPY",
  "name": "Spdr S&P 500 ETF Trust",
  "sponsor": "State Street(R) SPDR(R) S&P 500(R) ETF Trust",
  "structure": "Unit investment trust",
  "secSeriesId": "",
  "price": 765.16,
  "priceDate": "2026-09-02",
  "priceIsIntraday": false,
  "dayChangePercent": 0.4436976554910821,
  "netAssets": 781188872106.76,
  "totalAssets": 783339902049.69,
  "holdingCount": 504,
  "reportedHoldingCount": 504,
  "holdingsCoverage": "fullPortfolio",
  "reportPeriodDate": "2026-06-30",
  "high52Week": 779.37,
  "low52Week": 629.28,
  "range52WeekStartDate": "2025-09-03",
  "range52WeekIsPartial": false,
  "averageVolume30Day": 43120173,
  "averageVolumeSessionCount": 30,
  "topTenWeightPercent": 36.41615985464,
  "priceHistoryStartDate": "2021-09-03",
  "performance": {
    "oneWeekPercent": -0.12,
    "oneMonthPercent": -0.60,
    "sixMonthPercent": 15.49,
    "monthToDatePercent": -0.25,
    "yearToDatePercent": 12.80
  },
  "assetAllocations": [{ "label": "EC", "percent": 99.980260549216 }],
  "countryAllocations": [{ "label": "US", "percent": 97.033555957075 }],
  "topHoldings": [
    { "name": "NVIDIA Corp", "ticker": "NVDA", "cusip": "67066G104", "balance": 293478235.00000000, "units": "NS", "valueUsd": 58722060041.15000000, "percentOfNetAssets": 7.517011844111, "assetCategory": "EC", "country": "US" }
  ],
  "coverageNote": "ETF identity is authoritative security-reference data. Market figures use settled bars for the exact listed ticker; use the quote endpoint for plan-entitled intraday data. Fund assets and holdings come from the latest stored SEC Form NPORT-P report. Concentration and allocation are returned only when stored and reported holding counts prove the portfolio is complete; expense ratio and benchmark are not inferred from that filing."
}

/v1/etfs/

Return the latest stored NPORT-P holdings for an ETF, ranked by value, with stored and reported counts plus an explicit holdingsCoverage value: fullPortfolio, trackedEquitiesOnly, or unknown when the filing's authoritative reported count is unavailable.

Parameters: {ticker} (path); limit (default 20, max 500); offset (default 0).

curl "https://api.equibles.com/v1/etfs/SPY/holdings?limit=20&offset=0" \
  -H "Authorization: Bearer eq_your_api_key"
import requests
response = requests.get(
    "https://api.equibles.com/v1/etfs/SPY/holdings",
    params={"limit": 20, "offset": 0},
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(response.json())
const response = await fetch("https://api.equibles.com/v1/etfs/SPY/holdings?limit=20&offset=0", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await response.json());
{
  "ticker": "SPY",
  "name": "Spdr S&P 500 ETF Trust",
  "reportPeriodDate": "2026-06-30",
  "netAssets": 781188872106.76,
  "totalHoldings": 504,
  "reportedHoldingCount": 504,
  "holdingsCoverage": "fullPortfolio",
  "data": [
    { "name": "NVIDIA Corp", "ticker": "NVDA", "cusip": "67066G104", "balance": 293478235.00000000, "units": "NS", "valueUsd": 58722060041.15000000, "percentOfNetAssets": 7.517011844111, "assetCategory": "EC", "country": "US" },
    { "name": "Apple Inc", "ticker": "AAPL", "cusip": "037833100", "balance": 177966046.00000000, "units": "NS", "valueUsd": 51496255070.56000000, "percentOfNetAssets": 6.592036434374, "assetCategory": "EC", "country": "US" }
  ],
  "meta": { "limit": 20, "offset": 0, "count": 20, "total": 504, "hasMore": true }
}

ETF endpoints versus fund endpoints

  • Use /v1/etfs* for an exact exchange-traded ticker plus market analysis.
  • Use /v1/funds* for mutual-fund share classes, SEC series identifiers, and the broader registered-fund directory.
  • Existing fund endpoints remain compatible and continue accepting ETF aliases.

Examples were captured from the production dataset on September 3, 2026. Market and filing values change as new prices and reports arrive.

Try it with a real key

Every example on this page runs against the live API. A free account includes an API key and MCP access — set up in under a minute.

Get your free API key