Bank Structured Note Offerings
Bank structured-note offerings as published in their pricing supplements: issuer and guarantor, the underlying asset or assets, CUSIP and ISIN, principal amount, coupon, the barrier and call thresholds, the pricing, issue and maturity dates, the dealer's commission and the issuer's own estimated value of the note.
edgar_structured_notes - the dataset name to pass to the Obscura API.
What one row means
One **note offering document** - the paper an issuer files to take a tranche of notes down off its shelf registration, on any of the four forms it may appear under: `424B2`, `424B3`, `424B5` and `FWP`. 1,357,653 filings since 2015 - `424B2` alone is 35 % of the EDGAR backlog by count - and the only place a US structured note's issuer, guarantor, CUSIP, offering size, denomination, issuer-modelled value and pricing / issue / maturity dates are all stated in one public document. The prose is NOT stored: 540 MB of parsed fields against 78 GB of text for `424B2`, plus a further 28-58 GB of text for `424B3` against 64 MB parsed, which is far past the exporter's practical ceiling. The bronze tarball retains every byte, so a later parser change is a replay rather than a re-scrape. # What a row IS, precisely One row per FILING - not per note. A single note produces several rows over its life: one or more `FWP` term sheets, one or more preliminary supplements (`is_preliminary = true`, terms indicative, pricing date in the FUTURE), then the final. They are separate submissions with separate accessions, and they are separate, genuinely-dated public documents. **Measured on one note** - Citigroup CUSIP `17331A5K3`, "Pricing Supplement No. 1,796"-style lifecycle: `424B2` `0000950103-24-005133` (preliminary, 2024-04-10), `FWP` `0000950103-24-005134` and `0000950103-24-005135` (term sheets, 2024-04-11, filed once per registrant), `424B2` `0000950103-24-005600` (final, 2024-04-23). Four accessions, four rows, one CUSIP - which is exactly why the key is the ACCESSION and never the CUSIP. Consumers who want priced deals filter `is_preliminary = false AND form_type = '424B2'`; consumers who want the marketing window need the `FWP` rows. # The two admission rules, and why they differ Rule 424(b)(2) also covers ordinary debt and equity takedowns - measured at roughly 5 % of a dissemination day's 424B2 population (ConocoPhillips notes, a Diamondback Energy senior-notes tranche, a Province of Ontario bond). Those rows exist with NULL note terms rather than being classified out by a prose heuristic: every discriminator tried on the 49-filing probe corpus produced both false positives and false negatives, and a wrong classification is worse than a NULL. That holds because the FILING IS THE OFFERING EVENT under 424(b)(2). It does not hold for the other three. A Rule 433 `FWP` is a marketing communication that may accompany ANY offering (ABS collateral summaries, commodity- and crypto-trust brochures, proprietary-index methodology decks); `424B5` is overwhelmingly follow-on equity and ATM programmes; `424B3` is overwhelmingly a microcap RESALE registration. Those are admitted only where the document identifies the security - a check-valid CUSIP/ISIN, a decoded issuer-estimated value, or a maturity date paired with a per-security price. A refused filing yields NO ROW, which is what keeps this table from filling with nulls. See `docs/datasets/edgar_structured_notes.md`.
One row per One row per note-offering FILING - a 424B2, 424B3 or 424B5 prospectus supplement, or an FWP term sheet - keyed by its ACCESSION. The key is the accession and NOT the archive path because EDGAR indexes one filing under one path PER associated CIK, and a co-registered shelf takedown associates BOTH the issuing finance subsidiary and its guaranteeing parent: measured on master.20240410.idx, 328 424B2 index rows carry 197 distinct supplements, and on master.20240411.idx, 574 rows carry 347 - 227 of the 347 are two-path. Keying on the path would double-count two thirds of the modern corpus. Nor is the CUSIP the key: a single note yields SEVERAL rows over its life and they are separate filings with separate accessions - measured on Citigroup CUSIP 17331A5K3, which carries four (424B2 preliminary 0000950103-24-005133 on 2024-04-10, FWP 0000950103-24-005134 and 0000950103-24-005135 on 2024-04-11, 424B2 final 0000950103-24-005600 on 2024-04-23). form_type and is_preliminary distinguish them..
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_structured_notes: 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 (SEC moves it in both directions). occurred_on is the note's PRICING DATE, which on a preliminary supplement is in the FUTURE - Citigroup 0001481057-24-004996 was disseminated 2024-04-11 and prices 2024-04-19 - so occurred_is_forecast is set and the usual occurred_on <= available_date monotonicity does not apply to those rows. Measured publication lag on a priced supplement: Morgan Stanley 0001839882-24-011104 is dated and prices 2024-04-08, was accepted 2024-04-10 10:34:12 and appears in the 2024-04-10 daily index - a genuine two-day lag, which is the rule working.
Refresh cadence
Obscura refreshes edgar_structured_notes 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 - 33 columns
The full public column list for edgar_structured_notes, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/edgar_structured_notes.
| Column | Type | Description |
|---|---|---|
| accession | text · not null | PK. SEC accession number of the supplement, e.g. `0001839882-24-011104`. The key is the accession, not the archive path: EDGAR lists a co-registered takedown under the issuer's CIK path AND the guarantor's. |
| filename | text · not null | The ISSUER's SEC EDGAR Archives path for this supplement (`edgar/data/{issuer_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 the document's own "Dated …" line, which on a priced supplement is up to two days earlier. |
| occurred_on | date | The note's PRICING DATE (the `Pricing date:` / `Trade date:` term), when its economic terms are struck against the underlier's close. On a PRELIMINARY supplement this is a planned FUTURE date and `occurred_is_forecast` is set. NULL when the supplement states no pricing date at all - which is correct and common on a preliminary that leaves the date blank, and far better than a guess. Parsed prose, so evidence class C by construction. |
| occurred_is_forecast | boolean · not null | TRUE when `occurred_on` is a PLANNED date rather than a settled one, so monotonicity checks skip the row. Set when the supplement is preliminary, or when the stated pricing date is later than the dissemination day. The migration CHECKs exactly this biconditional rather than trusting the writer. |
| 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. NULL on a row ingested from the dissemination feed - the PDS envelope does not carry this stamp, so a NULL is a fact about the envelope and not a decoder gap. |
| filed_as_of | date | SEC's LEGAL filing date (`FILED AS OF DATE`). Kept for parity with `edgar_filings`; NEVER an availability date - SEC both back-dates it and rolls it forward past an after-hours acceptance. |
| issue_date | date | Settlement date (`Original issue date:` / `Issue date:` / `Settlement date:`), typically pricing plus three business days. NULL when the supplement leaves it blank, which preliminaries routinely do. |
| maturity_date | date | Scheduled maturity (`Maturity date:` / `Stated maturity date:`). Stored as the date alone: on a callable note the document prefixes it "Unless earlier redeemed", and the qualifier belongs to the payoff, not to the date. |
| form_type | text · not null | The submission's form type - one of `424B2`, `424B3`, `424B5`, `FWP`. All four publish the SAME economic object (a note offering off a shelf) but with different certainty and different admission rules: a `424B2` is admitted on the form, because Rule 424(b)(2) exists only to complete a takedown priced on a delayed basis, so the filing IS the offering event. The other three carry note offerings among a majority of other things and are admitted only where the document identifies the security - measured note share over 554 accessions on six dissemination days spanning 2016-2025: `FWP` 80%, `424B3` 36%, `424B5` 9%. An `FWP` row is a Rule 433 free writing prospectus, i.e. a term sheet bracketing the `424B2` for the same note; filter on this column to separate the marketing document from the prospectus supplement. |
| issuer_cik | bigint | Central Index Key of the note's ISSUER - typically a finance subsidiary (`Morgan Stanley Finance LLC`, `Citigroup Global Markets Holdings Inc.`, `GS Finance Corp.`). Identified STRUCTURALLY as the registrant whose SEC file number carries a co-registrant suffix (`333-275587-01`), because on every co-registered supplement measured the header writes the guaranteeing PARENT first and a positional read would record the guarantor as the issuer. On a single-registrant supplement (UBS AG, Barclays Bank PLC) it is that registrant. |
| issuer_name | text | Issuer name as EDGAR conforms it. |
| issuer_file_number | text | The issuer's own SEC file number on this supplement - the suffixed co-registrant number (`333-275587-01`) when there is a guarantor, else the bare shelf number. |
| guarantor_cik | bigint | Central Index Key of the GUARANTOR - the parent bank whose credit the note actually carries (`Morgan Stanley`, `Citigroup Inc.`, `The Goldman Sachs Group, Inc.`). The registrant holding the BARE shelf file number when the supplement has two or more registrants. NULL when the bank issues directly and there is no guarantee, which is the norm for UBS AG, Barclays Bank PLC and the Canadian banks. |
| guarantor_name | text | Guarantor name as EDGAR conforms it. |
| file_number | text | The `333-` SHELF the takedown comes off, without a co-registrant suffix (`333-275587`). Joins to `edgar_effectiveness_notices` (the EFFECT that made the shelf usable) and to `edgar_dilution_events`. |
| registrant_count | integer · not null | Number of registrant blocks in the submission header - 1 for a direct issuer, 2 for the ordinary issuer + guarantor pair. Also the fan-out of this accession across the daily index, which is why the row is keyed on the accession. |
| is_preliminary | boolean · not null | TRUE when the supplement is PRELIMINARY and its terms are indicative - from the document's own banner (`SUBJECT TO COMPLETION`, `preliminary pricing supplement`, `Preliminary Terms Supplement`, `Indicative Terms`). Distinct from `occurred_is_forecast`: that flags the DATE, this flags the TERMS. A preliminary's coupon reads "(to be determined on the pricing date)" and its CUSIP is often a literal `[ ]` placeholder - measured on three UBS supplements - which is stored as NULL, never as the placeholder. |
| cusip | text | The note's 9-character CUSIP, e.g. `61776LNV5`. Accepted only when the token's CUSIP CHECK DIGIT verifies, which is what makes it safe to recover from a transposed terms table where the label and the value are in different rows. Sources, in order: a `US`-prefixed ISIN in the document (positions 3..11 ARE the CUSIP), then a check-valid token near a `CUSIP` mention, then the filer's `<DESCRIPTION>` label. NULL on a preliminary that prints a `[ ]` placeholder and on a non-note takedown. |
| isin | text | The note's ISIN, e.g. `US61776LNV52`, when the document prints one. |
| aggregate_principal_amount | double precision | Size of the offering in `currency` units, e.g. `950000`. Read ONLY from an auditable source - see `aggregate_amount_source`. The fee exhibit's Rule 457 TABLE is deliberately not read: it is a transposed grid whose value row cannot be aligned to its header without a real table parser, and on a multi-tranche exhibit (Diamondback, three tranches) any single number picked out of it would be wrong. |
| aggregate_amount_source | text | WHICH source supplied `aggregate_principal_amount`: `filing_fees_ixbrl` (an `ffd:NrrtvMaxAggtOfferingPric` inline-XBRL fact), `filing_fees_prose` (the Exhibit 107 sentence "The maximum aggregate offering price of that offering is $X"), or `terms_block` (an explicitly AGGREGATE-qualified label in the supplement's own terms table). Recorded because the sources do not always agree and a silent precedence rule is unauditable. NULL exactly when the amount is NULL - the migration CHECKs the biconditional. |
| currency | text | ISO-4217 code of the currency the parsed amounts are stated in, from the currency SYMBOL the document prints (`$`→USD, `€`→EUR, `£`→GBP, `¥`→JPY, `C$`→CAD, `A$`→AUD). NULL when no amount was parsed. Recorded rather than assumed: a supplement stating a non-USD size must not be silently recorded as dollars. |
| denomination | double precision | Per-security face amount (`Stated principal amount:` / `Principal Amount:`), essentially always `1000`, but `10` on the UBS retail shape - which is exactly why it is stored rather than assumed, since every per-security figure below is quoted against it. |
| issue_price | double precision | Price to public per security (`Issue price:` / `Original issue price:`). |
| estimated_value | double precision | The ISSUER'S OWN MODEL VALUE per security on the pricing date (`961.20` against a `1000` issue price) - the embedded-fee measure, and the single most analytically valuable number in the document. Populated only when the supplement states a POINT value; a preliminary states a RANGE instead, which lands in `estimated_value_low`/`estimated_value_high`. The migration refuses a row that sets both. |
| estimated_value_low | double precision | Low end of the issuer's estimated-value RANGE when the supplement gives one ("expected to be between $885 and $925 per $1,000 face amount") - the normal shape on a preliminary, where the value cannot be known until pricing. Paired with `estimated_value_high`; the migration CHECKs that they are both present or both absent and correctly ordered. |
| estimated_value_high | double precision | High end of the issuer's estimated-value range. See `estimated_value_low`. |
| document_count | integer | Number of documents in the submission (`PUBLIC DOCUMENT COUNT:`). A size proxy: most of it is `GRAPHIC` payoff diagrams, 576 KB to 3 MB per filing, which are read past and never stored. |
| exhibit_types | jsonb · not null | Ordered JSON array of the submission's document types, e.g. `["424B2","EX-FILING FEES","GRAPHIC","GRAPHIC"]`. The manifest is kept; the bodies are not. |
| has_filing_fee_exhibit | boolean · not null | TRUE when an `EX-FILING FEES` (Exhibit 107) member rides on the submission - the fee exhibit that carries the offering size. Measured present on 10 of 49 probe filings, all of them 2024: the exhibit is a post-2021 requirement, so this is also a vintage marker. |
| primary_description | text | The filer's own `<DESCRIPTION>` label for the primary document - `PRICING SUPPLEMENT NO. 1,667`, `PRELIMINARY PRICING SUPPLEMENT`, `PSARC 405`, or an internal desk code that sometimes carries the CUSIP or ISIN outright. Free text and NOT a controlled vocabulary; kept because it corroborates `is_preliminary` and is a third identifier source. |
| document_truncated | boolean · not null | TRUE when only the leading 4 MiB of the primary document was read, because the whole of it would have stalled the walk. On such a row a NULL term means "not in the part that was read", NOT "not stated" - which is why this is a column and not a silent behaviour. It exists for the `424B3` tail: p99 submission is 30.5 MB and the sizing pass's largest sample was a single 67 MB HTML file (a unit investment trust's whole portfolio, `up_20170916-095205-0.htm`). Everything this parser reads is on the cover page, so 4 MiB is 27x the p90 `424B2` payload and 1.4x the largest primary document in the 554-filing probe corpus; expect this to be TRUE on well under 1% of rows and effectively never outside `424B3`. |
Access edgar_structured_notes
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_structured_notes",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 122 datasets
Frequently asked questions
What is in the edgar_structured_notes dataset?
Bank structured-note offerings as published in their pricing supplements: issuer and guarantor, the underlying asset or assets, CUSIP and ISIN, principal amount, coupon, the barrier and call thresholds, the pricing, issue and maturity dates, the dealer's commission and the issuer's own estimated value of the note. One **note offering document** - the paper an issuer files to take a tranche of notes down off its shelf registration, on any of the four forms it may appear under: `424B2`, `424B3`, `424B5` and `FWP`. 1,357,653 filings since 2015 - `424B2` alone is 35 % of the EDGAR backlog by count - and the only place a US structured note's issuer, guarantor, CUSIP, offering size, denomination, issuer-modelled value and pricing / issue / maturity dates are all stated in one public document. The prose is NOT stored: 540 MB of parsed fields against 78 GB of text for `424B2`, plus a further 28-58 GB of text for `424B3` against 64 MB parsed, which is far past the exporter's practical ceiling. The bronze tarball retains every byte, so a later parser change is a replay rather than a re-scrape. # What a row IS, precisely One row per FILING - not per note. A single note produces several rows over its life: one or more `FWP` term sheets, one or more preliminary supplements (`is_preliminary = true`, terms indicative, pricing date in the FUTURE), then the final. They are separate submissions with separate accessions, and they are separate, genuinely-dated public documents. **Measured on one note** - Citigroup CUSIP `17331A5K3`, "Pricing Supplement No. 1,796"-style lifecycle: `424B2` `0000950103-24-005133` (preliminary, 2024-04-10), `FWP` `0000950103-24-005134` and `0000950103-24-005135` (term sheets, 2024-04-11, filed once per registrant), `424B2` `0000950103-24-005600` (final, 2024-04-23). Four accessions, four rows, one CUSIP - which is exactly why the key is the ACCESSION and never the CUSIP. Consumers who want priced deals filter `is_preliminary = false AND form_type = '424B2'`; consumers who want the marketing window need the `FWP` rows. # The two admission rules, and why they differ Rule 424(b)(2) also covers ordinary debt and equity takedowns - measured at roughly 5 % of a dissemination day's 424B2 population (ConocoPhillips notes, a Diamondback Energy senior-notes tranche, a Province of Ontario bond). Those rows exist with NULL note terms rather than being classified out by a prose heuristic: every discriminator tried on the 49-filing probe corpus produced both false positives and false negatives, and a wrong classification is worse than a NULL. That holds because the FILING IS THE OFFERING EVENT under 424(b)(2). It does not hold for the other three. A Rule 433 `FWP` is a marketing communication that may accompany ANY offering (ABS collateral summaries, commodity- and crypto-trust brochures, proprietary-index methodology decks); `424B5` is overwhelmingly follow-on equity and ATM programmes; `424B3` is overwhelmingly a microcap RESALE registration. Those are admitted only where the document identifies the security - a check-valid CUSIP/ISIN, a decoded issuer-estimated value, or a maturity date paired with a per-security price. A refused filing yields NO ROW, which is what keeps this table from filling with nulls. See `docs/datasets/edgar_structured_notes.md`.
How do I avoid look-ahead bias with edgar_structured_notes?
Filter on edgar_structured_notes.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 (SEC moves it in both directions). occurred_on is the note's PRICING DATE, which on a preliminary supplement is in the FUTURE - Citigroup 0001481057-24-004996 was disseminated 2024-04-11 and prices 2024-04-19 - so occurred_is_forecast is set and the usual occurred_on <= available_date monotonicity does not apply to those rows. Measured publication lag on a priced supplement: Morgan Stanley 0001839882-24-011104 is dated and prices 2024-04-08, was accepted 2024-04-10 10:34:12 and appears in the 2024-04-10 daily index - a genuine two-day lag, which is the rule working. 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_structured_notes?
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_structured_notes". The column schema is public at https://api.obscura.trade/v1/catalog/edgar_structured_notes.
Can I filter edgar_structured_notes by company or symbol?
Yes. edgar_structured_notes carries issuer_cik, the column the API's symbols filter resolves against.
How often is edgar_structured_notes updated?
Obscura refreshes edgar_structured_notes 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.