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](/docs/api/endpoints/securities) 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](/docs/api/endpoints/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).

```bash
curl "https://api.equibles.com/v1/etfs?query=SPY" \
  -H "Authorization: Bearer eq_your_api_key"
```

```python
import requests
response = requests.get(
    "https://api.equibles.com/v1/etfs",
    params={"query": "SPY"},
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(response.json())
```

```javascript
const response = await fetch("https://api.equibles.com/v1/etfs?query=SPY", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await response.json());
```

```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/{ticker}

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](/docs/api/endpoints/prices) 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`).

```bash
curl "https://api.equibles.com/v1/etfs/SPY" \
  -H "Authorization: Bearer eq_your_api_key"
```

```python
import requests
response = requests.get(
    "https://api.equibles.com/v1/etfs/SPY",
    headers={"Authorization": "Bearer eq_your_api_key"},
)
print(response.json())
```

```javascript
const response = await fetch("https://api.equibles.com/v1/etfs/SPY", {
  headers: { Authorization: "Bearer eq_your_api_key" },
});
console.log(await response.json());
```

```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/{ticker}/holdings

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).

```bash
curl "https://api.equibles.com/v1/etfs/SPY/holdings?limit=20&offset=0" \
  -H "Authorization: Bearer eq_your_api_key"
```

```python
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())
```

```javascript
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());
```

```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.