Data Methodology

How Forelight works, where the data comes from, what the numbers are, and what we don't track. No black boxes.

<5 min
Median detection lag (cert issuance → API)
<2%
Domain detection false positive rate
11
CT logs monitored across 4 operators
0
Person-level PII fields in schema

The data source: Certificate Transparency logs

Under RFC 6962 and its successor RFC 9162, every publicly trusted Certificate Authority is legally required to submit every SSL/TLS certificate it issues to public Certificate Transparency (CT) logs before the certificate is considered valid. This is a browser-enforced requirement — Chrome and Safari will reject certificates not in the CT logs.

This means every time any company anywhere on the internet gets an SSL certificate for a new domain or subdomain, a public record of that event appears in a CT log within minutes. Forelight reads those logs continuously in real time.

Legal basis: CT logs are public infrastructure mandated by RFC 6962. Forelight runs its own log follower against public CT log APIs — no scraping, no terms of service violations, no intermediaries.

Ingestion pipeline

Step 1 — Log following

We follow the CT log tree using the standard get-entries API. Each log operator (Google, Cloudflare, Let's Encrypt, DigiCert, Sectigo) exposes a public HTTP endpoint. We poll continuously and checkpoint our position in the tree so we never miss an entry or double-process one.

Step 2 — Certificate parsing

Each log entry contains a DER-encoded certificate or pre-certificate. We parse it using the cryptography library and extract: Subject Alternative Names (SANs), subject CN, issuer, validity window, and the TBS (to-be-signed) hash. We store the TBS hash as our primary key — never the raw certificate blob.

Step 3 — Deduplication

We deduplicate on TBS hash, not leaf hash. A pre-certificate and its corresponding final certificate share a TBS hash but have different leaf hashes. Deduplicating on leaf hash would double-count every issuance. Deduplicating on TBS hash correctly treats each issuance as a single event.

Step 4 — Enrichment

For each new domain we detect, we run:

Step 5 — Signal classification

Enriched domain records are classified into typed signal events. Classification rules are deterministic — a signal either matches or it doesn't. No scoring model is applied at this stage.

CT logs monitored

LogOperatorStatus
nimbus2025CloudflareActive
xenon2025h2, xenon2026h1, argon2026h1GoogleExpansion planned
oak2025h2, oak2026Let's EncryptExpansion planned
yeti2025h2, yeti2026h1, nessie2026h1DigiCertExpansion planned
sabre2025h2, mammoth2026h1SectigoExpansion planned

Each new CT log starts from the current tree head when enabled — it does not backfill historical entries.

Detection latency

Our p50 detection latency (cert issuance → signal available in API) is under 5 minutes. The breakdown:

Compare this to intent data vendors, which typically operate on 24-48 hour batch cycles, or web crawlers that update on weekly schedules.

Signal types and detection logic

Signal typeDetection logicFalse positive rate
new_apex_domainFirst time a root domain (e.g. acme.com) appears in any CT log we monitor<1%
new_subdomainFirst time a subdomain under a known apex appears in any CT log<1%
saas_adoption_detectedSAN matches a known SaaS vendor pattern (e.g. *.myshopify.com, *.hubspotpagebuilder.com)<3%
geographic_expansionNew apex domain with a country-code TLD (60+ markets)<2%
wildcard_cert_issuedCertificate SAN contains *.domain format<1%
infrastructure_expansion5+ new subdomains under same apex in 24 hours<5%
domain_velocity3+ new_apex_domain signals for same company in 7 days~8%*

*domain_velocity false positives are typically large companies with active domain portfolios, not high-growth signals. Use in combination with company size filters for best precision.

Signal scoring

Every signal includes a score (1-100) and a score_reason field that explains what's driving it. Scores are computed from two components:

Scores are not a probability model. They are a fixed weighting of signal type plus a time decay on the recency component. You can filter, sort, and route on score directly in Clay or your own pipeline.

What we don't track

Zero person-level PII. Our schema contains no WHOIS registrant fields, no registrant names, no registrant emails. Firmographic enrichment is company-level only (People Data Labs Company API). We explicitly do not use person-focused enrichment APIs.

Validate the data yourself

We encourage it. Take a list of 20 domains from your ICP. Call GET /v1/signals?apex_domain=<domain> for each. Cross-reference the detected events against what you know happened at those companies. If we're wrong, tell us — hello@forelight.net.

We also publish our signal detection rules openly and will share sample datasets for evaluation. Ask.

Questions?

Email hello@forelight.net or read the full API docs.