Project Scoping
All scan endpoints support multi-tenancy via theX-Project-UUID header. When provided, scans are created and queried within the specified project. Responses include the project_uuid field to confirm the project context.
Single-Target Scans
POST /api/scan-url, Scan a URL
Starts an asynchronous scan of a single URL. Equivalent to the CLIscan-url command. Returns 202 Accepted immediately with a scan ID.
Request body:
POST /api/scan-request, Scan a Raw HTTP Request
Starts an asynchronous scan from a base64-encoded raw HTTP request. Equivalent to the CLIscan-request command. Returns 202 Accepted immediately with a scan ID.
Since v0.5.3 it settles a schemeless request like the CLI does: when the raw request gives no hint of http vs https, the scheme is probed rather than guessed.
Request body:
Use
GET /api/scan/status to check the progress of the scan.
Scan Management
POST /api/scans/run, Run Target Scan
Triggers a background scan against target URLs. Equivalent tovigolium scan -t <url>. At least one target URL is required, use POST /api/scan-all-records to scan existing DB records.
Returns 202 Accepted on success, 200 OK for dry runs, or 409 Conflict if a scan is already running.
Request body:
Source-aware whitebox analysis lives in agent mode. UsePhase duration factors: ThePOST /api/agent/run/swarmwith asourcefield for AI-driven route extraction + code audit + targeted scanning,POST /api/agent/run/autopilotfor autonomous pentest with code context, orPOST /api/agent/run/audit(CLI:vigolium agent audit) for the unified source-audit driver dispatcher.
scanning_max_duration field sets the global max duration. Each phase derives its own limit by multiplying the global value by its duration_factor from the scanning pace config. Default factors:
Per-phase
max_duration overrides in the YAML config take precedence over the factor calculation.
Phase names and aliases:
Note:onlyandskipare mutually exclusive, providing both returns400.
scanning_max_duration and per-phase duration factors are applied correctly.
GET /api/scan/status, Scan Status
Returns the status of the current or most recent scan. Thestatus field reflects pause state when applicable.
To cancel a running scan, callPOST /api/scans/:uuid/stop(covered under Scan Management) — there is no globalDELETE /api/scanroute.
Scan History
GET /api/scans, List Scans
Returns paginated scan history ordered by creation date (newest first). Query parameters:GET /api/scans/:uuid, Get Scan Detail
Returns a single scan by UUID.Scan completeness
Added in v0.5.2.status says whether the scan process reached its end. completeness says whether the run actually covered the input it was given. They are independent, and both are needed: a scan can reach its end having scanned half its records.
Each phase outcome carries:
The same fields ride
--format jsonl and the scan document vigolium scan -j prints, so one reading of “did this run cover the target” works across the CLI and the API.
reasons and limits are different claims. A limit is a bound you configured being honoured; a reason is coverage you asked for and did not get. Alerting on limits will page you for scans that worked exactly as specified.DELETE /api/scans/:uuid, Delete Scan
Deletes a scan record by UUID.POST /api/scans/:uuid/stop, Stop a Running Scan
Stops a specific running scan by UUID. The scan must be the currently active scan. Workers finish their current tasks before fully stopping.POST /api/scans/:uuid/pause, Pause a Running Scan
Pauses a running scan. Workers finish their current item then block until resumed. The scan status is set to"paused" in the database.
POST /api/scans/:uuid/resume, Resume a Paused Scan
Resumes a previously paused scan. Blocked workers continue processing items and the scan status is set back to"running".
GET /api/scans/:uuid/logs, Get Scan Logs
Returns log entries for a scan, ordered by creation time ascending. Logs are captured at multiple levels:- Structured events (
info,warn,error): Phase lifecycle events (start, complete, fail, skip), scan start/finish, pause/resume, configuration snapshots, and panic recovery. - Raw console output (
trace): Every line printed to the terminal during the scan, with ANSI color codes stripped. This includes phase headers, traffic lines (❯ spider │ [200] GET ...), progress feedback, and scan configuration banners.
v0.4.2: this endpoint returns the last 2 MiB of
runtime.log by default rather than the whole file on every poll — a long-running scan’s log grows without bound, and a dashboard polling it was re-reading all of it each time. Raise the window with ?max_bytes= (hard cap 64 MiB).level=info):
level=trace):
phase=config):
Phase values:
Log levels:
Error responses:
Selective Record Scan
POST /api/scan-records, Scan Specific HTTP Records
Starts an asynchronous scan on specific HTTP records identified by UUID. Returns202 Accepted on success or 409 Conflict if a scan is already running. Only one scan can run at a time.
Request body:
Use
GET /api/scan/status or GET /api/scans/:uuid to check scan progress.
POST /api/scan-all-records, Scan All DB Records
Scans existing HTTP records from the database with optional filtering. Equivalent to the DB-record scan mode, but as a dedicated route with rich filtering options. Returns202 Accepted on success, 200 OK for dry runs, or 409 Conflict if a scan is already running.
Request body:
Source Code Upload
Source code uploads for AI-driven analysis (swarm, autopilot, audit) are handled via the cloud-storage API. See Storage API:POST /api/storage/upload-source: upload a source archive (zip, tar.gz, tar.bz2, tar.xz)GET /api/storage/source/:key: download a previously-uploaded archivePOST /api/storage/presign: get a presigned URL for direct client-side upload
storage_url (e.g. gs://<project-uuid>/ugc/source.tar.gz) can be passed to --source (CLI) or the source field on POST /api/agent/run/{query,autopilot,swarm,audit}.