EDGAR N-PORT Holdings
Holdings inside fund N-PORT reports, security by security.
edgar_nport_holdings — the dataset name to pass to the Obscura API.
What one row means
A single security position (one `invstOrSec` line) reported in an SEC Form N-PORT-P filing — a registered fund's holding of one security, with the issuer, its identifiers (CUSIP/ISIN/ticker/LEI), balance, USD value and percent of net assets. Parsed from the filing's `edgarSubmission` XML `invstOrSec` list.
One row per (filename, seq).
Point-in-time availability
Every Obscura dataset carries available_date: the calendar day the publisher made the row
available, day-of, with no session rounding. It is the one column a backtest filters on, and it means the
same thing on every dataset in the catalog.
For edgar_nport_holdings: join-derived: available_date = edgar_filings.event_date via filename, the SEC dissemination/acceptance date of the N-PORT-P filing.
Refresh cadence
Obscura refreshes edgar_nport_holdings every weekday — the most frequent scheduled job that re-collects or re-exports it. This is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when a row became public is recorded per row in available_date.
Schema — 30 columns
The full public column list for edgar_nport_holdings, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/edgar_nport_holdings.
| Column | Type | Description |
|---|---|---|
| filename | text · not null | EDGAR archive path of the N-PORT-P submission (under sec.gov/Archives/); part of PK, denormalized from edgar_filings and used to join back to the filing's public filing date. |
| seq | integer · not null | 0-based position index within the filing's invstOrSec list; assigned by the task via `.enumerate()`, not sourced from the filing. Part of PK. |
| reg_cik | bigint | Filer (registrant) CIK, denormalized from the filing's genInfo/regCik for easy joins. |
| available_date | date | The filing's SEC dissemination date — when the public could first see it. Recovered (DB-generated) from edgar_filings via filename. The point-in-time anchor. |
| period_end | date | Report-period end (`repPdDate`) the holdings are AS OF; filed ~60 days later, so never the availability date. |
| name | text | Issuer / security name as reported in invstOrSec/name. |
| title | text | Security title / description (invstOrSec/title), e.g. the instrument label. |
| cusip | text | Security CUSIP (invstOrSec/cusip); indexed. Nullable. |
| isin | text | Security ISIN from invstOrSec/identifiers/isin@value. Nullable. |
| ticker | text | Security ticker from invstOrSec/identifiers/ticker@value; indexed. Nullable. |
| lei | text | Legal Entity Identifier of the issuer (invstOrSec/lei). Nullable. |
| balance | double precision | Quantity held; interpretation depends on units (shares for NS, principal amount for PA, etc.). |
| units | text | Units of balance: "NS" (shares), "PA" (principal amount), ... |
| cur_cd | text | Currency code of the position (invstOrSec/curCd), e.g. USD. |
| val_usd | double precision | USD market value of the position (invstOrSec/valUSD). |
| pct_val | double precision | Percent of the fund's net assets. |
| payoff_profile | text | "Long" / "Short". |
| asset_cat | text | Asset category (EC=equity common, DBT=debt, ...). |
| issuer_cat | text | Issuer category (CORP, USGSE, ...). |
| inv_country | text | Investment / issuer country code (invstOrSec/invCountry), e.g. US. |
| fair_val_level | text | ASC 820 fair-value hierarchy level (invstOrSec/fairValLevel): "1"/"2"/"3" (level 3 = unobservable inputs, hard to value). Valuation-quality signal. |
| is_restricted_sec | boolean | Restricted-security flag (invstOrSec/isRestrictedSec, Y/N → bool): 144A / illiquid. A liquidity status not derivable from other stored fields. |
| is_loan_by_fund | boolean | Securities-lending flag (invstOrSec/securityLending/isLoanByFund, Y/N → bool): whether this position is out on loan by the fund. |
| is_cash_collateral | boolean | Loan collateral flag (securityLending/isCashCollateral, Y/N → bool): whether cash collateral was received for a loaned position. |
| is_non_cash_collateral | boolean | Loan collateral flag (securityLending/isNonCashCollateral, Y/N → bool): whether non-cash collateral was received for a loaned position. |
| maturity_dt | date | Debt-security maturity date (invstOrSec/debtSec/maturityDt); present only for fixed-income holdings, parsed `%Y-%m-%d`. |
| coupon_kind | text | Debt-security coupon type (invstOrSec/debtSec/couponKind), e.g. "Fixed" / "Floating" / "Zero coupon". Fixed-income only. |
| annualized_rt | double precision | Debt-security annualized coupon rate percent (invstOrSec/debtSec/annualizedRt). Fixed-income only. |
| is_default | boolean | Debt-security default flag (invstOrSec/debtSec/isDefault, Y/N → bool): whether the issuer is in default. Fixed-income only. |
| scraped_at | timestamp with time zone · not null | Internal ingestion timestamp; excluded from exports. |
Access edgar_nport_holdings
Two delivery paths, one identifier. Both require an Obscura account and an active subscription; the catalog entry and the schema above are public.
import obscura
client = obscura.Client("obs_live_…")
df = client.query(
dataset="edgar_nport_holdings",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the edgar_nport_holdings dataset?
Holdings inside fund N-PORT reports, security by security. A single security position (one `invstOrSec` line) reported in an SEC Form N-PORT-P filing — a registered fund's holding of one security, with the issuer, its identifiers (CUSIP/ISIN/ticker/LEI), balance, USD value and percent of net assets. Parsed from the filing's `edgarSubmission` XML `invstOrSec` list.
How do I avoid look-ahead bias with edgar_nport_holdings?
Filter on edgar_nport_holdings.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — join-derived: available_date = edgar_filings.event_date via filename, the SEC dissemination/acceptance date of the N-PORT-P filing. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get edgar_nport_holdings?
As a Parquet bulk export (POST https://api.obscura.trade/v1/download) or as JSON from the typed query API (POST https://api.obscura.trade/v1/query), both with dataset="edgar_nport_holdings". The column schema is public at https://api.obscura.trade/v1/catalog/edgar_nport_holdings.
Can I filter edgar_nport_holdings by company or symbol?
Yes. edgar_nport_holdings carries ticker, the column the API's symbols filter resolves against.
How often is edgar_nport_holdings updated?
Obscura refreshes edgar_nport_holdings on a every weekday schedule — that is the most frequent scheduled job that re-collects or re-exports the table. It is Obscura's own pipeline cadence, not the upstream publisher's release schedule; when the publisher makes a row available is described by the availability rule above, and is recorded per row in available_date.