Super Whois

Back to lookup

Super Whois API

Simple, JSON-based WHOIS lookups for domains, IPs, and ASNs.

v2.2.2

Base URL

GEThttps://w.ppee.eu.org/api.php
POSThttps://w.ppee.eu.org/api.php

POST JSON accepts {"q":"example.com"} or {"queries":["example.com","example.org"]}.

Authentication

The API is public by default. Authenticated requests receive a higher, finite quota.

curl -H "Authorization: Bearer YOUR_API_KEY" "https://w.ppee.eu.org/api.php?q=google.com"

Send keys with Authorization: Bearer (preferred) or X-API-Key. For a simple local setup, put your SK code in api_keys.php; environment secrets are preferred in production. Query-string keys are deprecated.

Simple local setup (edit api_keys.php)

$apiKeys = ['paste-your-sk-code-here'];
SUPER_WHOIS_API_KEYS=replace-with-a-long-random-secret

Rate Limiting

Unauthenticated clients receive 60 lookup units per hour per IP. Each unique query costs one unit; DNS enrichment costs one extra unit.

Response HeaderDescription
RateLimit-LimitMaximum lookup units per window
RateLimit-RemainingLookup units remaining this window
RateLimit-ResetSeconds until the current window resets
Retry-AfterSeconds until a rate-limited request may be retried

Query Parameters

ParameterRequiredDescription
q / queries Required The target to look up. Accepts a domain name (e.g. google.com), IPv4 / IPv6 address, or ASN (e.g. AS15169). Separate with commas or newlines for batch mode. POST JSON accepts {"q":"example.com"} or {"queries":["example.com","example.org"]}. Public/authenticated caps: 10/50 queries. Duplicate output positions are preserved while upstream work is deduplicated.
key Optional Deprecated query-string API key. Prefer the Authorization or X-API-Key header.
dns Optional Set to true to include DNS records (A, AAAA, MX, TXT, NS) in domain lookup results
raw Optional Single queries include raw data by default; batches omit it by default. Set explicitly to true or false; included raw data is size-bounded.
pretty Optional Set to true to pretty-print JSON; compact JSON is the default
lang Optional Docs language: en (default), zh-cn (Simplified), or zh-tw (Traditional)

Endpoints & Examples

Domain lookup

GEThttps://w.ppee.eu.org/api.php?q=google.com

IP lookup

GEThttps://w.ppee.eu.org/api.php?q=8.8.8.8

ASN lookup

GEThttps://w.ppee.eu.org/api.php?q=AS15169

Domain + DNS Records lookup

GEThttps://w.ppee.eu.org/api.php?q=google.com&dns=true

Batch lookup

GEThttps://w.ppee.eu.org/api.php?q=google.com,github.com,cloudflare.com&raw=false
POST{"queries":["google.com","github.com"],"raw":false}

Response Fields

HTTP 200 means the request was processed. Clients must also inspect each item status; lookup failures remain application-level status=error for v2 compatibility.

FieldTypeDescription
querystringThe sanitized input query
query_typestringdomain | ipv4 | ipv6 | asn
query_methodstringRDAP, WHOIS, a fallback method, or none
lookup_domainstring|nullPSL-derived registrable domain used for domain queries
unicode_domainstring?Readable Unicode form when the input is an IDN A-label
is_subdomainboolean?True when the input was normalized to a registrable apex
statusstringregistered | available | found | restricted | error. available means authoritative not-found, not a purchase guarantee
whois_serverstring|nullThe upstream RDAP or WHOIS server that provided the data
attempted_serversarray?Servers tried before the result; useful for transport/fallback diagnostics
timestampISO 8601UTC time of this API response
query_msintegerQuery time in milliseconds
cachedbooleanWhether the normalized lookup came from the server-side cache
cache_age_sintegerAge of a cached value in seconds
staleboolean?Registered last-known-good value served after a transient refresh failure
duration_msnumberLookup or batch wall time in milliseconds
availabilitystring?not_found for an authoritative RDAP 404; not a purchase guarantee
upstream_statusinteger?Relevant upstream HTTP status when available
dns_recordsobject?Exact input hostname DNS data when dns=true
error_codestring?Stable machine-readable application error
request_idstringCorrelation ID also returned in X-Request-ID
api_versionstringAPI version string
dataobjectStructured parsed fields (domain queries only, when registered)
data.creation_dateISO 8601Domain registration date
data.expiration_dateISO 8601Domain expiry date
data.updated_dateISO 8601Last updated date
data.registrarstringRegistrar name
data.registrar_iana_idstringRegistrar IANA ID
data.registrant_address
data.registrant_city
data.registrant_region
data.registrant_postal_code
string?Registrant address components when the registry publishes them
data.nameserversarrayList of nameservers (lowercase, unique; order is not guaranteed)
data.statusarrayDomain EPP status codes
data.dnssecstringsigned or unsigned
subdomain_suggestionstring?If querying a subdomain, the suggested apex domain
rawstring?Raw RDAP/WHOIS response (IPs redacted); omit with raw=false; Bounded to 131072 bytes per item
raw_truncatedboolean?True when raw upstream data was size-limited
batch/count/succeeded/failedBatch envelope metadataBatch envelope summary; results keep request order

Sample Response — api.php?q=google.com

{ "query": "google.com", "query_type": "domain", "query_method": "rdap", "lookup_domain": "google.com", "whois_server": "rdap.verisign.com", "status": "registered", "cached": false, "cache_age_s": 0, "timestamp": "2026-08-08T10:23:45Z", "query_ms": 180, "api_version": "2.2.2", "data": { "creation_date": "1997-09-15T04:00:00Z", "expiration_date": "2028-09-14T04:00:00Z", "updated_date": "2019-09-09T15:39:04Z", "registrar": "MarkMonitor Inc.", "registrar_iana_id": "292", "registrar_whois": "whois.markmonitor.com", "nameservers": ["ns1.google.com","ns2.google.com","ns3.google.com","ns4.google.com"], "status": ["clientDeleteProhibited","clientTransferProhibited"], "dnssec": "unsigned" }, "request_id": "9c2e7f6f26a9d2c1", "raw": "RDAP 200 from rdap.verisign.com\n--- RDAP JSON ---\n{...}" }

Batch Response — api.php?q=google.com,github.com

{ "batch": true, "count": 2, "succeeded": 2, "failed": 0, "duration_ms": 420, "api_version": "2.2.2", "request_id": "9c2e7f6f26a9d2c1", "timestamp": "2026-08-08T10:23:45Z", "results": [ { "query": "google.com", "query_type": "domain", "status": "registered", "..." : "..." }, { "query": "github.com", "query_type": "domain", "status": "registered", "..." : "..." } ] }

Error Codes

HTTPMeaning
400Bad Request — invalid or missing q parameter
401Unauthorized — API key required but not provided or invalid
405Method not allowed
413Request body or generated response exceeds the configured limit
422Batch query limit exceeded
429Too Many Requests — rate limit exceeded
503Rate-limit storage or another required runtime service is unavailable
500Server Error — PHP extension missing or misconfiguration

Try It

Code Examples

JavaScript (fetch)

fetch("https:\/\/w.ppee.eu.org\/api.php?q=google.com") .then(r => r.json()) .then(data => { console.log(data.status); // "registered" console.log(data.data.registrar); // "MarkMonitor Inc." console.log(data.data.expiration_date); // "2028-09-14T04:00:00Z" });

Python (requests)

import requests resp = requests.get("https:\/\/w.ppee.eu.org\/api.php", params={'q': 'google.com'}) data = resp.json() print(data['status']) print(data['data']['registrar'])

cURL

curl -H "Authorization: Bearer YOUR_API_KEY" "https://w.ppee.eu.org/api.php?q=google.com&raw=false" | python3 -m json.tool

Batch Query (cURL)

curl "https://w.ppee.eu.org/api.php?q=google.com,github.com,cloudflare.com&raw=false" | python3 -m json.tool

POST JSON

curl -X POST -H "Content-Type: application/json" -d '{"queries":["google.com","github.com"],"raw":false}' "https://w.ppee.eu.org/api.php"