First CH AppsSmall apps that need a server

日本語

First CH Apps / Domain Info & Expiry Checker

Domain Info & Expiry Checker

Enter a domain name and our server queries RDAP — the HTTPS API that replaces WHOIS — for the registrar, creation date, expiry date, statuses and name servers. The RDAP server for gTLDs is resolved through the IANA bootstrap (RFC 9224).

The number that matters is how many days are left. When a domain expires the website and the email stop together, and getting it back costs more than a renewal. We never fetch or display registrant or admin contacts — only the registrar, which is a company.

e.g. example.com (a full URL, an email address or a www host all work — we fold them down to the registrable domain)

How to read this

You notice an expiry after it breaks things

When a domain expires, the website and the email stop at the same time. The outage does not begin at the exact expiry moment either — it depends on how the registrar handles the grace period — so the cause takes a while to find. Once you are inside 30 days, confirm that auto-renew is enabled and that the credit card on file with the registrar has not itself expired. An expired card is the single most common cause of a failed auto-renewal.

clientHold means DNS has stopped

clientHold is the registrar holding the domain: the name servers are pulled from the registry and resolution stops completely. It is applied not only for unpaid invoices but also when the ICANN-mandated verification of the registrant email address (within 15 days of registration, transfer or a contact change) goes unanswered. Those verification emails are often filtered as spam, so check the contact verification state in your registrar's control panel.

Keep the transfer lock (clientTransferProhibited) on

Domain hijacking usually works by getting into the management account and transferring the domain away. A transfer lock blocks that step. Leave it enabled and lift it only when you genuinely move the domain, and put two-factor authentication on the registrar account as well.

Grace periods after expiry (redemptionPeriod)

gTLDs have an auto-renew grace period (autoRenewPeriod, typically 45 days) after expiry, followed by redemptionPeriod (typically 30 days). Recovery is still possible during redemption, but registrars charge a redemption fee that exceeds a normal renewal. Once the domain reaches pendingDelete the registration is lost and anybody can register the name. If you see these statuses, call your registrar the same day.

RDAP versus WHOIS

RDAP is the successor to WHOIS: it returns JSON over HTTPS (RFC 9083 and 9224). ICANN requires gTLD registries and registrars to run RDAP and ended the obligation to run WHOIS on port 43 in 2025. Country-code TLDs are outside that requirement, which is why registries such as .jp still offer WHOIS only. This page queries RDAP for gTLDs and points you at the registry's WHOIS search when RDAP is unavailable.

SERVER PROCESSING — what we send and what we keep

Sent: only the domain name you type (subdomains are folded down to the registrable domain). Our server (Cloudflare Workers) makes at most two HTTPS GET requests: one to the IANA bootstrap (data.iana.org) and one to that TLD's registry RDAP server. For TLDs without RDAP we send a single NS query to Cloudflare's public DNS (1.1.1.1).

Stored: nothing. The lookup lives entirely inside one request and writes neither the domain nor the result to any database (no KV, no D1). It leaves memory when the request ends.

Returned: the registrar name, IANA number, dates, statuses, name servers and DNSSEC flag we read out of RDAP, plus our assessment. The raw RDAP response (notices, remarks and so on) is never relayed.

Not read: registrant, administrative and technical entities (names, addresses, phone numbers, email). Some country-code TLDs include personal data in RDAP; because we do not handle personal data, we read only the registrar (a company) and its abuse contact.

Note: the only servers we query are the registry servers named by the IANA bootstrap — there is no way to point this app at an arbitrary URL. localhost, internal domains (.internal, .local) and IP addresses are rejected.

Use it as an API

POST /domain-info/api/lookup with JSON ({"domain": "example.com"}) or a form body and you get the same result as JSON (no auth, nothing stored).