# RDAP Domain Lookup Scraper (WHOIS Replacement) (`parseforge/rdap-domain-lookup-scraper`) Actor

Modern WHOIS via the RDAP protocol. Bulk lookup of domains across any TLD — uses IANA's RDAP bootstrap to route each domain to the correct registry server. Returns registrar, registration / expiration / last-changed dates, nameservers, registrant entities, DNSSEC, and status flags.

- **URL**: https://apify.com/parseforge/rdap-domain-lookup-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Developer tools, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $27.00 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/raw/main/banner.jpg)

## 🌐 RDAP Domain Lookup Scraper (WHOIS Replacement)

> 🚀 **Bulk domain registration data in seconds.** Hit the modern **RDAP protocol** for any list of domains and pull back registrar, registration date, expiration, nameservers, registrant, DNSSEC, abuse contact, and status flags. No WHOIS rate-limit dance, no per-TLD parser.

> 🕒 **Last updated:** 2026-05-13 · **📊 16 fields** per record · **🌍 Any-TLD coverage via IANA bootstrap** · **🛡️ RDAP-native JSON**

The **RDAP Domain Lookup Scraper** uses the **IANA RDAP bootstrap** to route each domain to the correct authoritative registry server (Verisign for .com/.net, PIR for .org, Identity Digital for .cloud, and so on) and parses the structured JSON response into a clean flat record. Every lookup returns registrar, registration date, expiration date, last-changed date, nameservers, registrant entities, registrar IANA ID, abuse contact, DNSSEC delegation, status flags, and the underlying RDAP server URL.

RDAP is the official IETF successor to WHOIS and is mandated by ICANN for every gTLD. Coverage spans **the global gTLD namespace** plus the ccTLDs and new gTLDs that publish RDAP servers (most do). For TLDs that have not yet published RDAP (a small set including `.io` and `.dev`), the Actor records a clean error row rather than guessing.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Domain investors, brand-protection teams, threat-intel analysts, M&A diligence, registrar resellers, security researchers | Bulk WHOIS replacement, expiration monitoring, registrar attribution, abuse-contact harvesting, DNSSEC audits, domain portfolio tracking |

---

### 📋 What the RDAP Lookup Scraper does

Four lookup workflows in one Actor:

- 🌐 **Bulk WHOIS replacement.** Resolve any list of domains across any TLD that publishes RDAP.
- 🕒 **Expiration monitoring.** Pull registration and expiration dates to alert ahead of renewal.
- 🏢 **Registrar attribution.** See which registrar (and IANA ID) controls each domain.
- 🛡️ **Abuse contact harvesting.** Get the registrar's published abuse email and phone for every domain.

Each lookup returns the domain's RDAP `ldhName`, the registry server hit, registration/expiration/last-changed dates, nameservers, registrar, registrar IANA ID, abuse role contact, status flags, raw entity blocks, DNSSEC delegation, and the RDAP server URL used for the resolution.

> 💡 **Why it matters:** WHOIS is being deprecated. RDAP is the modern, structured replacement, but every TLD has its own server and quirks. This Actor handles the bootstrap, the redirects, and the JSON parsing so you never write registry-specific code again.

---

### 🎬 Full Demo

_🚧 Coming soon: a 3-minute walkthrough showing a bulk lookup, expiration alert, and abuse-contact export._

---

### ⚙️ Input

<table>
<thead>
<tr><th>Input</th><th>Type</th><th>Default</th><th>Behavior</th></tr>
</thead>
<tbody>
<tr><td><code>domains</code></td><td>string[]</td><td><code>["apify.com","wikipedia.org","github.io"]</code></td><td>One domain per line. Any TLD that publishes RDAP works.</td></tr>
<tr><td><code>maxItems</code></td><td>integer</td><td><code>10</code></td><td>Records to return. Free plan caps at 10, paid plan at 1,000,000.</td></tr>
<tr><td><code>concurrency</code></td><td>integer</td><td><code>5</code></td><td>Parallel RDAP requests. Registries rate-limit aggressively. Keep low for bulk lookups.</td></tr>
</tbody>
</table>

**Example: bulk lookup of a domain portfolio.**

```json
{
    "domains": [
        "google.com",
        "wikipedia.org",
        "icann.org",
        "cloudflare.com",
        "example.net"
    ],
    "maxItems": 100,
    "concurrency": 5
}
````

**Example: expiration check on a list of brands.**

```json
{
    "domains": [
        "apify.com",
        "openai.com",
        "anthropic.com"
    ],
    "concurrency": 3
}
```

> ⚠️ **Good to Know:** a handful of ccTLDs (notably `.io` and `.dev` at time of writing) have not yet published RDAP servers. For those domains the Actor records an `error` row with the reason. Most gTLDs (`.com`, `.net`, `.org`, `.io` may switch over, `.cloud`, `.app`, `.dev` may switch over, etc.) are fully supported.

***

### 📊 Output

Each lookup carries **16 fields**. Download as CSV, Excel, JSON, or XML.

#### 🧾 Schema

| Field | Type | Example |
|---|---|---|
| 🌐 `domain` | string | `"google.com"` |
| 🪪 `ldhName` | string | `"GOOGLE.COM"` |
| 🏢 `registry` | string | `"rdap.verisign.com"` |
| 🚦 `status` | string\[] | `["client delete prohibited","server delete prohibited"]` |
| 📜 `events` | object\[] | `[{ "action": "registration", "date": "1997-09-15T04:00:00Z" }]` |
| 🎂 `registrationDate` | ISO 8601 | `"1997-09-15T04:00:00Z"` |
| ⏳ `expirationDate` | ISO 8601 | `"2028-09-14T04:00:00Z"` |
| 🔄 `lastChangedDate` | ISO 8601 | `"2019-09-09T15:39:04Z"` |
| 🛰️ `nameservers` | string\[] | `["NS1.GOOGLE.COM","NS2.GOOGLE.COM"]` |
| 🏷️ `registrar` | string | `"MarkMonitor Inc."` |
| 🆔 `registrarIanaId` | string | `"292"` |
| 🚨 `abuse` | object | `{ "email": "abuse@registrar", "phone": "+1.555…" }` |
| 👥 `entities` | object\[] | full RDAP entity blocks |
| 🔐 `secureDNS` | object | `{ "delegationSigned": false, "dsDataCount": 0 }` |
| 🔗 `rdapServer` | string | `"https://rdap.verisign.com/com/v1"` |
| 🕒 `scrapedAt` | ISO 8601 | `"2026-05-13T22:25:21.044Z"` |

#### 📦 Sample records

<details>
<summary><strong>🌐 Major gTLD lookup: google.com</strong></summary>

```json
{
    "domain": "google.com",
    "ldhName": "GOOGLE.COM",
    "registry": "rdap.verisign.com",
    "status": [
        "client delete prohibited",
        "client transfer prohibited",
        "client update prohibited",
        "server delete prohibited",
        "server transfer prohibited",
        "server update prohibited"
    ],
    "events": [
        { "action": "registration", "date": "1997-09-15T04:00:00Z" },
        { "action": "expiration", "date": "2028-09-14T04:00:00Z" },
        { "action": "last changed", "date": "2019-09-09T15:39:04Z" },
        { "action": "last update of RDAP database", "date": "2026-05-13T22:25:00Z" }
    ],
    "registrationDate": "1997-09-15T04:00:00Z",
    "expirationDate": "2028-09-14T04:00:00Z",
    "lastChangedDate": "2019-09-09T15:39:04Z",
    "nameservers": ["NS1.GOOGLE.COM", "NS2.GOOGLE.COM", "NS3.GOOGLE.COM", "NS4.GOOGLE.COM"],
    "registrar": "MarkMonitor Inc.",
    "registrarIanaId": "292",
    "abuse": {
        "roles": ["abuse"],
        "email": "abusecomplaints@markmonitor.com",
        "phone": "+1.2086851750"
    },
    "entities": [
        { "handle": "292", "roles": ["registrar"], "name": "MarkMonitor Inc.", "ianaId": "292" }
    ],
    "secureDNS": { "delegationSigned": false, "dsDataCount": 0 },
    "rdapServer": "https://rdap.verisign.com/com/v1",
    "scrapedAt": "2026-05-13T22:25:21.044Z"
}
```

</details>

<details>
<summary><strong>🚫 TLD without RDAP (clean error row)</strong></summary>

```json
{
    "domain": "example.io",
    "error": "No RDAP server published for TLD .io"
}
```

</details>

***

### ✨ Why choose this Actor

| | Capability |
|---|---|
| 🌐 | **IANA bootstrap built in.** Every domain is routed to its registry's RDAP endpoint automatically. |
| 🏷️ | **Modern, structured JSON.** Skip ad-hoc WHOIS text parsing. |
| 🚨 | **Abuse contact extracted.** Registrar abuse email and phone surface as first-class fields. |
| 🔐 | **DNSSEC signal.** `delegationSigned` and `dsDataCount` tell you if a domain is DNSSEC-protected. |
| ⚡ | **Tunable concurrency.** Up to 20 parallel RDAP requests, defaults to 5 to stay polite. |
| 🚫 | **No API key.** RDAP is a public IETF protocol. No registration needed. |
| 🔁 | **Always fresh.** Every run hits the live registry server. |

> 📊 RDAP is the IETF and ICANN-mandated WHOIS replacement and is already required for every gTLD registrar. Lean into the new standard.

***

### 📈 How it compares to alternatives

| Approach | Cost | Coverage | Refresh | Format | Setup |
|---|---|---|---|---|---|
| **⭐ RDAP Lookup Scraper** *(this Actor)* | $5 free credit, then pay-per-use | All RDAP-publishing TLDs | **Live per run** | Structured JSON | ⚡ 2 min |
| Raw WHOIS via port 43 | Free | All TLDs | Live | Ad-hoc text | 🐢 Per-TLD parsers |
| Commercial WHOIS API | $$ | All TLDs | Cached + live | JSON | ⏳ Vendor onboarding |
| Hand-built RDAP client | Engineering time | All TLDs | Live | JSON | 🕒 Days |

Pick this Actor when you want modern RDAP data without writing the bootstrap, redirect handling, and parser yourself.

***

### 🚀 How to use

1. 📝 **Sign up.** [Create a free account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp) (takes 2 minutes).
2. 🌐 **Open the Actor.** Go to the RDAP Domain Lookup Scraper page on the Apify Store.
3. 🎯 **Paste your domains.** One domain per line in the `domains` field.
4. 🚀 **Run it.** Click **Start** and let the Actor walk your list.
5. 📥 **Download.** Grab results in the **Dataset** tab as CSV, Excel, JSON, or XML.

> ⏱️ Total time from signup to a fresh registrar export: **3-5 minutes.** No coding required.

***

### 💼 Business use cases

<table>
<tr>
<td width="50%" valign="top">

#### 🏷️ Brand Protection

- Daily checks on expiration dates for your portfolio
- Abuse-contact extraction for takedown filings
- Monitor registrar changes that could signal hijack risk
- Catch unauthorized status flag changes

</td>
<td width="50%" valign="top">

#### 💼 Domain Investing

- Bulk expiration scans on watchlists
- Drop-catch timing on premium portfolios
- Registrar mix analysis for portfolio diversification
- DNSSEC adoption signal across your inventory

</td>
</tr>
<tr>
<td width="50%" valign="top">

#### 🕵️ Threat Intel & Fraud

- Registrant pivots on suspicious campaigns
- Newly registered domain (NRD) age signals
- Cluster phishing operations by shared registrar
- Pivot from urlscan results into RDAP attribution

</td>
<td width="50%" valign="top">

#### 📊 M\&A & Diligence

- Verify a target's domain portfolio ownership
- Date-stamped records for IP audits
- Nameserver footprint and hosting hints
- Abuse-contact and registrar contact coverage

</td>
</tr>
</table>

***

### 🔌 Automating RDAP Lookup Scraper

Control the scraper programmatically for scheduled runs and pipeline integrations:

- 🟢 **Node.js.** Install the `apify-client` NPM package.
- 🐍 **Python.** Use the `apify-client` PyPI package.
- 📚 See the [Apify API documentation](https://docs.apify.com/api/v2) for full details.

The [Apify Schedules feature](https://docs.apify.com/platform/schedules) lets you trigger this Actor on any cron interval. Daily expiration sweeps, weekly registrar audits, and monthly portfolio refreshes keep your downstream database in sync.

***

### 🌟 Beyond business use cases

RDAP data feeds far more than commercial workflows. The same structured records support research, civic transparency, and personal projects.

<table>
<tr>
<td width="50%">

#### 🎓 Research and academia

- DNS infrastructure papers and longitudinal studies
- DNSSEC adoption tracking over time
- Registrar concentration research
- Reproducible domain history datasets

</td>
<td width="50%">

#### 🎨 Personal and creative

- Personal domain portfolio dashboards
- "Domain expiration" reminders for your hobby sites
- Side projects around namespace analytics
- Indie tools for fellow domainers

</td>
</tr>
<tr>
<td width="50%">

#### 🤝 Non-profit and civic

- Tracking ownership of news and civic-society domains
- Investigative journalism on shell-org domain footprints
- Election-period domain registration monitoring
- Open data on registrar abuse-response performance

</td>
<td width="50%">

#### 🧪 Experimentation

- Train ML models on registration patterns and tlds
- Prototype agents that triage abuse complaints
- Build domain-reputation features for risk engines
- Stress-test RDAP-aware integrations

</td>
</tr>
</table>

***

### 🤖 Ask an AI assistant about this scraper

Open a ready-to-send prompt about this ParseForge actor in the AI of your choice:

- 💬 [**ChatGPT**](https://chat.openai.com/?q=How%20do%20I%20use%20the%20RDAP%20Domain%20Lookup%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🧠 [**Claude**](https://claude.ai/new?q=How%20do%20I%20use%20the%20RDAP%20Domain%20Lookup%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🔍 [**Perplexity**](https://perplexity.ai/search?q=How%20do%20I%20use%20the%20RDAP%20Domain%20Lookup%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)
- 🅒 [**Copilot**](https://copilot.microsoft.com/?q=How%20do%20I%20use%20the%20RDAP%20Domain%20Lookup%20Scraper%20by%20ParseForge%20on%20Apify%3F%20Show%20me%20input%20examples%2C%20output%20fields%2C%20common%20use%20cases%2C%20and%20how%20to%20integrate%20it%20into%20a%20workflow.)

***

### ❓ Frequently Asked Questions

#### 🧩 How does it work?

Drop a list of domains into `domains`. The Actor downloads the IANA RDAP bootstrap, maps each TLD to its authoritative RDAP server, hits the server, follows redirects, parses the JSON, and emits a flat row per domain. Failed lookups are recorded as `error` rows.

#### 🆚 How is RDAP different from WHOIS?

RDAP is the IETF and ICANN-mandated successor to WHOIS. It returns structured JSON over HTTPS with standardized field names, status codes, redirects, and rate limits. WHOIS is a 40-year-old text protocol with ad-hoc formatting per registry. RDAP is what registrars and registries are required to support today.

#### 🌍 Which TLDs are supported?

Every TLD that publishes an RDAP server in the IANA bootstrap is supported. That covers the entire gTLD namespace and most ccTLDs. A small number of ccTLDs (notably `.io` and `.dev` at time of writing) have not yet published RDAP servers and will return an error row.

#### 🛡️ Does this include privacy-redacted contact info?

Yes. Post-GDPR, most public RDAP responses redact registrant contact details. The Actor returns whatever the registry actually publishes, including registrar contact and the abuse role contact, which is the official channel for takedown reports.

#### 🔁 How fresh is the data?

Every run hits the registry's live RDAP server. Data is as fresh as the registry chooses to publish.

#### ⚡ How fast is bulk lookup?

With the default concurrency of 5, expect roughly 5 lookups per second across registries. Most registry RDAP servers rate-limit aggressively, so do not crank concurrency past 10-20 for bulk runs.

#### ⏰ Can I schedule recurring runs?

Yes. Use Apify Schedules to run the Actor daily, weekly, or hourly and feed results into your warehouse.

#### ⚖️ Is this data legal to use?

Yes. RDAP responses are public by design. Comply with each registry's terms of service and applicable data-protection law for any downstream use.

#### 💳 Do I need a paid Apify plan?

No. The free plan covers small batches (10 lookups). A paid plan unlocks higher limits and scheduling.

#### 🆘 What if I need help?

Contact us through the form below to request a custom domain workflow, a private feed, or a feature.

***

### 🔌 Integrate with any app

RDAP Domain Lookup Scraper connects to any cloud service via [Apify integrations](https://apify.com/integrations):

- [**Make**](https://docs.apify.com/platform/integrations/make) - Automate multi-step domain workflows
- [**Zapier**](https://docs.apify.com/platform/integrations/zapier) - Connect with 5,000+ apps
- [**Slack**](https://docs.apify.com/platform/integrations/slack) - Get expiration alerts in your channels
- [**Airbyte**](https://docs.apify.com/platform/integrations/airbyte) - Pipe RDAP records into your warehouse
- [**GitHub**](https://docs.apify.com/platform/integrations/github) - Trigger runs from commits and releases
- [**Google Drive**](https://docs.apify.com/platform/integrations/drive) - Export datasets straight to Sheets

You can also use webhooks to trigger downstream actions. Push fresh RDAP records into your CRM or alert your team in Slack.

***

### 🔗 Recommended Actors

- [**🛡️ urlscan.io Threat Intelligence Scraper**](https://apify.com/parseforge/urlscan-scraper) - Pair RDAP with live scan data
- [**🤗 Hugging Face Model Scraper**](https://apify.com/parseforge/hugging-face-model-scraper) - AI model registry metadata
- [**🏗️ Hubspot Marketplace Scraper**](https://apify.com/parseforge/hubspot-marketplace-scraper) - Marketplace app and integration catalog
- [**📰 PR Newswire Scraper**](https://apify.com/parseforge/pr-newswire-scraper) - Press release feed with publish dates
- [**🏢 GSA eLibrary Scraper**](https://apify.com/parseforge/gsa-elibrary-scraper) - U.S. federal contract vendor and price data

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more reference-data scrapers.

***

**🆘 Need Help?** [**Open our contact form**](https://tally.so/r/BzdKgA) to request a new scraper, propose a custom data project, or report an issue.

***

> **⚠️ Disclaimer:** this Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by IANA, ICANN, any TLD registry, or any registrar. All trademarks mentioned are the property of their respective owners. Only publicly available RDAP data is collected.

# Actor input Schema

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

List of domain names to look up (one per line in the UI). Works for any TLD — IANA's RDAP bootstrap maps each domain to the correct authoritative registry server.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

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

Parallel RDAP requests. Default 5 — registries rate-limit aggressively, keep this low for bulk lookups.

## Actor input object example

```json
{
  "domains": [
    "apify.com",
    "wikipedia.org",
    "github.io"
  ],
  "maxItems": 10,
  "concurrency": 5
}
```

# Actor output Schema

## `overview` (type: `string`):

Overview of scraped data

## `fullData` (type: `string`):

Complete dataset

# 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",
        "wikipedia.org",
        "github.io"
    ],
    "maxItems": 10,
    "concurrency": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/rdap-domain-lookup-scraper").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",
        "wikipedia.org",
        "github.io",
    ],
    "maxItems": 10,
    "concurrency": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/rdap-domain-lookup-scraper").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 '{
  "domains": [
    "apify.com",
    "wikipedia.org",
    "github.io"
  ],
  "maxItems": 10,
  "concurrency": 5
}' |
apify call parseforge/rdap-domain-lookup-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "RDAP Domain Lookup Scraper (WHOIS Replacement)",
        "description": "Modern WHOIS via the RDAP protocol. Bulk lookup of domains across any TLD — uses IANA's RDAP bootstrap to route each domain to the correct registry server. Returns registrar, registration / expiration / last-changed dates, nameservers, registrant entities, DNSSEC, and status flags.",
        "version": "0.0",
        "x-build-id": "HMc4fWmfrQyaBevcT"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~rdap-domain-lookup-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-rdap-domain-lookup-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~rdap-domain-lookup-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-rdap-domain-lookup-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~rdap-domain-lookup-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-rdap-domain-lookup-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "domains"
                ],
                "properties": {
                    "domains": {
                        "title": "Domains",
                        "type": "array",
                        "description": "List of domain names to look up (one per line in the UI). Works for any TLD — IANA's RDAP bootstrap maps each domain to the correct authoritative registry server.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    },
                    "concurrency": {
                        "title": "Concurrency",
                        "minimum": 1,
                        "maximum": 20,
                        "type": "integer",
                        "description": "Parallel RDAP requests. Default 5 — registries rate-limit aggressively, keep this low for bulk lookups.",
                        "default": 5
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
