# Domain RDAP Lookup - Free Beta (`rex-law/domain-rdap-lookup-free-beta`) Actor

Look up bounded public domain-registration metadata through IANA discovery and authoritative RDAP services.

- **URL**: https://apify.com/rex-law/domain-rdap-lookup-free-beta.md
- **Developed by:** [Rex Law](https://apify.com/rex-law) (community)
- **Categories:** 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.

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

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## Domain RDAP Lookup - Free Beta

Look up public domain-registration metadata from authoritative RDAP services without WHOIS scraping, browser automation, logins, API keys, or proxies. The Actor accepts 1-25 bare domains, discovers each TLD's service through IANA's bootstrap registry, and returns normalized registrar, lifecycle, status, nameserver, entity, DNSSEC, notice, and source fields.

### Official basis and usage boundary

- IANA publishes the official [RDAP bootstrap registry for the domain name space](https://www.iana.org/assignments/rdap-dns/rdap-dns.xhtml) and links its machine-readable [`dns.json`](https://data.iana.org/rdap/dns.json). The registry references RFC 9224 for authoritative service discovery.
- IANA's linked [licensing terms](https://www.iana.org/help/licensing-terms) place applicable protocol-registry rights under CC0, while explicitly preserving third-party, trademark, patent, privacy, and data-protection rights and providing the registry without warranty.
- ICANN describes RDAP as the definitive gTLD registration-data source since 28 January 2025 and explains that responses come from registry operators and registrars. Its [RDAP lookup FAQ](https://lookup.icann.org/en/faq) warns that public fields vary, personal data can be redacted, and returned data can be inaccurate or unavailable.
- Most importantly, ICANN's [Using Domain Name Registration Data](https://www.icann.org/resources/pages/domain-name-registration-data-2023-11-02-en) page says RDDS may be used for legal purposes, but not to enable mass unsolicited commercial advertising or solicitation, and not for high-volume automated registry/registrar queries except as needed to manage domains.

This is therefore a low-volume metadata lookup tool, not a lead-list generator, contact harvester, bulk monitoring service, or permission to bypass a registry's notices. A commercial use is not automatically prohibited, but it must be lawful, low-volume, compatible with the specific authoritative service's notices, and unrelated to unsolicited solicitation. The Actor deliberately omits vCard names, email addresses, phone numbers, and postal addresses from generic entities.

#### Live source verification

Verified on 18 July 2026:

- IANA bootstrap returned HTTP 200, `application/json`, a 24-hour cache directive, and publication timestamp `2026-07-14T22:00:03Z`.
- IANA mapped `.com` to `https://rdap.verisign.com/com/v1/` and `.org` to `https://rdap.publicinterestregistry.org/rdap/`.
- Authoritative lookups for `example.com` and `iana.org` both returned HTTP 200 with `application/rdap+json`, registrars, registration/expiration dates, statuses, nameservers, and signed DNSSEC delegation data.

Availability and returned fields can change. Each output includes the bootstrap publication timestamp and exact final RDAP URL for provenance.

### Input

```json
{
  "domains": ["example.com", "iana.org", "bücher.de"]
}
````

`domains` is required and accepts 1-25 unique names. The Actor:

- normalizes case, a single trailing root dot, and Unicode IDNs to ASCII A-labels;
- rejects URLs, paths, query strings, fragments, credentials, ports, IP addresses, single-label names, invalid labels, control characters, and duplicates after normalization;
- rejects unknown input fields instead of silently ignoring them.

### Dataset output

Each successful lookup produces one `domain_rdap_record`:

```json
{
  "type": "domain_rdap_record",
  "domain": "example.com",
  "unicodeName": "example.com",
  "handle": "2336799_DOMAIN_COM-VRSN",
  "registrar": {
    "name": "RESERVED-Internet Assigned Numbers Authority",
    "handle": "376",
    "ianaId": "376",
    "rdapUrl": null
  },
  "createdAt": "1995-08-14T04:00:00.000Z",
  "updatedAt": "2026-01-16T18:26:50.000Z",
  "expiresAt": "2026-08-13T04:00:00.000Z",
  "status": ["client delete prohibited", "client transfer prohibited"],
  "nameservers": ["elliott.ns.cloudflare.com", "hera.ns.cloudflare.com"],
  "entities": [
    {
      "handle": "376",
      "roles": ["registrar"],
      "publicIds": [{ "type": "IANA Registrar ID", "identifier": "376" }]
    }
  ],
  "secureDNS": {
    "zoneSigned": null,
    "delegationSigned": true,
    "maxSigLife": null,
    "dsData": [{ "keyTag": 2371, "algorithm": 13, "digestType": 2, "digest": "..." }],
    "keyData": []
  },
  "notices": [],
  "bootstrapUrl": "https://data.iana.org/rdap/dns.json",
  "bootstrapPublication": "2026-07-14T22:00:03.000Z",
  "rdapBaseUrl": "https://rdap.verisign.com/com/v1/",
  "rdapUrl": "https://rdap.verisign.com/com/v1/domain/example.com",
  "fetchedAt": "2026-07-18T13:55:47.000Z"
}
```

Lifecycle dates use only the exact RDAP event actions `registration`, `last changed`, and `expiration`; the server's separate “last update of RDAP database” event is not misreported as a domain update. Missing or redacted values remain `null` or empty arrays.

### Network and abuse boundaries

- The only bootstrap URL is the fixed IANA HTTPS URL. It is fetched once per process and safely cached in memory for at most 24 hours.
- A TLD service must come from that validated bootstrap document and use HTTPS. HTTP-only entries fail with `NO_SECURE_RDAP_SERVICE`; the Actor never downgrades to plaintext.
- Dynamic service and redirect URLs reject credentials, non-443 ports, fragments, unexpected domain paths, IP literals, and DNS resolutions to loopback, private, link-local, carrier-grade NAT, documentation, multicast, or reserved addresses.
- Redirects are manual, revalidated, and capped at three.
- Global domain concurrency is three. Requests to the same authority are serialized with at least one second between starts.
- Bootstrap responses are capped at 1 MB and 15 seconds. RDAP responses are capped at 2 MB and 20 seconds.
- Each request has at most one retry. HTTP 429 honors `Retry-After` with a conservative five-second fallback; network, 408, and 5xx failures use bounded backoff. A 404 is not retried.
- Entity traversal, public IDs, DNSSEC arrays, notices, notice text, and error messages are all bounded before storage.

These controls reduce accidental load and SSRF exposure; they do not authorize repeated schedules or bulk extraction. Respect notices returned in every record.

### Partial failures

Successful domains are stored even when another domain fails. `OUTPUT` contains `success`, `partial`, or `failed`, bootstrap provenance, requested/succeeded/failed counts, effective limits, and bounded failures such as:

- `UNSUPPORTED_TLD`
- `NO_SECURE_RDAP_SERVICE`
- `DOMAIN_NOT_FOUND`
- `RDAP_LOOKUP_FAILED`
- `BOOTSTRAP_FAILED`

If every lookup fails, the summary is written and the Actor run fails.

### Local verification

Node.js 22 or newer is required.

```bash
npm ci
npm test
npm run check
npm run live-smoke
```

The live smoke fetches the current IANA bootstrap and independently verifies `.com` (`example.com`) and `.org` (`iana.org`) against their authoritative RDAP services.

### Guarded FREE release

The default command is a local dry run and never calls Apify:

```bash
npm run release
```

The exact executing command is:

```bash
APIFY_TOKEN='apify_api_...' \
CONFIRM_PUBLISH_FREE_BETA='domain-rdap-lookup-free-beta' \
npm run release:execute
```

The executing script creates or updates only the private Actor `domain-rdap-lookup-free-beta`, enforces `LIMITED_PERMISSIONS`, builds without cache, runs and validates the two-TLD cloud smoke while private, rechecks the exact build and FREE state, and only then makes it public. It refuses to replace an already-public target. Publication verification failures trigger a best-effort, verified rollback to private.

Every outgoing API body is recursively blocked if it contains a `pricingInfos` key. The script never creates or updates pricing information; any observed non-FREE pricing stops the release.

# Actor input Schema

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

One to 25 bare domain names. URLs, IP addresses, credentials, paths, ports, and duplicate normalized domains are rejected.

## Actor input object example

```json
{
  "domains": [
    "example.com",
    "iana.org"
  ]
}
```

# Actor output Schema

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

One normalized record per successful authoritative RDAP lookup.

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

Bootstrap provenance, processing counts, and bounded per-domain failures.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("rex-law/domain-rdap-lookup-free-beta").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("rex-law/domain-rdap-lookup-free-beta").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 '{}' |
apify call rex-law/domain-rdap-lookup-free-beta --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "Domain RDAP Lookup - Free Beta",
        "description": "Look up bounded public domain-registration metadata through IANA discovery and authoritative RDAP services.",
        "version": "0.1",
        "x-build-id": "jZA9fWthzNlu3EYsP"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/rex-law~domain-rdap-lookup-free-beta/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-rex-law-domain-rdap-lookup-free-beta",
                "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/rex-law~domain-rdap-lookup-free-beta/runs": {
            "post": {
                "operationId": "runs-sync-rex-law-domain-rdap-lookup-free-beta",
                "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/rex-law~domain-rdap-lookup-free-beta/run-sync": {
            "post": {
                "operationId": "run-sync-rex-law-domain-rdap-lookup-free-beta",
                "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": "Domain names",
                        "minItems": 1,
                        "maxItems": 25,
                        "uniqueItems": true,
                        "type": "array",
                        "description": "One to 25 bare domain names. URLs, IP addresses, credentials, paths, ports, and duplicate normalized domains are rejected.",
                        "items": {
                            "type": "string",
                            "minLength": 3,
                            "maxLength": 254,
                            "pattern": ".*\\S.*"
                        },
                        "default": [
                            "example.com",
                            "iana.org"
                        ]
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
