Whois API Documentation

Everything you need to integrate the WhoisJsonAPI endpoints.

Our Hosted Whois API Web Service provides registration details, also known as WHOIS Records, of a domain names.

Whoisjsonapi.com provides a RESTful API to get access to the whois data. It is designed for server-to-server communication between your system and the whoisjsonapi.com network using HTTPs protocol. Query responses are delivered in JSON format based on your requests which are made via GET method.

To begin, you must have a developer's account on whoisjsonapi.com, and an authentication token is necessary for each API usage.

The following data is included:

  • Important Dates (i.e. Expiration, Creation)
  • Owner and contact information if available
  • Nameservers
  • Registrar information
We store the WHOIS record in cache for a maximum of 24 hours. When you submit a query, we initially verify if the cached WHOIS record is older than 24 hours. If it is, we retrieve the most recent information in real time.

Single domain request

By making a single domain request, you can obtain only the whois information for the specific domain you are querying. This request operates swiftly as it doesn't necessitate additional resources.

API endpoint
GET https://whoisjsonapi.com/v1/{domain}
Input parameters: required
apiToken Get your personal API TOKEN on the Dashboard page.
domainName The domain for which WHOIS data is requested.
Example
curl --location 'https://whoisjsonapi.com/v1/twitter.com' \
--header 'Authorization: Bearer {your-api-token}'

Bulk request

Bulk WHOIS API gives you parsed domain WHOIS ownership information for a list of domains

The list of requested domains is limited. You can request a maximum of 20 domains at once
API endpoint
GET https://whoisjsonapi.com/v1/domains?d={domain1},{domain2},{domain3},...{domain20}
Input parameters: required
apiToken Get your personal API TOKEN on the Dashboard page.
domainNames Comma separated list of domain names. You must specify at least one domain.
Example
curl --location 'https://whoisjsonapi.com/v1/domains?d=facebook.com,twitter.com,bbc.com' \
--header 'Authorization: Bearer {your-api-token}'

Domain availability

The domain availability method checks the availability status of a single domain name. It accepts one argument: domain

The response will contain a JSON array of status objects with keys: domain and status*. The status key contains the status for the given domain.

There are two statuses provided by the API: active and inactive. INACTIVE domains indicate that they are available for purchase.

API endpoint
GET https://whoisjsonapi.com/v1/status/{domainName}
Input parameters: required
apiToken Get your personal API TOKEN on the Dashboard page.
domainName The domain for which status is requested.
Example
curl --location 'https://whoisjsonapi.com/v1/status/whois.com' \
--header 'Authorization: Bearer {your-api-token}'
Response
{
    "domain": "whois.com",
    "status": "active"
}

DNS records

The DNS records endpoint returns grouped DNS records for a hostname. It is available to Premium and Enterprise plans and uses the same shared request allowance as WHOIS: each accepted DNS lookup consumes one request, regardless of the number of requested record types.

Send your API token in the Authorization header using the bearer token scheme. Successful responses include X-Requests-Remaining when the shared allowance value is available.

API endpoint
GET https://whoisjsonapi.com/v1/dns/{domainName}
Input parameters
Parameter Required Description
domainName Yes The hostname to look up. Invalid hostnames return DNS_INVALID_DOMAIN.
types No Comma-separated record types. Omit it, or pass it blank, to request the default set: A, AAAA, MX, NS, TXT, CNAME, SOA, CAA.
Supported record types are exactly A, AAAA, MX, NS, TXT, CNAME, SOA, and CAA. Duplicate values, unsupported values, or empty items in a comma-separated list return DNS_INVALID_TYPES.
Default lookup example
curl --location 'https://whoisjsonapi.com/v1/dns/example.com' \
--header 'Authorization: Bearer {your-api-token}'
Type-filtered lookup example
curl --location 'https://whoisjsonapi.com/v1/dns/example.com?types=A,MX,TXT' \
--header 'Authorization: Bearer {your-api-token}'
Response fields
Field Description
domain Normalized hostname used for the lookup.
domain_ascii Lowercase ASCII or punycode hostname.
status One of success, no_data, nxdomain, or partial.
resolver_policy Resolver policy used for the lookup. The current public value is default.
requested_types Normalized record types returned in canonical order.
fetched_at Timestamp when the DNS data was fetched, or null when unavailable.
expires_at Timestamp when the returned DNS data expires, or null when unavailable.
records Object grouped by requested record type. Requested types without records are returned as empty arrays.
warnings Array of sanitized lookup warnings, if any.
Success response example
{
    "domain": "example.com",
    "domain_ascii": "example.com",
    "status": "success",
    "resolver_policy": "default",
    "requested_types": [
        "A",
        "AAAA",
        "MX",
        "NS",
        "TXT",
        "CNAME",
        "SOA",
        "CAA"
    ],
    "fetched_at": "2026-07-01T12:00:00+00:00",
    "expires_at": "2026-07-01T12:05:00+00:00",
    "records": {
        "A": [
            {
                "name": "example.com.",
                "type": "A",
                "ttl": 120,
                "value": "93.184.216.34"
            }
        ],
        "AAAA": [
            {
                "name": "example.com.",
                "type": "AAAA",
                "ttl": 120,
                "value": "2606:2800:220:1:248:1893:25c8:1946"
            }
        ],
        "MX": [
            {
                "name": "example.com.",
                "type": "MX",
                "ttl": 300,
                "priority": 10,
                "exchange": "mail.example.com."
            }
        ],
        "NS": [
            {
                "name": "example.com.",
                "type": "NS",
                "ttl": 86400,
                "target": "a.iana-servers.net."
            }
        ],
        "TXT": [],
        "CNAME": [],
        "SOA": [
            {
                "name": "example.com.",
                "type": "SOA",
                "ttl": 3600,
                "mname": "ns.icann.org.",
                "rname": "noc.dns.icann.org.",
                "serial": 2026070101,
                "refresh": 7200,
                "retry": 3600,
                "expire": 1209600,
                "minimum": 3600
            }
        ],
        "CAA": []
    },
    "warnings": []
}
Status and error behavior
Value HTTP status Meaning
success 200 The lookup completed and at least one requested record set is available.
no_data 200 The hostname exists, but no records were found for the requested types.
nxdomain 200 DNS reports that the hostname does not exist.
partial 200 A usable partial response was returned with warnings.
DNS_INVALID_DOMAIN 400 The hostname is invalid.
DNS_INVALID_TYPES 400 The type list contains a duplicate, empty, or unsupported value.
DNS_TIMEOUT 504 The DNS lookup timed out before a usable response was available.
DNS_LOOKUP_UNAVAILABLE 503 The DNS lookup service is temporarily unavailable.

Authentication, subscription access, feature access, and quota failures use the standard API error behavior for authenticated endpoints.


Authorization

When making a request to our REST API, send your API token in the Authorization header using the bearer token scheme. Keep API tokens out of URLs, browser code, public repositories, and logs.

Example: API key in headers
curl --location 'https://whoisjsonapi.com/v1/whois.com' \
--header 'Authorization: Bearer {your-api-token}'

Response

Query responses are delivered in JSON format.

Note: some fields may be missing due to incomplete data provided by the whois providers.

Domain

Field Type Example value
id String 2320948_DOMAIN_COM-VRSN
domain String facebook.com
name String facebook
extension String com
whois_server String whois.registrarsafe.com
status Array ["clientdeleteprohibited", "clienttransferprohibited"]
name_servers Array ["a.ns.facebook.com", "b.ns.facebook.com"]
created_date String 1997-03-29T05:00:00Z
updated_date String 2022-01-26T16:45:06Z
expiration_date String 2031-03-30T04:00:00Z

Registrar

Field Type Example value
id String 3237
name String RegistrarSafe, LLC
phone String +1.6513097004
email String [email protected]

Registrant

Field Type Example value
name String Domain Admin
organization String Meta Platforms, Inc.
street String 1601 Willow Rd
city String Menlo Park
province String CA
postal_code String 94025
country String US
phone String +1.6515434890
email [email protected]

Administrative

Field Type Example value
name String Domain Admin
organization String Meta Platforms, Inc.
street String 1601 Willow Rd
city String Menlo Park
province String CA
postal_code String 94025
country String US
phone String +1.6515434890
email [email protected]

Technical

Field Type Example value
name String Domain Admin
organization String Meta Platforms, Inc.
street String 1601 Willow Rd
city String Menlo Park
province String CA
postal_code String 94025
country String US
phone String +1.6515434890
email [email protected]
Response example
{
    "domain": {
        "id": "2320948_DOMAIN_COM-VRSN",
        "domain": "facebook.com",
        "punycode": "facebook.com",
        "name": "facebook.com",
        "extension": "com",
        "whois_server": "whois.registrarsafe.com",
        "status": [
            "clientdeleteprohibited",
            "clienttransferprohibited",
            "clientupdateprohibited",
            "serverdeleteprohibited",
            "servertransferprohibited",
            "serverupdateprohibited"
        ],
        "name_servers": [
            "d.ns.facebook.com",
            "a.ns.facebook.com",
            "b.ns.facebook.com",
            "c.ns.facebook.com"
        ],
        "created_date": "1997-03-29T05:00:00Z",
        "created_date_in_time": "1997-03-29T05:00:00Z",
        "updated_date": "2023-04-26T19:04:19Z",
        "updated_date_in_time": "2023-04-26T19:04:19Z",
        "expiration_date": "2032-03-30T04:00:00Z",
        "expiration_date_in_time": "2032-03-30T04:00:00Z"
    },
    "registrar": {
        "name": "RegistrarSafe, LLC",
        "phone": "+1.6503087004",
        "email": "[email protected]",
        "referral_url": "https://www.registrarsafe.com"
    },
    "registrant": {
        "name": "Domain Admin",
        "organization": "Meta Platforms, Inc.",
        "street": "1601 Willow Rd",
        "city": "Menlo Park",
        "province": "CA",
        "postal_code": "94025",
        "country": "US",
        "phone": "+1.6505434800",
        "email": "[email protected]"
    }
}

Domain monitoring

Domain Monitoring watches configured domains for WHOIS/RDAP and/or DNS changes over time. It is a signed-in, owner-scoped Dashboard feature, not a bearer-token REST API endpoint or a whoisphp feature. Available monitoring capacity, imports, and webhooks depend on your plan and permissions.

Open Domain Monitoring in the Dashboard. Sign in first; the Dashboard confirms whether monitoring is available for your account.

Quick start

  1. Open Dashboard → Monitoring and select Add monitor.
  2. Enter a valid domain and, if useful, an optional recognizable monitor name.
  3. Choose WHOIS/RDAP, DNS, or both, then configure whether email alerts are enabled.
  4. Save the monitor. Its first check establishes or loads a baseline asynchronously, so current data and change history may not be available immediately.
  5. Open the monitor detail page to review its health, current data, and detected changes.

Manage monitors

Use the monitor list to search by domain or name and filter by status, source, change state, tag, or severity. Each monitor has Overview, Changes, Current data, and Settings tabs.

A monitor can be active, initializing, paused, have a problem, or be removed. Run now requests a refresh for the enabled sources; it does not promise an immediately completed result. You can pause, resume, or remove a monitor. Removed monitors leave the normal list and stop normal monitoring, while their history remains available to the owner. We do not make a retention-duration promise.

One account can have one monitor for each normalized domain. Duplicate active monitors for the same normalized domain are not created; a monitor that was previously removed can be reactivated.

Alerts and change history

The change timeline records customer-facing events for enabled sources. Events show the source, severity, summary, detected time, and, when available, a previous/current delta. Disabling email alerts does not disable detection or timeline entries.

Your account email is the default alert recipient. A custom recipient must be verified before it can receive alerts; an unverified address receives no alert. Eligible alerts are sent immediately—there is no daily or weekly digest setting. Choose Critical and important changes to limit notifications or All changes to receive every eligible alert. Notifications contain a concise summary and Dashboard link, not raw WHOIS/RDAP or DNS source data.

Bulk import

Bulk import is available only when your plan enables it. On the Import page, paste comma-separated rows or upload a .csv file. CSV-file uploads may include the optional header below; pasted rows must omit the header and use the five columns in this order:

domain,monitor_name,tags,alert_level,email_mode
example.com,Primary domain,"production, customer",important_only,immediate
example.net,,security,all,immediate
Column Use
domain Required domain to monitor.
monitor_name Optional recognizable name.
tags Optional comma-separated tags; quote the field when a tag list contains commas.
alert_level important_only for critical and important changes, or all for all changes.
email_mode Currently supports immediate.

Omitted optional values use the Dashboard defaults. Notification recipients follow the account or monitor email settings; there is no per-row recipient field. Rows are processed independently, so review the results for created, reactivated, duplicate, invalid, over-limit, or other error rows.

Webhooks

An entitled account can configure one account-level endpoint for events from its monitored domains in Dashboard → Monitoring → Webhook. Webhooks are outbound-only and are not a public configuration API. Use an HTTPS endpoint, save and enable it, store its generated signing secret securely, send a test delivery, and review delivery history from the Dashboard.

The Dashboard normally masks the signing secret. Explicitly reveal or copy it only when needed, never put it in a URL or logs, and rotate the secret in your receiver at the same time as you rotate it in the Dashboard. You can enable or disable the endpoint and use test delivery without creating a real monitoring event.

Outbound request

POST https://customer.example/monitoring-webhook
Content-Type: application/json
User-Agent: WhoisJsonAPI/Monitoring-Webhooks/1.0
X-WhoisJsonAPI-Event-Id: <event UUID or test>
X-WhoisJsonAPI-Delivery-Id: <delivery ID>
X-WhoisJsonAPI-Signature-SHA256: <base64 HMAC-SHA256>

Values in this example are placeholders. A representative payload contains only customer-safe event details; test distinguishes a test delivery from a monitoring event.

{
  "event_id": "<event UUID>",
  "event_type": "record_changed",
  "source": "dns",
  "severity": "important",
  "domain": "example.com",
  "detected_at": "<ISO 8601 timestamp>",
  "monitor": {
    "id": "<monitor ID>",
    "name": "Primary domain",
    "tags": ["production"]
  },
  "change": {
    "summary": "A monitored value changed.",
    "previous": "<previous customer-facing value>",
    "current": "<current customer-facing value>"
  },
  "links": {
    "dashboard": "https://whoisjsonapi.com/dashboard/monitoring/<monitor ID>"
  },
  "test": false
}

Verify signatures and process deliveries

Verify every request before processing it. Calculate HMAC-SHA256 over the exact received request-body bytes with your stored signing secret, Base64-encode the binary digest, and compare it with X-WhoisJsonAPI-Signature-SHA256 using a timing-safe comparison. Do not parse and re-serialize the body before verifying it.

$expected = base64_encode(hash_hmac(
    'sha256',
    $rawRequestBody,
    '<stored webhook signing secret>',
    true
));

if (!hash_equals($expected, $requestSignature)) {
    // Reject the request.
}

Delivery is at least once. Deduplicate with both X-WhoisJsonAPI-Event-Id and X-WhoisJsonAPI-Delivery-Id, or with an equivalent idempotency policy. Automatic retries retain the delivery identity and body. A manual resend creates a separate manual delivery.

Current retry policy

Transport errors, timeouts, and HTTP 408, 409, 425, 429, 500, 502, 503, and 504 are retryable. The current backoff is 1 minute, 5 minutes, 30 minutes, and 2 hours, with terminal failure after attempt five. Successful responses, redirects, and HTTP 400, 401, 403, 404, 410, and 422 are not retried. This is the current delivery policy, not a delivery-time guarantee.


Rate limits

A rate limit is the number of API calls an app or user can make within a given time period. If this limit is exceeded or if CPU or total time limits are exceeded, the app or user may be throttled. API requests made by a throttled user or app will fail.

Platform rate limits

Each endpoint is subject to a rate limit of 50 requests per second. Once this limit is reached, the system will respond with a 429 status code.

Errors

When you request information about a domain, you may receive a message that the domain was not found. This means that the domain has not yet been registered and might be available for purchase.

Code Examples

curl --location \
--request GET 'https://whoisjsonapi.com/v1/youtube.com' \
--header 'Authorization: Bearer {your token}'