Skip to content

Real-Time Threat Feeds

Introduction

Real-Time Threat Feeds provide data on the different stages of the domain lifecycle: from first-observed in the wild, to newly re-activated after a period of quiet. Access current feed data in real-time or retrieve historical feed data through separate APIs. Some feeds also offer data for DNS firewalls in Response Policy Zone (RPZ) format.

Summary of Common Features

  • Stable, static URL endpoint: fetch the latest feed data with the same query parameters.
  • Configurable polling frequency: fetch as often as you like, up to every 60 seconds.
  • 5-day data retention time for Feed API: current feed data is easily accessible.
  • Access historical data via Download API: never lose out on data missed accidentally.
  • Session management: Pick up where you left off, without missing or duplicating events.
  • Domain pattern filtering: Use the domain query parameter to filter a feed based on domain name patterns that are important to you, without extra downstream data processing.

Feed Descriptions and URLs

More feeds are being made available; inquire with enterprisesupport@domaintools.com to learn more.

Domain Discovery

New domains as they are discovered in domain registration information, observed by our global passive DNS sensor network, or reported by trusted third parties.

Feed endpoint: api.domaintools.com/v1/feed/domaindiscovery/

Download endpoint: api.domaintools.com/v1/download/domaindiscovery/

Jump to: Authentication | Feed API | Download API

Domain Hotlist

Domains with high Domain Risk Scores that have also been active within 24 hours.

Each entry in the Domain Hotlist is an apex-level domain. Domains are emitted when the two attributes are met within a 24 hour period:

  • Observed by passive DNS
  • Assigned a Domain Risk Score of ≥70 Proximity OR ≥90 Phish OR ≥90 Malware OR ≥90 Spam

Domain Risk Scores have an expiration time of 24 hours:

  • When a domain is assigned a high Domain Risk Score, and activity was observed in passive DNS over the previous 24 hours, the domain is emitted immediately with a 24 hour expiration time.
  • If a domain is assigned a high Domain Risk Score but there is no passive DNS activity over the past 24 hours, the system waits the Domain Risk Score's 24 hours. If passive DNS activity is observed on a domain that already has a high and live (i.e., not expired) Domain Risk Score, the domain is emitted with the expiration time of 24 hours from the original risk observation.
  • Risky domains without passive DNS activity are not emitted.

The Domain Hotlist includes an expires response field with the expiration time in UTC. We consider the score invalid after 24 hours and recommend the customer should delete it from their side or exclude it from detections or queries after the expiration.

Feed endpoint: api.domaintools.com/v1/feed/domainhotlist/

Download endpoint: api.domaintools.com/v1/download/domainhotlist/

Jump to: Authentication | Feed API | Download API

Domain Risk

Real-time updates to Domain Risk Scores for apex domains, regardless of observed traffic.

Domains are emitted at the moment they reach a combined Domain Risk Score of 70+.

We recommend customers stop using Domain Risk entries older than 24 hours as seen in the timestamp value. (The domainrisk feed does not have the expires field.)

Feed endpoint: api.domaintools.com/v1/feed/domainrisk/

Download endpoint: api.domaintools.com/v1/download/domainrisk/

Jump to: Authentication | Feed API | Download API

Newly Active Domains (NAD)

Domains observed in passive DNS to be newly active in the latest lifecycle of the domain: either for the first time, or after an inactive period of at least 10 days.

Domains are apex-level (e.g. example.com but not www.example.com), and are emitted as they are observed.

Feed endpoint: api.domaintools.com/v1/feed/nad/

Download endpoint: api.domaintools.com/v1/download/nad/

Jump to: Authentication | Feed API | Download API

Newly Observed Domains (NOD)

Domains observed for the first time, and not previously, in passive DNS.

Domains are apex-level (e.g. example.com but not www.example.com), and are emitted as they are observed.

Feed endpoint: api.domaintools.com/v1/feed/nod/

Download endpoint: api.domaintools.com/v1/download/nod/

Jump to: Authentication | Feed API | Download API

Newly Observed Hostnames (NOH)

Hostname resolutions that we observe for the first time with our global passive DNS sensor network.

Hostnames are emitted as they are observed.

Feed endpoint: api.domaintools.com/v1/feed/noh/

Download endpoint: api.domaintools.com/v1/download/noh/

Jump to: Authentication | Feed API | Download API

Parsed Domain RDAP

Changes to global domain registration information, populated by the Registration Data Access Protocol (RDAP). Compliments the 5-Minute WHOIS Feed as registries and registrars switch from Whois to RDAP.

Feed endpoint: api.domaintools.com/v1/feed/domainrdap/

Download endpoint: api.domaintools.com/v1/download/domainrdap/

Jump to: Authentication | Feed API | Download API

Note that the text/csv Accept header is not accepted by the Domain RDAP feed.

Summary of Access Methods

  • Real-time Feed API: Returns results based on absolute or relative times. Consult the Feed API Quick Start, authentication, and Feed API sections.
  • Download API: Our download API returns archives of past results as signed, temporary AWS S3 file links. Consult the Download API Quick Start, authentication, and Download API sections.
  • Response Policy Zone (RPZ): Feed contents delivered as real-time Response Policy Zones that populate DNS firewalls. Consult the Response Policy Zone section, below. The following feeds are currently available by RPZ: Newly Active Domains, Newly Observed Domains.

Getting Started

Authentication Quick Start

Authenticate with either API Header or API Key and Secret methods. Here is an example of API header authentication using curl, and a sessionID called mySIEM. One hour of results will return by default:

curl -H 'X-Api-Key: MY_API_KEY' 'https://api.domaintools.com/v1/feed/nod/?sessionID=mySIEM'

To authenticate with the API Key and Secret method, provide your api_username and api_key as query parameters. Here is a curl example, with the same sessionID (mySIEM):

curl 'https://api.domaintools.com/v1/feed/nod/?api_key=MY_API_KEY&api_username=MY_API_USERNAME&sessionID=mySIEM'

Feed API Quick Start

The Feed API standard access pattern is to periodically request the most recent feed data, as often as every 60 seconds. Specify the range of data you receive in one of two ways:

  • With sessionID: Make a call and provide a new sessionID parameter of your choosing. The API will return the past hour of results by default.
    • Each subsequent call to the API using your sessionID will return all data since the last.
    • Only one sessionID can be maintained at a time per account.
    • Any single request returns a maximum of 10M results. Requests that exceed 10M results will return a HTTP206 response code; repeat the same request (with the same sessionID) to receive the next tranche of data until receiving a HTTP 200 response code.
    • This session ID can be deleted to clear the saved offset by using an HTTP DELETE call.
  • Or, specify the time range in one of two ways:
    • Either an after=-60 query parameter, where (in this example) -60 indicates the previous 60 seconds.
    • Or after and before query parameters for a time range, with each parameter accepting an ISO-8601 UTC formatted timestamp (a UTC date and time of the format YYYY-MM-DDThh:mm:ssZ).

Optional details:

  • The default response format is Newline-Delineated JSON (NDJSON) (e.g., JSON lines).
    • Optionally enable CSV format response option by setting a header Accept: text/csv, and optionally adding &headers=1 to the query parameters to include column headers as the first line in the response. text/csv is not available for the Parsed Domain RDAP Feed.
  • Optionally limit the response payload for testing by adding a top=N query parameter, where N is the number of results to return.
  • Optionally add server-side domain filtering using the domain query parameter to return a specific domain or domains where a specific substring is present.
    • Exact match example: domain=example.com
    • Partial match example: domain=*example*
    • Sometimes, the asterisk will need to be urlencoded to %2A depending on the method used to query. In a curl command, you can use an asterisk (*) as long as you single-quote the URL.

Download API Quick Start

The Download API returns short-lived, signed URLs for pairs of files containing historical feed data that change each hour, where {feed_short_name} is one of: nod, nad, noh, domaindiscovery, domainhotlist, domainrisk, domainrdap:

  • A data file: {feed_short_name}/{YYYY-MM-DD}/{feed_short_name}-{YYYYMMDD}.{starthour:HH00}-{endhour:HH00}.json.gz
  • A checksum file: {feed_short_name}/{YYYY-MM-DD}/{feed_short_name}-{YYYYMMDD}.{starthour:HH00}-{endhour:HH00}.json.gz.sha256

Here is an example curl command to retrieve the list of NOD files available to download:

curl 'https://api.domaintools.com/v1/download/nod?api_key=MY_API_KEY&api_username=MY_API_USERNAME'

Requirements

You will require a license to one or more DomainTools feeds, and API credentials. Your required API credentials will vary with your authentication method, detailed below.

Obtain your API credentials from your group’s API administrator. API administrators can manage their API keys at https://research.domaintools.com, selecting the drop-down account menu and choosing API admin.

Authentication

Authentication is available via HTTP header, HMAC, or API key and secret. If you need to obtain credentials or are unsure about your authentication options, please contact enterprisesupport@domaintools.com.

API Key (Header) Authentication

Authenticate your requests by including the API key in the header of each HTTP request. The API key serves as a unique identifier and is used to authenticate your requests.

Required API Key Authentication Parameters

Required Parameters Value
X-Api-Key MY_API_KEY

Example Request with API Key Authentication

curl -H 'X-Api-Key: MY_API_KEY' 'https://api.domaintools.com/v1/feed/nod/?after=-60

HMAC Signature Authentication

HMAC authentication is a secure alternative to API key-based methods. It requires signing each request with a SHA1 HMAC digest derived from your API secret, providing integrity and authenticity without exposing credentials directly in the request.

This method is recommended for systems where authentication credentials should not be stored in plain text or included directly in request URLs.

Required Parameters Value
api_key API Key
api_username API Username
signature HMAC-SHA1 signature of api_username, timestamp, and request path
timestamp ISO 8601 formatted UTC time (e.g., 2025-06-01T15:30:00Z)

Constructing the HMAC Signature

The HMAC signature is computed as follows:

signature = HMAC_SHA1(api_key, api_username + timestamp + uri_path)

Example Python signing function:

import hmac
import hashlib

def sign(api_username, api_key, timestamp, uri):
    params = "".join([api_username, timestamp, uri])
    return hmac.new(
        api_key.encode("utf-8"), params.encode("utf-8"), hashlib.sha1
    ).hexdigest()

Example Python HMAC request:

import os
import datetime
import urllib.parse
import requests

api_username = os.environ["API_USERNAME"]
api_key = os.environ["API_KEY"]
uri = "/v1/feed/nod/"
host = os.environ.get("HOST", "https://api.domaintools.com/")
timestamp = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
signature = sign(api_username, api_key, timestamp, uri)

response = requests.get(
    urllib.parse.urljoin(host, uri),
    params={
        "api_username": api_username,
        "signature": signature,
        "timestamp": timestamp,
        "sessionID": "mySIEM",  # required parameter for queries
        "top": 1  # returns a single result, for testing
    },
)

API Key and Secret Authentication

This is the easiest and most insecure authentication scheme to implement: each request contains the full API key and API secret. DomainTools typically recommends using API Header authentication instead. If you are unsure about your authentication options, please contact enterprisesupport@domaintools.com.

Required Parameters for API Key and Secret

Required Parameters Value
api_username API username
api_key API key

Example Request with API Key and Secret

https://api.domaintools.com/v1/feed/nod/?after=-60&api_username=&api_key=xxxxxx

Response Policy Zone (RPZ) Authentication

RPZ authentication is detailed in the Response Policy Zone section, below.

Feed API

Feed API Base URL

api.domaintools.com/v1/feed/

Feed API Endpoints

Feed API Feed Endpoint
Domain Discovery domaindiscovery
Domain Hotlist domainhotlist
Domain RDAP domainrdap
Domain Risk domainrisk
Newly Active Domains nad
Newly Observed Domains nod
Newly Observed Hostnames noh

Feed API Header Options

Key Value Description
Accept application/x-ndjson Get results in JSON Lines format.
Accept text/csv Get results in CSV format. Not available with the Download API, or in the domainrdap Feed API endpoint. Optionally adding &headers=1 to the query parameters will include column headers as the first line in the response.

Note that the text/csv Accept header is not accepted by the Domain RDAP feed.

Feed API Common GET Request Parameters

Name Type Valid Values Description Example Required Feeds
after integer -1 to -432,000 The start of the query window in seconds, relative to the current time, inclusive. after=-60 Required if before or sessionID not provided. all
after string ISO 8601 datetime string in UTC form The start of the query window, inclusive. after=2024-10-16T10:20:00Z Required if before or sessionID not provided. all
before integer -1 to -432,000 The end of the query window in seconds, relative to the current time, inclusive. before=-120 Required if after or sessionID not provided. all
before string ISO 8601 datetime string in UTC form The end of the query window. before=2024-10-16T10:20:00Z Required if after or sessionID not provided. all
domain string Domain character set restricted by the DNS specification (Letters, Digits, Hyphens). International characters should be specified in punycode. A trailing dot is acceptable. Multiple domain filters are accepted in a request. Filter for an exact domain or a domain substring by prefixing or suffixing your string with *. Multiple parameters are supported. The URL-encoded version of * (%2A) may be required. domain=*apple*&domain=*microsoft* No all
fromBeginning boolean true, false Functions with new Session IDs to return the first hour (rather than the last). Returns an error if Session ID already exists. fromBeginning=true No all
headers boolean 0, 1 Adds a header to the first line of response when text/csv is set in header parameters. headers=1 No all
malware_min integer 1-100 Filter domains for malware domain risk scores greater than or equal to this value. malware_min=75 No Domain Hotlist, Domain Risk
overall_min integer 1-100 Filter domains for overall domain risk scores greater than or equal to this value. overall_min=75 No Domain Hotlist, Domain Risk
phishing_min integer 1-100 Filter domains for phishing domain risk scores phishing_min=75 No Domain Hotlist, Domain Risk
proximity_min integer 1-100 Filter domains for proximity domain risk scores proximity_min=75 No Domain Hotlist, Domain Risk
sessionID string 1-64 alphanumeric characters ([a-zA-Z0-9-]+). A string that serves as a unique identifier for the session, used for resuming data retrieval from the last point. sessionID=mySIEM Required to continue where you left off. all
spam_min integer 1-100 Filter domains for spam domain risk score spam_min=75 No Domain Hotlist, Domain Risk
top integer Positive integer, 1-1,000,000,000. Limits the number of results in the response payload. When applied to domainrisk, results are sorted by overall_risk (desc). top=10 No all

Feed API Common DELETE Request Parameters

Name Type Valid Values Description Examples Required
sessionID string 1-64 alphanumeric characters ([a-zA-Z0-9-]+). A string that serves as a unique identifier for the session, used for resuming data retrieval from the last point. sessionID=mySIEM No

Feed API Query Examples

Use curl and header authentication to retrieve the last 60 seconds of Newly Observed Domains:

curl -H 'X-Api-Key: MY_API_KEY' 'https://api.domaintools.com/v1/feed/nod/?after=-60'

Use curl and header authentication to retrieve the last 4 hours of Newly Observed Domains that contain the keyword bank:

curl -H 'X-Api-Key: MY_API_KEY' 'https://api.domaintools.com/v1/feed/nod/?after=-14400&domain=*bank*'

Feed API Response Codes

Code Description
200 OK: The request was successful.
206 Partial content: The request was successful, but only a portion of the data was returned.
400 Malformed request
401 Unauthorized
403 Forbidden
404 sessionID does not exist
422 Invalid header query parameter

If an API call returns a HTTP 206 response, continue submitting the same request (with the same sessionID) until the API returns a HTTP 200, signalling that all the data for the request has been delivered.

Feed API Response Structure and Examples

NAD, NOD, NOH, and Domain Discovery Response Structure

NAD, NOD, NOH, and Domain Discovery return one hour of results by default.

Responses are returned in JSON-lines (JSONL), with each response containing one domain entry per line. Each entry contains a timestamp in ISO 8601 UTC form, and the domain.

Name Type Valid Values Description Example
domain str Domain character set restricted by the DNS specification (Letters, Digits, Hyphens) Apex-level domain for NAD, NOD, and Domain Discovery. The NOH feed returns full hostnames (e.g., including subdomains.). "domain":"example.com"
timestamp str ISO 8601 datetime string in UTC form Discovery timestamp "timestamp":"2024-11-15T16:14:39Z"

Example response:

{"timestamp":"2024-11-15T16:14:39Z","domain":"domiantools.com"}
{"timestamp":"2024-11-15T16:14:38Z","domain":"domsintools.com"}
{"timestamp":"2024-11-15T16:14:36Z","domain":"edomaintools.com"}
{"timestamp":"2024-11-15T16:14:35Z","domain":"omaintools.com"}
{"timestamp":"2024-11-15T16:14:35Z","domain":"v-domaintools.com"}

Domain Hotlist Response Structure

The Domain Hotlist returns 1 hour of results by default. Null values are emitted.

Responses are returned in JSON-lines (JSONL), with each response containing one domain entry per line. In addition to the domain and timestamp parameters, the Domain Hotlist and Domain Risk Feeds include risk scoring:

Name Type Valid Values Description Example
timestamp str ISO 8601 UTC timestamp The date and time of discovery in UTC "timestamp"="2024-11-15T16:14:39Z"
domain str Domain character set restricted by the DNS specification (Letters, Digits, Hyphens). Apex-level domain for NAD, NOD, and Domain Discovery. The NOH feed returns full hostnames (e.g., including subdomains.). "domain"="example.com"
phishing_risk int 0-100 | null Phishing domain risk score phishing_risk=80
malware_risk int 0-100 | null Malware domain risk score malware_risk=80
spam_risk int 0-100 | null Spam domain risk score spam_risk=80
proximity_risk int 0-100 Proximity domain risk score proximity_risk=80
overall_risk int 0-100 | null Overall domain risk score overall_risk=80
expires str ISO 8601 UTC timestamp The expiration of the entry. The expiration is 24 hours after the first of the two required events (risk or activity) is detected. "expires":"2025-08-19T19:08:58Z"

Example response via api.domaintools.com/v1/feed/domainhotlist?sessionID=mySOC&top=3 (with header authorization):

{"timestamp":"2025-08-18T19:16:47Z","domain":"domiantools.com","phishing_risk":99,"malware_risk":99,"spam_risk":99,"proximity_risk":99,"overall_risk":99,"expires":"2025-08-19T19:08:58Z"}
{"timestamp":"2025-08-18T19:27:56Z","domain":"domsintools.com","phishing_risk":99,"malware_risk":99,"spam_risk":99,"proximity_risk":99,"overall_risk":99,"expires":"2025-08-19T19:23:30Z"}
{"timestamp":"2025-08-18T18:52:12Z","domain":"edomaintools.com","phishing_risk":99,"malware_risk":99,"spam_risk":99,"proximity_risk":99,"overall_risk":99,"expires":"2025-08-19T18:44:51Z"}

Domain Risk Response Structure

The Domain Risk Feed returns one hour of results by default. Null values are emitted.

Responses are returned in JSON-lines (JSONL), with each response containing one domain entry per line. In addition to the domain and timestamp parameters, the Domain Hotlist and Domain Risk Feeds include risk scoring:

Name Type Valid Values Description Example
timestamp str ISO 8601 UTC timestamp The date and time of discovery in UTC "timestamp"="2024-11-15T16:14:39Z"
domain str Domain character set restricted by the DNS specification (Letters, Digits, Hyphens) Apex-level domain for NAD, NOD, and Domain Discovery. The NOH feed returns full hostnames (e.g., including subdomains.). "domain"="example.com"
phishing_risk int 0-100 | null Phishing domain risk score phishing_risk=80
malware_risk int 0-100 | null Malware domain risk score malware_risk=80
spam_risk int 0-100 | null Spam domain risk score spam_risk=80
proximity_risk int 0-100 Proximity domain risk score proximity_risk=80
overall int 0-100 | null Overall domain risk score overall_risk=80

Example response via api.domaintools.com/v1/feed/domainrisk?sessionID=mySOC&top=3 (with header authorization):

{"timestamp":"2025-04-22T16:08:33Z","domain":"omaintools.com","phishing_risk":94,"malware_risk":88,"spam_risk":93,"proximity_risk":80,"overall":94}
{"timestamp":"2025-04-22T16:08:29Z","domain":"v-domaintools.com","phishing_risk":96,"malware_risk":91,"spam_risk":99,"proximity_risk":85,"overall":99}
{"timestamp":"2025-04-22T16:08:34Z","domain":"domanitools.com","phishing_risk":98,"malware_risk":97,"spam_risk":68,"proximity_risk":72,"overall":98}

Domain RDAP Response Structure

The Parsed Domain RDAP feed returns one hour of results by default.

Responses are returned in JSON (not NDJSON). Note that the text/csv Accept header is not accepted by the Domain RDAP feed.

Domain RDAP records for a given domain may be provided by a domain registry, registrar, or both. Domain registries maintain authoritative information about one or more top-level domains (e.g., .com), while domain registrars manage apex domains (e.g., domaintools.com). When domain information is present from both the registry and registrar, this API presents a record containing both sets of results, as well the original raw JSON record, from both the registry and registrar.

Each response begins with either the raw registrar record, the raw registry record, or when useful information is present in both records, the response will contain both the registrar and registry record. The parsed record then follows the raw record.

Output field Type Valid Values Description Example
timestamp str ISO 8601 UTC timestamp The date and time of discovery in UTC "timestamp"="2024-11-15T16:14:39Z"
domain str Domain character set restricted by the DNS specification (Letters, Digits, Hyphens) Apex-level domain for NAD, NOD, and Domain Discovery. The NOH feed returns full hostnames (e.g., including subdomains.). "domain"="example.com"
raw_record obj N/A Contains the raw registry and/or registrar for the domain. See example below.
first_request_timestamp str ISO 8601 UTC timestamp The timestamp of the first request "first_request_timestamp"="2025-04-23T10:30:17Z"
requests array N/A Record request objects See example below
data str JSON string The raw data of the request "data"="{\"objectClassName\":\"domain\",\"handle\":\"1831890332_DOMAIN_NET-VRSN\"...}"
source_type str Source type values The source type of the request "source_type"="registrar"
timestamp str ISO 8601 UTC timestamp The timestamp of the request "timestamp"="2025-04-23T10:30:18Z"
url str URL format The URL associated with the request "url"="https://rdap.nicproxy.com/domain/domiantools.com"
parsed_record obj N/A Contains parsed information from the raw record See nested fields below
registrar_request_url str URL format The URL for the registrar request "registrar_request_url"="https://rdap.nicproxy.com/domain/domiantools.com"
registry_request_url str URL format The URL for the registry request "registry_request_url"="https://rdap.nicproxy.com/domain/domiantools.com"

In the following example using domaintools.com, both a registry and registrar record are present (note source_type). The raw records, as well as the content of the parsed record, are removed for brevity.

With the following query:

curl -sH "X-API-Key: $FEEDAPIKEY" 'https://api.domaintools.com/v1/feed/domainrdap?sessionID=mySOC&top=1'`

The following results are obtained:

{
    "timestamp": "2024-11-15T00:00:19Z",
    "domain": "domaintools.com",
    "raw_record": {
        "first_request_timestamp": "2024-11-15T00:00:14Z",
        "requests": [
            {
                "data": "{RAW REGISTRY RECORD}",
                "source_type": "registry",
                "timestamp": "2024-11-15T00:00:14Z",
                "url": "https://rdap.verisign.com/com/v1/domain/domaintools.com"
            },
            {
                "data": "{RAW REGISTRAR RECORD}",
                "source_type": "registrar",
                "timestamp": "2024-11-15T00:00:16Z",
                "url": "https://enom.rdap.tucows.com/domain/DOMAINTOOLS.COM"
            }
        ]
    },
    "parsed_record": {
        "parsed_fields": {PARSED FIELDS},
        "registrar_request_url": "https://enom.rdap.tucows.com/domain/DOMAINTOOLS.COM",
        "registry_request_url": "https://rdap.verisign.com/com/v1/domain/domaintools.com"
    }
}

Download API

The download API returns 90 days of historical results in the form of temporary AWS S3 files. The AWS S3 files are signed and come in pairs:

  • A data file: {feed_short_name}/{YYYY-MM-DD}/{feed_short_name}-{YYYYMMDD}.{starthour:HH00}-{endhour:HH00}.json.gz
  • A checksum file: {feed_short_name}/{YYYY-MM-DD}/{feed_short_name}-{YYYYMMDD}.{starthour:HH00}-{endhour:HH00}.json.gz.sha256

The API lists the files available for download, after which individual files can be downloaded from the signed URL. The hourly files are gzip-compressed JSON.

Note that setting the limit parameter to an odd number will deliver a data file without its checksum companion.

Download API Base URL

api.domaintools.com/v1/download/

Download API Endpoints

Feed API Feed Endpoint
Domain Discovery domaindiscovery
Domain Hotlist domainhotlist
Domain RDAP domainrdap
Domain Risk domainrisk
Newly Active Domains nad
Newly Observed Domains nod
Newly Observed Hostnames noh

E.g., api.domaintools.com/v1/download/nad/

Download API Common GET Query Parameters

Parameter Description Type Required?
api_key API key provided by DomainTools, dashes included string Yes (for key auth)
api_username API username provided by DomainTools string Yes (for key auth)
app_name Name of your appliance, playbook, module, etc., or in combination. Useful to help with debugging string No
app_partner Your product name. Useful to help debugging string No
app_version Your version number. Useful to help with debugging string No
limit Limit the list of signed files. Ordering of files is always descending, so the latest files are first. integer No
signature HMAC hash of your request, using the MD5, SHA1, or SHA256 hashing algorithm string Yes (for HMAC auth)
timestamp Current timestamp for HMAC authentication, in ISO 8601 format. (e.g. 2025-01-10T15:44:39.118Z) string Yes (for HMAC auth)

Download API Query Examples

Get the latest, single (limit=1) signed download URL from Newly Observed Domains using curl:

curl -sH "X-API-Key: YOUR_API_KEY" 'https://api.domaintools.com/v1/download/nod/?limit=1'

Download API Response Codes

Code Description
200 OK: The request was successful.
400 Malformed request
401 Unauthorized
403 Forbidden
422 Invalid header query parameter

If an API call returns a HTTP 206 response, continue submitting the same request (with the same sessionID) until the API returns a HTTP 200, signalling that all the data for the request has been delivered.

Download API Common Response Parameters

Name Type Description
download_name string Name of the feed.
etag string Entity tag (a hash of the object).
last_modified string Last modified date of the file in ISO 8601 format.
size integer Size in kilobytes (KB)
url string Signed AWS CloudFront download URL; consult note below.

The Download API returns short-lived, signed URLs for two files containing historical feed data that change each hour, where {feed_short_name} is one of: nod, nad, noh, domainrdap, domaindiscovery:

  • A data file: {feed_short_name}/{YYYY-MM-DD}/{feed_short_name}-{YYYYMMDD}.{starthour:HH00}-{endhour:HH00}.json.gz
  • A checksum file: {feed_short_name}/{YYYY-MM-DD}/{feed_short_name}-{YYYYMMDD}.{starthour:HH00}-{endhour:HH00}.json.gz.sha256

Note that setting the limit parameter to an odd number will return a checksum file without its data file.

Download API Response Structure and Example

API Response

Note that returned file URLs are in pairs: a data file (ending in .json.gz) and a checksum file (ending in .json.gz.sha256).

{
  "response": {
    "download_name": "nod",
    "files": [
      {
        "name": "nod/2025-08-21/nod-20250821.1200-1300.json.gz.sha256",
        "last_modified": "2025-08-21T13:00:13+00:00",
        "etag": "\"ETAG\"",
        "size": "64",
        "url": "https://dyyl2mzrdiuqox.cloudfront.net/nod/2025-08-21/nod-20250821.1200-1300.json.gz.sha256?aui=14592&ai=1708207&Expires=1755824426&Signature=SIGNATURE&Key-Pair-Id=KEYPAIRID"
      },
      {
        "name": "nod/2025-08-21/nod-20250821.1200-1300.json.gz",
        "last_modified": "2025-08-21T13:00:13+00:00",
        "etag": "\"ETAG\"",
        "size": "140725",
        "url": "https://d2rdimzuqyylox.cloudfront.net/nod/2025-08-21/nod-20250821.1200-1300.json.gz?aui=14592&ai=1708207&Expires=1755824426&Signature=SIGNATURE&Key-Pair-Id=KEYPAIRID"
      }
    ]
  }
}

File Contents

The *.json.gz.sha256 file is a checksum containing a SHA-256 hash value used to verify the integrity of the downloaded file.

The *.json.gz file, uncompressed to a JSON file containing the same information as the Feed API.

Response Policy Zone (RPZ)

RPZ delivery is available for Newly Active Domains (nad) and Newly Observed Domains (nod).

Hotlists are delivered over DNS Zone Transfer from DomainTools RPZ providers using AXFR, IXFR, and DNS Notify.

The DNS resolver using our RPZ feed will respond with an NXDOMAIN (“no such domain”) status code for queries for matching domains in the Threat Feed.

RPZ Access Configuration

RPZ Zone Names

Zone name labels are constructed (left to right) from a time period, followed by a list name, followed by .rpz.domaintools.com:

[interval].[list].rpz.domaintools.com

Available time intervals: 10m, 30m, 1h, 3h, 12h.

For example, the 1 hour NOD list: 1h.nod.rpz.domaintools.com.

RPZ Provider Allowlist

Before attempting to connect to our RPZ provider, please be sure to provide two sets of IP addresses to DomainTools at enterprisesupport@domaintools.com:

  • The IP address(es) from which you will connect to the RPZ provider server;
  • The IP address(es) to which you would like DNS Notify messages to be sent.

These two sets of addresses are typically the same.

You will also need to add rules to your firewall’s access control list(s) for DomainTools hosts to send UDP packets to port 53 of your DNS server, so that it can receive the DNS NOTIFY packets for updates.

RPZ Provider Server Addresses

Primary Server: IPv4: 104.244.14.88

Fallback Server: IPv4: 104.244.14.89

RPZ TSIG Information

Recommendation: Local RPZ Allowlist Zone

We recommend that customers maintain an allowlist zone for instances when a customer has more, specific information about a domain than DomainTools. Contact enterprisesupport@domaintools.com until this recommendation is fully documented in Q1 2025.

RPZ Response Format

Each hotlist is formatted in accordance with the draft specification for DNS Response Policy Zones. All domain entries are listed with NXDOMAIN outcomes by default (CNAME .). Each domain entry contains both apex and wildcard *. entries (i.e., two records per domain).

For example:

$ORIGIN RPZ.EXAMPLE.ORG.
example.com                 CNAME   .
*.example.com               CNAME   .

RPZ Troubleshooting

The DNS resolver using our RPZ feed will respond with an NXDOMAIN (“no such domain”) status code for queries for matching domains in the RPZ feed. The NXDOMAIN response will include an SOA record in the ADDITIONAL section of the DNS response (and no ANSWER). This SOA record may be used to troubleshoot the RPZ feed. In addition, see your RPZ related debugging logs for your DNS resolver.

This SOA will identify that it came from the RPZ. For example, the following label tells you what RPZ feed was used and the SOA RNAME indicates the primary DNS server (rpz-ns1.domaintools.com) that hosts this RPZ zone:

;; ADDITIONAL SECTION:
3h.nod.rpz.domaintools.com. 86400 IN SOA rpz-ns1.domaintools.com. noc.domaintools.com. 36625313 600 300 86400 86400

Our RPZ Threat Feeds also have a testing domain entry and its corresponding wildcard which may be used to verify the RPZ feed is loaded and working. You may do a DNS lookup, like with dig, for test.rpz.domaintools.test and it should respond with the NXDOMAIN and the ADDITIONAL section SOA record indicating its originating RPZ feed. If the ADDITIONAL section SOA record response does not have the domainhotlist feed name, then it did not come from the RPZ.

Python Wrapper Methods

Consult our GitHub documentation at https://github.com/DomainTools/python_api.

Last modified: Aug 20, 2025