POST/api/public/v1/scansBearer key required
Start a scan in your personal workspace. Returns running or queued; a matching active target may reuse its existing scan ID.
JSON request body
{
"target": "https://example.com",
"mode": "single",
"severity_filter": "low",
"phases": [1, 2, 3, 4, 5, 6, 7, 8]
}Request fields and behavior
target: required string, 3–2048 characters; a bare host defaults to HTTPS.
mode: single (default) or wildcard.
severity_filter: info | low (default) | medium | high | critical; minimum reported severity.
phases: optional array of 1–22 integer phase IDs, each 1–22; omitted = all 22 phases.
This endpoint uses active reconnaissance and testing. It does not accept organization_id, target authentication, files, or other web-form settings.
Response
202 Accepted
{
"id": "0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1",
"target": "https://example.com",
"status": "queued",
"status_url": "https://www.xalgorix.com/api/public/v1/scans?id=0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1",
"stop_url": "https://www.xalgorix.com/api/public/v1/scans/stop",
"web_url": "https://www.xalgorix.com/scans/0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1"
}GET/api/public/v1/scansBearer key required
Read an owned scan's persisted status, assessment metadata and exact per-severity finding counts. Status updates may lag ongoing work briefly.
Query parameters and access
id: required scan UUID (the database ID returned by POST /scans).
Response
200 OK
{
"scan": {
"id": "0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1",
"target": "https://example.com",
"mode": "single",
"status": "running",
"current_phase": 6,
"started_at": "2026-10-02T10:00:00.000Z",
"completed_at": null,
"engine_completion": null,
"engine_stop_reason": null,
"plan_tasks_total": null,
"plan_tasks_completed": null,
"plan_tasks_skipped": null,
"plan_tasks_unfinished": null
},
"counts": { "critical": 0, "high": 1, "medium": 2, "low": 4, "info": 0 }
}POST/api/public/v1/scans/stopBearer key required
Stop an owned queued, running or paused scan while retaining saved findings and report data. No additional fields are accepted.
JSON request body
{
"id": "0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1"
}Request fields and behavior
id: required scan UUID. Repeating a stop returns 200 with already_terminal: true.
Already completed or failed scans return their existing status; no work or credits are changed.
A concurrent state change can return 409 state_changed; poll status, then retry.
503 stop_unconfirmed means success was not verified; poll status and retry shortly.
Response
200 OK
{
"id": "0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1",
"ok": true,
"state_changed": false,
"already_terminal": false,
"status": "stopped"
}GET/api/public/v1/findingsBearer key required
Read findings from one owned scan or across the key owner's scans. Evidence is structured report data; handle it as sensitive information.
Query parameters and access
All query parameters are optional:
scan_id: scan UUID; must belong to the key owner.
severity: exact severity filter (not a minimum).
limit: integer 1–500, default 100.
offset: integer ≥ 0, default 0.
order: newest (default), oldest, or severity (critical first, then newest).
Sorting happens before pagination; ties use finding ID. total is the filtered count across all pages.
Increase offset by the number of returned rows until offset reaches total. Live results may change between pages.
Response
200 OK
{
"findings": [{
"id": "4e899609-96f0-48b0-a89c-6a041a9ae406",
"scan_id": "0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1",
"severity": "high",
"title": "Verified access-control weakness",
"description": "...",
"category": "Authentication",
"cve": null,
"cvss": 8.1,
"phase": 5,
"scan_target": "https://example.com",
"scan_mode": "single",
"evidence": { "poc": "...", "request": "...", "response": "..." },
"remediation": "...",
"created_at": "2026-10-02T10:05:00.000Z"
}],
"total": 7,
"limit": 100,
"offset": 0,
"scan_id": "0f5d31b5-8c0a-4a66-9b29-5e23e6bfc9b1",
"severity": null,
"order": "newest"
}GET/api/public/v1/shareNo API key
Read an existing shared report. No API key is required. Password-protected shares require the x-share-password header; never put the password in the URL.
Query parameters and access
token: required shr_ followed by 48 hexadecimal characters.
x-share-password: request header required when the report is password protected.
401 password_required / invalid_password; 429 too_many_attempts with Retry-After.
404 for an unknown, revoked, expired or missing report. 400 for malformed tokens.
This is a read endpoint; create/revoke shares in the web app.
Response
200 OK
{ scan, findings, counts, branding, canCustomizeBranding, customer? }
findings contains up to 1000 report rows; counts cover those returned rows.
Use authenticated GET /findings for full paginated exports.
Password-protected responses: Cache-Control: private, no-store.
Unprotected responses may be cached for 60 seconds.GET/api/public/v1/badgeNo API key
Read an SVG badge for a public Trust Page. This endpoint returns an image, not JSON, and requires no API key.
Query parameters and access
slug: required public Trust Page slug.
metric: status (default) | findings | severity | lastscan.
label: optional left-hand label, default xalgorix.
Response
200 OK — image/svg+xml, normally cached for 300 seconds.
Unknown/unpublished slugs return an SVG fallback; malformed, throttled or unavailable requests use a 60-second fallback. No private scan data is exposed.