Request
POST /v1/search/emails · Required scope: search:login (all tiers)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
emails | string[] | Yes | — | Email addresses to search, min 1 item. Lowercased automatically. |
type | employees | users | both | No | both | See Domain Intelligence Overview |
start_date | string (date-time) | null | No | — | Inclusive start filter, clamped by query_window_days |
end_date | string (date-time) | null | No | — | Inclusive end filter |
sort_direction | asc | desc | No | desc | Must stay constant across pages |
cursor | string | null | No | — | Pagination token |
limit | integer | No | 25 | 1–500, clamped to your tier’s max_rows |
Example request
Response
200 OK — array of CredentialExposureResult, cursor-paginated.
| Field | Description |
|---|---|
stealer_id | log_victim_id of the infected machine |
victim_id | SHA-256 victim ID — use with Victim Profiles |
username | Returned unmasked — exactly matches a value you searched for |
password | Masked to "••••" on free tier |
domain | Registrable domain extracted from url |
url | Masked to scheme://host/*** on free tier |
infection_date | When the log was captured |
username is unmasked here even on free tier — it’s the exact
email you searched for. See
Data Masking.
Pagination
Cursor-paginated — see Pagination.Errors
| Status | code | Cause |
|---|---|---|
| 400 | VALIDATION_ERROR | emails is empty or exceeds limits |
| 400 | INVALID_CURSOR | Tampered or stale cursor |
| 403 | FORBIDDEN_SCOPE | Key lacks search:login |
Tier notes
password and url are masked on free tier; username (the searched
value) is always raw. start_date/limit clamping follows the standard
per-tier rules in Rate Limits & Tiers.