Passive subdomain enumeration
Subdomains, already found.
A local index built from certificate transparency logs, registry zone data, and public crawls. Give it an apex and the names come back oldest known first, with first-seen dates where the source provides them. Nothing is fetched from an upstream source while you wait.
Hostnames on file
--
reading the index
Apexes covered
--
distinct registrable domains
CT logs feeding it
--
counted from ingest evidence
Last write to the index
--
from the ingest run log
Names on file
Names first logged, by year
Using it
One call, no key.
One apex in, hostnames out, from a shell or from anything that speaks HTTP. There is no key to request and no account to make. An apex with nothing on file answers 200 with an empty body, so a miss is cheap to handle.
curl -s "$SUBFINDER/v1/search?apex=example.com"
curl -s "$SUBFINDER/v1/search?apex=example.com&format=json&dates=1" \
| jq -r '.[] | "\(.first_seen // "undated")\t\(.sub)"'
What the index is built from
The Chrome and Apple log lists name the logs worth reading. A poller walks ct/v1/get-entries on every usable log in both programs, and the Geomys archive backfills logs that have since retired. Zone data from IANA, CISA, and the registries that publish openly, plus Common Crawl, fill in apexes that certificates alone would miss.
Each name keeps three fields. Hostname, apex, and the earliest date any source saw it. No certificate bodies, no serial numbers, no issuer chains.
Reading it without a browser
Search
GET /v1/search?apex=example.com
One hostname per line. Add &format=json for an array, &dates=1 to attach each first-seen date. Rows come back oldest first, undated names last.
Index size
GET /v1/stats
Counts for the whole index and the timestamp of the last ingest run. It costs nothing against the search allowance, which is what lets the counter above keep itself current.
Allowance
X-RateLimit-Remaining
1000 successful reads per IP per UTC day, shared with the MCP endpoint. Every response carries the limit, what is left, and the reset time. A spent allowance returns 429 with Retry-After.
MCP
POST /mcp
One streamable HTTP tool called search. Pass an apex, get an array of hostnames. Same allowance as the HTTP route, same refusal to probe.