Developer Reference
WHOIS Lookup
DomScan API: Get WHOIS information for a domain including registrar, dates, and status.
WHOIS Lookup
Get WHOIS information for a domain including registrar, dates, and status.
Privacy Note: Contact information may be redacted due to GDPR and other privacy regulations. The API automatically detects when privacy/proxy services are being used and returns a
privacy object with detection details.
GET
/v1/whois
2 Credits
Query Parameters
| Parameter | Type | Description |
|---|---|---|
| domain required | string | Full domain name (e.g., example.com) |
Response Fields
| Field | Type | Description |
|---|---|---|
registered | boolean | Whether domain is registered |
registrar | string | Registrar name |
created_date | string | ISO 8601 creation date |
expiry_date | string | ISO 8601 expiration date |
status | array | EPP status codes |
nameservers | array | Authoritative nameservers |
contacts | object | Registrant, admin, tech, billing contacts |
privacy | object | Privacy protection detection |
Example Request
curl -H "X-API-Key: your-api-key" "https://domscan.net/v1/whois?domain=github.com"
const domscanFetch = (url, options = {}) =>
fetch(url, {
...options,
headers: { ...options.headers, "X-API-Key": "your-api-key" },
});
const response = await domscanFetch(
"https://domscan.net/v1/whois?domain=github.com"
);
const data = await response.json();
console.log(`Registrar: ${data.registrar}`);
console.log(`Created: ${data.created_date}`);
console.log(`Expires: ${data.expiry_date}`);
console.log(`Nameservers: ${data.nameservers.join(', ')}`);
// Check for privacy protection
if (data.privacy.is_private) {
console.log(`Privacy service: ${data.privacy.privacy_service}`);
}
import requests
domscan = requests.Session()
domscan.headers.update({"X-API-Key": "your-api-key"})
from datetime import datetime
response = domscan.get(
"https://domscan.net/v1/whois",
params={"domain": "github.com"}
)
data = response.json()
# Calculate days until expiration
expiry = datetime.fromisoformat(data['expiry_date'].replace('Z', '+00:00'))
days_left = (expiry - datetime.now(expiry.tzinfo)).days
print(f"Registrar: {data['registrar']}")
print(f"Expires in {days_left} days")
print(f"Privacy protected: {data['privacy']['is_private']}")
package main
import (
"encoding/json"
"fmt"
"net/http"
"os"
)
func domscanGet(url string) (*http.Response, error) {
request, err := http.NewRequest(http.MethodGet, url, nil)
if err != nil {
return nil, err
}
request.Header.Set("X-API-Key", os.Getenv("DOMSCAN_API_KEY"))
return http.DefaultClient.Do(request)
}
func main() {
resp, _ := domscanGet("https://domscan.net/v1/whois?domain=github.com")
defer resp.Body.Close()
var data map[string]interface{}
json.NewDecoder(resp.Body).Decode(&data)
fmt.Printf("Registrar: %s\n", data["registrar"])
fmt.Printf("Created: %s\n", data["created_date"])
fmt.Printf("Expires: %s\n", data["expiry_date"])
}
require 'net/http'
require 'json'
require 'date'
uri = URI("https://domscan.net/v1/whois?domain=github.com")
request = Net::HTTP::Get.new(uri)
request["X-API-Key"] = ENV.fetch("DOMSCAN_API_KEY")
response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.request(request) }
data = JSON.parse(response.body)
expiry = DateTime.parse(data['expiry_date'])
days_left = (expiry - DateTime.now).to_i
puts "Registrar: #{data['registrar']}"
puts "Expires in #{days_left} days"
Example Response
{
"domain": "example.com",
"registered": true,
"registrar": "RESERVED-Internet Assigned Numbers Authority",
"registrar_url": "https://www.iana.org",
"registrar_iana_id": "376",
"created_date": "1995-08-14T04:00:00Z",
"updated_date": "2023-08-14T07:01:38Z",
"expiry_date": "2024-08-13T04:00:00Z",
"status": ["clientDeleteProhibited", "serverUpdateProhibited"],
"nameservers": ["a.iana-servers.net", "b.iana-servers.net"],
"dnssec": true,
"contacts": {
"registrant": {
"name": "REDACTED FOR PRIVACY",
"organization": "Internet Assigned Numbers Authority",
"email": null,
"phone": null,
"address": {
"country": "US"
},
"role": "registrant"
},
"admin": { "name": "Domain Administrator", "email": "admin@example.org" },
"tech": { "name": "Technical Contact", "email": "tech@example.org" },
"billing": null
},
"privacy": {
"is_private": false,
"privacy_service": null,
"detected_patterns": []
},
"summary": {
"has_registrant": true,
"has_admin": true,
"has_tech": true,
"has_billing": false,
"contact_count": 3,
"is_privacy_protected": false
},
"raw_rdap_link": "https://rdap.verisign.com/com/v1/domain/example.com",
"checked_at": "2025-01-07T10:30:00Z",
"query_time_ms": 145
}
POST
/v1/whois/bulk
2/domain
Bulk WHOIS lookup for multiple domains (max 20 per request).
Request Body
{
"domains": ["example.com", "google.com", "github.com"]
}
Response Fields
| Field | Type |
|---|---|
results[] |
object[] |
results[] |
object |
results[].domain |
string |
results[].registrar |
string | null |
results[].created_date |
string | null |
results[].updated_date |
string | null |
results[].expiry_date |
string | null |
results[].nameservers[] |
string[] |
results[].status[] |
string[] |
results[].raw |
string |
results[].raw_whois |
string | null |
results[].edge_summary |
object |
results[].edge_summary.relay_configured |
boolean |
results[].edge_summary.data_sources[] |
string[] |
results[].edge_summary.authoritative_source |
string |
results[].edge_summary.relay_whois_used |
boolean |
results[].edge_summary.raw_whois_available |
boolean |
results[].edge_summary.parse_error_count |
integer | null |
results[].edge_summary.registered |
boolean | null |
results[].edge_summary.available |
boolean | null |
results[].edge_summary.registration_age_days |
integer | null |
results[].edge_summary.days_until_expiry |
integer | null |
results[].edge_summary.expires_within_30_days |
boolean | null |
results[].edge_summary.transfer_locked |
boolean | null |
results[].edge_summary.privacy_protected |
boolean | null |
results[].edge_summary.dnssec |
boolean | null |
results[].edge_summary.nameserver_count |
integer |
results[].edge_summary.contact_roles_available[] |
string[] |
results[].edge_summary.abuse_contact_available |
boolean |
results[].edge_summary.registrar_whois_server |
string | null |
meta |
object |
meta.total |
integer |
meta.successful |
integer |
meta.duration_ms |
integer |
Example Response
{
"results": [
{
"domain": "example.com",
"registrar": "string",
"created_date": "2026-04-15T12:00:00Z",
"updated_date": "2026-04-15T12:00:00Z",
"expiry_date": "2026-04-15T12:00:00Z",
"nameservers": [
"string"
],
"status": [
"string"
],
"raw": "string",
"raw_whois": "string",
"edge_summary": {
"relay_configured": true,
"data_sources": [
"rdap"
],
"authoritative_source": "rdap",
"relay_whois_used": true,
"raw_whois_available": true,
"parse_error_count": 1,
"registered": true,
"available": true,
"registration_age_days": 1,
"days_until_expiry": 1,
"expires_within_30_days": true,
"transfer_locked": true,
"privacy_protected": true,
"dnssec": true,
"nameserver_count": 1,
"contact_roles_available": [
"string"
],
"abuse_contact_available": true,
"registrar_whois_server": "string"
}
}
],
"meta": {
"total": 1,
"successful": 1,
"duration_ms": 1
}
}
GET
/v1/rdap
Query Parameters
| Parameter | Type | required |
|---|---|---|
| query | string | optional |
| type | string | optional |
| domain | string | optional |
Response Fields
| Field | Type |
|---|---|
query |
string |
type |
string |
status |
string |
rdap |
object |
rdap.objectClassName |
string |
rdap.handle |
string |
rdap.name |
string |
rdap.startAddress |
string |
rdap.endAddress |
string |
rdap.ipVersion |
string |
Example Request
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/rdap?query=example.com"
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/rdap?type=ip&query=8.8.8.8"
curl -G -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/rdap" \
--data "type=ip" \
--data-urlencode "query=2001:4860:4860::8888/128"
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/rdap?type=autnum&query=AS174"
Example Response
{
"query": "8.8.8.8",
"type": "ip",
"status": "found",
"rdap": {
"objectClassName": "ip network",
"handle": "NET-8-8-8-0-2",
"name": "LVLT-GOGL-8-8-8",
"startAddress": "8.8.8.0",
"endAddress": "8.8.8.255",
"ipVersion": "v4"
}
}
POST
/v1/rdap/bulk
Body Parameters
| Parameter | Type | required |
|---|---|---|
| queries | string[] | required |
| type | string | optional |
Response Fields
| Field | Type |
|---|---|
results[] |
unknown[] |
meta |
object |
meta.total |
integer |
meta.succeeded |
integer |
meta.failed |
integer |
meta.max_items |
integer |
meta.credits_per_item |
integer |
meta.duration_ms |
integer |
Example Request
curl -X POST "https://domscan.net/v1/rdap/bulk" \
-H "Content-Type: application/json" \
-H "X-API-Key: $DOMSCAN_API_KEY" \
-d '{
"queries": [
"example.com",
"cloudflare.com"
],
"type": "domain"
}'
Example Response
{
"results": [
null
],
"meta": {
"total": 1,
"succeeded": 1,
"failed": 1,
"max_items": 10,
"credits_per_item": 1,
"duration_ms": 1
}
}
GET
/v1/whois/history
Query Parameters
| Parameter | Type | required |
|---|---|---|
| domain | string | required |
| limit | integer | optional |
Response Fields
| Field | Type |
|---|---|
domain |
string |
total_snapshots |
integer |
first_seen |
string | null |
last_seen |
string | null |
snapshots[] |
object[] |
snapshots[] |
object |
snapshots[].id |
integer |
snapshots[].domain |
string |
snapshots[].registrar |
string | null |
snapshots[].registrar_iana_id |
string | null |
snapshots[].created_date |
string | null |
snapshots[].expiry_date |
string | null |
snapshots[].updated_date |
string | null |
snapshots[].status[] |
string[] |
snapshots[].nameservers[] |
string[] |
snapshots[].dnssec |
boolean |
snapshots[].transfer_locked |
boolean |
snapshots[].privacy_protected |
boolean |
snapshots[].snapshot_date |
string |
snapshots[].changes_from_previous[] |
object[] |
snapshots[].changes_from_previous[] |
object |
snapshots[].changes_from_previous[].field |
string |
snapshots[].changes_from_previous[].old_value |
string | null |
snapshots[].changes_from_previous[].new_value |
string | null |
snapshots[].created_at |
string |
summary |
object |
summary.registrar_changes |
integer |
summary.nameserver_changes |
integer |
summary.expiry_extensions |
integer |
summary.privacy_toggles |
integer |
summary.status_changes |
integer |
lifecycle_drift_summary |
object |
lifecycle_drift_summary.drift_detected |
boolean |
lifecycle_drift_summary.change_event_count |
integer |
lifecycle_drift_summary.latest_change_date |
string | null |
lifecycle_drift_summary.registrar_changed |
boolean |
lifecycle_drift_summary.nameservers_changed |
boolean |
lifecycle_drift_summary.expiry_extended |
boolean |
lifecycle_drift_summary.status_changed |
boolean |
lifecycle_drift_summary.privacy_changed |
boolean |
lifecycle_drift_summary.transfer_lock_changed |
boolean |
lifecycle_drift_summary.dnssec_changed |
boolean |
lifecycle_drift_summary.expiry_extension_days_total |
integer |
lifecycle_drift_summary.latest_changes[] |
object[] |
lifecycle_drift_summary.latest_changes[] |
object |
lifecycle_drift_summary.latest_changes[].field |
string |
lifecycle_drift_summary.latest_changes[].old_value |
string | null |
lifecycle_drift_summary.latest_changes[].new_value |
string | null |
lifecycle_drift_summary.current_snapshot |
object |
lifecycle_drift_summary.current_snapshot.registrar |
string | null |
lifecycle_drift_summary.current_snapshot.expiry_date |
string | null |
lifecycle_drift_summary.current_snapshot.nameservers[] |
string[] |
lifecycle_drift_summary.current_snapshot.status[] |
string[] |
lifecycle_drift_summary.current_snapshot.privacy_protected |
boolean |
lifecycle_drift_summary.previous_snapshot |
object |
lifecycle_drift_summary.previous_snapshot.registrar |
string | null |
lifecycle_drift_summary.previous_snapshot.expiry_date |
string | null |
lifecycle_drift_summary.previous_snapshot.nameservers[] |
string[] |
lifecycle_drift_summary.previous_snapshot.status[] |
string[] |
lifecycle_drift_summary.previous_snapshot.privacy_protected |
boolean |
Example Request
curl -H "X-API-Key: $DOMSCAN_API_KEY" "https://domscan.net/v1/whois/history?domain=example.com&limit=50"
Example Response
{
"domain": "example.com",
"total_snapshots": 1,
"first_seen": "2026-07-09",
"last_seen": "2026-07-09",
"snapshots": [
{
"id": 42,
"domain": "example.com",
"registrar": "Example Registrar, Inc.",
"registrar_iana_id": "9999",
"created_date": "1995-08-14T04:00:00Z",
"expiry_date": "2027-08-13T04:00:00Z",
"updated_date": "2026-06-01T12:00:00Z",
"status": [
"client transfer prohibited"
],
"nameservers": [
"a.iana-servers.net",
"b.iana-servers.net"
],
"dnssec": true,
"transfer_locked": true,
"privacy_protected": true,
"snapshot_date": "2026-07-09",
"changes_from_previous": [
{
"field": "nameservers",
"old_value": "ns1.example.net, ns2.example.net",
"new_value": "a.iana-servers.net, b.iana-servers.net"
}
],
"created_at": "2026-07-09T10:15:30Z"
}
],
"summary": {
"registrar_changes": 1,
"nameserver_changes": 1,
"expiry_extensions": 1,
"privacy_toggles": 1,
"status_changes": 1
},
"lifecycle_drift_summary": {
"drift_detected": true,
"change_event_count": 1,
"latest_change_date": "2026-04-15",
"registrar_changed": true,
"nameservers_changed": true,
"expiry_extended": true,
"status_changed": true,
"privacy_changed": true,
"transfer_lock_changed": true,
"dnssec_changed": true,
"expiry_extension_days_total": 1,
"latest_changes": [
{
"field": "string",
"old_value": "string",
"new_value": "string"
}
],
"current_snapshot": {
"registrar": "string",
"expiry_date": "2026-04-15T12:00:00Z",
"nameservers": [
"string"
],
"status": [
"string"
],
"privacy_protected": true
},
"previous_snapshot": {
"registrar": "string",
"expiry_date": "2026-04-15T12:00:00Z",
"nameservers": [
"string"
],
"status": [
"string"
],
"privacy_protected": true
}
}
}