# Bulk WHOIS & Domain Age Lookup (RDAP) (`nonstop-greed/bulk-domain-lookup`) Actor

Bulk domain intelligence: registrar, creation date, domain age, expiry, nameservers and status. Flags newly registered and expiring domains.

- **URL**: https://apify.com/nonstop-greed/bulk-domain-lookup.md
- **Developed by:** [qasbeque](https://apify.com/nonstop-greed) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bulk WHOIS & Domain Age Lookup (RDAP)

Look up thousands of domains at once and get back registrar, registration date, **domain age**, expiry date, nameservers and registry status — as clean tabular data, not raw WHOIS text you have to parse yourself.

Paste domains, full URLs, or even email addresses; the domain is extracted for you.

### What you get per domain

| Field | Meaning |
|---|---|
| `registrar` | Who the domain is registered through |
| `created` / `age_days` | Registration date and exact age in days |
| `expires` / `expires_in_days` | Expiry date and days remaining |
| `recently_registered` | `true` when the domain is under 90 days old |
| `expiring_soon` | `true` when under 30 days remain |
| `nameservers` | Normalised, sorted list |
| `domain_status` / `flagged_status` | Registry codes, with holds and pending-delete surfaced separately |
| `is_registered` | `false` when the name is unregistered and available |

**`recently_registered` is the field most people come for.** A domain created three weeks ago is the cheapest reliable signal that a sender, vendor or lead is not what it claims. Combined with `flagged_status`, it catches most of what a manual WHOIS check is used for.

### Built on RDAP, not port-43 WHOIS

This Actor uses **RDAP** (RFC 9082), the structured JSON protocol that registries now publish over HTTPS. That means parsed, consistent fields across registries instead of free-text WHOIS output that differs for every TLD.

**Coverage is ~1,200 TLDs**, including `.com`, `.net`, `.org`, `.co.uk`, `.gov`, `.ai`, `.xyz` and every gTLD.

Some country TLDs — notably **`.io`, `.ru`, `.de`** — do not publish an RDAP service at all. Those come back with status `unsupported_tld` and a clear note. They are not guessed at, and not silently dropped from your results: you get a row for every domain you submitted, in the order you submitted it.

### Input

Any one of these:

- **Paste** into the text box — one per line, or comma/semicolon/space separated
- **JSON array** via `domains`, when calling from the API
- **File URL** via `fileUrl` — a public `.txt` or single-column `.csv` link

URLs (`https://www.example.com/pricing`) and emails (`bob@example.com`) are both reduced to `example.com`, and duplicates are removed *after* that reduction — so `example.com`, `www.example.com` and `bob@example.com` count as one lookup, not three.

### Output

```json
{
  "domain": "google.com",
  "status": "registered",
  "is_registered": true,
  "registrar": "MarkMonitor Inc.",
  "created": "1997-09-15",
  "expires": "2028-09-14",
  "age_days": 10546,
  "expires_in_days": 776,
  "recently_registered": false,
  "expiring_soon": false,
  "nameservers": ["ns1.google.com", "ns2.google.com"],
  "domain_status": ["client transfer prohibited"],
  "flagged_status": ["client transfer prohibited"],
  "note": null
}
```

Statuses: `registered`, `available`, `unsupported_tld`, `rate_limited`, `invalid`, `error`.

### Pricing

**Free.** No per-domain fee and no markup — you pay only the Apify platform compute your own run uses, which is a fraction of a cent for a few thousand domains.

### Speed and rate limits

Around 10 domains/second at the default concurrency. Registries throttle aggressive clients, so the default of 10 parallel lookups is deliberately conservative: pushing it higher tends to produce `rate_limited` rows rather than faster results. Repeated domains within a run are cached and cost nothing.

### Common uses

- **Lead qualification** — filter out prospects whose domain was registered last month
- **Fraud and spam screening** — newly registered domains are the strongest cheap signal
- **Portfolio monitoring** — catch your own domains before they expire
- **Availability checks** — bulk-test whether names are still free
- **M\&A and competitive research** — registration dates and registrar footprints

### Related

Cleaning a contact list rather than a domain list? [Bulk Email Verifier](https://apify.com/nonstop-greed/bulk-email-verifier) checks syntax, MX, disposable providers and typos on the same kind of input.

# Actor input Schema

## `domainsText` (type: `string`):

One per line, or separated by commas/semicolons/spaces. Full URLs and email addresses are accepted too - the domain is extracted for you.

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

Same as above, as a JSON array. Useful when calling this Actor from the API.

## `fileUrl` (type: `string`):

Public link to a plain-text or single-column CSV file. A header row named 'domain' or 'email' is skipped automatically.

## `concurrency` (type: `integer`):

Registries rate-limit. 10 is safe; raising it risks 'rate\_limited' rows rather than faster results.

## `timeoutSecs` (type: `integer`):

How long to wait for a single registry response before marking that domain as an error.

## Actor input object example

```json
{
  "domainsText": "google.com\nhttps://www.bbc.co.uk/news\nbob@apify.com\npython.org",
  "concurrency": 10,
  "timeoutSecs": 20
}
```

# 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 = {
    "domainsText": `google.com
https://www.bbc.co.uk/news
bob@apify.com
python.org`
};

// Run the Actor and wait for it to finish
const run = await client.actor("nonstop-greed/bulk-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 = { "domainsText": """google.com
https://www.bbc.co.uk/news
bob@apify.com
python.org""" }

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

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

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

```

## CLI example

```bash
echo '{
  "domainsText": "google.com\\nhttps://www.bbc.co.uk/news\\nbob@apify.com\\npython.org"
}' |
apify call nonstop-greed/bulk-domain-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=nonstop-greed/bulk-domain-lookup",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/DbdRXVbzJmXKgEamu/builds/ySJdOuaagQ26fQey7/openapi.json
