Free Structured Products API
Structured note issuance parsed from SEC 424B2 and FWP filings. Issuer, underlyings, note type, coupon, and barrier per filing, refreshed every 30 minutes.
Endpoints
/api/markets/structured-products?issuer=&underlying=¬eType=&minCoupon=&maxCoupon=&days=&cursor=Recent filings, newest first, up to 200 rows. Filter by issuer substring, underlying symbol (SPX, NVDA...), note type (autocallable, buffered, barrier, income), coupon bounds in % (minCoupon/maxCoupon), and lookback days (max 365). minCoupon and maxCoupon compare the stored coupon, so a filing whose coupon is null (a range, a minimum or a rate not yet set) is not returned. For the next page, send the response's nextCursor back as cursor.
/api/markets/structured-products/csvFull dataset as CSV, up to 50,000 rows.
Rate Limit
10 requests a minute without a key, 30 with a free key
CORS
Open (*)
Auth
Optional X-API-Key header
Examples
curl
curl "https://xoomar.com/api/markets/structured-products?underlying=NVDA&days=30" curl "https://xoomar.com/api/markets/structured-products?noteType=autocallable&minCoupon=10"
Python
import requests
r = requests.get("https://xoomar.com/api/markets/structured-products",
params={"underlying": "SPX", "days": 30})
for f in r.json()["data"][:10]:
print(f["filedAt"], f["issuer"], f["noteType"], f["coupon"])Limits
- Term extraction is best-effort. Preliminary filings often show no principal amount; coupon and barrier parse for most but not all filings.
- docUrl always links the primary SEC document. Trust it over any parsed field.
- Filings go back five years; older rows carry the filing details, and the parsed terms fill in for newer filings.
- Updated every 30 minutes on business days, so weekends and market holidays are quiet.
Response shape
Every endpoint returns the same JSON envelope: { data, updatedAt, source, docs, license, attribution, meta }. In meta, source names who publishes the data and sourceAttribution is the credit line to show with it. The data field is an array of records with these fields:
| Field | Type | Description |
|---|---|---|
| accessionNo | string | EDGAR accession number, unique per filing |
| issuer | string | Filing entity (BofA Finance, Morgan Stanley Finance...) |
| formType | string | 424B2 or FWP |
| filedAt | string (date) | Filing date, YYYY-MM-DD |
| pricingDate | string | null | Pricing/trade date when stated |
| underlyings | string[] | null | Parsed underlying symbols (SPX, NDX, NVDA...). Populated for priced notes; preliminary filings carry nulls |
| noteType | string | null | autocallable, buffered, barrier, or income. Populated for priced notes; preliminary filings carry nulls |
| coupon | string | null | Annual coupon %. Null when the filing states a range, a minimum, a rate still to be set, or terms that do not state a single annual rate. |
| couponMin | string | null | Low end of a stated coupon range, or the minimum when the filing says the coupon is at least that rate, in % per year; null otherwise |
| couponMax | string | null | High end of a stated coupon range, in % per year; null otherwise |
| couponStatus | string | null | How the filing states the coupon: fixed (one annual rate, in coupon), range (couponMin to couponMax), minimum (at least couponMin), pending (the rate is still to be set), review (the terms do not state a single annual rate) or unknown (no coupon wording found). null: terms not classified; coupon may be a stated minimum or the low end of a range. |
| capPct | string | null | Maximum return as % of initial level when the note is capped |
| barrierPct | string | null | Barrier/threshold as % of initial level. barrierPct is null when the level is not available. |
| principalUsd | string | null | Aggregate principal when stated (final filings) |
| docUrl | string | Link to the primary SEC document |
| canonicalUrl | string (optional) | The page on xoomar.com for this record, present only when a matching page exists; otherwise omitted |
Next to data, this endpoint's envelope also carries:
| Field | Type | Description |
|---|---|---|
| nextCursor | string | null | Send it back as cursor for the next 200 rows; null on the last page |
Rows are newest-first. Parsed term fields are null when the filing does not state them. couponMin and couponMax are filled for a range (both) and a minimum (couponMin only), including on preliminary filings. A rate still to be set has couponStatus pending, with couponMin and couponMax both null. The SEC document link is the source of truth.
Numeric fields typed string in the table carry exact decimals; parse them with your language's decimal type. No key needed to start: 10 requests a minute per IP without a key and 30 a minute with a free account key, with at least six months of history. A 429 response carries a Retry-After header in seconds. Credit XOOMAR with a link to the dataset page when you republish the data; the data terms are on the terms page.
A free account key raises the limit; send it in an X-API-Key header.
Frequently Asked Questions
Where does this data come from?
Is it really free?
Which issuers appear?
Can I get the full history as a file?
Data on this page is provided for informational purposes only and is not financial advice. See our editorial policy.