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.
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.
| Column | Type | Description |
|---|---|---|
| ticker | text · not null | Common-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_on | date · not null | The 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`. |
| domain | text · not null | Registered 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_active | integer · not null | Distinct subdomains with a cert covering this date (grows on issuance, shrinks on expiration — the net±). |
| subdomains_total | integer · not null | Cumulative distinct subdomains ever seen up to this date (monotonic). |
| net_change | integer · not null | Day-over-day change in `subdomains_active` (the event that day). |
| available_date | date | PUBLIC-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.