Want the machine, not the account? Filtered credentials hands you a deduplicated account list. Its organization-scoped sibling, Stealer logs, searches the same corpus by infected device — when an exposure traces to info-stealer malware and you need the whole capture (session cookies, screenshots, everything else that was on the machine), start there.
Run a search
A filtered search is a four-step async flow: see which filters exist, submit the search, poll until it’s ready, then read the accounts.1
See the filters
Start here.
leak_filter_filters returns the live catalog — each filter’s id, name, description, and parameters_schema. It’s the source of truth for the IDs below, since the catalog is configured per environment. The filter_id you pick is the arrangement: it decides which slice of your exposed accounts comes back, and whether you need to supply any filter_parameters.The Include/Exclude filters match a case-insensitive substring (so
alice also matches alice.smith), and take comma-separated values.2
Create the search
leak_filter_search_create submits it. Pass the domain, the filter_id, and mode. Use soft_wait: it returns a task to poll and still gives you results when only part of the data finished in time. (hard_wait is all-or-nothing — it reaches ready only once collection and analysis both fully complete, and fails otherwise.) It comes back with an id and a status.filter_id 1), passing them in filter_parameters (the key is plural — usernames):filter_id 3):3
Poll until it's ready
Fetch the task with The first search for a domain is the heavy one. The platform walks every leak exposing that domain — back to 2020 — deduplicates it, and scores each account. It runs asynchronously, so depending on how much data is exposed (and how busy the queue is) it can take many minutes, sometimes up to around 20. Poll about every 30 seconds; status moves
leak_filter_search_retrieve, passing the id from the previous step as filter_task_id, until its status reads ready (or incomplete_ready).pending → in_progress → ready. A status of incomplete_ready is also usable — it means results are available but built from a partial run.After that first run, the results are stored as deduplicated account rows. Every later search for the same domain only processes the delta — the new leaks since last time — so it comes back far faster.4
Read the accounts
Fetch the results with
leak_filter_search_results, again by filter_task_id. Results are paginated (count, next, previous, results).filter_task_id to track. leak_filter_domain_search_results takes domain_url + filter_id and returns the current accounts directly. It’s what the dashboard’s Credentials view uses — and it only works for a domain that already has a search behind it: call it for one that’s never been searched and you get a 404 (“No results available. The requested domain does not exist.”). So run the flow above first.
What comes back
Each account row carries the credential, where it was used, when it surfaced, and how it scores:- the credential —
server,username,password - classification —
is_infrastructure,is_business,is_private,has_url - scoring —
risk_score,novelty_score,reuse_count_till_creation_time,first_discovery - provenance —
leaks(each withleak_idandleak_name),leak_publish_date,leak_discover_date,tags
server + username + password, so the same login on a different server stays a separate row — it’s a different exposure to act on. The default arrangement, Unique Credentials (filter_id 5), returns that full deduplicated set; the other filters narrow it.
Ordering. Sort with order and direction (asc or desc). The API defaults to created_at descending; the dashboard’s Credentials view sorts by novelty_score descending.
How novelty and risk are scored
novelty_score and risk_score are computed, not pulled from the leak. Both run 0–10.
Novelty — how fresh a credential is. It’s the average of two sub-scores.
Recency, from when the credential was first seen:
Reuse, from how many earlier records already carried the same username + password:
A brand-new, never-seen credential scores 10; an old, heavily recycled one bottoms out near 2. By default the two sub-scores are weighted equally — the
first_discovery_weight and reuse_weight settings below re-balance them.
Risk — how urgently it deserves attention. A weighted average of four inputs, each normalized to 0–1, then scaled back to 0–10:
is_private is recorded on the row but does not affect the score.
Tuning the weights. All six weights are org-level and tunable 0–5: first_discovery_weight and reuse_weight shape the novelty score; novelty_weight, url_presence_weight, infrastructure_weight, and business_weight shape the risk score (defaults 3, 1, 2, 1). Read them with leak_filter_risk_settings_retrieve and change them with leak_filter_risk_settings_update; scores re-compute on the next read.
Match against your password policy
A leaked password that still satisfies your current password policy is the dangerous kind: it’s plausibly still in use, so it may still open the account it was taken from. Filtered credentials can flag exactly those — define a policy once, then apply it to any search. Define it. A password policy is a standalone, org-scoped object. Create one withleak_filter_password_policies_create:
min_length (default 8), require_numbers, require_special_chars, and require_uppercase (all default false). A password matches when it clears min_length and each requirement you turned on — at least one digit, at least one A–Z, and at least one of !@#$%^&*(),.?":{}|<>. Manage policies with leak_filter_password_policies_list, leak_filter_password_policy_retrieve, leak_filter_password_policy_update, and leak_filter_password_policy_delete.
Apply it. Pass pwd_policy_ids (comma-separated) on the results call:
matches_password_policy boolean to every row. It tags, it doesn’t filter — non-matching accounts still come back, so you keep the full picture and can sort or triage by the flag. (Pass several IDs and a row is flagged if it matches any of them.)
Export the results
To pull a full result set in one file rather than paging, use an export — an asynchronous job. Filtered credentials has dedicated leak-filter export endpoints; for the general export pattern across other result sets, see Downloads and exports. (The old direct-download endpoints have been removed in favour of this flow.)1
Create the export
Create it from a completed filter task with
leak_filter_export_create_from_filter_task (pass filter_task_id), or straight from a stored domain with leak_filter_export_create_from_domain (pass domain_url + filter_id). Each returns an export id and status.2
Poll until ready
Poll
leak_filter_export_retrieve with the export id until status is ready.3
Download
Fetch the file from
leak_filter_export_download. The link expires 24 hours after creation — a later download returns 410 Gone, so create a fresh export if you need it again. leak_filter_export_list lists your export jobs from the last 24 hours.A few things worth knowing
exact_matchdefaults totrue. Set itfalseto also pull country-code subsidiary domains (for exampleacme.com.brunderacme.com).- The
passwordfilter is case-sensitive;username,server, andtagsare case-insensitive substring matches. - Results paginate up to 1000 per page, and
page×page_sizecan’t exceed 50,000 — past that, narrow the filter or export the results.