Domain WHOIS (RDAP) & DNS Lookup, No Login avatar

Domain WHOIS (RDAP) & DNS Lookup, No Login

Pricing

from $1.30 / 1,000 domain lookups

Go to Apify Store
Domain WHOIS (RDAP) & DNS Lookup, No Login

Domain WHOIS (RDAP) & DNS Lookup, No Login

Bulk WHOIS lookup over official registry RDAP plus live DNS records: registrar, creation and expiry dates, days to expiry, status, nameservers, DNSSEC and A/AAAA/MX/NS/TXT records for up to 5,000 domains. No login, no API key.

Pricing

from $1.30 / 1,000 domain lookups

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Check a list of domain names and get WHOIS-style registration data from the official registry RDAP service, plus live DNS records, in one row per domain. You get the registrar, creation and expiry dates, days until expiry, status codes, nameservers, DNSSEC and A, AAAA, MX, NS, TXT, CNAME, SOA or CAA records. No login and no API key.

Paste up to 5,000 domains or URLs. A run with the four prefilled domains finishes in a few seconds; 1,000 domains cost about $1.50.

Domain WHOIS (RDAP) & DNS Lookup: paste domains, get registrar, expiry date, nameservers, DNSSEC and DNS records in one row per domain

Table of contents

What it does

For each domain, the Actor asks two public sources:

  1. RDAP, the modern replacement of WHOIS. It asks the registry of the domain's top-level domain (for example Verisign for .com, Public Interest Registry for .org, Nominet for .uk). The server is found in the IANA RDAP bootstrap file.
  2. DNS over HTTPS, from Google Public DNS or Cloudflare 1.1.1.1. If one fails, the other is tried.

Both answers go into one Dataset row. Every row has a clear lookupStatus.

Good fit

  • Find domains that expire soon in a portfolio (expiresAt, daysUntilExpiry).
  • Check which registrar and nameservers a list of domains uses.
  • Check mail and verification setup (MX, TXT with SPF, CAA) for many domains at once.
  • Check whether domain names are registered (registered, not_found).

Not a fit / limits

  • No registrant data. The Actor never reads the owner's name, address, e-mail or phone. Registries hide most of it anyway.
  • No port 43 WHOIS. Some country-code registries have no public RDAP service, for example .it, .es, .ru, .jp, .se, .dk, .so. For these you get DNS records and rdapStatus: rdap_unavailable, not registration data.
  • Some registries share little. For example DENIC (.de) does not publish the registrar or expiry date. These fields are null then.
  • Best effort. Data comes from public services as they answer at run time. We do not promise that every field is present or correct.
  • Not for spam. Registry terms (for example Verisign and PIR) forbid using this data for mass advertising or unsolicited e-mail. Use it for your own domains, research or security work.

Quick start

  1. Open the Input tab.
  2. Put your domains in Domains (domains), one per line. The field is prefilled with four examples.
  3. Keep the defaults: RDAP on, DNS on, record types A, AAAA, MX, NS, TXT, Google resolver.
  4. Click Start.
  5. Open the Output tab and the dataset table. The table has three views:
    • Domains — status, registrar, dates and nameservers;
    • DNS records — DNS response code and records by type;
    • Registry details — registrar IDs, RDAP sources and links.

Expected result: one row per unique domain. Domains that are not registered get lookupStatus: not_found.

Use cases

Buyer jobInput pathKey fieldsNext step
Expiry watch for a domain portfoliodomainsexpiresAt, daysUntilExpiry, registrarSort by daysUntilExpiry; run on a schedule
Registrar and DNS auditdomains, recordTypesregistrar, nameservers, dns.NS, dnssecExport to CSV or Excel
E-mail setup checkincludeRdap: false, recordTypes: ["MX","TXT"]dns.MX, dns.TXTFilter rows with empty dns.MX
Is this name registered?domainsregistered, lookupStatusKeep rows with not_found

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffect
domainsDomainsarray of stringsyesprefill: apify.com, example.org, a made-up .com, repubblica.it1–5,000 domain names or URLsThe domains to check
includeRdapRegistration data (RDAP)booleannotruetrue / falseRegistrar, dates, status, nameservers, DNSSEC
includeDnsDNS recordsbooleannotruetrue / falseLive DNS records
recordTypesDNS record typesarraynoA, AAAA, MX, NS, TXTA, AAAA, CNAME, MX, NS, TXT, SOA, CAAOne DNS query per type and domain
dnsResolverDNS resolverstringnogooglegoogle, cloudflareResolver asked first

How domains is cleaned:

  • URLs and subdomains become the registrable domain: https://www.shop.example.co.uk/page becomes example.co.uk.
  • Internationalised names become punycode: münchen.de becomes xn--mnchen-3ya.de.
  • Duplicates (also in different letter case) are checked once.
  • Invalid values are not checked and not charged. They are listed in RUN_SUMMARY.invalidInputs.
  • If no value is a valid domain, the run fails at once with a message that names the bad values.

At least one of includeRdap and includeDns must be on. With DNS off, domains under a TLD without public RDAP (for example .it) have nothing to return. They are listed in RUN_SUMMARY.invalidInputs and not charged. If no domain is left, the run fails with a message that names those TLDs.

Input example

{
"domains": ["apify.com", "example.org", "this-domain-should-not-exist-7f3k9q.com", "repubblica.it"],
"includeRdap": true,
"includeDns": true,
"recordTypes": ["A", "AAAA", "MX", "NS", "TXT"],
"dnsResolver": "google"
}

Expected output: 4 rows. apify.com and example.org are complete. The made-up domain is not_found. repubblica.it is partial, because .it has no public RDAP service, but its DNS records are there.

Output

Output fields

FieldMeaningCan be empty?
inputThe value as you entered itno
domainRegistrable domain that was checkedno
tldTop-level domain, for example com or co.ukno
lookupStatuscomplete, partial, not_found or errorno
registeredtrue / false from the registry; null if unknownyes
rdapStatusfound, not_found, rdap_unavailable, error, skippedno
registrar, registrarIanaIdSponsoring registraryes
registrarUrlRegistrar websiteyes
registrarAbuseEmailRegistrar abuse mailbox, only role addresses like abuse@yes
createdAt, updatedAt, expiresAtRegistration dates, ISO 8601 UTCyes
daysUntilExpiry, domainAgeDaysWhole days, computed at check timeyes
statusEPP status codes, for example client transfer prohibitedempty list
nameserversNameservers according to the registryempty list
dnssecWhether the delegation is DNSSEC-signedyes
dnsResponseCodeNOERROR, NXDOMAIN, SERVFAIL or REFUSEDyes
dnsRecords by type, for example {"MX": ["10 mx.example.com"]}yes
rdapUrlThe exact RDAP URL, so you can open the source recordyes
rdapServer, rdapServerSourceRDAP server used, and where it came from: iana_bootstrap or known_registry_endpointyes
registrarRdapUrlLink to the registrar's own RDAP record, if the registry gives ityes
rdapDatabaseUpdatedAtWhen the registry last updated its RDAP databaseyes
dnsResolverResolver that answered: google or cloudflareyes
error, errorCodeWhat failed, for example RDAP_NOT_AVAILABLE, RATE_LIMITEDyes
checkedAt, sourceCheck time and sources usedno

Rows appear in the order the lookups finish, not in input order. Sort by input or domain if you need a fixed order.

Empty values: a missing single value is null, a missing list is []. There are no empty strings.

In dns, [] means "no records of this type" and null means "this query failed". After NXDOMAIN the other types are not asked, so they show [].

Lookup status

lookupStatusMeaningCharged?
completeEvery requested part answeredyes
partialSome data returned, but one part failed or the TLD has no RDAPyes
not_foundThe registry says the domain is not registered (or DNS says NXDOMAIN when RDAP is off)yes
errorNo useful data at allno

Output example

Trimmed row for apify.com from a real run (TXT and AAAA shortened):

{
"input": "apify.com",
"domain": "apify.com",
"tld": "com",
"lookupStatus": "complete",
"registered": true,
"rdapStatus": "found",
"registrar": "Amazon Registrar, Inc.",
"registrarIanaId": "468",
"registrarAbuseEmail": "trustandsafety@support.aws.com",
"createdAt": "2009-06-02T17:14:10.000Z",
"updatedAt": "2026-05-16T16:53:04.000Z",
"expiresAt": "2035-06-02T17:14:10.000Z",
"daysUntilExpiry": 3154,
"domainAgeDays": 6341,
"status": ["client transfer prohibited"],
"nameservers": ["ns-1225.awsdns-25.org", "ns-1928.awsdns-49.co.uk", "ns-449.awsdns-56.com", "ns-839.awsdns-40.net"],
"dnssec": true,
"rdapUrl": "https://rdap.verisign.com/com/v1/domain/apify.com",
"dnsResponseCode": "NOERROR",
"dns": {
"A": ["3.170.42.100", "3.170.42.109", "3.170.42.68", "3.170.42.76"],
"AAAA": ["2600:9000:2870:2000:9:a03e:6540:93a1"],
"MX": ["1 aspmx.l.google.com", "5 alt1.aspmx.l.google.com"],
"NS": ["ns-1225.awsdns-25.org", "ns-1928.awsdns-49.co.uk", "ns-449.awsdns-56.com", "ns-839.awsdns-40.net"],
"TXT": ["google-site-verification=R_4agUZyHorQrO5QGFa6ZB_o-uDxq82NY-EteDUpPvo"]
},
"dnsResolver": "google",
"error": null,
"errorCode": null,
"checkedAt": "2026-10-13T11:24:11.691Z",
"source": "RDAP (domain registry) + DNS-over-HTTPS"
}

DNS records are returned as the domain owner published them. Some records, such as CAA iodef or DMARC rua, can contain an e-mail address.

Run summary

Each run also writes RUN_SUMMARY to the Key-value store. It has the run status (COMPLETE or PARTIAL), the reason for a partial run, counts by status, invalid inputs, domains that were not checked, request statistics and warnings. For example, it lists the TLDs that have no RDAP service.

Pricing and limits

Pricing unit

You pay per event:

EventPriceWhen
Domain lookup$1.50 per 1,000 domains (lower on Bronze, Silver and Gold plans)Each row with complete, partial or not_found
Actor start$0.0005 per runOnce per run, charged by Apify

Not charged: rows with lookupStatus: error, invalid inputs and duplicates. Platform usage (compute, storage) is included in these prices; you do not pay it on top.

Cost examples (Free plan price)

ScenarioDomainsCharge
Prefill4about $0.0065
Small list100about $0.15
Portfolio1,000about $1.50
Maximum input5,000about $7.50

Set Maximum cost per run in the run options to cap the spend. When the cap is reached, the Actor stops, saves the rows it has, and marks the run PARTIAL with CHARGE_LIMIT. Unchecked domains are listed in RUN_SUMMARY.unprocessedDomains.

Speed and limits

  • Up to 5,000 unique domains per run. For more, split the list into several runs.
  • The Actor keeps request rates low for each registry (at most 10 requests per second to Verisign) and waits when a server asks it to slow down.
  • Some registries limit RDAP on their side. SWITCH (.ch) answered only about 40–70 lookups in a row in our tests and then returned rate-limit errors; Nominet (.uk) allows about 2 lookups per second and a daily maximum. The Actor slows down for these registries, but long .ch or .uk lists can get rows with errorCode: RATE_LIMITED or HOST_CIRCUIT_OPEN. Such a row still has its DNS records and is partial.
  • Measured on 256 MB with a mixed list (mostly .com, .net, .org): 2,000 domains took about 9 minutes and 5,000 domains about 22 minutes. Lists with many .ch or .uk domains run slower because of the registry limits above. The default timeout is 1 hour.

API, export and integrations

  • API: start the Actor with the Apify API and read the Dataset items.
  • Export: download the Dataset as JSON, CSV, Excel or XML from the Output tab.
  • Scheduling: create a schedule in Apify Console to check the same list every week, for example for expiry dates.
  • Webhooks / no-code: send a webhook when the run finishes, or use the Apify integrations for Make, Zapier or n8n.

Use with AI agents (MCP)

  • MCP server URL with only this Actor: https://mcp.apify.com?tools=cliqtomedia/domain-whois-dns-lookup
  • Smallest useful input: {"domains": ["apify.com"]}
  • Key output fields: lookupStatus (complete / partial / not_found / error), registrar, expiresAt, nameservers, dns.
  • A run with a few domains takes a few seconds. Cost: $0.0015 per domain plus $0.0005 per run on the Free plan.
  • Limits: up to 5,000 domains per run; no registrant data; some TLDs have no RDAP (rdapStatus: rdap_unavailable).

Troubleshooting

Registration fields are empty, but DNS works

Symptom: rdapStatus: rdap_unavailable, lookupStatus: partial. Reason: the registry of this TLD has no public RDAP service known to the Actor. Action: use the DNS data, or check the registry website by hand. RUN_SUMMARY.warnings lists these TLDs.

Registrar or expiry date is null for a complete row

Reason: some registries, for example DENIC for .de, do not publish these fields in RDAP. This is the registry's choice, not a failed lookup.

The run is PARTIAL with LOOKUP_ERRORS

Reason: a source did not answer for some domains, for example after repeated rate limits or timeouts. Those rows have errorCode such as SOURCE_UNAVAILABLE or RATE_LIMITED. Action: run again later with only those domains. Rows with lookupStatus: error are not charged.

If 100 lookups in a row fail, the sources are down. The Actor then stops, so it does not write an error row for every domain. The run is PARTIAL (or failed, if nothing worked), and the domains it did not check are in RUN_SUMMARY.unprocessedDomains.

The run is PARTIAL with DEADLINE

Reason: the run timeout was too short for the list. Unchecked domains are in RUN_SUMMARY.unprocessedDomains. Action: raise the timeout or split the list.

FAQ

Do I need a WHOIS API key or an account at a registry?

No. RDAP and DNS over HTTPS are public. You only need an Apify account.

Is this the same as WHOIS?

RDAP is the official successor of WHOIS for domain registries. It gives the same registration facts in a structured JSON format.

Why do I not get the owner's name or e-mail?

The Actor does not collect personal data of registrants. Most registries hide it for privacy reasons anyway.

How fresh is the data?

Each row is checked live at checkedAt. Registry data can lag behind registrar changes by a short time; rdapDatabaseUpdatedAt shows when the registry last refreshed it.

Support

For bugs or questions, open an issue in the Issues tab of this Actor. Include the run ID and the domains that look wrong. Do not send API tokens or private data.