---
title: "ETF holdings from the SEC NPORT-P quarterly filing"
method: GET
path: "/api/v1/etf/{symbol}/holdings/sec"
tags: ["Funds & ETFs"]
---

# ETF holdings from the SEC NPORT-P quarterly filing

`GET /api/v1/etf/{symbol}/holdings/sec`

Full fund-holdings snapshot from the SEC's NPORT-P quarterly filing for one ETF underlier. Replaces the prior commercial fund-profile holdings field (Tier C, disabled in DATA-N1) with the SEC Tier S equivalent. NPORT-P carries the FULL holdings list (NOT top-10), CUSIP/ISIN/LEI, asset-cat + issuer-cat (for sector derivation), and ``invCountry`` (for country weightings). Public NPORT-P refreshes only ONCE per fiscal quarter (the SEC's month-3-of-quarter rule), so freshness is typically 3-5 months. Compare ``rep_pd_date`` against today to gauge staleness. Returns 404 ``holdings_unavailable`` when the ETF is a commodity-pool / grantor-trust structure (USO/UNG/GLD/SLV) that files 10-K/10-Q instead of NPORT-P.

## Path parameters

- `symbol` string, required — ETF underlier ticker.

## Response `200`

SEC NPORT-P holdings payload.

- EnvelopeSecNportHoldingsPayload
  - `data` SecNportHoldingsPayload, required — DATA-N3 derived endpoint: fund-holdings snapshot from the SEC NPORT-P quarterly filing for one ETF underlier. Per-ETF blob written by the ``quarterly_sec_nport`` Timer (5th of Jan/Apr/Jul/Oct UTC). Holdings are as-of the fund's most recent *public* fiscal-quarter-end (``rep_pd_date``) - typically 3-5 months stale by the time it's publicly disclosed per the SEC NPORT-P month-3 rule. Compare ``rep_pd_date`` against today to gauge freshness. Replaces the legacy ``fundProfile.topHoldings`` field (Tier C, disabled in DATA-N1) with the SEC Tier S equivalent. SEC's NPORT-P carries the FULL holdings list (not top-10), CUSIP/ISIN/LEI, asset-cat + issuer-cat for sector derivation, and ``invCountry`` for country weightings.
    - `ticker` string, required — ETF underlier ticker.
    - `cik` integer, required — SEC Central Index Key of the fund.
    - `fund_name` string, nullable — Fund's registered name as reported in NPORT-P ``regName``.
    - `accession` string, required — SEC filing accession number (dashed format).
    - `filing_date` string, nullable — Date the NPORT-P was filed (YYYY-MM-DD).
    - `rep_pd_date` string, nullable — Fund's fiscal-quarter-end date (holdings as-of). Typically lags filing_date by 60-90 days.
    - `holdings_count` integer, required — Number of distinct holdings rows in this filing.
    - `total_val_usd` number, nullable — Sum of ``val_usd`` across all holdings rows.
    - `net_assets` number, nullable — Fund-level net assets (``fundInfo/netAssets``) in USD - the true NAV-basis total. NOT the holdings gross sum ``total_val_usd``. Used by the snapshot builder to derive NAV and AUM.
    - `total_assets` number, nullable — Fund-level total assets (``fundInfo/totAssets``) in USD.
    - `total_liabilities` number, nullable — Fund-level total liabilities (``fundInfo/totLiabs``) in USD.
    - `monthly_returns` number[], nullable — Up to three monthly total-return percentages (``returnInfo/monthlyTotReturns``), chronological - earliest first, the ``rep_pd_date`` month last. Shorter when the fund reported fewer than three months.
    - `holdings` SecNportHolding[], required — Full holdings list from the filing. Default sort matches the filing's row order (typically by ``pct_val`` DESC). Clients computing 'top N' should sort client-side.
      - `name` string, nullable — Issuer / security name as reported.
      - `title` string, nullable — Security title (e.g. share class).
      - `cusip` string, nullable
      - `isin` string, nullable
      - `lei` string, nullable — Legal Entity Identifier (ISO 17442).
      - `balance` number, nullable — Number of shares / units of the security held.
      - `val_usd` number, nullable — Aggregate USD value of the position at fiscal-quarter-end.
      - `pct_val` number, nullable — Position weight as percent of the fund's net assets.
      - `asset_cat` string, nullable — SEC asset-category code. Common values: ``EC`` (equity-common), ``DBT`` (debt), ``DIV`` (derivative), ``RA`` (repurchase agreement).
      - `issuer_cat` string, nullable — SEC issuer-category code. Common values: ``CORP`` (corporation), ``USGSE`` (US government-sponsored entity), ``MUN`` (municipal).
      - `country` string, nullable — ISO-3166-1 alpha-2 country code of investment.
      - `currency` string, nullable — Currency code of the position.
    - `data_source` string, required — Always ``sec_nport`` for this endpoint. Reserved for forward-compat (e.g. ``sec_n_csr`` fallback for funds without NPORT-P).
    - `license_attribution` string, required — U.S. Public Domain (federal data, 17 USC §105).
  - `meta` SugraMeta, required — Metadata attached to every /api/v1/* response envelope.
    - `endpoint` string, required — Requested endpoint path.
    - `data_time` string, required — ISO 8601 UTC timestamp of the source data, not of the request.
    - `response_time` string, required — ISO 8601 UTC timestamp when this response was produced.
    - `provider` string, required — API name and version.
    - `source` string, nullable — Identifier of the primary upstream source used for this response.
    - `attribution` string, nullable — Human-readable attribution mandated by an upstream source (e.g. a securities regulator or self-regulatory organization). Present only on responses whose source requires the owner and source to be clearly identified. Do not remove or alter it when using the response.
    - `fallback_used` boolean, nullable — True when the primary source failed and a fallback produced the data.
    - `fallback_chain` string[], nullable — Ordered list of sources attempted, in the order they were tried.
    - `cached` boolean, nullable — True when this response was served from the internal cache.
    - `stale` boolean, nullable — True when the cached response was returned after the upstream rate-limited or errored. Clients can use this to detect degraded data.

## Other responses

- `401` — Missing or invalid `x-api-key` header.
- `422` — Validation Error
- `429` — Daily rate limit exceeded. Check `X-RateLimit-Reset` for the next window.
- `503` — Upstream source is temporarily unavailable. Retry after a short delay.

---

[API](https://skmtc.net/sugra/apis/sugra-api.md) · [All operations](https://skmtc.net/sugra/apis/sugra-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/sugra/sugra-api/versions/dcf7427e6897/schema)
