Use the site's checks as a JSON API. No sign-up and no API key.
REST · JSONv1No sign-up or keyOpenAPI 3.1
Getting started
Free, no sign-up. The base URL is https://certadomain.com/api/v1. Use within the limits is welcome (Terms of Use). Every check uses public DNS, registry and CT-log data only; target web pages are never fetched.
Addresses, status (ok, lame, timeout ...) and SOA serial of each nameserver.
dnssec
valid, off, broken, unverified ...
findings[]
code (stable identifier), severity (critical / warning / info / ok) and, where needed, params.
analyzed_at
Unix time the analysis ran. With cached true, this is when the stored result was produced.
cached
True when a stored result was served.
GETPOST/dmarccost 1
SPF, DKIM, DMARC and MX per the RFCs: subdomains inherit the organization domain's DMARC, and SPF is counted recursively against the 10-lookup limit. For POST, send {"domain":"example.com"} as the body.
Parameters
Name
Required
Description
domain
yes
A domain or host name. A URL is reduced to its host; internationalized names become punycode.
Registration date, expiry, registrar, lock state. Empty for TLDs without RDAP.
analyzed_at
Unix time the analysis ran. With cached true, this is when the stored result was produced.
cached
True when a stored result was served.
Discovery
GET/subdomainscost 1
Subdomains from Certificate Transparency logs (crt.sh and Cert Spotter). Only names that ever had a certificate appear, and entries may be stale. Results are stored for 2 hours.
Parameters
Name
Required
Description
domain
yes
A domain or host name. A URL is reduced to its host; internationalized names become punycode.
Subdomains that could not be checked (timeouts and so on).
analyzed_at
Unix time the analysis ran. With cached true, this is when the stored result was produced.
cached
True when a stored result was served.
The finding in this example is illustrative, to show the shape of a hit; it is not a real result.
GET/lookalikecost 5
Generates up to 220 typosquatting / homograph candidates and returns the registered ones ranked by risk. Takes 4-6 seconds. Being registered is not proof of abuse.
Parameters
Name
Required
Description
domain
yes
A domain or host name. A URL is reduced to its host; internationalized names become punycode.
Risk and what it is based on (RECENT, MX, WEB, CORP_REGISTRAR ...).
generated · scanned · registered
Candidates generated, probed and found registered.
analyzed_at
Unix time the analysis ran. With cached true, this is when the stored result was produced.
cached
True when a stored result was served.
Reports
POST/reportscost 1
Stores a result for 30 days and returns an unguessable id; anyone who has the id can read it. The server re-reads the result itself, so the content cannot be supplied. Limited to 20 creations per 5 minutes per IP, plus a global daily ceiling.
Each client IP gets 60 units per 5 minutes (a fixed window). The cost on each endpoint is what one call uses: 5 for takeover and lookalike, 1 for the rest, 0 for the index and spec.
RateLimit-Limit
Units allowed per window (60)
RateLimit-Remaining
Units left
RateLimit-Reset
Seconds until the window resets
RateLimit-Policy
The policy, as 60;w=300
Retry-After
On 429 only: seconds to wait
HTTP/2 429
content-type: application/problem+json
ratelimit-limit: 60
ratelimit-remaining: 0
ratelimit-reset: 142
retry-after: 142
{
"type": "urn:certadomain:problem:rate_limited",
"title": "Rate limit reached",
"status": 429,
"detail": "Too many requests from this address. Wait for Retry-After seconds.",
"error": "rate_limited"
}
The site's edge also allows 100 requests per 5 minutes per IP; past that the CDN blocks the request. How the counts are kept is described in the Privacy Policy.
Errors
4xx and 5xx bodies are RFC 9457application/problem+json. Branch on the stable error code.
HTTP/2 400
content-type: application/problem+json
{
"type": "urn:certadomain:problem:invalid_domain",
"title": "Invalid domain",
"status": 400,
"detail": "The value is not a valid domain name.",
"error": "invalid_domain"
}
Do not read the body of a 404. The CDN replaces it with the site's HTML page. Use the status code only.
Using the results
Decide on findings[].code:codes such as SPF_LOOKUP_EXCEEDED are stable and listed in the glossary (Japanese). score and grade are a prioritization aid and their weighting may change.
Caching:results are stored per domain for about 1 hour (CT: 2 hours). cached and analyzed_at tell you which you got. There is no way to force a refresh.
Browsers:CORS allows only https://certadomain.com. Call the API from your own server, not from another site's page.
Concurrency:takeover and lookalike are slow. Set a timeout of 30 seconds or more and keep concurrency low.
For the limits of the results (DKIM selector coverage, subdomains absent from CT, and so on) see About. For bugs or limit requests, use Contact.