Request
POST /v1/search/keyword/urls · Required scope: search:keyword (pro and ultra tiers)
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
keywords | string[] | Yes | — | Up to 10 keywords to match against harvested URLs and page titles, e.g. ["admin-panel"] |
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 KeywordUrlResult, cursor-paginated.
| Field | Description |
|---|---|
url | Full matching URL from browser history |
domain | Registrable domain extracted from url |
title | Page title at time of visit |
occurrence | Number of times this URL was visited across matched victims |
last_seen | Most recent visit timestamp, may be null if unavailable |
Pagination
Cursor-paginated — see Pagination.Errors
| Status | code | Cause |
|---|---|---|
| 400 | VALIDATION_ERROR | keywords is empty or exceeds 10 items |
| 400 | INVALID_CURSOR | Tampered or stale cursor |
| 403 | FORBIDDEN_SCOPE | Key lacks search:keyword (free tier) |
Tier notes
This endpoint requiressearch:keyword, which is not included on the free
tier — a free-tier key receives 403 FORBIDDEN_SCOPE. Both pro and ultra
tiers receive url unmasked — the free-tier masking rule for url in
Data Masking never applies here, since free tier cannot call
this endpoint at all.