How Forelight works, where the data comes from, what the numbers are, and what we don't track. No black boxes.
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.
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.
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.
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.
For each new domain we detect, we run:
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.
| Log | Operator | Status |
|---|---|---|
| nimbus2025 | Cloudflare | Active |
| xenon2025h2, xenon2026h1, argon2026h1 | Expansion planned | |
| oak2025h2, oak2026 | Let's Encrypt | Expansion planned |
| yeti2025h2, yeti2026h1, nessie2026h1 | DigiCert | Expansion planned |
| sabre2025h2, mammoth2026h1 | Sectigo | Expansion planned |
Each new CT log starts from the current tree head when enabled — it does not backfill historical entries.
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 type | Detection logic | False positive rate |
|---|---|---|
| new_apex_domain | First time a root domain (e.g. acme.com) appears in any CT log we monitor | <1% |
| new_subdomain | First time a subdomain under a known apex appears in any CT log | <1% |
| saas_adoption_detected | SAN matches a known SaaS vendor pattern (e.g. *.myshopify.com, *.hubspotpagebuilder.com) | <3% |
| geographic_expansion | New apex domain with a country-code TLD (60+ markets) | <2% |
| wildcard_cert_issued | Certificate SAN contains *.domain format | <1% |
| infrastructure_expansion | 5+ new subdomains under same apex in 24 hours | <5% |
| domain_velocity | 3+ 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.
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.
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.
Email hello@forelight.net or read the full API docs.