# Bulk RDAP Domain Registration & Expiration (`afkdigital/newapi33-icann-rdap-bulk-domain-intelligence`) Actor

Look up user-supplied domains via IANA RDAP bootstrap. Export registration, expiration, registrar, nameservers and DNSSEC data.

- **URL**: https://apify.com/afkdigital/newapi33-icann-rdap-bulk-domain-intelligence.md
- **Developed by:** [AFK Digital](https://apify.com/afkdigital) (community)
- **Categories:** Developer tools, SEO tools
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 successful unique domains

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

## ICANN RDAP Bulk Domain Registration & Expiration Intelligence

Look up **only domains you supply** through the IANA DNS RDAP bootstrap registry. Bulk means a list of inputs, not internet-wide discovery. This Actor does not identify all domain owners. Registries may redact information or omit fields.

### Input

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

Supply 1–100 domain names. Unicode names are normalized to IDNA ASCII, case-insensitive duplicates are processed once. URLs, IP addresses, wildcards and invalid labels are rejected. The default three-domain run normally completes within five minutes, subject to registry availability.

### Output

One default Dataset row per unique domain, including failures. Download JSON at the default Dataset items URL or add `?format=csv` for Clay and n8n. Columns: `domain`, `handle`, `status_codes`, `registration_date`, `expiration_date`, `last_changed_date`, `registrar_name`, `nameservers`, `dnssec_signed`, `query_status`, `error_code`, `source_url`. Missing or redacted values are JSON `null`. Apify CSV export flattens arrays into indexed columns such as `nameservers/0` and `status_codes/0`.

Dates come exclusively from top-level RDAP domain `events` with exact `eventAction` values `registration`, `expiration`, and `last changed`. These are registry RDAP dates, not a live website TLS certificate expiry. `handle` is the top-level domain handle, not the registrar's handle. `registrar_name` is extracted only from an entity with the `registrar` role and its vCard `fn`. `dnssec_signed` reflects `secureDNS.delegationSigned`, indicating a DS delegation at the parent, not a live DNSSEC audit. Nameservers reflect registration data, not live DNS resolution.

A successful result has `query_status=success`. A missing IANA service, 404, rate limit, server error, timeout or malformed response has `query_status=error`, a machine-readable `error_code`, and null unavailable fields. An RDAP domain identity mismatch is not accepted as success.

### Requests and limits

The Actor fetches IANA's `https://data.iana.org/rdap/dns.json` and chooses the label-wise longest matching service URL from HTTPS endpoints. It requests `/domain/{domain}` one at a time, waits at least one second between requests to the same host, uses a 10-second response timeout, at most three attempts and capped exponential backoff on transient errors or 429. Redirects are not followed. Responses are limited to 2 MB. Registry policies and availability vary; some TLDs have no IANA RDAP endpoint.

### Pricing

Pay per event: **$0.004 for each successful unique domain** (equivalent to $4 per 1,000). The Actor sends the custom `successful-domain` event when writing a successful row. Failures, retries, and duplicates trigger no custom event. The live monetization configuration contains only this custom event; the synthetic `apify-default-dataset-item` and `apify-actor-start` events are absent, so error rows and run starts do not incur event charges. Apify's run spending limit is respected. No separate platform usage charge is intended.

### Development

```bash
python3 -m unittest discover -s tests -v
docker build -t newapi33-rdap:0.1 .
```

For a local run with Apify SDK, set `ACTOR_TEST_PAY_PER_EVENT=true` and provide `storage/key_value_stores/default/INPUT.json`. Do not put account credentials in this repository.

Sources: IANA RDAP bootstrap registry; RFC 9224 (longest label match); RFC 9083 (domain response and event actions); Apify Pay-per-Event documentation.

# Actor input Schema

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

Plain domain names, no URLs or wildcards. Invalid entries fail validation.

## Actor input object example

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

# Actor output Schema

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

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("afkdigital/newapi33-icann-rdap-bulk-domain-intelligence").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("afkdigital/newapi33-icann-rdap-bulk-domain-intelligence").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 '{}' |
apify call afkdigital/newapi33-icann-rdap-bulk-domain-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,afkdigital/newapi33-icann-rdap-bulk-domain-intelligence"
        }
    }
}
```

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/A4xnlPcFysLI7ZSTc/builds/gr8V5Tk5ZWKtjd930/openapi.json
