RDAP Domain Lookup & Expiry/Change Monitor avatar

RDAP Domain Lookup & Expiry/Change Monitor

Under maintenance

Pricing

$2.00 / 1,000 domain results

Go to Apify Store
RDAP Domain Lookup & Expiry/Change Monitor

RDAP Domain Lookup & Expiry/Change Monitor

Under maintenance

Bulk WHOIS/RDAP lookup via the public RDAP protocol: registrar, status, created/updated/expiry dates, nameservers and DNSSEC. Expiry alerts and change detection with onlyNew mode. Unofficial; not affiliated with IANA or any registry.

Pricing

$2.00 / 1,000 domain results

Rating

0.0

(0)

Developer

Chee Chiaw Lim

Chee Chiaw Lim

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

5 days ago

Last modified

Share

Look up domains through public registry RDAP servers. Read registration and expiry dates, registrar details, status codes, nameservers, and DNSSEC status. Schedule repeat runs to detect changes.

The Actor uses IANA's DNS bootstrap to find each server. It caches the bootstrap for 24 hours in the named state store. It requires no login and collects no registrant data.

Input

{
"domains": ["example.com", "google.com", "apify.com", "wikipedia.org", "ngrok.io"],
"onlyNew": false,
"expiresWithinDays": 30,
"includeRaw": false,
"maxItems": 100,
"minIntervalMs": 1000,
"stateStoreName": "rdap-domain-monitor-state"
}
FieldDefaultMeaning
domainsRequiredDomain list. The runtime also accepts a newline or comma separated string. Schemes, paths, and trailing dots are removed. Names become lowercase ASCII with IDN conversion. Duplicates are removed.
onlyNewtrueEmit only new or changed domains. Set false for a full lookup report.
expiresWithinDays30Alert window in days, from 0 to 36500. Already expired domains also alert.
includeRawfalseAdd the public RDAP response as raw.
maxItems100Maximum emitted records, including errors, from 1 to 10000. Unchanged domains do not count toward this limit.
minIntervalMs1000Minimum time between request starts per host, from 0 to 60000 milliseconds.
stateStoreNamerdap-domain-monitor-stateNamed KV store for bootstrap cache and domain snapshots. Use a separate name for each independent history.

Output sample

This illustrative record shows a domain's first successful lookup.

{
"domain": "example.com",
"tld": "com",
"rdapServer": "https://rdap.verisign.com/com/v1",
"found": true,
"registrar": "Example Registrar",
"registrarIanaId": "123",
"statuses": ["clientTransferProhibited"],
"createdAt": "1995-08-14T04:00:00.000Z",
"updatedAt": "2026-10-01T00:00:00.000Z",
"expiresAt": "2026-11-01T00:00:00.000Z",
"daysToExpiry": 12,
"expiresWithinAlert": true,
"nameservers": ["a.iana-servers.net", "b.iana-servers.net"],
"dnssec": true,
"fingerprint": "01bf303a56dc8040ddb2b96ebc74521940f6b2b0975b0e7bf85eeec3be1467d6",
"changeType": "new",
"changedFields": [],
"previous": null,
"error": null,
"checkedAt": "2026-10-20T00:00:00.000Z",
"rdapUrl": "https://rdap.verisign.com/com/v1/domain/example.com"
}

Dates are ISO timestamps or null when unavailable. daysToExpiry rounds up the remaining time in days and can be negative. dnssec is null when the server does not report delegation signing. HTTP 404 produces found: false with error: null. A missing server produces error: "no RDAP server for TLD". Other lookup failures produce an error string and still appear in the dataset.

The dataset has overview, changes, and details views. RUN_SUMMARY in the default KV store contains start and finish times, onlyNew, counts for fetched, eligible, and pushed records, and stoppedAtChargeLimit. Failed runs also include error.

Change monitoring

The SHA-256 fingerprint covers registrar, sorted statuses, expiresAt, sorted lowercase nameservers, dnssec, and found. Changes to updatedAt, registrar IANA ID, registration dates, or the daily expiry countdown do not trigger an emission.

changeType is new, changed, or unchanged. changedFields lists changed fingerprint fields. previous contains their old values, or null when none changed. New records have an empty changedFields list. With onlyNew: true, an unchanged domain stays suppressed even when its expiry alert becomes true. Lookup errors always emit and leave successful history intact.

The named store holds BOOTSTRAP with { fetchedAt, data } and DOMAINS with a per-domain { fingerprint, fields } map. Snapshots save only after a successful dataset push. Full lookup runs also update history. Delete DOMAINS to reset history.

Dataset pushes and state saves are separate operations. A crash between them can produce a duplicate on retry. Avoid overlapping runs that share a state store.

Pricing

The pay-per-event price is $0.002 per domain, or $2 per 1,000 domains, using the domain event. There is no run fee. Errored lookups are pushed without an event and are not charged. Successful 404 lookups count as results and are charged. Suppressed unchanged records are not charged. Local runs do not bill you. Store pricing must match the event configuration in PUBLISHING.md before publication.

Limits

Some ccTLDs do not offer RDAP through IANA's bootstrap. Registries may rate limit requests or omit fields. Contacts may be redacted. The normalized output includes no registrant data. Opting into raw includes whatever public response the registry provides.

The Actor retries HTTP 429 and 5xx responses up to three times with exponential backoff and honors Retry-After. Each request times out after 30 seconds. Registry data can lag behind registration changes. Expiry alerts depend on the dates the registry publishes and do not guarantee renewal or availability.

Disclaimer

This Actor is unofficial and is not affiliated with or endorsed by IANA, ICANN, or any registry or registrar. It uses only the public RDAP protocol. It uses no logos and requires no login.

Local development

npm install
npm test
npx apify run

Node 20 or newer is required. The CLI reads storage/key_value_stores/default/INPUT.json, which matches the root INPUT.json sample. npm start also runs the Actor with local storage. Tests use node:test, stubbed fetch, and temporary local storage without network access.