Skip to main content
A look-alike domain is registered before it is used. A name such as acme-login.com is often registered days or weeks before the first phishing mail or fake sign-in page goes out. This source shows you those registrations while they are still new. It collects newly registered domains from 9 feeds: WHOIS and registrar lists, newly-registered-domain threat feeds and certificate transparency logs. The index keeps one record per domain, so a domain that several feeds report appears once. Every call is synchronous. The answer comes back in the same response. Availability: Expert Search, included in every edition. Cost: no metered allowance. With an API key, each call that returns 2xx uses 1 unit of your monthly API Calls allowance, and a non-2xx response is refunded. Every call also counts toward the per-second rate limit. See Rate limits. When your license is not active, all four endpoints return 403:

Pick an endpoint

Search by keyword

Send your brand as domain to domain_search_keyword. To search several terms in one call, separate them with commas.
Each term is reduced to a name before matching:
  • The term is lowercased.
  • Subdomains and the public suffix are removed, including two-part suffixes such as .co.uk. acme.com and login.acme.com both search for acme.
  • Duplicate names are dropped, so acme.com,login.acme.com runs one search.
  • The name is matched as a case-insensitive substring anywhere in the registered domain. acme returns acme-login.com and portal.acme-login.com.
You cannot look up one exact domain. domain=acme.com searches for acme, not for acme.com alone. Short or generic names return a lot of noise: acme is a useful term, pay is not.
A call takes up to 200 terms. Each name must be at least 3 characters after the suffix is removed, so ab is rejected, with or without a suffix. Omit start_date and end_date to search the whole index.

Narrow the matches

Three optional conditions cut the noise of a substring match. When you pass more than one, a domain must meet all of them.
The conditions apply to the keyword search only. The list and the export do not take them.

Result cap

A keyword search returns at most 10,000 matches. The 10,000 are picked before sorting, so a capped result is not guaranteed to hold the newest registrations. A larger page_size does not lift the cap. When count is 10000, narrow the search with start_date, end_date, source or the conditions, or export the same domain. The export has no cap.

Request parameters

Dates without a timezone are read as UTC.

What comes back

The envelope carries the paging state. The domains are in results.
  • count — matches across all pages. At most 10000 on a keyword search.
  • total_pages — pages available at the current page_size.
  • next / previous — the URLs of the adjacent pages on this API, or null at the ends.
  • results — one record per domain:
    • domain — the registered domain.
    • source — the feed that first reported it.
    • created_at — when the index first recorded it, as an ISO 8601 UTC timestamp.
created_at is when the index first recorded the domain, not the registrar’s registration timestamp. When several feeds report the same domain, the first one to report it is the source, and later reports add no new record.

Reading the results

Each hit is a registration, not an attack. The name tells you what it imitates:
  • Sign-in names. acme-login, acme-sso and acme-verify imitate a login page.
  • Payment and support names. acme-billing and acme-support imitate invoices, refunds or help desks.
  • Typos and other TLDs. A swapped character or a different TLD next to acme.com catches mistyped addresses and mail.
  • Your own registrations. A regional site or campaign domain your organization registered matches too.
To follow a domain further through the API:

Monitor new registrations

To receive new matches without repeating the search, create a monitor on the Domain Search service (16 in the service list) with your terms as args:
The monitor applies the same rules as the keyword search: up to 200 terms, each name at least 3 characters. See Create and manage monitors.

Browse the daily feed

domain_search_list returns every new domain in a date range, with no keyword. The response has the same shape as the keyword search.
It differs from the keyword search in three ways:
  • It takes no domain. Filter with start_date, end_date and source.
  • Omitted dates default to today (UTC), not to the whole index. Set them for any other day.
  • It has no 10,000 cap. count is every domain in the range.
A full day is a large result. Page with a high page_size, or export the range in one file.

Export

domain_search_export returns a file instead of JSON. The columns are Domain, Source, Created At and Updated At, with timestamps in ISO 8601.
domain decides what the file holds:
  • With domain, the file holds every match for those terms. The keyword rules apply, the dates are optional bounds, and there is no 10,000 cap.
  • Without domain, the file holds the date range, which defaults to today (UTC).
source and ordering work as on the search endpoints. file_format is csv (default) or xlsx. The server names the file domain_registrations_<terms> or domain_registrations_<start>_to_<end>.

Feeds

Nine feeds supply new domains, once a day: Whoisfreaks · Shreshta Labs Weekly · Shreshta Labs Monthly · CENK NRD · SSL Logs · Whoisextractor · Codepunch · Hagezi NRD7 · Opensquat source also accepts three older feed names: NITT, xRuffKez NRD 14-day and xRuffKez NRD 14-day DGA. These feeds no longer deliver new domains, so filtering on them returns only older records. source takes these names in two ways:
  • Keyword search, list and export take one or more names, comma-separated, in any letter case. An unknown name returns 400.
  • Stats takes one name, spelled exactly as listed here.
The feeds overlap and differ in latency and coverage. Filtering to one feed narrows your results, so leave source off unless you are checking a specific feed.

Feed volume and health

domain_search_stats reports how many domains each feed delivered and whether its last run worked. Check it when a search returns nothing: a failing feed leaves a gap in the window you searched.
start_date and end_date default to today (UTC). The counts cover the feed runs in that range.
  • totals — unique, duplicate and total_fetched across the range. unique domains were new to the index. duplicate domains were already in it.
  • by_day — the same three counts per day, each day with its own by_source breakdown.
  • by_source — the three counts per feed across the range, sorted by feed name.
  • sources_health — the current state of each feed: name, is_healthy, last_run_at, last_status_code and last_error. It does not depend on the date range.
is_healthy: false means the feed’s last run failed, so its coverage is missing until a run succeeds. last_run_at: null means the feed has not run yet.

Errors

Endpoints