Obscura

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.

Category Corporate Columns 12 Refresh Daily Entity key cik Point-in-time available_date

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.

ColumnTypeDescription
filenametext · not nullEDGAR 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.
seqinteger · not null0-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.
cikbigintRegistrant (parent) CIK, taken from the SEC-HEADER FILER section; nullable when the header CIK is unparseable. The parent node of the subsidiary graph.
available_datedatePUBLIC-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_nametext · not nullBest-effort parsed name of the subsidiary/child entity; header/junk rows are dropped so this always holds a candidate entity name.
jurisdictiontextState/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_reportdateFiscal 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_nametextParent/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_ownedtextRaw 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_incorptextParent/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_codeintegerParent/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_attimestamp with time zone · not nullInternal 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.

Related datasets

Board InterlocksPairs of public companies that share a director, reconstructed from SEC insider filings: one row per (director, company … Domain SubdomainsSubdomains discovered for each public company's domains through Certificate Transparency logs (crt.sh). Employee CountsEmployee headcount as stated in the text of 10-K annual reports. Executive CompensationExecutive pay from the Pay-versus-Performance table in proxy statements: reported and 'actually paid' compensation for t… Governance EventsGovernance events distilled from company 8-K filings and tagged by type: executive changes, auditor changes, restatement… Insider SentimentMonthly insider buying and selling per company, netted from Form 4 open-market trades: shares and dollars bought versus … Job PostingsOpen job-posting counts for a curated set of companies, captured over time. O*NET Occupation DataThe O*NET database of occupations: the tasks, skills and requirements that define each job, by release version.