Skip to main content
The organization analytics answer “how exposed are we?” in numbers. How many credentials for your domain leaked in the past 30 days? Which addresses appear in the most leaks? How many leaked passwords are shorter than eight characters? Which of your subdomains show up in stealer logs? In the API reference these endpoints sit under the Leaks Analysis tag. Every figure covers your organization’s own domain, the domain that get_direct_org_info returns, within one analysis window: the last 7, 30 or 365 days. An API key always reads its own organization’s figures. Clients whose assets you register in your own organization are not covered: to report on a client’s domain here, the client needs a client workspace of its own, read with that workspace’s key. See Client organizations. Each call answers in the same response. There is no job to start and nothing to poll. One endpoint, leak_type_analysis, works differently: it runs a live search for the domain and dates you send.

Availability and cost

Availability: every plan with a license in force. None of these endpoints checks a plan feature. Cost: no feature allowance. Each call made with an API key uses 1 unit of your monthly API Calls allowance, refunded if the response is not 2xx. Every call also counts toward the per-second rate limit. See Rate limits. Without a license in force, every endpoint on this page returns 403:
These endpoints never return the plan-feature 403, a feature-allowance 429 (detail, resource, period, limit) or a capacity 409. The per-second rate limit 429 and the API Calls allowance 429 still apply. See When you exceed a limit. Plans and quotas explains license states.

How the figures are built

  • Precomputed once a week. The figures are not computed when you call. DarknetSearch recomputes the figures of every organization with a license in force once a week, for all three windows at once. A read returns the last computed set. The numbers change about once a week, so there is no need to poll them.
  • Counted back from the last refresh. A window covers the 7, 30 or 365 days before the last weekly refresh, not the days before your call.
  • Indexed date, not theft date. The breach feed, the subdomain list, the risky-users chart and the password strength figures select leak records by the date DarknetSearch indexed them, not by when the credentials were stolen.
  • Empty until the first run. For a new organization, lists stay empty and counts stay 0 until its first computation finishes. Before the analytics service knows the organization at all, reads return 404. See Errors.
For current data on your domain, use Filtered credentials or the ULP feed. They search when you call.

Set the analysis window

The window is one setting for your whole organization. It is not a parameter of each read. Every API key of your organization reads through the same window, and the window stays set until someone changes it. Set it with update_current_date_range:
Read it with get_current_date_range. The response has the same shape.
All three windows are computed ahead of time, so a switch takes effect at once. The next read returns the figures for the new window.
Set the window at the start of every run, then read. Another integration in your organization may have changed it since your last run. Store the window next to the figures you save.
Any value other than 7D, 30D or 365D returns 400:

Read a summary in one run

1

Set the window

Send update_current_date_range with the window you want, as shown above.
2

Read the figures

Each read is a plain GET with no required parameters.
3

Page through the breach rows

Read account_breaches page by page until you have count rows.
A full summary takes ten calls or more, depending on how many breach pages you read. Each call uses 1 unit of your API Calls allowance.

Credential totals

leaked_credentials_stats counts the leaked credentials for your domain in the window.
unique_number can be 0 while total_number is not. That means the unique count was not available for that window, not that no credentials leaked.

The riskiest users and passwords

Top risky users

top_risky_users returns up to three users with the most leaked credentials in the window, highest number_of_leaks first.
  • username: the leaked login, usually an address on your domain.
  • number_of_leaks: how many leaked credentials name this user.
  • unique_count: the same count with duplicates filtered out.

Top risky passwords

top_risky_passwords returns up to three leaked username and password pairs that appear most often. The fields match the user list, plus password.
The rows are not sorted by count. Sort them by number_of_leaks yourself before you rank them.
The response carries passwords in clear text, and so does account_breaches. Keep these responses out of logs and tickets.

How leaks spread across users

risky_users_chart_stats shows whether exposure is concentrated on a few people or spread across many. It counts the email addresses on your domain found in leak records indexed in the window. For each address, it counts the distinct leaked files that address appears in. Then it groups the addresses by that number.
  • number_of_leaks: a number of distinct leaked files.
  • number_of_users_per_leak: how many addresses appear in exactly that many files.
Read each row as “number_of_users_per_leak addresses appear in number_of_leaks files each.” Above, 87 addresses appear in one file each, and one address appears in six. The rows come highest number_of_leaks first. Their number_of_users_per_leak values add up to the number of distinct addresses found: 103 here.

Password strength

password_strength_analysis tests the leaked passwords of your domain’s email addresses against a basic policy: at least 8 characters, 1 uppercase letter, 1 digit and 1 special character.
How to read the counts:
  • They overlap. A password can fail several rules, so the four counts do not add up to total_number. Divide each by total_number for a share: 248 of 412 here, or 60%, have no uppercase letter.
  • Only clear text is tested. Passwords come from leaks tagged password or hash. A value longer than 12 characters that is not all letters is treated as a hash and skipped.
  • Records, not people. The same password counts once for every leak record it appears in.

Where credentials were used

Three lists show the services and hosts that appear in your domain’s leaked credentials. They share one response shape and the same paging:
count is the length of the whole list. results holds one page of it. A page past the end of the list returns 404 with {"detail": "Invalid page."}. Stop when you have read count rows.

External services

external_service_login_stealer_logs lists services outside your domain where stealer logs captured your people’s credentials, most frequent first. Filter by name.
  • name: the service’s server name.
  • count: how many of the window’s leaked credentials were for that service.
To list matching accounts, run Filtered credentials with Employee Logins on External Services (filter_id 2). Filtered credentials is not limited to the analysis window, so its results do not match these counts one to one.

Your services, used by outsiders

internal_service_third_party_login lists services on your own domain that appear in leaked credentials with third-party logins, most frequent first. Filter by name.
The fields match the external list. To list matching accounts, run Filtered credentials with Third Party Logins (filter_id 7): logins to servers on your domain whose username is an email address on another domain. Filtered credentials is not limited to the analysis window.

Subdomains in stealer logs

top_affected_subdomains_stealer_logs lists the host names under your domain that appear in stealer logs indexed in the window, most frequent first. Filter by sub_domain.
  • sub_domain: a host name under your domain, such as vpn.acme.com. The bare domain acme.com is not listed.
  • leaks_number: how many stealer-log records name this host. Each record counts once, for the first host under your domain it names. Records with the same content count once.
The count stops after the first 2,000 host mentions in the window. To read the captures themselves, search Stealer logs for the host name.

List the leaked accounts

account_breaches is the row-level feed behind the figures: one row per leaked credential line for your domain in the window. It reads leak records indexed in the window that come from leaks tagged account. From each line that mentions your domain, it extracts the login, password and website. The filters narrow the rows inside the current window. They cannot reach outside it. To read rows older than the window, set a longer window first.
  • leak_date: when DarknetSearch indexed the record, in UTC. It is not the date of the breach.
  • login, password, website: the values extracted from the leaked line. Each is null when the line does not hold it, and each is cut at 200 characters.
  • leak_source: where the leak was found, such as darknet.
Rows come most recently indexed first. They are not deduplicated, so the same credential can appear in more than one row. A page past the end returns 404 with {"detail": "Invalid page."}. To read the full record around a row, search Raw Data for the login.

Classify leaks as personal or business

leak_type_analysis splits the leak records that mention a domain by the kind of leak they come from: personal accounts, business accounts, both, or neither. Unlike the other endpoints, it runs a live search when you call it. It ignores the analysis window and uses the dates you send. Leave out both dates to count every indexed record. start_date cannot be after end_date.
The analysis groups the matching records by leak, then sorts each leak into one bucket by its tags. private marks a leak of personal accounts and business a leak of business accounts.
  • total_leaks counts records, not leaks. It is the number of matching records across all leaks. The four buckets add up to it.
  • Each percentage is the bucket’s share of total_leaks, rounded to two decimals. All four are 0.0 when total_leaks is 0.
To leave a date open, omit the field. Sending null or an empty string returns 400.
The live search takes longer on a domain with many leaks. When it runs past the API’s wait, 30 seconds by default, the call returns 504. Narrow the date range and retry. The call is refunded.

Errors

These errors are specific to the endpoints on this page. Handle API errors lists the ones every endpoint shares, such as 401 and the rate-limit 429.

Endpoints