Developer tools
Certificate Transparency Subdomain Scraper
Bulk Certificate Transparency log enumeration over crt.sh's free, official, keyless endpoint — one clean, capped, deduplicated row per certificate or subdomain, with computed expiry/wildcard signals, instead of a raw un-deduplicated JSON blob.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Every TLS certificate ever issued for a domain is logged forever in public Certificate Transparency logs — a firehose that crt.sh exposes as a free, keyless JSON endpoint. The catch: the raw payload is large, un-deduplicated, and carries no computed security signal. This Actor queries crt.sh per root domain and turns that firehose into a clean, capped dataset: one row per certificate (or per unique subdomain, your choice) with expiry countdown, expired/wildcard flags, and issuer metadata already computed — ready for an attack-surface inventory, a cert-hygiene sweep, or a daily subdomain-discovery job.
What we handle for you
- 🔎 One query per domain, whole log in one shot — crt.sh has no pagination; we fetch the complete result and process it in memory, so results land in one pass.
- 🧮 Computed security signals —
days_until_expiry,is_expired, andis_wildcardcome pre-computed, not left for you to derive from raw timestamps. - 🧊 Deduplication, your way — one row per unique subdomain (keeping the newest cert), or one row per raw certificate/SAN entry if you want the closer-to-raw shape.
- 🚧 Egress guard built in —
maxCertsPerDomaincaps the response before a single row is built, so a domain with 10,000+ historical certificates can't blow your bill. - 🔁 Retries with exponential backoff on
408 / 429 / 503and network errors — a slow moment on crt.sh's shared database doesn't fail your run. - 💰 Pay-Per-Event pricing — you only pay for certificates that land in your dataset. No data, no charge beyond the warm-up fee.
Use cases
- Attack-surface enumeration — pentest and bug bounty teams discovering subdomains from CT logs instead of brute-force DNS.
- Certificate hygiene monitoring — schedule daily runs across your own fleet and catch expiring or duplicate certificates.
- Brand protection — spot lookalike-domain certificate issuance for enforcement leads.
- Security research — track issuer patterns and wildcard usage across a domain's certificate history.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
domains | array | yes | Root domains to query against crt.sh, e.g. example.com. One crt.sh query per domain. |
maxCertsPerDomain | integer | no | Hard cap on rows emitted per domain — the egress guard. crt.sh can return tens of thousands of records for a large domain. |
deduplicateSubdomains | boolean | no | When true, emit one row per unique subdomain (keeping the newest certificate's metadata). When false, emit one row per raw certificate/SAN entry. |
includeExpired | boolean | no | When false, drop certificates whose validity end date is in the past. |
{
"domains": [
"github.com",
"gitlab.com"
],
"maxCertsPerDomain": 10,
"deduplicateSubdomains": true,
"includeExpired": true,
"proxyConfiguration": {
"useApifyProxy": true
}
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
domainsubdomaincertificate_idissuer_namecommon_nameserial_numbernot_beforenot_afterentry_timestampdays_until_expiryis_expiredis_wildcard
{
"domain": "github.com",
"subdomain": "api.github.com",
"certificate_id": 12345678,
"issuer_name": "C=US, O=DigiCert Inc, CN=DigiCert TLS RSA SHA256 2020 CA1",
"common_name": "github.com",
"serial_number": "0a1b2c3d4e5f",
"not_before": "2026-01-15T00:00:00+00:00",
"not_after": "2027-01-15T23:59:59+00:00",
"entry_timestamp": "2026-01-15T08:12:03+00:00",
"days_until_expiry": 132,
"is_expired": false,
"is_wildcard": false
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| Certificate scraped | $0.0060 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Certificate Transparency logs only see certificates issued by CAs that log to CT — self-signed or non-logged internal certificates never appear.
- No DNS resolution or liveness check — a discovered subdomain in the dataset may no longer resolve to a live host.
- No historical diffing between runs in v1 — compare successive dataset exports yourself to see what changed.
FAQ
Is this legal?
Does this scan or connect to the discovered subdomains?
What happens if a domain has zero certificates?
Why is a domain's row count capped?
maxCertsPerDomain is the egress guard that keeps your bill predictable — raise it if you need more.Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors