Obscura

Subdomain IPs

Historical resolutions of company subdomains to IP addresses, with cloud-provider attribution.

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

Category Corporate Columns 12 Refresh Every 6 hours Entity key ticker Point-in-time available_date

What one row means

One historical DNS resolution fact for a covered company's web footprint: a single subdomain (discovered via crt.sh certificate-transparency logs for the company's registered domain) paired with one IPv4 address that Mnemonic passive DNS has observed it resolving to, annotated with the cloud provider that IP address belongs to (matched against AWS/GCP/ Cloudflare published ranges) and a not-yet-populated ASN/AS-org attribution slot.

One row per (subdomain, ip).

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 subdomain_ips: published: available_date = synced_at::date, the day alt_data's own crt.sh + Mnemonic scan observed and upserted this (subdomain, ip) resolution — a snapshot-on-ingest dataset with no native filing/publication calendar behind it.

Refresh cadence

Obscura refreshes subdomain_ips every 6 hours — 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 subdomain_ips, with the meaning of every field. The same schema is served unauthenticated at https://api.obscura.trade/v1/catalog/subdomain_ips.

ColumnTypeDescription
subdomaintext · not nullFully-qualified subdomain hostname (e.g. 'www.grindr.com') enumerated from crt.sh certificate-transparency logs for the covered company's registered domain, with wildcard entries filtered out before resolution. First half of the composite conflict key.
iptext · not nullIPv4 address (dotted-quad text) the subdomain has been observed resolving to, per a Mnemonic passive-DNS A-record answer. Only IPv4 is captured. Second half of the composite conflict key.
tickertextEquity ticker of the company whose website produced this subdomain, resolved from the company-homepage mapping at scan time.
domaintext · not nullThe registered (eTLD+1) domain the subdomain belongs to, derived from the ticker's company_site — e.g. 'grindr.com' for subdomain 'www.grindr.com'. This is the unit the task's resumability/dedup keys on, not the subdomain itself.
first_seendateMnemonic passive-DNS firstSeenTimestamp for this (subdomain, ip) A-record — the historical day the sensor network first observed the resolution; an observation-window start, not a public-availability date.
last_seendateMnemonic passive-DNS lastSeenTimestamp for this (subdomain, ip) A-record — the most recent day the sensor network observed the subdomain still resolving to that IP; the observation-window end.
asnbigintAutonomous System Number the IP belongs to. Always NULL in the current build — ASN attribution via the iptoasn bulk feed is an unimplemented follow-up.
as_orgtextRegistered organization name for the IP's ASN (e.g. the hosting/transit provider). Always NULL in the current build for the same reason as `asn`.
cloud_providertext"aws" | "gcp" | "azure" | "cloudflare" | null (self-hosted / other). Best-effort cloud vendor label for the IP, derived by longest-match against each vendor's published IPv4 CIDR ranges fetched fresh each run.
min_ttlbigintMinimum DNS record TTL (seconds) Mnemonic observed for this (subdomain, ip) A-record, from `data[].minTtl`. A distinct passive-DNS measurement (not derivable from anything else we keep); very short TTLs can hint at CDN/failover/traffic-steering hosting.
max_ttlbigintMaximum DNS record TTL (seconds) Mnemonic observed for this (subdomain, ip) A-record, from `data[].maxTtl`. Distinct measurement paired with `min_ttl`.
available_datedatePUBLIC-availability date, DB-generated STORED as `synced_at::date` — the day alt_data itself observed and ingested this (subdomain, ip) resolution. The point-in-time column to filter/join on; NEVER the DNS record's own first/last-seen history.

Access subdomain_ips

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

Create a free account Browse all 95 datasets

Frequently asked questions

What is in the subdomain_ips dataset?

Historical resolutions of company subdomains to IP addresses, with cloud-provider attribution. One historical DNS resolution fact for a covered company's web footprint: a single subdomain (discovered via crt.sh certificate-transparency logs for the company's registered domain) paired with one IPv4 address that Mnemonic passive DNS has observed it resolving to, annotated with the cloud provider that IP address belongs to (matched against AWS/GCP/ Cloudflare published ranges) and a not-yet-populated ASN/AS-org attribution slot.

How do I avoid look-ahead bias with subdomain_ips?

Filter on subdomain_ips.available_date, the day the publisher made the row public. For this dataset that date is derived as follows — published: available_date = synced_at::date, the day alt_data's own crt.sh + Mnemonic scan observed and upserted this (subdomain, ip) resolution — a snapshot-on-ingest dataset with no native filing/publication calendar behind it. A query of the form WHERE available_date <= '<as-of date>' never sees a row before it existed.

In what formats can I get subdomain_ips?

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

Can I filter subdomain_ips by company or symbol?

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

How often is subdomain_ips updated?

Obscura refreshes subdomain_ips on a every 6 hours 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. 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.