# Bulk WHOIS lookup with RDAP and live DNS records

> Bulk WHOIS lookup with RDAP and DNS records. Get registrar, creation and expiry dates, nameservers and MX records for up to 5,000 domains. No API key.

URL: https://cliqtomedia.com/actors/domain-whois-dns-lookup/

Category: Leads, companies & validation · Status: live on Apify Store · Apify page: https://apify.com/cliqtomedia/domain-whois-dns-lookup?fpr=cliqto

Paste a list of domains. For each one, you get registrar, dates and days until expiry from the official registry. You also get live DNS records in the same row.

## How to use it: 3 steps

1. **Make a free Apify account.** Apify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
2. **Paste your input and press Start.** No code needed: you fill in a form (the input). It already has a working example. For example: `apify.com` in Domains. Each start is one run.
3. **Download the results.** When the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.

## What it does

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.

- 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.
- DNS over HTTPS, from Google Public DNS or Cloudflare 1.1.1.1. If one fails, the other is tried.

### Good for

- 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 good fit

- 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.

## Price

Pay per event. Apify bills you, not us.

| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.0005 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Domain lookup | $0.0015 (from $0.0013 on paid Apify plans) | One checked domain saved to the Dataset with status complete, partial or not_found. Rows with status error, invalid inputs and duplicates are not charged. |

- One domain: about $0.002.
- 1,000 domains: about $1.50.
- Every day 100 domains, for 30 days: about $4.51 a month.

Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed.

Prices checked on 24 October 2026. Current price: https://apify.com/cliqtomedia/domain-whois-dns-lookup?fpr=cliqto

## Questions

### Is RDAP the same as WHOIS?

RDAP is the official successor of WHOIS. It gives the same facts in clean JSON.

### Do I get the owner's name or email?

No. The tool never collects owner data. Most registries hide it anyway.

### Why is there no expiry date for some domains?

Some registries share little, or run no public RDAP. You still get DNS records.

### Do I need a WHOIS API key?

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

### 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.

## Data fields

- `input` (string): The value as given in the input, before normalisation.
- `domain` (string): Registrable domain that was checked (lowercase ASCII/punycode), e.g. example.co.uk.
- `tld` (string): Top-level domain whose registry was asked, e.g. com, uk, de.
- `lookupStatus` (string): complete = every requested part answered; partial = some data returned but a part failed or the registry has no RDAP; not_found = the registry says the domain is not registered (or, with RDAP off, DNS answers NXDOMAIN); error = nothing usable (not charged).
- `registered` (boolean): true when the registry RDAP returned the domain, false when it answered 404 (not registered), null when unknown (RDAP off, unavailable or failed). DNS alone never sets this.
- `rdapStatus` (string): Outcome of the RDAP part: found, not_found (404), rdap_unavailable (the TLD has no public RDAP service known to the Actor), error, or skipped (RDAP off).
- `registrar` (string): Sponsoring registrar name from RDAP.
- `registrarIanaId` (string): Registrar IANA ID (gTLDs).
- `registrarUrl` (string): Registrar website from RDAP, when published.
- `registrarAbuseEmail` (string): Registrar abuse-contact mailbox when it is a role address (abuse@, support@, ...); any other address is dropped.
- `createdAt` (string): Registration date (ISO 8601, UTC).
- `updatedAt` (string): Last change of the registration (ISO 8601, UTC).
- `expiresAt` (string): Expiry date (ISO 8601, UTC). Many ccTLD registries do not publish it: null then.
- `daysUntilExpiry` (integer): Whole days from checkedAt to expiresAt; negative when already past. null when expiresAt is unknown.
- `domainAgeDays` (integer): Whole days since createdAt. null when createdAt is unknown.
- `status` (array): EPP / RDAP status values, lowercase, e.g. client transfer prohibited.
- `nameservers` (array): Delegated nameservers according to the registry (RDAP).
- `dnssec` (boolean): true/false when the registry states whether the delegation is DNSSEC-signed; null when not stated.
- `rdapServer` (string): RDAP base URL used for the TLD.
- `rdapServerSource` (string): Where the RDAP server came from: the IANA bootstrap file, or a registry endpoint verified by the Actor author but not yet listed by IANA.
- `rdapUrl` (string): Exact RDAP URL that was requested (open it to see the source record).
- `registrarRdapUrl` (string): Link to the registrar's own RDAP record of the domain, when the registry publishes one.
- `rdapDatabaseUpdatedAt` (string): When the registry last refreshed its RDAP database (ISO 8601).
- `dnsResponseCode` (string): DNS response code: NOERROR (name exists), NXDOMAIN (name does not exist in DNS), SERVFAIL, REFUSED. null when DNS is off or failed.
- `dns` (object): Records per requested type, e.g. {"A": ["1.2.3.4"], "MX": ["10 mx.example.com"]}. Empty list = no records of that type; null = that query failed. MX values are "priority host" ("0 ." = null MX: the domain accepts no mail); TXT strings are joined and unquoted.
- `dnsResolver` (string): Resolver that answered.
- `error` (string): What failed, per part (RDAP: ... | DNS: ...). null when nothing failed.
- `errorCode` (string): Machine-readable code of the first failure, e.g. RDAP_NOT_AVAILABLE, RATE_LIMITED, SOURCE_UNAVAILABLE, SOURCE_TIMEOUT.
- `checkedAt` (string): When the lookup started (ISO 8601, UTC).
- `source` (string): Sources used for this row: RDAP (domain registry), DNS-over-HTTPS, or both.

## Input settings

- `domains` (array, required): Up to 5,000 domain names or URLs, one per line (e.g. apify.com, https://www.example.org/page). Subdomains and paths are reduced to the registrable domain (www.shop.example.co.uk becomes example.co.uk); duplicates are checked once; invalid values are listed in RUN_SUMMARY and not charged.
- `includeRdap` (boolean): Registrar, IANA ID, creation, update and expiry dates, EPP status, nameservers and DNSSEC from the registry's RDAP server. Registrant names and emails are never collected. Some country-code registries (e.g. .it, .eu, .ru) run no public RDAP service; those rows get rdapStatus rdap_unavailable instead of guessed data.
- `includeDns` (boolean): Live DNS records of the domain from public DNS-over-HTTPS resolvers.
- `recordTypes` (array): Which record types to resolve when DNS records are on. Each type is one DNS query per domain.
- `dnsResolver` (string): Public DNS-over-HTTPS resolver asked first; the other one is used when it fails.

## Step by step on Apify

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:
6. Domains — status, registrar, dates and nameservers;
7. DNS records — DNS response code and records by type;
8. Registry details — registrar IDs, RDAP sources and links.

## Use cases

| Task | Input | Key fields | Next step |
|---|---|---|---|
| Expiry watch for a domain portfolio | `domains` | `expiresAt`, `daysUntilExpiry`, `registrar` | Sort by `daysUntilExpiry`; run on a schedule |
| Registrar and DNS audit | `domains`, `recordTypes` | `registrar`, `nameservers`, `dns.NS`, `dnssec` | Export to CSV or Excel |
| E-mail setup check | `includeRdap: false`, `recordTypes: ["MX","TXT"]` | `dns.MX`, `dns.TXT` | Filter rows with empty `dns.MX` |
| Is this name registered? | `domains` | `registered`, `lookupStatus` | Keep rows with `not_found` |

## Tips

- Sort by daysUntilExpiry to see urgent renewals first.
- Pick only the DNS record types you need. Each type is one query.
- Long .ch or .uk lists can be slow. Split them into smaller runs.

## 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.

## Sample result

```json
{
  "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"
}
```

## Use it from code

Actor ID: `cliqtomedia/domain-whois-dns-lookup`

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/domain-whois-dns-lookup").call(run_input={
    "domains": [
        "apify.com",
        "example.org",
        "this-domain-should-not-exist-7f3k9q.com",
        "repubblica.it"
    ],
    "includeRdap": True
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

```bash
curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~domain-whois-dns-lookup/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"domains": ["apify.com", "example.org", "this-domain-should-not-exist-7f3k9q.com", "repubblica.it"], "includeRdap": true}'
```

```python
# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool

tool = ApifyActorsTool("cliqtomedia/domain-whois-dns-lookup")
result = tool.invoke({"run_input": {"domains": ["apify.com", "example.org", "this-domain-should-not-exist-7f3k9q.com", "repubblica.it"], "includeRdap": True}})
print(result)
```

run-sync waits up to 300 seconds; for longer runs start a run and use a webhook. LlamaIndex and MCP: https://cliqtomedia.com/actors/ai-agents/

## Use cases with this tool

- [Lead lists from public data](https://cliqtomedia.com/actors/use-cases/lead-generation/): Build lists of companies and contacts from public sites. Check emails and phones before you send.

## Similar tools

- [Website Contact Scraper](https://cliqtomedia.com/actors/website-contacts-scraper/)
- [Bulk Email Verifier: MX, Disposable, Role & Typo Check](https://cliqtomedia.com/actors/email-verifier/)
- [EU VAT Number Validator (VIES) - Bulk Check, No Login](https://cliqtomedia.com/actors/vat-number-validator/)
- [Europages Scraper: B2B Suppliers & Certificates (No Login)](https://cliqtomedia.com/actors/europages-companies-scraper/)
- [France Company & SIRET Search](https://cliqtomedia.com/actors/france-sirene-company-search/)
- [Norway Company Register (Brreg) & Updates](https://cliqtomedia.com/actors/norway-brreg-company-register/)
