Company Subsidiaries
Parent-and-subsidiary lists taken from the Exhibit 21 that public companies attach to their annual report.
company_subsidiaries — the dataset name to pass to the Obscura API.
What one row means
One subsidiary entity listed in the Exhibit 21 ("Subsidiaries of the Registrant") of a single annual report (10-K/10-K405/10-KSB/20-F/40-F) — i.e. one parsed name+jurisdiction row extracted from one filing's Ex-21 text/table. Stacked across filings, rows form a point-in-time historical parent(CIK)->child corporate-subsidiary graph.
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 company_subsidiaries: published: available_date = the SEC EDGAR 'FILED AS OF DATE', the day the annual report (and its Exhibit 21) became public on EDGAR.
Refresh cadence
Obscura refreshes company_subsidiaries daily — 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 — 12 columns
The full public column list for company_subsidiaries, with the meaning of every field. The same
schema is served unauthenticated at https://api.obscura.trade/v1/catalog/company_subsidiaries.
| Column | Type | Description |
|---|---|---|
| filename | text · not null | EDGAR full-submission path of the annual report this row was parsed from; first half of the primary key and the join back to the source filing. |
| seq | integer · not null | 0-based positional index of this subsidiary within the filing's Exhibit 21 (enumerate order of parsed rows); second half of the primary key, disambiguates rows sharing a filename. |
| cik | bigint | Registrant (parent) CIK, taken from the SEC-HEADER FILER section; nullable when the header CIK is unparseable. The parent node of the subsidiary graph. |
| available_date | date | PUBLIC-availability date = SEC 'FILED AS OF DATE' of the annual report, the day Exhibit 21 became public on EDGAR; nullable if absent from the header. |
| subsidiary_name | text · not null | Best-effort parsed name of the subsidiary/child entity; header/junk rows are dropped so this always holds a candidate entity name. |
| jurisdiction | text | State/country of incorporation of the subsidiary when cleanly separable from the Ex-21 row; nullable/best-effort because Exhibit 21 has no fixed schema. |
| period_of_report | date | Fiscal period-end the subsidiary list is valid AS-OF, from the SEC-HEADER `CONFORMED PERIOD OF REPORT` (`YYYYMMDD`); the natural "as-of" report-period date a point-in-time corporate graph keys on, kept separate from `available_date` (filing day) to avoid look-ahead. Nullable when the header omits it. |
| parent_name | text | Parent/registrant company name — the SEC-HEADER FILER `COMPANY CONFORMED NAME`; the `entity_name` of the graph's parent node, so parents aren't opaque CIK integers. Nullable when the header omits it. |
| percent_owned | text | Raw third Ex-21 cell when present — usually the subsidiary's percentage-owned ("100%", "80.1%") a genuine graph-edge weight, occasionally a "d/b/a"/notes cell; kept verbatim (parsing is best-effort, Ex-21 has no fixed schema). Nullable when the row has only name+jurisdiction. |
| parent_state_of_incorp | text | Parent/registrant state (or country) of incorporation — the SEC-HEADER FILER `STATE OF INCORPORATION` code (e.g. `CA`, `DE`); parent-node attribute, derivable via CIK join but captured here for convenience. Nullable when the header omits it. |
| parent_sic_code | integer | Parent/registrant SIC industry code, parsed from the bracketed number in the SEC-HEADER FILER `STANDARD INDUSTRIAL CLASSIFICATION` (e.g. `ELECTRONIC COMPUTERS [3571]` -> 3571); parent-node attribute. Nullable when the header omits it or the code is unparseable. |
| scraped_at | timestamp with time zone · not null | Internal ingestion timestamp (Utc::now() at upsert); excluded from exports. |
Access company_subsidiaries
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="company_subsidiaries",
symbols=["NVDA", "AAPL"],
start="2024-01-01",
)
Create a free account Browse all 95 datasets
Frequently asked questions
What is in the company_subsidiaries dataset?
Parent-and-subsidiary lists taken from the Exhibit 21 that public companies attach to their annual report. One subsidiary entity listed in the Exhibit 21 ("Subsidiaries of the Registrant") of a single annual report (10-K/10-K405/10-KSB/20-F/40-F) — i.e. one parsed name+jurisdiction row extracted from one filing's Ex-21 text/table. Stacked across filings, rows form a point-in-time historical parent(CIK)->child corporate-subsidiary graph.
How do I avoid look-ahead bias with company_subsidiaries?
Filter on company_subsidiaries.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = the SEC EDGAR 'FILED AS OF DATE', the day the annual report (and its Exhibit 21) became public on EDGAR. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.
In what formats can I get company_subsidiaries?
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="company_subsidiaries". The column schema is public at https://api.obscura.trade/v1/catalog/company_subsidiaries.
Can I filter company_subsidiaries by company or symbol?
Yes. company_subsidiaries carries cik, the column the API's symbols filter resolves against.
How often is company_subsidiaries updated?
Obscura refreshes company_subsidiaries on a daily 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.