# WHOIS Domain Lookup: Expiry Dates, Registrar & DNS (Bulk) (`kramer_labs/domain-lookup`) Actor

Bulk WHOIS/RDAP domain lookup: registrar, creation and expiry dates, days until expiry, status, nameservers, DNSSEC, availability, plus A/AAAA/MX/NS/TXT DNS records. Official registry RDAP. No personal data. $2 per 1,000 domains.

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

## Pricing

$2.00 / 1,000 domain lookups

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

## Domain Lookup: registration, expiry dates & DNS records for any list of domains

**Look up hundreds of domains at once:** registrar, creation date, **expiry date and days until expiry**, status, nameservers, DNSSEC, whether the domain is **available**, plus **A, AAAA, MX, NS, and TXT** DNS records.

- **Official registry data:** uses RDAP, the modern structured replacement for WHOIS, straight from each domain registry. No scraped WHOIS text to parse.
- **Paste anything:** `apify.com`, `www.example.org`, or full links. They're cleaned and de-duplicated.
- **DNS in the same row:** see the hosting provider (A/AAAA), email provider (MX, e.g. Google Workspace), and verification records (TXT)
- **No personal data:** only the registrar's name. Owner contact details are never collected.

### Sample output (real, Oct 2026)

```json
{
  "type": "domain",
  "domain": "apify.com",
  "registered": true,
  "registrar": "Amazon Registrar, Inc.",
  "createdAt": "2009-06-02T17:14:10Z",
  "updatedAt": "2026-05-16T16:53:04Z",
  "expiresAt": "2035-06-02T17:14:10Z",
  "daysUntilExpiry": 3137,
  "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,
  "available": false,
  "dns": {
    "A": [
      "143.204.1.110",
      "143.204.1.19"
    ],
    "AAAA": [
      "2600:9000:2000:2200:9:a03e:6540:93a1",
      "2600:9000:2000:3800:9:a03e:6540:93a1"
    ],
    "MX": [
      "1 aspmx.l.google.com.",
      "10 aspmx2.googlemail.com."
    ],
    "NS": [
      "ns-1225.awsdns-25.org.",
      "ns-1928.awsdns-49.co.uk."
    ],
    "TXT": [
      "aisle-domain-verification-ymx7gd=j3J4hCmXHIc9R0RNQCfa8xdSf"
    ]
  }
}
```

### How to use

1. Add **domains** (one per line) or website links.
2. Keep **Include DNS records** on, or turn it off for registration data only.
3. Run, then export from the Dataset tab (JSON, CSV, Excel, or API).

#### Sample input

```json
{ "domains": ["apify.com", "google.dev", "bbc.co.uk", "my-startup-idea.com"] }
```

### Pricing

- **$0.002 per domain** ($2 per 1,000)
- **No start fee.** Invalid inputs and failed registry lookups cost nothing.
- Domains whose registry has no public RDAP service (for example `.io` and `.co`) return **DNS records only, free**.

### Who it's for

- **Domain investors:** find expiring and available names in bulk
- **IT and security teams:** audit your company's domains and catch renewals before they lapse
- **Sales and lead research:** see which email provider and hosting a company uses (MX and A records)
- **SEO and brand protection:** check lookalike domains
- **AI agents:** one call returns structured domain facts

### Works well with

- [Website SEO Audit](https://apify.com/kramer_labs/website-seo-audit): on-page SEO score and tech stack for the site
- [Broken Link Checker](https://apify.com/kramer_labs/broken-link-checker): dead links and redirect chains
- [Sitemap URL Extractor](https://apify.com/kramer_labs/sitemap-url-extractor): every page URL a site lists

### FAQ

**Is this WHOIS?** It's RDAP, the official successor to WHOIS run by the same registries, with structured and consistent data.
**Which endings work?** More than 1,200, including .com, .net, .org, .dev, .app, .ai, .uk, and .co.uk. A few registries (e.g. .io, .co) don't offer RDAP yet. Those return DNS only, at no charge.
**Is "available" guaranteed?** It means the registry has no record of the domain. Check with a registrar before buying, since some names are reserved or premium.

More tools from the same studio: [Kramer Labs](https://kramer-labs.netlify.app/).

### Data source and responsible use

Data comes from the registries' official RDAP services (the successor to WHOIS) and public DNS. Registrant contact details are never returned. Use it in line with the registries' terms and your local laws.

# Actor input Schema

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

Domain names or website links, e.g. apify.com, https://www.example.org/page. Duplicates are removed.

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

Adds A, AAAA, MX, NS and TXT records (shows hosting, email provider, and verification records).

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "google.dev",
    "bbc.co.uk"
  ],
  "includeDns": true
}
```

# Actor output Schema

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

No description

## `allResults` (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",
        "google.dev",
        "bbc.co.uk"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("kramer_labs/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",
        "google.dev",
        "bbc.co.uk",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("kramer_labs/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",
    "google.dev",
    "bbc.co.uk"
  ]
}' |
apify call kramer_labs/domain-lookup --silent --output-dataset

```

## MCP server setup

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