Launch site scans

View as MarkdownOpen in Claude
Launches a malware scan on an explicit selection of websites, one scan per website, over each website's configured areas unless `included` names them (`core`, `plugins`, `themes`, `mu_plugins`, `content`, `uploads`, `database`); each website's own exclusions always apply. Answers **202** with `data` as `site-scans` resources - one per website the preflight accepted - and `meta.skipped` for every website it refused. **Body** (JSON): - `sites` (array of website ids, required, 1 to 200). - `included` (array of string, optional) - areas to scan instead of each website's configured ones. Reason codes in `meta.skipped`, first match wins: `PERMISSION_DENIED` (the id is outside the token's reach - `site_name` is null), `SITE_UNREACHABLE` (disconnected), `UNSUPPORTED` (no Malware Scanner configuration, or not yet registered with the scanning provider), `CONFLICT` (a scan of that website is already running) and `QUOTA_EXCEEDED` (no scan quota left for any of the requested areas this period - the message carries the reset date). When only one of the requested areas has quota left, that website's scan still runs, on that area alone, and the response carries a `meta.warnings` entry naming the area left out. A manual scan uses the website's scan quota and does not move its scheduled scan; a scan can take hours - follow the launched ids with "List site scans" (`filter[id][]`) and read `status`/`verdict`. Requires a full-access token (read-only tokens answer 403).

Authentication

AuthorizationBearer

Personal access token created in the Modular DS dashboard; read-only tokens can only call GET endpoints.

Request

This endpoint expects an object.
includedlist of stringsOptional
siteslist of doublesOptional

Response

202 - Scans launched, two skipped

datalist of objectsOptional
jsonapiobjectOptional
metaobjectOptional