# WHOIS & DNS Lookup (`cyber1nj3ct0r/whois-dns-lookup`) Actor

Look up registration data and DNS records for a list of domains: registrar, creation and expiry dates, domain age, status, name servers, A, MX, TXT and other records, plus SPF, DMARC, mail provider and DNS provider. Uses the registries' official RDAP service. Returns no personal contact data.

- **URL**: https://apify.com/cyber1nj3ct0r/whois-dns-lookup.md
- **Developed by:** [Sanira Botheju](https://apify.com/cyber1nj3ct0r) (community)
- **Categories:** Developer tools, SEO tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 domains

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

### What does WHOIS & DNS Lookup do?

WHOIS & DNS Lookup tells you, for any list of domains, **who a domain is registered with, how old it is, when it expires, and what its DNS records say**. One run handles one domain or a long list.

Paste your domains and press Start. The registration data comes from the registries' official **RDAP** service, the machine-readable successor to WHOIS, so dates and fields arrive clean and in one format for every domain ending. For country domains that have no RDAP service yet, the tool asks the registry's WHOIS server instead.

- **Domain age and expiry**: creation, update and expiry dates, plus ready-made `domainAgeDays` and `daysUntilExpiry`.
- **Registrar and status**: registrar name, IANA ID, abuse contact, registry status codes, DNSSEC.
- **Registered or not**: `registered: false` when the registry has no record of the name.
- **Full DNS**: A, AAAA, CNAME, MX, NS, TXT, SOA and CAA records.
- **E-mail set-up at a glance**: SPF record, DMARC record and policy, and the mail provider (Google Workspace, Microsoft 365 and others).
- **DNS provider**: Cloudflare, Route 53, GoDaddy and others, recognised from the name servers.
- **Loose input**: paste domains, full web addresses or e-mail addresses; the domain is taken from them and duplicates are looked up once.
- **No personal data**: names, e-mail addresses, phone numbers and street addresses of registrants are never returned.

### What data do you get?

| Field | Example |
|---|---|
| `domain` | `example.com` |
| `registered` | `true` |
| `registrar` | `Example Registrar, Inc.` |
| `createdAt` | `2009-06-02T17:14:10.000Z` |
| `expiresAt` | `2035-06-02T17:14:10.000Z` |
| `domainAgeDays` | `6342` |
| `daysUntilExpiry` | `3154` |
| `statuses` | `["client transfer prohibited"]` |
| `nameServers` | `["ns1.example.net", "ns2.example.net"]` |
| `dnssec` | `true` |
| `registrantOrganization` | `Example Ltd`, when the registry publishes it |
| `registrantCountry` | `GB`, when the registry publishes it |
| `dns.A`, `dns.AAAA`, `dns.MX`, `dns.TXT`, ... | the DNS records |
| `email.spf`, `email.dmarcPolicy`, `email.mailProvider` | `v=spf1 ...`, `reject`, `Google Workspace` |
| `dnsProvider` | `Cloudflare` |

### How to look up WHOIS and DNS data for a list of domains

1. Enter your domains under **Domains**, one per line.
2. Leave both **Registration data** and **DNS records** on, or turn one off if you only need the other.
3. Press **Start**.
4. Download the result from the **Output** tab as JSON, CSV or Excel, or read it through the API.

### How much does a WHOIS lookup cost?

You pay per domain: **$2.00 per 1,000 domains**, with registration data and DNS records together. Apify subscribers on the Silver plan pay $1.70 and on the Gold plan $1.40 per 1,000. Each run also has a start fee of $0.00005.

| Domains | Cost |
|---|---|
| 10 | $0.02 |
| 1,000 | $2.00 |
| 10,000 | $20.00 |

Apify's free plan includes $5 of credit each month, enough for about 2,500 domains.

### Input

```json
{
    "domains": ["example.com", "https://www.example.org/page", "example.co.uk"],
    "includeRegistration": true,
    "includeDns": true
}
```

### Output example

```json
{
    "domain": "example.com",
    "input": "example.com",
    "hostname": "example.com",
    "tld": "com",
    "registered": true,
    "registrationSource": "rdap",
    "registrar": "Example Registrar, Inc.",
    "registrarIanaId": "468",
    "createdAt": "2009-06-02T17:14:10.000Z",
    "updatedAt": "2026-05-16T16:53:04.000Z",
    "expiresAt": "2035-06-02T17:14:10.000Z",
    "domainAgeDays": 6342,
    "daysUntilExpiry": 3154,
    "statuses": ["client transfer prohibited"],
    "nameServers": ["ns1.example.net", "ns2.example.net"],
    "dnssec": true,
    "dns": {
        "A": ["93.184.215.14"],
        "MX": [{ "priority": 10, "exchange": "aspmx.l.google.com" }],
        "TXT": ["v=spf1 include:_spf.google.com ~all"]
    },
    "email": { "acceptsMail": true, "mailProvider": "Google Workspace", "spf": "v=spf1 include:_spf.google.com ~all", "dmarc": "v=DMARC1; p=reject", "dmarcPolicy": "reject" },
    "dnsProvider": "Amazon Route 53",
    "error": null
}
```

### What can you use it for?

- **Check domain age** before trusting a website, a seller or a link: brand-new domains are a common sign of fraud.
- **Watch expiry dates** of your own and your clients' domains. Schedule the tool weekly and filter on `daysUntilExpiry`.
- **Vet a list of websites**: which are registered, with which registrar, on which DNS and mail provider.
- **Audit e-mail security**: find domains without SPF or with a weak DMARC policy.
- **Migrations and due diligence**: record every domain's name servers and records before a move or a purchase.
- **Security research**: status codes, DNSSEC and CAA records for a whole portfolio.

### FAQ

#### Which domain endings are supported?

More than 1,200 endings have an RDAP service, among them `.com`, `.net`, `.org`, `.dev`, `.app`, `.ai`, `.xyz`, `.uk`, `.fr`, `.nl`, `.ca`, `.au`, `.br` and `.in`. For endings without RDAP, such as `.io`, `.co`, `.me`, `.us`, `.de`, `.jp` and `.ru`, the tool asks the registry's WHOIS server. A few registries give out little or nothing to automated lookups (for example `.es`, `.ch` and `.lk`); for those you still get the DNS records, and the `error` field says why the registration data is missing.

#### Why are some fields empty?

Registries decide what they publish. Several country registries do not give expiry dates or registrars, and most registries hide the registrant. The tool returns what the registry publishes and leaves the rest empty.

#### Does `registered: false` mean I can buy the domain?

It means the registry has no record of it. Reserved and premium names can still be unavailable or expensive, so check with a registrar before you rely on it.

#### Why does the tool not return the registrant's name, e-mail or phone?

Those are personal data. Most registries have hidden them since 2018, and where they are still published the tool leaves them out on purpose. You get the organisation and the country when the registry publishes them.

#### Can I look up a subdomain?

Yes. For `shop.example.com` you get the registration data of `example.com` and the DNS records of `shop.example.com`.

#### A lookup failed with RDAP_RATE_LIMITED or WHOIS_RATE_LIMITED

The registry limits how many questions it answers in a given time. The tool already spaces its requests and retries. Run the affected domains again later; for WHOIS-only endings, keep lists of the same ending small.

#### Something does not work

Open an issue on the **Issues** tab and include the domain. Every report is read and answered.

# Actor input Schema

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

One domain per line, for example <code>example.com</code>. You can also paste web addresses such as <code>https://www.example.com/page</code>. For a subdomain such as <code>shop.example.com</code>, the registration data is that of <code>example.com</code> and the DNS records are those of the subdomain.

## `includeRegistration` (type: `boolean`):

Registrar, creation, update and expiry dates, domain age, status codes, name servers and DNSSEC. Read from the registry's RDAP service, or over WHOIS for the country domains that have no RDAP service.

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

A, AAAA, CNAME, MX, NS, TXT, SOA and CAA records, the SPF and DMARC records, and the mail and DNS provider.

## `requestTimeoutSecs` (type: `integer`):

How long to wait for a registry server before giving up on a domain.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "crawlee.dev"
  ],
  "includeRegistration": true,
  "includeDns": true,
  "requestTimeoutSecs": 20
}
```

# Actor output Schema

## `domains` (type: `string`):

One record per domain with its registration data and DNS records.

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

How many domains were registered, not registered, or could not be looked up.

# 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",
        "crawlee.dev"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("cyber1nj3ct0r/whois-dns-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",
        "crawlee.dev",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("cyber1nj3ct0r/whois-dns-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",
    "crawlee.dev"
  ]
}' |
apify call cyber1nj3ct0r/whois-dns-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cyber1nj3ct0r/whois-dns-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/wb4GrYHRLN6ke5exD/builds/nLHRo7z25OmV4Xp5g/openapi.json
