EDGAR 13F Filings
Metadata for every 13F report, the quarterly filing where large institutional managers list their U.S. equity holdings.
edgar_13f_filings — the dataset name to pass to the Obscura API.
What one row means
A 13F-HR cover-page summary for one institutional investment manager's quarterly report of Section 13(f) securities holdings — the manager, the reporting period, the aggregate portfolio totals, and the count of positions (the individual positions themselves live in the child table `edgar_13f_holdings`, keyed by the same `filename`).
One row per one row per 13F submission document (EDGAR accession `filename`); original 13F-HR filings and their 13F-HR/A amendments are distinct rows, no dedup to one row per (manager, quarter).
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_13f_filings: published: available_date is recovered via filename -> edgar_filings.event_date, the EDGAR filing/acceptance date (the true public-availability anchor); period_end is the periodOfReport quarter-end, filed up to ~45 days later — never the availability anchor.
Refresh cadence
Obscura refreshes edgar_13f_filings 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 — 17 columns
The full public column list for edgar_13f_filings, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/edgar_13f_filings.
| Column | Type | Description |
|---|---|---|
| filename | text · not null | EDGAR accession/document path (e.g. edgar/data/CIK/accession.txt); primary key of the row and the join key to `edgar_filings` and the child `edgar_13f_holdings` table. |
| cik | bigint · not null | SEC Central Index Key of the institutional manager that filed the 13F, parsed from the `<cik>` tag in the cover. |
| manager_name | text | Name of the filing institutional manager, from `<filingManager><name>`; nullable. |
| available_date | date | Public availability date: the 13F's SEC filing/dissemination date — when the public could first see it. Recovered from `edgar_filings` via `filename`. The point-in-time anchor. |
| period_end | date | Reporting-period end (`periodOfReport`) — the quarter the holdings are AS OF. Filed up to ~45 days later, so NEVER the availability date. |
| report_type | text | Report classification from the cover page `<reportType>`: `13F HOLDINGS REPORT` / `13F NOTICE` / `13F COMBINATION REPORT`. A NOTICE carries no holdings of its own, so 0 positions is expected — this distinguishes it from a parse failure. |
| submission_type | text | SEC form type of the submission (`13F-HR` original vs `13F-HR/A` amendment), from the cover `<submissionType>` / SGML `CONFORMED SUBMISSION TYPE`. The grain keeps amendments as distinct rows; this is the only column that says which. |
| is_confidential_omitted | boolean | Whether the manager omitted confidential holdings under delayed-disclosure relief (summary page `<isConfidentialOmitted>`); true means the reported portfolio is incomplete. |
| other_included_managers_count | bigint | Count of other managers whose holdings are aggregated into this combined filing (summary page `<otherIncludedManagersCount>`; 14 for Berkshire); nullable. |
| form_13f_file_number | text | The filing manager's 13F file number (cover `<form13FFileNumber>`, e.g. `028-04545`); a stable per-manager identifier for the 13F series. |
| manager_state | text | State or country code of the filing manager's address (`<filingManager><address><stateOrCountry>`, e.g. `NE`); nullable. |
| manager_zip | text | ZIP/postal code of the filing manager's address (`<filingManager><address><zipCode>`); nullable. |
| acceptance_datetime | timestamp with time zone | Exact SGML `<ACCEPTANCE-DATETIME>` acceptance moment (e.g. `20260515160605` = 16:06 ET), finer than `available_date`'s day granularity; nullable. |
| table_entry_total | bigint | Manager-reported count of holdings entries from the summary page `<tableEntryTotal>`; nullable, source-declared (may differ from the parsed `positions`). |
| table_value_total | double precision | Manager-reported aggregate market value of all reported holdings from `<tableValueTotal>` (in the form's units, typically dollars or thousands); nullable. |
| positions | integer · not null | Actual number of `<infoTable>` position rows parsed and written to `edgar_13f_holdings` for this filing; NOT NULL, default 0. |
| scraped_at | timestamp with time zone · not null | Ingestion timestamp (`Utc::now()` at upsert); internal provenance, excluded from exports. Not the filing or public date. |
Access edgar_13f_filings
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_13f_filings",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the edgar_13f_filings dataset?
Metadata for every 13F report, the quarterly filing where large institutional managers list their U.S. equity holdings. A 13F-HR cover-page summary for one institutional investment manager's quarterly report of Section 13(f) securities holdings — the manager, the reporting period, the aggregate portfolio totals, and the count of positions (the individual positions themselves live in the child table `edgar_13f_holdings`, keyed by the same `filename`).
How do I avoid look-ahead bias with edgar_13f_filings?
Filter on edgar_13f_filings.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date is recovered via filename -> edgar_filings.event_date, the EDGAR filing/acceptance date (the true public-availability anchor); period_end is the periodOfReport quarter-end, filed up to ~45 days later — never the availability anchor. 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_13f_filings?
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_13f_filings". The column schema is public at https://api.obscura.trade/v1/catalog/edgar_13f_filings.
Can I filter edgar_13f_filings by company or symbol?
Yes. edgar_13f_filings carries cik, the column the API's symbols filter resolves against.
How often is edgar_13f_filings updated?
Obscura refreshes edgar_13f_filings 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.