# Bulk WHOIS Domain Lookup: Age, Expiry & Registrar (RDAP) (`juicy_fillet/rdap-domain-lookup`) Actor

Bulk WHOIS for any list of domains, URLs or emails via official RDAP: registrar, creation and expiry dates, domain age, days until expiry, nameservers, status, DNSSEC, abuse contact and availability.

- **URL**: https://apify.com/juicy_fillet/rdap-domain-lookup.md
- **Developed by:** [Xander Yushchak](https://apify.com/juicy_fillet) (community)
- **Categories:** Developer tools, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bulk WHOIS Domain Lookup: Age, Expiry & Registrar (RDAP)

Look up **thousands of domains at once** and get clean WHOIS data as a table: registrar, creation date, **expiry date**, **domain age in days**, days until expiry, nameservers, status codes, DNSSEC, abuse contact and, where it isn't privacy-protected, the registrant organisation and country. Unregistered domains are flagged as **available**.

It uses **RDAP**, the official JSON successor to WHOIS that ICANN requires every gTLD registry and registrar to run. Answers come from the registries themselves, in a fixed format, so there's no fragile text parsing for .com, .net, .org, .app, .ai, .co.uk, .fr, .ca and 1,200 other TLDs. Country domains without RDAP yet (.io, .co, .de, .so and others) fall back to classic WHOIS automatically.

### Paste anything

Domains, URLs and email addresses all work, one per line or comma-separated:

```
apify.com
https://www.stripe.com/pricing     -> stripe.com
jane@bbc.co.uk                     -> bbc.co.uk
blog.notion.so                     -> notion.so
```

Duplicates are removed, and subdomains are reduced to the registered domain (turn on "Keep subdomains" to change that).

### What people use it for

- **Lead scoring:** drop brand-new domains (often spam or throwaway sites) from a lead list with "Minimum domain age", or prioritise established companies.
- **Fraud and risk checks:** domain age is a top signal for phishing, fake shops and sign-up fraud.
- **Expiring domains:** find domains in your list that expire in the next 30 days with "Expiring within".
- **Domain investing and brand monitoring:** check availability in bulk, see who registered look-alike domains and where to report abuse.
- **Portfolio audits:** registrars, renewal dates and DNS hosts for every domain your company owns.
- **Enrichment:** run it after [Website Contact Extractor](https://apify.com/juicy_fillet/website-contact-extractor) or [Website Technology Detector](https://apify.com/juicy_fillet/website-tech-detector) to add company age.

### Output example

```json
{
  "domain": "apify.com",
  "found": true,
  "available": false,
  "registrar": "Amazon Registrar, Inc.",
  "registrarIanaId": "468",
  "registrarUrl": "http://registrar.amazon.com",
  "createdAt": "2009-06-02T17:14:10Z",
  "updatedAt": "2026-05-16T16:53:04Z",
  "expiresAt": "2035-06-02T17:14:10Z",
  "domainAgeDays": 6334,
  "daysUntilExpiry": 3161,
  "status": ["client transfer prohibited"],
  "nameservers": ["ns-1225.awsdns-25.org", "ns-449.awsdns-56.com"],
  "dnssec": true,
  "registrantOrganization": null,
  "registrantCountry": "US",
  "abuseEmail": "trustandsafety@support.aws.com",
  "abusePhone": "tel:+1.2024422253",
  "source": "rdap",
  "checkedAt": "2026-10-06T14:01:29Z"
}
```

`source` says whether the row came from RDAP or the WHOIS fallback. Unregistered domains come back with `"found": false, "available": true`. A `SUMMARY` record in the key-value store counts registered, available and unknown domains.

### Filters

| Option | What it does |
|--------|--------------|
| Only registered domains | Skip available or failed lookups |
| Minimum domain age (days) | e.g. 365 keeps only domains older than a year |
| Expiring within (days) | e.g. 30 keeps only domains that expire soon |
| Ask the registrar too | For .com/.net, also query the registrar's RDAP server for registrant country and abuse contacts (on by default) |
| Classic WHOIS fallback | For TLDs without RDAP (on by default) |

### Pricing

**$1.50 per 1,000 domains** (plus a tiny per-run start fee), with the filters applied before you're charged.

### FAQ

**Why is the registrant name empty?** Since GDPR most registrars redact personal registrant details. The actor returns the organisation and country only when the registry publishes them, and never guesses.

**Is "available" guaranteed?** It means the registry has no record of the domain. Premium, reserved or recently deleted names can still be unavailable to register, so confirm at a registrar before you buy.

**Is this allowed?** RDAP and WHOIS are public lookup services run by the registries for exactly this purpose. The actor limits parallel lookups per registry to stay polite.

### Use it with n8n, Make or Zapier

Schedule a weekly run on your domain list in Apify, then use the Apify integration in n8n, Make or Zapier to send domains expiring soon to Slack, email or Google Sheets.

### More from this developer

- [Website Contact Extractor](https://apify.com/juicy_fillet/website-contact-extractor): emails, phones and socials from any list of websites
- [Website Technology Detector](https://apify.com/juicy_fillet/website-tech-detector): CMS, analytics and 7,600+ technologies per site
- [Email Verifier Lite](https://apify.com/juicy_fillet/email-verifier-lite): bulk syntax, MX and disposable checks
- [Company Jobs Scraper](https://apify.com/juicy_fillet/ats-jobs-scraper): every open job from Greenhouse, Lever, Ashby and more

# Actor input Schema

## `domains` (type: `array`):

One per line. Domains, website URLs or email addresses all work (https://www.shop.example.com/page and jane@example.com both become example.com). Comma-separated lists are split automatically. Duplicates are removed.

## `maxItems` (type: `integer`):

Look up at most this many domains. Leave empty for all. You only pay for results returned.

## `onlyRegistered` (type: `boolean`):

Skip domains that aren't registered or couldn't be looked up. Turn off to also get availability results.

## `minAgeDays` (type: `integer`):

Only return domains registered at least this many days ago, e.g. 365 to drop brand-new domains from a lead list.

## `expiringWithinDays` (type: `integer`):

Only return domains that expire within this many days, e.g. 30 to find domains that may drop soon.

## `followRegistrarRdap` (type: `boolean`):

For .com, .net and similar, the registry only knows the registrar. Also querying the registrar's RDAP server adds registrant organisation and country (when not privacy-protected) and abuse contacts.

## `whoisFallback` (type: `boolean`):

Some country domains (.io, .co, .de and others) have no RDAP server yet. Use classic WHOIS for those, with best-effort parsing.

## `keepSubdomains` (type: `boolean`):

By default blog.example.com is looked up as example.com, since only registered domains have WHOIS records.

## `maxConcurrencyPerRegistry` (type: `integer`):

Registries rate-limit lookups. 5 is fast and polite; lower it if you see many errors for one TLD.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "https://www.stripe.com/pricing",
    "jane@bbc.co.uk",
    "github.io",
    "this-domain-is-surely-free-98213.com"
  ],
  "onlyRegistered": false,
  "followRegistrarRdap": true,
  "whoisFallback": true,
  "keepSubdomains": false,
  "maxConcurrencyPerRegistry": 5
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "domains": [
        "apify.com",
        "https://www.stripe.com/pricing",
        "jane@bbc.co.uk",
        "github.io",
        "this-domain-is-surely-free-98213.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("juicy_fillet/rdap-domain-lookup").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "domains": [
        "apify.com",
        "https://www.stripe.com/pricing",
        "jane@bbc.co.uk",
        "github.io",
        "this-domain-is-surely-free-98213.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("juicy_fillet/rdap-domain-lookup").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "domains": [
    "apify.com",
    "https://www.stripe.com/pricing",
    "jane@bbc.co.uk",
    "github.io",
    "this-domain-is-surely-free-98213.com"
  ]
}' |
apify call juicy_fillet/rdap-domain-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,juicy_fillet/rdap-domain-lookup"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/cGVMhcE8gjfnKH4uA/builds/tqSnQw1PLcjRc1uMb/openapi.json
