# Domain WHOIS & Availability Checker — $1/1k · Bulk RDAP, Age (`tidydata/domain-whois-checker`) Actor

Bulk WHOIS lookup and domain availability checker: registrar, creation and expiry date, domain age, status, nameservers, DNSSEC and DNS lookup (MX, SPF, DMARC) for any domain list. Official RDAP + WHOIS, 1,200+ extensions. $1 per 1,000 domains.

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

## Pricing

from $0.80 / 1,000 domain checkeds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## 🌐 Domain WHOIS & Availability Checker — Bulk RDAP, Age, Expiry

**Bulk WHOIS lookup** for any list of domains, websites or emails: **registrar, creation date, expiry date, domain age, days until expiry, status, nameservers and DNSSEC**, plus **DNS checks (website online, MX, SPF, DMARC)** and whether each domain is **available to register**. Uses the official **RDAP** system (the modern WHOIS run by ICANN and the registries) for 1,200+ extensions, and classic **WHOIS** for country domains that don't offer RDAP yet.

**$1 per 1,000 domains.** Duplicates and invalid names are free. No API key.

- ✅ **Paste anything**: `example.com`, `https://shop.example.co.uk/page`, `info@example.de` → the registrable domain is extracted automatically (public suffix list)
- ✅ **Registration data**: registrar (name, IANA ID, website), **created**, **updated**, **expires**, **age in days and years**, **days until expiry**, status codes (e.g. `client transfer prohibited`), nameservers, DNSSEC
- ✅ **Availability**: `registered`, `available`, `probably_available` (no registry lookup but the name doesn't exist in DNS) or `unknown`
- ✅ **DNS checks** (free): A records (does it have a website?), **MX** (does it receive email?), **SPF** and **DMARC** records
- ✅ **Abuse contact** of the registrar, and the **registrant organization and country** when the registry publishes them (personal data is redacted by law)
- ✅ **1,200+ extensions** via RDAP (.com, .net, .org, .co.uk, .fr, .nl, .ai, .app, .dev, .shop…) plus WHOIS/RDAP for .de, .io, .it, .eu, .ch, .co, .me, .us, .at, .se, .pt, .be and more
- ✅ **Bulk input from datasets and files**: pick a Google Maps / lead scraper dataset or a CSV — website, URL or email columns are detected automatically
- ✅ Fast and polite: parallel lookups with per-registry limits and retries

### Who uses it

- **Lead generation & sales** — qualify company lists by domain age (new vs. established businesses) and check that their email domain has MX/SPF/DMARC.
- **Domain investors** — check availability and expiry dates of hundreds of names at once.
- **SEO & agencies** — domain age and registrar of competitors and link prospects.
- **Security & brand protection** — find newly registered look-alike domains, check DMARC/SPF of partners.
- **IT & compliance** — monitor your company's domains so none expires by accident.

### How to use it

1. Paste **domains, URLs or emails** (one per line), or pick **datasets** / add **CSV files**.
2. Keep **DNS checks** on (free) and, if you need it, **ask the registrar too** for registrant organization and country.
3. Run and export to **CSV, Excel or JSON**, or schedule it to watch expiry dates.

#### Input example

```json
{
  "domains": ["apify.com", "https://www.bbc.co.uk/news", "info@google.de", "my-new-startup-idea.com"],
  "includeDns": true
}
```

### Output example

```json
{
  "domain": "apify.com",
  "availability": "registered",
  "registered": true,
  "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",
  "ageDays": 6350,
  "ageYears": 17.4,
  "daysUntilExpiry": 3146,
  "statuses": ["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,
  "abuseEmail": "trustandsafety@support.aws.com",
  "aRecords": ["3.170.42.100", "3.170.42.109", "3.170.42.68", "3.170.42.76"],
  "mxRecords": ["alt1.aspmx.l.google.com", "alt2.aspmx.l.google.com", "aspmx.l.google.com", "aspmx2.googlemail.com", "aspmx3.googlemail.com"],
  "spf": "v=spf1 a mx include:_spf.google.com include:mailgun.org include:amazonses.com include:19497222.spf05.hubspotemail.net -all",
  "dmarc": "v=DMARC1; p=reject; sp=reject; pct=100; rua=mailto:dmarc-reports@apify.com; ri=604800",
  "hasWebsite": true,
  "hasEmail": true,
  "source": "rdap"
}
```

A free domain looks like `{"domain": "my-new-startup-idea.com", "availability": "available", "registered": false, "source": "rdap"}`.

### Pricing

**$0.001 per domain ($1 per 1,000).** DNS checks are included. Duplicates, invalid names and input errors are free. Higher Apify plans get an automatic discount, and you can set a **maximum cost per run**.

### Tips

- Find emails, phones and social profiles of the same websites with [Website Contact Extractor](https://apify.com/tidydata/website-contact-extractor).
- Check SSL certificates and their expiry with [SSL Certificate & DNS Checker](https://apify.com/tidydata/ssl-dns-checker).
- Validate the email addresses themselves with [Email Validator & Verifier](https://apify.com/tidydata/email-validator).

### FAQ

**Why are owner names and emails missing?**
Since GDPR, registries and registrars redact personal registrant data. You get the registrar, dates, status and nameservers for every domain, and the registrant organization/country only when it's published.

**What does `probably_available` mean?**
Some country registries (for example .es) don't allow automated lookups. In that case the Actor checks DNS: if the name doesn't exist at all, it's very probably free — confirm at a registrar before buying.

**Can "available" be wrong?**
Premium and reserved names can show as available in the registry but cost more or can't be registered. Always confirm at your registrar.

**Why does a .de domain have no creation date?**
Some registries (like DENIC for .de) don't publish creation or expiry dates. The Actor returns everything the registry shares.

**Is it legal?**
It uses the public RDAP and WHOIS services that registries provide for looking up registration data, at a polite rate. Use the results in line with each registry's terms and privacy laws.

Something doesn't work for an extension? Open an issue in the **Issues** tab — we answer fast.

# Actor input Schema

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

One per line. Domains, website URLs or email addresses all work (https://shop.example.co.uk/page → example.co.uk).

## `datasetIds` (type: `array`):

Pick datasets from your storages (e.g. a Google Maps or lead scraper run). Website, URL, domain or email columns are detected automatically. When this Actor runs as an integration, use {{resource.defaultDatasetId}}.

## `fileUrls` (type: `array`):

Public links to .csv, .json or plain .txt files (one domain per line).

## `domainFields` (type: `array`):

Column names to read from datasets/files (e.g. website, url, email). Empty = detected automatically.

## `includeDns` (type: `boolean`):

A records (website online), MX (receives email), SPF and DMARC — free.

## `registrarDetails` (type: `boolean`):

For .com/.net and others where the registry only knows the registrar. Slower; most personal data is redacted by law.

## `maxDomains` (type: `integer`):

Duplicates are removed first.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "google.de",
    "tidydata-free-example-4821.com"
  ],
  "includeDns": true,
  "registrarDetails": false,
  "maxDomains": 100000
}
```

# Actor output Schema

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

One row per domain.

# 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",
        "google.de",
        "tidydata-free-example-4821.com"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidydata/domain-whois-checker").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",
        "google.de",
        "tidydata-free-example-4821.com",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("tidydata/domain-whois-checker").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",
    "google.de",
    "tidydata-free-example-4821.com"
  ]
}' |
apify call tidydata/domain-whois-checker --silent --output-dataset

```

## MCP server setup

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

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/oZ6wynt0stwkTKXld/builds/xAoyfwPa79B9DdgYL/openapi.json
