Obscura

Domain Subdomains

Subdomains discovered for each public company's domains through Certificate Transparency logs (crt.sh).

domain_subdomains — the dataset name to pass to the Obscura API.

Category Corporate Columns 7 Refresh Daily Entity key ticker Point-in-time available_date

What one row means

One point on the daily step-function series of a company's public subdomain footprint, reconstructed from Certificate Transparency (CT) logs via crt.sh: the count of distinct subdomains under one ticker's registered domain that had a currently-valid TLS certificate as of a given historical day, the cumulative distinct-ever count, and that day's net change — a row exists only on days the count actually moved (a new cert's issuance, or an unrenewed cert's lapse), with gaps between rows meant to be forward-filled by the reader.

One row per (ticker, discovered_on).

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 domain_subdomains: published: available_date = discovered_on — CT logs are near-real-time, so the subdomain count as-of day D is computable ~D.

Refresh cadence

Obscura refreshes domain_subdomains 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 — 7 columns

The full public column list for domain_subdomains, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/domain_subdomains.

ColumnTypeDescription
tickertext · not nullCommon-stock equity ticker whose company homepage resolved (via registered_domain()) to this domain; part of the composite primary key with discovered_on. Dual-class tickers sharing one site (e.g. FITB-PA/FITB-PK -> 53.com) are deduped so only the first ticker encountered for a domain accumulates rows.
discovered_ondate · not nullThe historical calendar day the subdomain count changed: a new cert's issuance date, or the day after an unrenewed cert's last-valid expiry (only once that day is in the past). Covers a domain's full history back to ~2002. Part of the composite primary key with ticker; the OnConflict target for the upsert. Rehomed from the originally-misnamed `available_date`.
domaintext · not nullRegistered apex domain derived from the company's homepage via registered_domain() — strips the scheme and leading 'www.', keeps the eTLD+1 host. Not unique by itself — the (ticker, discovered_on) pair is the real key.
subdomains_activeinteger · not nullDistinct subdomains with a cert covering this date (grows on issuance, shrinks on expiration — the net±).
subdomains_totalinteger · not nullCumulative distinct subdomains ever seen up to this date (monotonic).
net_changeinteger · not nullDay-over-day change in `subdomains_active` (the event that day).
available_datedatePUBLIC-availability date, DB-generated (STORED, GENERATED ALWAYS AS discovered_on) and read-only — equal to discovered_on since CT-log discovery of a count change is itself the public-availability event (published, zero lag). The point-in-time column to filter/join on.

Access domain_subdomains

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="domain_subdomains",
    symbols=["NVDA", "AAPL"],
    start="2024-01-01",
)

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the domain_subdomains dataset?

Subdomains discovered for each public company's domains through Certificate Transparency logs (crt.sh). One point on the daily step-function series of a company's public subdomain footprint, reconstructed from Certificate Transparency (CT) logs via crt.sh: the count of distinct subdomains under one ticker's registered domain that had a currently-valid TLS certificate as of a given historical day, the cumulative distinct-ever count, and that day's net change — a row exists only on days the count actually moved (a new cert's issuance, or an unrenewed cert's lapse), with gaps between rows meant to be forward-filled by the reader.

How do I avoid look-ahead bias with domain_subdomains?

Filter on domain_subdomains.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = discovered_on — CT logs are near-real-time, so the subdomain count as-of day D is computable ~D. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.

In what formats can I get domain_subdomains?

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="domain_subdomains". The column schema is public at https://api.obscura.trade/v1/catalog/domain_subdomains.

Can I filter domain_subdomains by company or symbol?

Yes. domain_subdomains carries ticker, the column the API's symbols filter resolves against.

How often is domain_subdomains updated?

Obscura refreshes domain_subdomains 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 … Company SubsidiariesParent-and-subsidiary lists taken from the Exhibit 21 that public companies attach to their annual report. 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.