WHOIS Lookup API
Last updated: 2026-10-15
GET https://whois.tcp.lc/v1/whois/{domain}
Returns normalized registration data for a domain, resolved over RDAP where the registry publishes it and falling back to WHOIS otherwise. No API key is required.
This endpoint runs on its own host and follows standard HTTP semantics, not the
codeenvelope used by the/api/v2/endpoints. The conventions in the API documentation do not apply here: success is200, and failures use real 4xx/5xx statuses with anerrorobject.
| Parameter | In | Description |
|---|---|---|
domain |
path | Domain to look up. IDNs are accepted; IP addresses are not. |
raw |
query | Set to true to get the upstream RDAP/WHOIS response instead of the normalized envelope. |
Example:
curl "https://whois.tcp.lc/v1/whois/example.com"
Response fields:
| Field | Description |
|---|---|
query |
The input as received. |
domain |
The registrable domain that was looked up. |
domainUnicode |
Unicode form for IDNs, otherwise null. |
id |
Registry-assigned domain ID, when available. |
tld |
Top-level domain. |
isRegistered |
Whether the domain is registered. |
registrar |
name, ianaId, url, whoisServer, abuseEmail, abusePhone, reseller. |
status |
EPP status codes. |
nameservers |
name, plus any ipv4 / ipv6 addresses resolved for it. |
dnssec |
signed, and dsData with keyTag, algorithm, digestType, digest. |
dates |
created, updated, expires (ISO 8601). |
contacts |
registrant, admin, tech, billing; each has name, organization, email, phone, address and redacted. Most registries redact personal data. |
meta |
source (rdap or whois), server, fetchedAt and cached. |
An unregistered domain is not an error: the response is still 200, with isRegistered: false and empty fields.
Raw response
With ?raw=true the normalized envelope is replaced by the upstream payload — RDAP JSON (application/rdap+json) where the registry publishes it, otherwise plain WHOIS text.
curl "https://whois.tcp.lc/v1/whois/example.com?raw=true"
Errors
Failures use real HTTP status codes and an error object with code, message, and sometimes query, source and detail.
| Status | error.code |
Meaning |
|---|---|---|
| 400 | INVALID_DOMAIN |
The input could not be parsed as a registrable domain. |
| 429 | RATE_LIMITED |
Rate limit exceeded. |
| 501 | UNSUPPORTED_TLD |
No RDAP or WHOIS source exists for the TLD. |
| 504 | UPSTREAM_TIMEOUT |
The upstream registry did not respond in time. |
Under edge rate limiting the 429 may be plain text without the error object, so check the status code as well.
Rate limits
10 requests / minute per client IP. When exceeded, the endpoint returns 429 with error.code set to RATE_LIMITED.
Successful answers are cacheable (Cache-Control: public), so repeated lookups of the same domain are usually served from the edge cache.