Request
POST /v1/domain/overview · Required scope: search:domain (all tiers) · Aggregation (counts toward agg_per_min) · Not paginated
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
domains | string[] | Yes | — | Domains to summarize, 1–500 items |
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 |
Example request
Response
200 OK — array of DomainOverviewResult, one entry per requested domain.
Not masked (no PII rows are returned).
| Field | Description |
|---|---|
domain | Echoes the requested domain |
compromised_employees | Distinct compromised @<domain> accounts |
compromised_users | Distinct compromised end-user accounts on this domain’s services |
last_employee_uploaded / last_user_uploaded | Most recent infection date in each bucket, or null if none |
first_employee_uploaded | Earliest employee-account infection date on record, or null |
Caching
Responses are cached for roughly 15 minutes (stale-while-revalidate) —meta.freshness_at reflects when the underlying data was last computed.
Errors
| Status | code | Cause |
|---|---|---|
| 400 | VALIDATION_ERROR | domains is empty or exceeds 500 items |
| 403 | FORBIDDEN_SCOPE | Key lacks search:domain |
| 429 | RATE_LIMIT_EXCEEDED | Exceeded agg_per_min (5 / 60 / 240 per tier) |