Asset-Backed Securities Distributions (Form 10-D)
Form 10-D distribution reports for asset-backed securities: which trust paid out, for which distribution period, its depositor and sponsor, the Regulation AB asset class, and whether asset-level data rode along with the filing. A monthly census of every publicly registered US securitisation trust and the deal parties behind it.
edgar_abs_distributions - the dataset name to pass to the Obscura API.
What one row means
One **Form 10-D asset-backed issuer distribution report** - the mandated cover-page identity of one distribution period for one securitisation trust. 105,652 filings since 2015: a complete monthly census of every publicly-registered US securitisation, and the only public place where a trust, its depositor, its sponsor and its Reg AB asset class are stated together, per period, as identified CIKs. # What a row IS, and what it deliberately is not A row is the SUBMISSION'S IDENTITY: which trust, which period, which deal parties, which exhibits rode along. It is **not** the pool's numbers. Those live in `EX-99.1`, which Reg AB Item 1121 prescribes the *content* of and not the *shape* of: three opened servicer reports share no row labels, no column headers and not even a table count (10 vs 33 vs 33). A single field parser across 105,652 of those does not exist, so this table does not pretend to one. See `docs/datasets/edgar_abs_distributions.md`. # Every column here is a STRUCTURED SEC header field - none is parsed prose The design proposed reading the depositor, the sponsor and the trust off the cover page's English. It does not have to: SEC's own submission header states `<DEPOSITOR-CIK>`, `<SPONSOR-CIK>` and `ABS ASSET CLASS` outright, measured present on **156 of 156** filings sampled across 2015 and 2026. So the whole row is evidence class B, and the cover-page prose - the distribution date, the period start, the note-class table - is left unread rather than half-parsed. # The row costs 3.5 KB of bronze, not 52 MB The submission this describes is landed by [`edgar_abs_assets`](super::edgar_abs_asset) territory and can be enormous: one dissemination day of 10-D (2026-06-15, 106 filings) is **5.39 GB** of full submissions - median 657 KB, mean 52 MB, max 288 MB, 36 % over 10 MB - because 37 % of modern 10-Ds carry a Reg AB II asset-level `EX-102` XML rider. This dataset's bronze is instead SEC's own `-index-headers.html` submission-index object (2.5–6.6 KB, measured), which carries the complete SGML header AND the document manifest and nothing else. That is what keeps the cheap cover-page table from being hostage to the multi-terabyte asset-level one. # Two fields the trust's own block states are deliberately NOT carried A registrant's `STATE OF INCORPORATION` and `EIN` are per-block fields, and the shared header abstraction can scope them to the FIRST block only (`edgar_docs::party_field`). Here the first block is the DEPOSITOR on 19 % of filings, so reading them would record the depositor's domicile as the trust's - and reading them correctly would mean copying `HeaderField`'s spelling table into this collector, which is the failure CLAUDE.md's "fix the abstraction, not the eightieth call site" rule names. For a trust's boilerplate Delaware domicile that trade is not worth making: `issuing_entity_cik` is carried and `edgar_filings` holds both fields for every CIK.
One row per One row per Form 10-D / 10-D/A submission - one distribution period for one asset-backed issuing entity - keyed by its ACCESSION. The key is the accession and NOT the archive path because EDGAR indexes one submission under one path PER associated registrant, and a securitisation associates the trust, the depositor and often a co-issuer: measured on four dissemination days spanning 2015-2026 (master.20150415, 20190815, 20240415, 20260615), 468 index rows carry only 317 distinct submissions. Keying on the path would store 32 % of every period twice. A trust files ~12 rows a year for 3-7 years, so this is a genuine per-deal time series, not a snapshot..
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_abs_distributions: filing_join: available_date is the EDGAR DISSEMINATION day, taken from the bronze object's own day partition, never from the header's FILED AS OF DATE. period_end is CONFORMED PERIOD OF REPORT - SEC's own structured field, and systematically EARLIER than publication (CNH Equipment Trust 2023-A reports the period ending 2024-03-31 in a submission disseminated 2024-04-15), which is exactly why it can never be the availability date. The distribution date stated in the cover page's prose is deliberately NOT parsed, so there is no occurred_on: it is class C by construction and the submission bytes that carry it are 52 MB/filing on average.
Refresh cadence
Obscura refreshes edgar_abs_distributions every 6 hours - 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 - 22 columns
The full public column list for edgar_abs_distributions, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/edgar_abs_distributions.
| Column | Type | Description |
|---|---|---|
| accession | text · not null | PK. SEC accession number of the distribution report, e.g. `0001193125-26-269770`. The key is the accession, not the archive path: EDGAR lists one 10-D under the trust's CIK path, the depositor's, and any co-issuer's. |
| filename | text · not null | The ISSUING ENTITY's SEC EDGAR Archives path for this report (`edgar/data/{issuing_entity_cik}/{accession}.txt`), derived from the payload's own registrant blocks rather than from whichever index row was walked - so it is the same value on every ingestion path. The join key into `edgar_filings`. |
| available_date | date | Public availability date: the EDGAR DISSEMINATION day, recovered from the bronze object's day partition. The point-in-time anchor and the only date a backtest may key on. It is NOT `period_end`, which precedes it by ~15 days on an amortising pool. |
| period_end | date | The as-of date the report describes (`CONFORMED PERIOD OF REPORT`) - SEC's own structured field and the most reliable date in the filing. Its MEANING varies by trust and the variation is real, not noise: an amortising pool states the collection period's month-end (`2024-03-31`), while many CMBS and credit-card trusts state the DISTRIBUTION date itself (`2024-06-17`, `2015-04-15`). Present on 156 of 156 sampled filings. |
| accepted_at | timestamp with time zone | When SEC ACCEPTED the submission (`<ACCEPTANCE-DATETIME>`), US-Eastern wall clock stored under a UTC type. Provenance, never an availability date: an after-hours acceptance is disseminated the next morning, and this one runs three days early (`0001193125-26-269770`, accepted 2026-06-12 17:44:30, disseminated 2026-06-15). |
| filed_as_of | date | SEC's LEGAL filing date (`FILED AS OF DATE`). Kept for parity with `edgar_filings`; NEVER an availability date - SEC moves it in both directions across the EDGAR corpus. |
| form_type | text · not null | The submission's form type - `10-D` or `10-D/A`. Amendments are 15 of 2,409 index rows in 2024Q2 (0.6 %). |
| is_amendment | boolean · not null | TRUE when this report AMENDS an earlier one for the same trust and period (`10-D/A`). A consumer building a period time series wants the latest row per `(issuing_entity_cik, period_end)`; a consumer reconstructing what was knowable on a date wants the original. The migration CHECKs this against `form_type` rather than trusting the writer. |
| asset_class | text | **The Reg AB asset class, from SEC's own `ABS ASSET CLASS` header field** - a controlled publisher vocabulary, not free text: `Auto loans`, `Auto leases`, `Credit card`, `Equipment loans`, `Commercial mortgages`, `Residential mortgages - Other/Combined`, `Debt Securities`, `Other`. Present on 156 of 156 sampled filings spanning 2015-2026. This is the dimension that makes the table a consumer-credit panel rather than a filing list, and it exists nowhere in `edgar_filings`. |
| issuing_entity_cik | bigint | Central Index Key of the ISSUING ENTITY - the trust itself. Identified STRUCTURALLY as the first registrant whose CIK is NOT `<DEPOSITOR-CIK>`, because a positional read is wrong on 29 of 156 sampled filings (19 %): Santander writes the DEPOSITOR's block first and the trust's second, so "the first FILER" records `SANTANDER DRIVE AUTO RECEIVABLES LLC` as the issuing entity of every Drive Auto Receivables Trust. The rule resolved on 156 of 156. |
| issuing_entity_name | text | Trust name as EDGAR conforms it, e.g. `Drive Auto Receivables Trust 2021-3`, `CNH Equipment Trust 2023-A`. Taken from the header's registrant block, so it is the same string `edgar_filings` carries and joins to it without a second naming vocabulary. |
| issuing_entity_file_number | text | The trust's own SEC file number on this report, e.g. `333-228364-19`. The `-NN` suffix identifies the deal WITHIN the depositor's shelf, which is what makes `shelf_file_number` recoverable. |
| shelf_file_number | text | The `333-` SHELF the deal was registered off, with any co-registrant suffix removed (`333-228364-19` → `333-228364`) - **the column that groups every trust a depositor has ever issued**. NULL when the trust's number is not a Securities Act registration: `000-`/`001-` Exchange Act numbers really occur (Discover Card Master Trust I is `000-23108`), 154 of 156 sampled filings are `333-`. Derived, and the migration CHECKs the derivation rather than trusting it. |
| depositor_cik | bigint | Central Index Key of the DEPOSITOR - the shelf registrant that sold the pool into the trust. From the header's structured `<DEPOSITOR-CIK>`, present on 156 of 156 sampled filings, so it never depends on the cover page's prose. |
| depositor_name | text | Depositor name, and ONLY when the depositor is itself a registrant on this submission (40 % of filings, measured) - then it is EDGAR's conformed string. NULL otherwise, deliberately: `depositor_cik` is the join, `edgar_filings` carries the name for every CIK, and inventing one from the cover page's capitalised prose would seed a second naming vocabulary that drifts. |
| sponsor_cik | bigint | Central Index Key of the SPONSOR - the originating lender whose credit book the pool is (`SANTANDER CONSUMER USA`, `CAPITAL ONE, NATIONAL ASSOCIATION`, `CNH INDUSTRIAL CAPITAL AMERICA LLC`). From the header's structured `<SPONSOR-CIK>`, present on 156 of 156. **This is the link from an anonymous trust to the operating company it is really about**, and the reason the table is worth having next to `edgar_filings`. |
| co_registrant_ciks | jsonb · not null | Every OTHER registrant CIK on the submission - neither the issuing entity nor the depositor - as an ordered JSON array. Non-empty on the two-tier collateral-certificate structures where a master trust issues a certificate that a note trust then issues against: `CAPITAL ONE MULTI ASSET EXECUTION TRUST` files with `CAPITAL ONE MASTER TRUST` (922869), American Express with two further entities. Empty array, never NULL, on the ordinary single-trust deal. |
| registrant_count | integer · not null | Number of registrant blocks in the header - 1 to 4, measured. A structure proxy: 1 is a plain trust, 2 is the usual depositor + trust pair, 3-4 is a collateral-certificate stack. |
| document_count | integer | Number of documents in the submission (`PUBLIC DOCUMENT COUNT`). |
| exhibit_types | jsonb · not null | Ordered JSON array of the submission's document types, e.g. `["10-D","EX-99.1","EX-102","EX-103"]`. The manifest is kept; the bodies are NOT - the `EX-102` alone averages 93 MB. |
| has_asset_level_data | boolean · not null | TRUE when Reg AB II asset-level XML (`EX-102`) rides in this submission - **the flag that identifies the filings carrying loan-by-loan data, and the join to `edgar_abs_assets`**. Also a hard vintage marker, measured: 0 of 50 filings on 2015-04-15 and 37 of 101 on 2026-06-15 (37 %), because the asset-level requirement phased in from November 2016. |
| has_servicer_report | boolean · not null | TRUE when an `EX-99.x` servicer distribution report rides on the submission - 145 of 151 sampled filings. Its NUMBERS are not parsed (no mandated schema; see the struct docs), but its presence says whether they exist to be parsed later from the sibling dataset's bronze. |
Access edgar_abs_distributions
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_abs_distributions",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 122 datasets
Frequently asked questions
What is in the edgar_abs_distributions dataset?
Form 10-D distribution reports for asset-backed securities: which trust paid out, for which distribution period, its depositor and sponsor, the Regulation AB asset class, and whether asset-level data rode along with the filing. A monthly census of every publicly registered US securitisation trust and the deal parties behind it. One **Form 10-D asset-backed issuer distribution report** - the mandated cover-page identity of one distribution period for one securitisation trust. 105,652 filings since 2015: a complete monthly census of every publicly-registered US securitisation, and the only public place where a trust, its depositor, its sponsor and its Reg AB asset class are stated together, per period, as identified CIKs. # What a row IS, and what it deliberately is not A row is the SUBMISSION'S IDENTITY: which trust, which period, which deal parties, which exhibits rode along. It is **not** the pool's numbers. Those live in `EX-99.1`, which Reg AB Item 1121 prescribes the *content* of and not the *shape* of: three opened servicer reports share no row labels, no column headers and not even a table count (10 vs 33 vs 33). A single field parser across 105,652 of those does not exist, so this table does not pretend to one. See `docs/datasets/edgar_abs_distributions.md`. # Every column here is a STRUCTURED SEC header field - none is parsed prose The design proposed reading the depositor, the sponsor and the trust off the cover page's English. It does not have to: SEC's own submission header states `<DEPOSITOR-CIK>`, `<SPONSOR-CIK>` and `ABS ASSET CLASS` outright, measured present on **156 of 156** filings sampled across 2015 and 2026. So the whole row is evidence class B, and the cover-page prose - the distribution date, the period start, the note-class table - is left unread rather than half-parsed. # The row costs 3.5 KB of bronze, not 52 MB The submission this describes is landed by [`edgar_abs_assets`](super::edgar_abs_asset) territory and can be enormous: one dissemination day of 10-D (2026-06-15, 106 filings) is **5.39 GB** of full submissions - median 657 KB, mean 52 MB, max 288 MB, 36 % over 10 MB - because 37 % of modern 10-Ds carry a Reg AB II asset-level `EX-102` XML rider. This dataset's bronze is instead SEC's own `-index-headers.html` submission-index object (2.5–6.6 KB, measured), which carries the complete SGML header AND the document manifest and nothing else. That is what keeps the cheap cover-page table from being hostage to the multi-terabyte asset-level one. # Two fields the trust's own block states are deliberately NOT carried A registrant's `STATE OF INCORPORATION` and `EIN` are per-block fields, and the shared header abstraction can scope them to the FIRST block only (`edgar_docs::party_field`). Here the first block is the DEPOSITOR on 19 % of filings, so reading them would record the depositor's domicile as the trust's - and reading them correctly would mean copying `HeaderField`'s spelling table into this collector, which is the failure CLAUDE.md's "fix the abstraction, not the eightieth call site" rule names. For a trust's boilerplate Delaware domicile that trade is not worth making: `issuing_entity_cik` is carried and `edgar_filings` holds both fields for every CIK.
How do I avoid look-ahead bias with edgar_abs_distributions?
Filter on edgar_abs_distributions.available_date, the day the publisher made the row public. For this dataset that date is derived as follows - filing_join: available_date is the EDGAR DISSEMINATION day, taken from the bronze object's own day partition, never from the header's FILED AS OF DATE. period_end is CONFORMED PERIOD OF REPORT - SEC's own structured field, and systematically EARLIER than publication (CNH Equipment Trust 2023-A reports the period ending 2024-03-31 in a submission disseminated 2024-04-15), which is exactly why it can never be the availability date. The distribution date stated in the cover page's prose is deliberately NOT parsed, so there is no occurred_on: it is class C by construction and the submission bytes that carry it are 52 MB/filing on average. 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_abs_distributions?
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_abs_distributions". The column schema is public at https://api.obscura.trade/v1/catalog/edgar_abs_distributions.
Can I filter edgar_abs_distributions by company or symbol?
Yes. edgar_abs_distributions carries issuing_entity_cik, the column the API's symbols filter resolves against.
How often is edgar_abs_distributions updated?
Obscura refreshes edgar_abs_distributions on a every 6 hours 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.