Bulk WHOIS & RDAP Domain Lookup: DNS, SSL
Pricing
from $0.80 / 1,000 domain records
Bulk WHOIS & RDAP Domain Lookup: DNS, SSL
Look up thousands of domains over RDAP, the protocol that replaced WHOIS: registrar, IANA id, creation and expiry dates, EPP status codes, nameservers, DNSSEC and availability across 1,200 TLDs. Adds DNS records and SSL certificate details, flags redacted fields, exports to CSV or JSON.
Pricing
from $0.80 / 1,000 domain records
Rating
0.0
(0)
Developer
Automation Craft
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Bulk WHOIS & RDAP Domain Lookup: DNS, SSL
A bulk WHOIS lookup that reads registration data straight from the registries over RDAP, the protocol ICANN made the definitive source for gTLD registration data in January 2025. Give it a list of domains, get one row per domain with registrar, creation and expiry dates, status codes, nameservers, DNSSEC, availability, live DNS records and the SSL certificate the site serves. No API key, no login, no per-domain rate limit to manage yourself.
It covers 1,200 top level domains from the official IANA bootstrap file, and it tells you honestly which fields the registry withholds instead of handing you a row full of silent nulls.
Quick start
- Paste your domains into Domains, or point Domain list URL at a text or CSV file with one domain per line. Full URLs, subdomains, email addresses and internationalized names are all accepted and reduced to the registered domain.
- Pick your Checks. RDAP is always on. DNS and SSL cost nothing extra.
- Set Maximum charged domain records so a large list cannot surprise you.
- Click Start, then download the results as JSON, CSV or Excel, or read them from the API.
A run of 5 domains finishes in about 20 seconds. A run of 1,000 domains across mixed TLDs takes a few minutes.
What you get
One record per domain. Fill rates below were measured on 176 live records across 49 TLDs during the build, and they are what you should expect, not a best case.
| Field | What it is | Fill rate |
|---|---|---|
domain, tld | The registered domain, lower case, punycode for IDNs | 100% |
isRegistered | true, false (the registry says the name does not exist) or null (nobody answered, and the row is free) | 100% |
statusReason | Why a domain is reported available, or why no registry answered | as needed |
rdapServer | The registry RDAP host that answered | 100% |
registrar | Sponsoring registrar name | 98.3% |
registrarIanaId | ICANN accreditation number | 96.0% |
registrarAbuseEmail | Registrar abuse contact | 96.6% |
createdAt | Registration date, ISO 8601 | 97.7% |
expiresAt, daysToExpiry | Registry expiry date and days remaining | 97.2% |
updatedAt | Last change to the registration record | 100% |
statuses | EPP status codes, for example client transfer prohibited | 100% |
nameservers | Delegated nameservers with glue addresses | 100% |
dnssec | Whether the delegation is signed, plus DS and key counts | 98.3% |
entities.registrant | Registrant contact, with a redacted flag and the list of withheld fields | present 9.7%, name 4.5% |
entities.admin, entities.tech | Admin and tech contacts, same redaction flags | 5.7% and 6.3% |
dns | Live A, AAAA, MX, NS, TXT, CAA and SOA answers over HTTPS | 100% of registered domains |
tls | Certificate issuer, subject, validity window, days to expiry, SAN count | 100% of hosts that answer on port 443 |
whois | Port 43 fallback details, for TLDs with no RDAP service | only where used |
billable | Whether this row is charged. A registry answered definitively AND no earlier entry in the run already produced the same registration | 100% |
registrationKey | The registration this row is billed against, so you can see which entries share one | 100% of billable rows |
Why registrant names are almost always empty
They are redacted at the registry under GDPR and ICANN's temporary specification, not missing from this Actor. In the measurement above a registrant name field carried a value in 8 of 176 records and in 0 of 104 .com records, and three of those 8 were placeholders (REDACTED FOR PRIVACY, Registration Private, Domain Administrator) rather than a real party. The genuine names came from .ca, .fr, .nl, .ai and .art. Where a contact is present but withheld, it carries redacted: true and a redactedFields list, so you can tell "the registry withholds this" apart from "this domain has no such contact", which is a plain null.
How much does it cost to look up a domain?
Pay per event, and only for an answer.
| Event | Price | When it is charged |
|---|---|---|
| Domain record | $0.001 per record (FREE and Bronze), $0.0009 Silver, $0.0008 Gold and above | A registry answered definitively about that exact domain: a full registration record, or a confirmed availability |
| Actor start | $0.00005 per run, per gigabyte of run memory | Apify's standard start fee. The Actor runs on 256 MB |
That is $1.00 per 1,000 domains on the Free and Bronze plans, and $0.80 per 1,000 on Gold and above. DNS records and SSL certificate details are included in that price, not billed separately.
What is free:
- rows where every registry path failed (
isRegistered: null), with the reason on the row, - domains removed by the TLD filter,
- repeated domains inside one run, and domains a named memory has already delivered,
- unusable input, which produces a status row and no charges,
- the run summary row.
Worked example: 1,000 domains with RDAP and DNS on a Bronze plan costs $1.00 plus one $0.00005 start event, so $1.00005. The same list with the registrant contacts redacted costs exactly the same, because you are charged for the registry's answer, not for the fields it chose to publish.
Input
| Option | What it does |
|---|---|
| Domains | The list to look up. URLs, subdomains, emails and IDNs are all reduced to the registered domain |
| Domain list URL | A public text or CSV file, one domain per line, merged with the list above |
| Only these TLDs | Keep only com, io and so on. Filtered domains are skipped free of charge |
| Checks to run | rdap (always on), dns, tls, whois |
| DNS record types | A, AAAA, MX, NS, TXT, CAA, SOA |
| Include the raw registry response | Adds the RDAP JSON the registry returned, and the raw WHOIS text under whois.raw, to each row the registry answered |
| Maximum charged domain records | Hard cap on billed rows |
| Parallel domains | 1 to 10. Per-registry pacing is automatic regardless |
| Cross-run memory name | Skip domains already answered under that name, free of charge. Domains no registry could answer for are not remembered |
| Proxy configuration | Optional and off by default. Registries answer Apify directly |
How the lookup works
- The TLD is resolved to its authoritative RDAP server through the IANA bootstrap file, which covers 1,200 TLDs, plus a built-in table for popular ccTLDs the bootstrap omits (
io,sh,ac,me,us,de,ch,li) and for the busiest gTLDs, so a run still works if IANA is briefly unreachable. - The registry is asked for the domain. A 200 is accepted only when the record it returns is a record for that exact name; anything else is reported as unknown and is free. HTTP 404 from the authoritative server for that TLD means the name is not registered.
- If the TLD publishes no RDAP service, or the registry's RDAP server did not answer, and you enabled the WHOIS check, the Actor asks IANA for that TLD's WHOIS server and queries it on port 43, then reads what it can from free-form WHOIS text. A truncated or timed-out WHOIS reply is never classified: the row stays unknown and free.
- DNS records are read over HTTPS from Cloudflare, with Google as the fallback resolver, for the name that was looked up. They are skipped when the registry confirmed the name is not registered. A resolver that answers SERVFAIL or REFUSED is not treated as an answer.
- The certificate is read from the TLS handshake on port 443 for that same name, on the same condition. Nothing is downloaded from the site.
- Requests are paced per registry host, so one busy TLD in your list does not slow down or throttle the rest. A rate-limited response is retried with backoff, and a domain that still cannot be answered is returned free with the reason on the row.
What this Actor does NOT do
- It does not un-redact registrant details. Where a registry withholds a contact field, it is flagged, not recovered. No paid WHOIS reseller data is used.
- It does not bill the same registration twice. If your list contains
example.comandwww.example.com, both entries come back with their own row and only the first is charged; the second says so instatusReasonand carriesbillable: false. - It does not check subdomains separately. Every entry is reduced to the registered domain, because RDAP has no object for
www.example.com. If that name turns out not to exist, up to two longer forms of what you typed are tried before anything is reported. DNS and SSL are then read for the name the registry confirmed, not for the subdomain you typed, and two entries that resolve to one registration produce one row and one charge. - It does not query every TLD over RDAP. Some ccTLDs,
.jp,.it,.ru,.esand.cnamong them, publish no public RDAP service; they are answered through the port 43 WHOIS fallback, which returns fewer normalized fields..de,.chand.lido publish RDAP, but by registry policy their records are thin: status, nameservers and DNSSEC, with no registrar or dates. - It does not tell you the price of an available domain, and it is not a registrar. A 404 means the registry has no record; registry-reserved and premium names can answer 404 too.
- It does not resolve IP addresses or ASNs, and it does not scan ports.
- It does not know private namespaces such as
uk.com,eu.comorza.com, which are sold by a private registry that the TLD's own RDAP service knows nothing about. A name under one of those is reported for the parent registration rather than guessed at, and it is never reported as available on the strength of the TLD registry's 404. - It follows a hostname up to four labels deeper than the registered name. An entry deeper than that is reported as unknown, free of charge, rather than answered for a name the caller did not ask about.
- It does not follow the registrar's own RDAP referral for thicker registrar-side data. Registry data only in this version.
- It does not monitor by itself. Use an Apify schedule, and a memory name if you want only what is new.
FAQ
Is WHOIS being replaced by RDAP?
Yes. ICANN announced on 27 January 2025 that RDAP is the definitive source of gTLD registration data and that WHOIS is being sunsetted. This Actor reads RDAP first for exactly that reason, and keeps port 43 WHOIS only as a fallback for TLDs that publish no RDAP service.
Why is WHOIS data redacted, and what can I still get?
Registrant, admin and tech contacts are withheld from public registration data under GDPR and ICANN policy. Everything else is still public and this Actor returns it: registrar, IANA id, registrar abuse contact, creation, expiry and last-changed dates, EPP status codes, nameservers and DNSSEC. In our measurement a registrant name was present in 4.5 percent of records, while the registrar was present in 98.3 percent.
How many domains can I check at once?
As many as you like. The cap is the Maximum charged domain records value you set, up to 50,000 per run, and there is no ten-domain or hundred-domain limit built into the Actor. Requests are paced per registry host and a rate-limited response is retried with backoff; a domain that still cannot be answered comes back free, with the reason on the row.
How do I check when a domain expires?
Run the RDAP check and read expiresAt and daysToExpiry. Both come from the registry's own expiration event, and were present on 97.2 percent of the records we measured. Sort by daysToExpiry for a renewal queue, and schedule the run weekly to keep it current.
How do I check whether a domain is available?
Read isRegistered. false means the authoritative registry answered that the name does not exist. null means no registry could be reached, and that row is free. Availability is not a price quote: registry-reserved and premium names can also answer as not registered.
What format should the domain list be in?
Anything readable. The Domains field takes bare names, full URLs, subdomains, email addresses and internationalized names. The Domain list URL takes plain text with one domain per line, or a CSV whose first column is the domain. Lines starting with # are ignored and duplicates are removed before anything is charged.
Why does this Actor run with limited permissions?
Least privilege. It only reads and writes its own storages, and it never touches the rest of your account. The optional cross-run memory is a named key-value store the Actor creates for itself on its first run and reads back on later runs.
API examples
curl -X POST "https://api.apify.com/v2/acts/automation_craft~domain-whois-rdap-lookup/run-sync-get-dataset-items?token=YOUR_TOKEN" \-H "Content-Type: application/json" \-d '{"domains":["apify.com","github.io"],"checks":["rdap","dns"],"maxItems":50}'
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_TOKEN' });const run = await client.actor('automation_craft/domain-whois-rdap-lookup').call({domains: ['apify.com', 'bbc.co.uk'],checks: ['rdap', 'dns', 'tls'],dnsRecordTypes: ['A', 'MX', 'TXT'],});const { items } = await client.dataset(run.defaultDatasetId).listItems();
from apify_client import ApifyClientclient = ApifyClient("YOUR_TOKEN")run = client.actor("automation_craft/domain-whois-rdap-lookup").call(run_input={"domainListUrl": "https://example.com/domains.csv","checks": ["rdap"],"maxItems": 1000,"memoryName": "my-portfolio",})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item.get("domain"), item.get("expiresAt"))
Changelog
1.0 First release: RDAP for 1,200 TLDs with a ccTLD override table, availability from authoritative 404s, DNS over HTTPS, TLS certificate metadata, port 43 WHOIS fallback, per-field redaction flags and an optional cross-run memory.