Domain Lookup API — /api/v1/domain/lookup
Returns ownership, registrar, key dates (created / updated / expires), nameservers, DNSSEC, and abuse contacts for any apex domain. Automatically picks RDAP when supported and falls back to WHOIS — pass `server` to force one protocol. Contact fields are blank for most TLDs due to ICANN / GDPR redaction.
What Domain Lookup does
Returns ownership, registrar, key dates (created / updated / expires), nameservers, DNSSEC, and abuse contacts for any apex domain. Automatically picks RDAP when supported and falls back to WHOIS — pass `server` to force one protocol. Contact fields are blank for most TLDs due to ICANN / GDPR redaction.
- Method GET
- Path /api/v1/domain/lookup
- Stability STABLE
- Version v2026-05-15
- Summary WHOIS / RDAP lookup for any registered domain.
Request parameters
Pass these as query-string parameters (or, where indicated, in the request headers). Required params marked required.
- domain (required) — string Apex or subdomain. IDN punycode accepted. Max 253 characters.
- server — string, default "auto" Which protocol to use. `auto` prefers RDAP and falls back to WHOIS — recommended.
- cache — boolean, default true Serve from cache when available (24h TTL). Set `false` to force a fresh upstream call.
- raw — boolean, default false Include the raw WHOIS / RDAP response in the payload for debugging.
Response schema
All successful responses follow the standard `{ success: true, data: {...} }` envelope. Notable fields on the data object for this endpoint:
- success — boolean Always `true` on 2xx.
- data.domain — string Normalized lower-case ASCII domain.
- data.tld — string The top-level domain (e.g. `com`).
- data.details.dates.creationDate — ISO8601 When the domain was first registered.
- data.details.dates.updatedDate — ISO8601 Last registrar update.
- data.details.dates.expiryDate — ISO8601 When the domain expires.
- data.details.registrar — object Registrar name, IANA id, abuse contact, WHOIS server URL.
- data.details.nameServers — array<object> Each NS with `name`, optional `ipv4` / `ipv6`.
- data.details.dnssec — object `signed` boolean, `dsData[]`, `keyData[]`.
- data.details.status — array<string> EPP status codes (e.g. clientTransferProhibited).
- data.details.source — string Either `whois` or `rdap`.
Example response
Truncated but representative example for a real lookup:
{
"success": true,
"data": {
"domain": "google.com",
"tld": "com",
"details": {
"domainName": "google.com",
"dates": {
"creationDate": "1997-09-15T04:00:00.000Z",
"updatedDate": "2019-09-09T15:39:04.000Z",
"expiryDate": "2028-09-14T04:00:00.000Z"
},
"registrar": {
"name": "MarkMonitor Inc.",
"ianaId": "292",
"whoisServer": "whois.markmonitor.com",
"abuseContact": {
"email": "[email protected]",
"phone": "+1.2086851750"
}
},
"nameServers": [
{
"name": "ns1.google.com"
},
{
"name": "ns2.google.com"
}
],
"dnssec": {
"signed": false,
"dsData": [],
"keyData": []
},
"status": [
"clientDeleteProhibited",
"clientTransferProhibited"
],
"source": "whois"
}
}
}Error codes
Errors return HTTP status codes paired with stable machine-readable codes. Match on the code field rather than the human-readable message.
- 400 VALIDATION_ERROR `domain` missing or not a valid hostname.
- 404 DOMAIN_NOT_FOUND No WHOIS or RDAP record exists for this name.
- 503 UPSTREAM_UNAVAILABLE The TLD's registry is unreachable.
Implementation tips
Patterns we recommend when integrating this endpoint:
- Cache results for at least 24h — registrar data changes rarely.
- Use `server=auto` unless you specifically need a raw WHOIS text response.
- Treat 404 as an authoritative signal that a domain is unregistered (or recently dropped).
- Pass `raw=true` only when debugging — it inflates response size 5–10x.
Frequently asked questions
- Why are contact fields blank? ICANN's redaction policy and GDPR remove personal data for most TLDs. The registrar's abuse contact is always returned.
- Does this count against my AI quota? No. WHOIS/RDAP calls consume one general API credit, not an AI credit.
- How fresh is the data? Cached for 24h. Set `cache=false` to bypass.