WHOIS is on its way out. For generic domains like .com, .net and .org, ICANN now requires registries and registrars to answer over RDAP, the Registration Data Access Protocol: plain HTTPS that returns JSON instead of free-form text that every registry formats differently.
Put RDAP together with DNS over HTTPS and the Wayback Machine's CDX API, and you can answer most "what is this domain?" questions for free, from official sources, without parsing a single WHOIS blob. This post shows each API, the gotchas I hit, and a hosted version that does all of it in bulk. Disclosure: I built the tool at the end.
1. Registration date, registrar and expiry: RDAP
There's no single RDAP server. Each top-level domain has its own, and IANA publishes the list:
curl https://data.iana.org/rdap/dns.json services is a list of [[tlds], [base URLs]]. For com it points to Verisign:
curl https://rdap.verisign.com/com/v1/domain/stripe.com The answer is structured JSON. The useful parts:
const rdap = await (await fetch('https://rdap.verisign.com/com/v1/domain/stripe.com')).json(); const date = (action) => rdap.events.find((e) => e.eventAction === action)?.eventDate; const registrar = rdap.entities.find((e) => e.roles.includes('registrar')); console.log({ registered: date('registration'), // 1995-09-12 expires: date('expiration'), // 2027-09-11 registrar: registrar.vcardArray[1].find((x) => x[0] === 'fn')[3], // SafeNames Ltd. status: rdap.status, nameservers: rdap.nameservers.map((n) => n.ldhName.toLowerCase()), dnssec: rdap.secureDNS?.delegationSigned, }); Gotchas:
- A 404 means the domain isn't registered. That makes RDAP a clean availability check too.
- Not every country domain has RDAP.
.io,.esand.soweren't in IANA's bootstrap file when I checked, so for those you only get DNS-level facts. Don't fall back to guessing. - Use the registrable domain, not the host:
news.bbc.co.uk→bbc.co.uk, so you need a small list of two-level suffixes likeco.ukandcom.au. - Owner names and emails are mostly redacted for privacy. You get dates, registrar and status, not people.
2. Email provider, SPF and DMARC: DNS over HTTPS
Google's public resolver answers DNS queries as JSON:
curl "https://dns.google/resolve?name=stripe.com&type=MX" curl "https://dns.google/resolve?name=_dmarc.stripe.com&type=TXT" From MX hosts you can tell the email provider: aspmx.l.google.com is Google Workspace, *.mail.protection.outlook.com is Microsoft 365, *.pphosted.com is Proofpoint, and so on. The SPF record is the TXT record starting with v=spf1, and the DMARC policy is the p= tag on _dmarc.<domain>: none, quarantine or reject.
Two details that cost me time: long TXT records come back as several quoted chunks ("v=spf1 include:a" " -all") that you have to join, and the answer list can contain CNAME records mixed in with the type you asked for, so filter by the numeric type (MX is 15, TXT is 16).
3. Site history: the Wayback Machine CDX API
# first capture curl "https://web.archive.org/cdx/search/cdx?url=stripe.com&output=json&limit=1&fl=timestamp,original&filter=statuscode:200" # most recent capture curl "https://web.archive.org/cdx/search/cdx?url=stripe.com&output=json&limit=-1&fastLatest=true&fl=timestamp,original&filter=statuscode:200" Row 0 is the header; row 1 is the capture, with a yyyyMMddHHmmss timestamp. The archive link is https://web.archive.org/web/{timestamp}/{original}.
The interesting signal is comparing this with the RDAP date. apify.com was registered (in its current registration) in 2009, but its first Wayback capture is from 2007. A first capture years before the registration date usually means the name had an earlier owner, which matters if you're buying aged or expired domains.
The CDX API is slow and rate-limited, so pace it (about one request a second) and back off on errors.
4. Website status and SSL certificate
A normal fetch with redirect: 'follow' gives you the status code, final URL and page title. For the certificate, Node's tls module reads it directly:
import tls from 'node:tls'; const socket = tls.connect({ host: 'stripe.com', port: 443, servername: 'stripe.com' }, () => { const cert = socket.getPeerCertificate(); console.log(cert.issuer.O, cert.valid_to); // DigiCert, Inc. May 2027 socket.end(); }); Doing it in bulk
Each source needs its own pacing (RDAP servers and the Wayback Machine are much stricter than Google DNS), and you want one row per domain, not four API responses. I packaged all of the above as an Apify Actor, Domain Intelligence: paste domains, URLs or email addresses, and each gets one row with registration date, age, registrar, expiry, status, name servers, DNSSEC, IPs, MX hosts, email provider, SPF, DMARC policy, first and last Wayback capture, HTTP status, final URL, title, and SSL issuer and days left. It costs $5 per 1,000 domains and invalid entries are free.
If you'd rather run it yourself, everything above is free and official. The main work is the pacing and the edge cases.
