{"openapi":"3.0.0","info":{"title":"FortWatch API","version":"1","description":"The FortWatch REST API: your assets, scans, issues, reports and audit log. Authenticate with an API key or an OAuth access token (Authorization: Bearer …). Each key or token gets 120 reads and 60 writes a minute. Guides: https://docs.fortwatch.ai.","contact":{"name":"FortWatch","url":"https://docs.fortwatch.ai"}},"servers":[{"url":"https://api.fortwatch.ai"}],"tags":[{"name":"Assets","description":"Domains, subdomains, IP addresses and cloud buckets, their ownership proof and what anyone can see of them.","x-fortwatch-area":"assets"},{"name":"Projects","description":"Groups of assets.","x-fortwatch-area":"assets"},{"name":"Discovery","description":"Hostnames public sources know under your proven domains, to add as assets.","x-fortwatch-area":"assets"},{"name":"Scans","description":"Start scans and read their results.","x-fortwatch-area":"scans"},{"name":"Scan schedules","description":"When each asset is scanned on its own.","x-fortwatch-area":"scans"},{"name":"Issues","description":"What needs fixing: one issue per kind of problem and asset, with its findings, status and comments.","x-fortwatch-area":"issues"},{"name":"Findings","description":"Everything the scanners found.","x-fortwatch-area":"issues"},{"name":"Ports","description":"Open ports across your assets.","x-fortwatch-area":"issues"},{"name":"Reports","description":"Period summaries, the most vulnerable assets and SLA performance.","x-fortwatch-area":"reports"},{"name":"Assessments","description":"Forwardable assessment reports, as HTML or PDF, and their share links.","x-fortwatch-area":"reports"},{"name":"Audit log","description":"Every change in the workspace, by whom and through what.","x-fortwatch-area":"audit"}],"paths":{"/app/projects":{"get":{"description":"The workspace's projects.","operationId":"listProjects","parameters":[{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProjectModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"List projects","tags":["Projects"],"x-fortwatch-area":"assets","x-fortwatch-paged":true,"x-fortwatch-scope":"assets:read"},"post":{"description":"A name unique in the workspace (1 to 255 characters), an optional description and color.","operationId":"createProject","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateProjectDto"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Create a project","tags":["Projects"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/projects/{id}":{"put":{"description":"Changes the name, description or color.","operationId":"updateProject","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProjectDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Update a project","tags":["Projects"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"},"delete":{"description":"Deletes the project with its assets, scans, findings, issues and schedules. This cannot be undone.","operationId":"deleteProject","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Delete a project","tags":["Projects"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/ports":{"get":{"description":"Open-port issues grouped by port, with the assets each port is open on.","operationId":"listOpenPorts","parameters":[],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortsModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:read"]}],"summary":"List open ports","tags":["Ports"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:read"}},"/app/assets":{"get":{"description":"Every asset of the workspace (domains, subdomains, IP addresses, cloud buckets) with its issue counts, ownership state and scan status. Filter by project, type or status.","operationId":"listAssets","parameters":[{"name":"projectId","required":false,"in":"query","schema":{"type":"number"}},{"name":"type","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetListItemModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"List assets","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-paged":true,"x-fortwatch-scope":"assets:read"},"post":{"description":"Adds a domain, subdomain, IP address or bucket to a project and checks that it answers. Nothing is scanned until its ownership is proven (see Verify ownership). Past the plan's included assets the answer asks for a paid slot, which an API key or OAuth app cannot buy: add that asset in the dashboard.","operationId":"createAsset","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssetDto"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetWithProjectModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Add an asset","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/assets/{id}":{"get":{"description":"One asset with its severity breakdown, open issues, scan schedules, detected technologies and, when its site sends visitors to a host its proof does not cover, which host.","operationId":"getAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDetailModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"Get an asset","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:read"},"put":{"description":"Changes the project, the value or type (checked as when adding, then validated again), the scan profile (portScanMode, nucleiMinSeverity) or the scanners turned off for it.","operationId":"updateAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateAssetDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetWithProjectModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Update an asset","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"},"delete":{"description":"Deletes the asset with its scans, findings, issues and schedules. This cannot be undone.","operationId":"deleteAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Delete an asset","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/assets/{id}/revalidate":{"post":{"description":"Runs the reachability check again (DNS, HTTP and HTTPS). At most 30 an hour per workspace. Also limited per workspace: 30 a hour.","operationId":"revalidateAsset","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Check an asset again","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-costly":"revalidate","x-fortwatch-scope":"assets:write"}},"/app/assets/{id}/screenshot":{"get":{"description":"The latest screenshot of the asset's site, as a PNG image.","operationId":"getAssetScreenshot","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"Get an asset's screenshot","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:read"}},"/app/assets/{id}/outside-view/{part}":{"get":{"description":"What anyone can see of the asset without scanning it, read live and never stored: web (the site's headers and certificate), email (SPF, DMARC, DKIM, MX), dns, or subdomains (from certificate transparency logs). At most 120 a minute per workspace. Also limited per workspace: 120 a minute.","operationId":"getAssetOutsideView","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"part","required":true,"in":"path","schema":{"type":"string","enum":["web","email","dns","subdomains"]}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutsideViewModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"Get the outside view","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-costly":"outsideView","x-fortwatch-scope":"assets:read"}},"/app/assets/{id}/ownership":{"get":{"description":"Whether the asset's ownership is proven and how, with the DNS TXT record or the HTTP file that proves it.","operationId":"getAssetOwnership","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipStateModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"Get the ownership state","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:read"}},"/app/assets/{id}/ownership/verify":{"post":{"description":"Looks for the DNS TXT record or the HTTP file now. The first successful proof starts the asset's first scan; 422 when neither is found.","operationId":"verifyAssetOwnership","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnershipVerifiedModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Verify ownership","tags":["Assets"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/discovery/summary":{"get":{"description":"One row per project and registrable domain: how many hostnames are new, added or ignored, and the last discovery run.","operationId":"getDiscoverySummary","parameters":[{"name":"projectId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DiscoverySummaryModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"Summarize discovery","tags":["Discovery"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:read"}},"/app/discovery/hosts":{"get":{"description":"Hostnames public sources know under the workspace's proven domains, with whether they resolve and their status: new, added or ignored.","operationId":"listDiscoveredHosts","parameters":[{"name":"projectId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"domain","required":false,"in":"query","schema":{"type":"string"}},{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DiscoveredHostModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:read"]}],"summary":"List discovered hostnames","tags":["Discovery"],"x-fortwatch-area":"assets","x-fortwatch-paged":true,"x-fortwatch-scope":"assets:read"}},"/app/discovery/run":{"post":{"description":"Queues a discovery run for a registrable domain the project has a verified asset under; 202 with the run, or with the one already running. At most 10 an hour per workspace. Also limited per workspace: 10 a hour.","operationId":"runDiscovery","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryRunDto"}}}},"responses":{"202":{"description":"Accepted: the work is queued.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryRunModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Run discovery","tags":["Discovery"],"x-fortwatch-area":"assets","x-fortwatch-costly":"discoveryRun","x-fortwatch-scope":"assets:write"}},"/app/discovery/hosts/add":{"post":{"description":"Makes up to 200 discovered hostnames assets of their project, as adding them one by one would. A host past the plan's included assets is refused: an API key or OAuth app cannot buy a paid slot.","operationId":"addDiscoveredHosts","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryAddHostsDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveryAddResultsModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Add hostnames as assets","tags":["Discovery"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/discovery/hosts/{id}/ignore":{"post":{"description":"Hides a discovered hostname; 409 when it is already an asset.","operationId":"ignoreDiscoveredHost","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveredHostModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Ignore a hostname","tags":["Discovery"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/discovery/hosts/{id}/restore":{"post":{"description":"Brings an ignored hostname back to new.","operationId":"restoreDiscoveredHost","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DiscoveredHostModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["assets:write"]}],"summary":"Restore a hostname","tags":["Discovery"],"x-fortwatch-area":"assets","x-fortwatch-scope":"assets:write"}},"/app/scans":{"get":{"description":"Scans with their status and severity breakdown, newest first; each carries the asset's scan number. Filter by status, asset or project.","operationId":"listScans","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"assetId","required":false,"in":"query","schema":{"type":"number"}},{"name":"projectId","required":false,"in":"query","schema":{"type":"number"}},{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScanListItemModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:read"]}],"summary":"List scans","tags":["Scans"],"x-fortwatch-area":"scans","x-fortwatch-paged":true,"x-fortwatch-scope":"scans:read"},"post":{"description":"Starts every enabled scanner on a verified asset. With issueId it re-checks that issue (its scanner runs even when turned off for the asset). 409 with the running scan when one is in progress; 403 when the daily scan limits are reached.","operationId":"startScan","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScanDto"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanCreatedAppModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:write"]}],"summary":"Start a scan","tags":["Scans"],"x-fortwatch-area":"scans","x-fortwatch-scope":"scans:write"}},"/app/scans/active":{"get":{"description":"Every pending or running scan of the workspace, with how many scanners are done.","operationId":"listActiveScans","parameters":[],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ActiveScanModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:read"]}],"summary":"List running scans","tags":["Scans"],"x-fortwatch-area":"scans","x-fortwatch-scope":"scans:read"}},"/app/scans/{id}":{"get":{"description":"One scan with its status, timing, scanners and finding counts; a failed scan says why when the host was the reason.","operationId":"getScan","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanDetailAppModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:read"]}],"summary":"Get a scan","tags":["Scans"],"x-fortwatch-area":"scans","x-fortwatch-scope":"scans:read"},"delete":{"description":"Deletes the scan and its findings.","operationId":"deleteScan","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:write"]}],"summary":"Delete a scan","tags":["Scans"],"x-fortwatch-area":"scans","x-fortwatch-scope":"scans:write"}},"/app/scans/{id}/findings":{"get":{"description":"What the scan found; info findings are left out unless asked for.","operationId":"listScanFindings","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"severity","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScanFindingModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:read"]}],"summary":"List a scan's findings","tags":["Scans"],"x-fortwatch-area":"scans","x-fortwatch-paged":true,"x-fortwatch-scope":"scans:read"}},"/app/scans/{id}/issues":{"get":{"description":"Issues with at least one finding from this scan.","operationId":"listScanIssues","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScanIssueModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:read"]}],"summary":"List a scan's issues","tags":["Scans"],"x-fortwatch-area":"scans","x-fortwatch-paged":true,"x-fortwatch-scope":"scans:read"}},"/app/scan-schedules":{"get":{"description":"Every scan schedule of the workspace with its next run.","operationId":"listScanSchedules","parameters":[{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ScanScheduleModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:read"]}],"summary":"List scan schedules","tags":["Scan schedules"],"x-fortwatch-area":"scans","x-fortwatch-paged":true,"x-fortwatch-scope":"scans:read"},"post":{"description":"Daily, weekly, monthly or every N days, at a time of day in UTC, optionally only within a window of hours and weekdays. Daily and custom schedules depend on the plan; an asset has at most 5 schedules (1 on Essential).","operationId":"createScanSchedule","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateScheduleDto"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanScheduleModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:write"]}],"summary":"Create a scan schedule","tags":["Scan schedules"],"x-fortwatch-area":"scans","x-fortwatch-scope":"scans:write"}},"/app/scan-schedules/{id}":{"put":{"description":"Changes when it runs, or turns it on or off; its name and next run are recomputed.","operationId":"updateScanSchedule","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateScheduleDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScanScheduleModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:write"]}],"summary":"Update a scan schedule","tags":["Scan schedules"],"x-fortwatch-area":"scans","x-fortwatch-scope":"scans:write"},"delete":{"description":"Deletes the schedule; scans it already ran stay.","operationId":"deleteScanSchedule","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["scans:write"]}],"summary":"Delete a scan schedule","tags":["Scan schedules"],"x-fortwatch-area":"scans","x-fortwatch-scope":"scans:write"}},"/app/findings":{"get":{"description":"Everything the scanners found across the workspace; info findings are left out unless asked for. Filter by scan, severity, asset, project, scanner or issue status.","operationId":"listFindings","parameters":[{"name":"scanId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"includeInfo","required":false,"in":"query","schema":{"type":"string"}},{"name":"severity","required":false,"in":"query","schema":{"type":"string"}},{"name":"assetId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"projectId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"scanner","required":false,"in":"query","schema":{"type":"string"}},{"name":"issueStatus","required":false,"in":"query","schema":{"type":"string"}},{"name":"includeInactive","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":100,"type":"number"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FindingAppModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:read"]}],"summary":"List findings","tags":["Findings"],"x-fortwatch-area":"issues","x-fortwatch-paged":true,"x-fortwatch-scope":"issues:read"}},"/app/issues":{"get":{"description":"Issues, one per kind of problem and asset, with the asset, assignee, status, severity, reachability and SLA. Filter by status, severity, category, asset, project, reachability or text, and sort. Paged in the body (issues, total, page, limit): 100 by default, at most 500.","operationId":"listIssues","parameters":[{"name":"status","required":false,"in":"query","schema":{"type":"string"}},{"name":"severity","required":false,"in":"query","schema":{"type":"string"}},{"name":"category","required":false,"in":"query","schema":{"type":"string"}},{"name":"assetId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"projectId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"reachability","required":false,"in":"query","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"type":"string"}},{"name":"sort","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":100,"type":"number"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuesPageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:read"]}],"summary":"List issues","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:read"}},"/app/issues/{id}":{"get":{"description":"The issue with its latest finding, detection history, proof, how to reproduce it, and its comments.","operationId":"getIssue","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueAppDetailModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:read"]}],"summary":"Get an issue","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:read"}},"/app/issues/{id}/status":{"patch":{"description":"Resolving starts a re-check scan of the asset, which counts toward the daily scan limits; when none can start, the issue still resolves and the next scheduled scan confirms the fix.","operationId":"setIssueStatus","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateIssueStatusDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueDetailModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:write"]}],"summary":"Change an issue's status","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:write"}},"/app/issues/{id}/assignee":{"patch":{"description":"To a member who can work on issues, or null to leave it unassigned.","operationId":"assignIssue","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssignIssueDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueDetailModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:write"]}],"summary":"Assign an issue","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:write"}},"/app/issues/{id}/comments":{"get":{"description":"The reviewers' notes on the issue, oldest first.","operationId":"listIssueComments","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"page","required":false,"in":"query","description":"The page, from 1.","schema":{"minimum":1,"type":"integer"}},{"name":"limit","required":false,"in":"query","description":"Rows per page: an API key or OAuth token gets 100 when it sends none, at most 500.","schema":{"minimum":1,"maximum":500,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/IssueCommentModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:read"]}],"summary":"List an issue's comments","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-paged":true,"x-fortwatch-scope":"issues:read"},"post":{"description":"A note of 1 to 5000 characters, under the key's or app's person.","operationId":"addIssueComment","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentBodyDto"}}}},"responses":{"201":{"description":"Created.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueCommentModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:write"]}],"summary":"Comment on an issue","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:write"}},"/app/issues/{id}/comments/{commentId}":{"delete":{"description":"Authors delete their own comments; owners and admins any.","operationId":"deleteIssueComment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"number"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:write"]}],"summary":"Delete a comment","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:write"},"patch":{"description":"Only the comment's author can edit it.","operationId":"editIssueComment","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"number"}},{"name":"commentId","required":true,"in":"path","schema":{"type":"number"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommentBodyDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueCommentModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:write"]}],"summary":"Edit a comment","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:write"}},"/app/issues/{id}/dismiss":{"patch":{"description":"With a reason (false_positive, accepted_risk, mitigating_control, not_applicable, noise), optional notes and an optional expiry (30d, 90d, 1y).","operationId":"dismissIssue","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissIssueDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueDetailModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["issues:write"]}],"summary":"Dismiss an issue","tags":["Issues"],"x-fortwatch-area":"issues","x-fortwatch-scope":"issues:write"}},"/app/reports/summary":{"get":{"description":"New, fixed and open issues, findings by severity and scan counts for a period (the last 30 days by default), for the workspace, a project or an asset.","operationId":"getReportSummary","parameters":[{"name":"projectId","required":false,"in":"query","description":"Only this project's numbers.","schema":{"type":"integer"}},{"name":"assetId","required":false,"in":"query","description":"Only this asset's numbers.","schema":{"type":"integer"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSummaryModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:read"]}],"summary":"Get the period summary","tags":["Reports"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:read"}},"/app/reports/vulnerable-assets":{"get":{"description":"The 10 assets with the most serious open issues in the period.","operationId":"getVulnerableAssets","parameters":[{"name":"projectId","required":false,"in":"query","description":"Only this project's numbers.","schema":{"type":"integer"}},{"name":"assetId","required":false,"in":"query","description":"Only this asset's numbers.","schema":{"type":"integer"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/VulnerableAssetModel"}}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:read"]}],"summary":"Get the most vulnerable assets","tags":["Reports"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:read"}},"/app/reports/sla":{"get":{"description":"Days to fix per severity in the period, and the issues past their SLA.","operationId":"getSlaReport","parameters":[{"name":"projectId","required":false,"in":"query","description":"Only this project's numbers.","schema":{"type":"integer"}},{"name":"assetId","required":false,"in":"query","description":"Only this asset's numbers.","schema":{"type":"integer"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportSlaModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:read"]}],"summary":"Get the SLA report","tags":["Reports"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:read"}},"/app/assessments":{"get":{"description":"The workspace's assessment reports, newest first, with their status and share link.","operationId":"listAssessments","parameters":[{"name":"scopeType","required":true,"in":"query","schema":{"nullable":true,"type":"string","enum":["workspace","project","asset"]}},{"name":"scopeId","required":false,"in":"query","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"limit","required":false,"in":"query","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessmentListModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}},"X-Total-Count":{"description":"Rows matching, over all pages.","schema":{"type":"integer"}},"X-Page":{"description":"This page, from 1.","schema":{"type":"integer"}},"X-Limit":{"description":"Rows per page.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:read"]}],"summary":"List assessment reports","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-paged":true,"x-fortwatch-scope":"reports:read"},"post":{"description":"Queues the forwardable report for the workspace, a project or an asset: 201 with the pending report, or 200 with the one already being generated. At most 10 an hour per workspace. Also limited per workspace: 10 a hour.","operationId":"createAssessment","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssessmentDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessmentModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:write"]}],"summary":"Create an assessment report","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-costly":"assessment","x-fortwatch-scope":"reports:write"}},"/app/assessments/{id}":{"get":{"description":"One report; include=data adds its snapshot and narrative.","operationId":"getAssessment","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}},{"name":"include","required":false,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessmentModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:read"]}],"summary":"Get an assessment report","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:read"},"delete":{"description":"Deletes the report and its files.","operationId":"deleteAssessment","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessmentDeletedModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:write"]}],"summary":"Delete a report","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:write"}},"/app/assessments/{id}/html":{"get":{"description":"The finished report as HTML; 409 until it is done.","operationId":"getAssessmentHtml","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:read"]}],"summary":"Get a report as HTML","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:read"}},"/app/assessments/{id}/pdf":{"get":{"description":"The finished report as a PDF download; 409 until it is done.","operationId":"getAssessmentPdf","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:read"]}],"summary":"Get a report as PDF","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:read"}},"/app/assessments/{id}/share":{"post":{"description":"Creates or extends a link anyone can open, for up to 365 days (0 for no expiry).","operationId":"shareAssessment","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareAssessmentDto"}}}},"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessmentModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:write"]}],"summary":"Share a report","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:write"},"delete":{"description":"The share link stops working at once.","operationId":"unshareAssessment","parameters":[{"name":"id","required":true,"in":"path","schema":{"minimum":1,"maximum":9007199254740991,"type":"integer"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssessmentModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found in your workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["reports:write"]}],"summary":"Stop sharing a report","tags":["Assessments"],"x-fortwatch-area":"reports","x-fortwatch-scope":"reports:write"}},"/app/audit-log":{"get":{"description":"Every change in the workspace, newest first, by members, API keys, OAuth apps, FortWatch AI, support and FortWatch itself, and every sign-in. Filter by category, action, actor, target or period. Owners and admins only. Paged in the body (items, total).","operationId":"listAuditEvents","parameters":[{"name":"page","required":false,"in":"query","schema":{"default":1,"type":"number"}},{"name":"limit","required":false,"in":"query","schema":{"default":50,"type":"number"}},{"name":"category","required":false,"in":"query","schema":{"type":"string","enum":["auth","team","settings","project","asset","discovery","scan","schedule","issue","assessment","ai","billing","integration","workspace","platform","audit"]}},{"name":"action","required":false,"in":"query","schema":{"type":"string","enum":["auth.register","auth.register_blocked","auth.verify_email","auth.forgot_password","auth.reset_password","auth.resend_verification","auth.login_success","auth.login_failed","auth.login_throttled","auth.login_mfa_required","auth.mfa_failed","auth.mfa_throttled","auth.mfa_setup_started","auth.mfa_enabled","auth.mfa_disabled","auth.mfa_codes_regenerated","auth.provider_login","auth.provider_login_failed","auth.provider_signup_started","auth.provider_linked","auth.provider_unlinked","auth.invite_accepted","auth.email_change_requested","auth.email_change_cancelled","auth.email_changed","auth.password_changed","auth.password_set","auth.profile_updated","auth.logout","auth.session_revoked","auth.other_sessions_revoked","auth.session_replay_revoked","auth.admin_login_success","auth.admin_login_failed","auth.admin_login_throttled","auth.admin_login_mfa_required","auth.admin_mfa_failed","auth.admin_mfa_throttled","auth.admin_mfa_setup_started","auth.admin_mfa_enabled","auth.admin_mfa_disabled","auth.admin_mfa_codes_regenerated","auth.admin_email_change_requested","auth.admin_email_change_cancelled","auth.admin_email_changed","auth.admin_password_changed","auth.admin_profile_updated","auth.admin_logout","auth.admin_session_revoked","auth.admin_other_sessions_revoked","auth.admin_session_replay_revoked","account.notification_preferences_updated","account.unsubscribed","invite.sent","invite.cancelled","invite.resent","member.created","member.updated","member.role_changed","member.password_reset","member.removed","member.deleted_all","workspace.ownership_transferred","settings.sla_updated","settings.security_updated","settings.notifications_updated","settings.updated","api_key.created","api_key.revoked","oauth_app.created","oauth_app.updated","oauth_app.secret_rotated","oauth_app.deleted","oauth_app.disabled","oauth_app.enabled","oauth_app.connected","oauth_app.disconnected","project.created","project.updated","project.deleted","project.deleted_all","asset.created","asset.updated","asset.deleted","asset.revalidated","asset.ownership_verified","asset.ownership_set","asset.scanners_changed","asset.deleted_all","discovery.run_started","discovery.hosts_added","discovery.host_ignored","discovery.host_restored","scan.started","scan.refused","scan.deleted","scan.deleted_all","schedule.created","schedule.updated","schedule.deleted","issue.status_changed","issue.resolved","issue.reopened","issue.in_progress","issue.dismissed","issue.undismissed","issue.assigned","issue.unassigned","issue.due_date_changed","issue.updated","issue.comment_added","issue.comment_edited","issue.comment_deleted","issue.opened","issue.auto_resolved","issue.auto_reopened","issue.severity_changed","issue.dismissal_expired","issue.created","issue.deleted","issue.deleted_all","finding.deleted","finding.deleted_all","assessment.generated","assessment.shared","assessment.share_revoked","assessment.deleted","ai.conversation_renamed","ai.conversation_deleted","ai.action_declined","billing.plan_chosen","billing.upgrade_requested","billing.change_scheduled","billing.change_cancelled","billing.cancelled","billing.resumed","billing.details_updated","billing.card_made_default","billing.card_removed","billing.plan_set","billing.discount_set","billing.limits_set","billing.invoice_created","billing.tax_set","billing.invoice_marked_paid","billing.invoice_voided","billing.receipt_resent","billing.unapplied_resolved","workspace.created","workspace.updated","workspace.suspended","workspace.reactivated","workspace.deleted","workspace.deleted_all","administrator.created","administrator.updated","administrator.deleted","scanner.updated","emerging_threat.released","ai_settings.updated","ai_logs.cleared","scanner_logs.cleared","service_logs.cleared","ticket.updated","ticket.deleted","blog.post_created","blog.post_updated","blog.post_deleted","blog.posts_deleted_all","blog.image_uploaded","integration.connected","integration.updated","integration.route_created","integration.route_updated","integration.route_deleted","integration.tested","integration.paused","integration.resumed","integration.reconnect_needed","integration.reconnected","integration.disconnected","integration.delivery_resent","integration.issues_sent","integration.identity_linked","integration.identity_unlinked","integration.ticket_created","integration.ticket_linked","integration.ticket_unlinked","integration.ticket_closed","integration.ticket_reopened","issue.fix_reported","audit.exported"]}},{"name":"actor","required":false,"in":"query","schema":{"type":"string"}},{"name":"hideAutomatic","required":false,"in":"query","schema":{"type":"string","enum":["true","false"]}},{"name":"targetType","required":false,"in":"query","schema":{"maxLength":40,"type":"string"}},{"name":"targetId","required":false,"in":"query","schema":{"maxLength":64,"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"maxLength":200,"type":"string"}}],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditEventPageModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["audit:read"]}],"summary":"List audit events","tags":["Audit log"],"x-fortwatch-area":"audit","x-fortwatch-scope":"audit:read"}},"/app/audit-log/export":{"get":{"description":"The same events as CSV, at most 50,000 rows. At most 10 an hour per workspace. Also limited per workspace: 10 a hour.","operationId":"exportAuditLog","parameters":[{"name":"category","required":false,"in":"query","schema":{"type":"string","enum":["auth","team","settings","project","asset","discovery","scan","schedule","issue","assessment","ai","billing","integration","workspace","platform","audit"]}},{"name":"action","required":false,"in":"query","schema":{"type":"string","enum":["auth.register","auth.register_blocked","auth.verify_email","auth.forgot_password","auth.reset_password","auth.resend_verification","auth.login_success","auth.login_failed","auth.login_throttled","auth.login_mfa_required","auth.mfa_failed","auth.mfa_throttled","auth.mfa_setup_started","auth.mfa_enabled","auth.mfa_disabled","auth.mfa_codes_regenerated","auth.provider_login","auth.provider_login_failed","auth.provider_signup_started","auth.provider_linked","auth.provider_unlinked","auth.invite_accepted","auth.email_change_requested","auth.email_change_cancelled","auth.email_changed","auth.password_changed","auth.password_set","auth.profile_updated","auth.logout","auth.session_revoked","auth.other_sessions_revoked","auth.session_replay_revoked","auth.admin_login_success","auth.admin_login_failed","auth.admin_login_throttled","auth.admin_login_mfa_required","auth.admin_mfa_failed","auth.admin_mfa_throttled","auth.admin_mfa_setup_started","auth.admin_mfa_enabled","auth.admin_mfa_disabled","auth.admin_mfa_codes_regenerated","auth.admin_email_change_requested","auth.admin_email_change_cancelled","auth.admin_email_changed","auth.admin_password_changed","auth.admin_profile_updated","auth.admin_logout","auth.admin_session_revoked","auth.admin_other_sessions_revoked","auth.admin_session_replay_revoked","account.notification_preferences_updated","account.unsubscribed","invite.sent","invite.cancelled","invite.resent","member.created","member.updated","member.role_changed","member.password_reset","member.removed","member.deleted_all","workspace.ownership_transferred","settings.sla_updated","settings.security_updated","settings.notifications_updated","settings.updated","api_key.created","api_key.revoked","oauth_app.created","oauth_app.updated","oauth_app.secret_rotated","oauth_app.deleted","oauth_app.disabled","oauth_app.enabled","oauth_app.connected","oauth_app.disconnected","project.created","project.updated","project.deleted","project.deleted_all","asset.created","asset.updated","asset.deleted","asset.revalidated","asset.ownership_verified","asset.ownership_set","asset.scanners_changed","asset.deleted_all","discovery.run_started","discovery.hosts_added","discovery.host_ignored","discovery.host_restored","scan.started","scan.refused","scan.deleted","scan.deleted_all","schedule.created","schedule.updated","schedule.deleted","issue.status_changed","issue.resolved","issue.reopened","issue.in_progress","issue.dismissed","issue.undismissed","issue.assigned","issue.unassigned","issue.due_date_changed","issue.updated","issue.comment_added","issue.comment_edited","issue.comment_deleted","issue.opened","issue.auto_resolved","issue.auto_reopened","issue.severity_changed","issue.dismissal_expired","issue.created","issue.deleted","issue.deleted_all","finding.deleted","finding.deleted_all","assessment.generated","assessment.shared","assessment.share_revoked","assessment.deleted","ai.conversation_renamed","ai.conversation_deleted","ai.action_declined","billing.plan_chosen","billing.upgrade_requested","billing.change_scheduled","billing.change_cancelled","billing.cancelled","billing.resumed","billing.details_updated","billing.card_made_default","billing.card_removed","billing.plan_set","billing.discount_set","billing.limits_set","billing.invoice_created","billing.tax_set","billing.invoice_marked_paid","billing.invoice_voided","billing.receipt_resent","billing.unapplied_resolved","workspace.created","workspace.updated","workspace.suspended","workspace.reactivated","workspace.deleted","workspace.deleted_all","administrator.created","administrator.updated","administrator.deleted","scanner.updated","emerging_threat.released","ai_settings.updated","ai_logs.cleared","scanner_logs.cleared","service_logs.cleared","ticket.updated","ticket.deleted","blog.post_created","blog.post_updated","blog.post_deleted","blog.posts_deleted_all","blog.image_uploaded","integration.connected","integration.updated","integration.route_created","integration.route_updated","integration.route_deleted","integration.tested","integration.paused","integration.resumed","integration.reconnect_needed","integration.reconnected","integration.disconnected","integration.delivery_resent","integration.issues_sent","integration.identity_linked","integration.identity_unlinked","integration.ticket_created","integration.ticket_linked","integration.ticket_unlinked","integration.ticket_closed","integration.ticket_reopened","issue.fix_reported","audit.exported"]}},{"name":"actor","required":false,"in":"query","schema":{"type":"string"}},{"name":"hideAutomatic","required":false,"in":"query","schema":{"type":"string","enum":["true","false"]}},{"name":"targetType","required":false,"in":"query","schema":{"maxLength":40,"type":"string"}},{"name":"targetId","required":false,"in":"query","schema":{"maxLength":64,"type":"string"}},{"name":"from","required":false,"in":"query","schema":{"type":"string"}},{"name":"to","required":false,"in":"query","schema":{"type":"string"}},{"name":"q","required":false,"in":"query","schema":{"maxLength":200,"type":"string"}}],"responses":{"200":{"description":"The matching events as CSV, newest first, at most 50,000 rows","content":{"text/csv":{"schema":{"type":"string"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["audit:read"]}],"summary":"Export the audit log","tags":["Audit log"],"x-fortwatch-area":"audit","x-fortwatch-costly":"auditExport","x-fortwatch-scope":"audit:read"}},"/app/audit-log/filters":{"get":{"description":"The categories, actions and actors the log can be filtered by.","operationId":"getAuditFilters","parameters":[],"responses":{"200":{"description":"The request succeeded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuditLogFiltersModel"}}},"headers":{"RateLimit-Limit":{"description":"Requests of this kind (read or write) allowed per minute.","schema":{"type":"integer"}},"RateLimit-Remaining":{"description":"Requests left in the current minute.","schema":{"type":"integer"}},"RateLimit-Reset":{"description":"Seconds until the minute's budget resets.","schema":{"type":"integer"}}}},"400":{"description":"The request is not valid: a field is missing or has the wrong shape (the message names it).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No valid credentials: the API key or access token is missing, revoked or expired (INVALID_API_KEY, INVALID_TOKEN).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Not allowed: the key or token lacks this scope (SCOPE_REQUIRED), the route is dashboard-only (SESSION_REQUIRED), or a plan limit applies.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (RATE_LIMITED): wait the seconds Retry-After gives.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}},"headers":{"Retry-After":{"description":"Seconds to wait.","schema":{"type":"integer"}}}}},"security":[{"apiKey":[]},{"oauth":["audit:read"]}],"summary":"Get the audit log's filters","tags":["Audit log"],"x-fortwatch-area":"audit","x-fortwatch-scope":"audit:read"}}},"components":{"schemas":{"MessageModel":{"type":"object","properties":{"message":{"type":"string"}},"required":["message"]},"ProjectCountsModel":{"type":"object","properties":{"assets":{"type":"number"}},"required":["assets"]},"ProjectModel":{"type":"object","properties":{"id":{"type":"number"},"workspaceId":{"type":"number"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"color":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"_count":{"$ref":"#/components/schemas/ProjectCountsModel"}},"required":["id","workspaceId","name","description","color","createdAt","updatedAt","_count"]},"CreateProjectDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":2000},"color":{"type":"string","nullable":true,"maxLength":30}},"required":["name"]},"UpdateProjectDto":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":255},"description":{"type":"string","nullable":true,"maxLength":2000},"color":{"type":"string","nullable":true,"maxLength":30}}},"PersonNameModel":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["firstName","lastName"]},"PortAssetModel":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"object","nullable":true},"value":{"type":"string"},"type":{"type":"string"},"projectName":{"type":"string"},"projectColor":{"type":"object","nullable":true},"issueId":{"type":"number"},"seenInLatestScan":{"type":"boolean"}},"required":["id","name","value","type","issueId","seenInLatestScan"]},"PortModel":{"type":"object","properties":{"port":{"type":"number"},"protocol":{"type":"string"},"service":{"type":"object","nullable":true},"severity":{"type":"string"},"category":{"type":"string"},"issueCategory":{"type":"string"},"label":{"type":"string"},"issues":{"type":"number"},"assets":{"type":"array","items":{"$ref":"#/components/schemas/PortAssetModel"}}},"required":["port","protocol","service","severity","category","issueCategory","label","issues","assets"]},"PortCategoryModel":{"type":"object","properties":{"category":{"type":"string"},"label":{"type":"string"},"issueCategory":{"type":"string"},"total":{"type":"number"},"issues":{"type":"number"},"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"}},"required":["category","label","issueCategory","total","issues","critical","high","medium"]},"PortsSummaryModel":{"type":"object","properties":{"total":{"type":"number"},"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"},"low":{"type":"number"},"byCategory":{"type":"object"}},"required":["total","critical","high","medium","low","byCategory"]},"PortsModel":{"type":"object","properties":{"ports":{"type":"array","items":{"$ref":"#/components/schemas/PortModel"}},"categories":{"type":"array","items":{"$ref":"#/components/schemas/PortCategoryModel"}},"summary":{"$ref":"#/components/schemas/PortsSummaryModel"}},"required":["ports","categories","summary"]},"AssetProjectSummaryModel":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"color":{"type":"string"}},"required":["id","name","color"]},"AssetLatestScanSummaryModel":{"type":"object","properties":{"id":{"type":"number"},"status":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}},"required":["id","status","createdAt"]},"OpenBySeverityModel":{"type":"object","properties":{"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"},"low":{"type":"number"}},"required":["critical","high","medium","low"]},"AssetListItemModel":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"name":{"type":"string","nullable":true},"type":{"type":"string"},"value":{"type":"string"},"status":{"type":"string"},"canonicalUrl":{"type":"string","nullable":true},"resolvedIp":{"type":"string","nullable":true},"cdnProvider":{"type":"string","nullable":true},"bucketProvider":{"type":"string","nullable":true},"lastCheckedAt":{"type":"string","format":"date-time","nullable":true},"failReason":{"type":"string","nullable":true},"skippedRedirectHost":{"type":"string","nullable":true},"disabledScannerTypes":{"type":"array","items":{"type":"string"}},"portScanMode":{"type":"string"},"nucleiMinSeverity":{"type":"string"},"ownershipVerifiedAt":{"type":"string","format":"date-time","nullable":true},"ownershipToken":{"type":"string"},"ownershipMethod":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"project":{"$ref":"#/components/schemas/AssetProjectSummaryModel"},"scans":{"type":"array","items":{"$ref":"#/components/schemas/AssetLatestScanSummaryModel"}},"_count":{"type":"object"},"rootDomain":{"type":"object","nullable":true},"findingCount":{"type":"number"},"issueCount":{"type":"number"},"openBySeverity":{"$ref":"#/components/schemas/OpenBySeverityModel"},"highestIssueSeverity":{"type":"object","nullable":true},"attentionReasons":{"type":"array","items":{"type":"string"}},"lastCompletedScanAt":{"type":"string","format":"date-time","nullable":true},"staleAfterDays":{"type":"number"}},"required":["id","projectId","name","type","value","status","canonicalUrl","resolvedIp","cdnProvider","bucketProvider","lastCheckedAt","failReason","skippedRedirectHost","disabledScannerTypes","portScanMode","nucleiMinSeverity","ownershipVerifiedAt","ownershipToken","ownershipMethod","createdAt","updatedAt","project","scans","_count","rootDomain","findingCount","issueCount","openBySeverity","highestIssueSeverity","attentionReasons","lastCompletedScanAt","staleAfterDays"]},"CreateAssetDto":{"type":"object","properties":{"projectId":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string","nullable":true,"maxLength":255},"type":{"type":"string"},"value":{"type":"string"},"bucketProvider":{"type":"string","nullable":true},"acceptExtraCharge":{"type":"boolean"}},"required":["projectId","type","value"]},"AssetWithProjectModel":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"name":{"type":"string","nullable":true},"type":{"type":"string"},"value":{"type":"string"},"status":{"type":"string"},"canonicalUrl":{"type":"string","nullable":true},"resolvedIp":{"type":"string","nullable":true},"cdnProvider":{"type":"string","nullable":true},"bucketProvider":{"type":"string","nullable":true},"lastCheckedAt":{"type":"string","format":"date-time","nullable":true},"failReason":{"type":"string","nullable":true},"skippedRedirectHost":{"type":"string","nullable":true},"disabledScannerTypes":{"type":"array","items":{"type":"string"}},"portScanMode":{"type":"string"},"nucleiMinSeverity":{"type":"string"},"ownershipVerifiedAt":{"type":"string","format":"date-time","nullable":true},"ownershipToken":{"type":"string"},"ownershipMethod":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"project":{"$ref":"#/components/schemas/AssetProjectSummaryModel"}},"required":["id","projectId","name","type","value","status","canonicalUrl","resolvedIp","cdnProvider","bucketProvider","lastCheckedAt","failReason","skippedRedirectHost","disabledScannerTypes","portScanMode","nucleiMinSeverity","ownershipVerifiedAt","ownershipToken","ownershipMethod","createdAt","updatedAt","project"]},"SeverityCountsModel":{"type":"object","properties":{"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"},"low":{"type":"number"},"info":{"type":"number"}},"required":["critical","high","medium","low","info"]},"OpenPortModel":{"type":"object","properties":{"port":{"type":"number"},"protocol":{"type":"string"},"service":{"type":"string"},"version":{"type":"object","nullable":true},"severity":{"type":"string"},"name":{"type":"string"}},"required":["port","protocol","service","version","severity","name"]},"FindingTrendPointModel":{"type":"object","properties":{"scanId":{"type":"number"},"date":{"type":"string","format":"date-time"},"total":{"type":"number"},"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"},"low":{"type":"number"}},"required":["scanId","date","total","critical","high","medium","low"]},"IssueSummaryModel":{"type":"object","properties":{"open":{"type":"number"},"resolved":{"type":"number"},"dismissed":{"type":"number"},"total":{"type":"number"},"lowOpen":{"type":"number"},"lowResolved":{"type":"number"}},"required":["open","resolved","dismissed","total","lowOpen","lowResolved"]},"ScannerCountModel":{"type":"object","properties":{"scanner":{"type":"string"},"count":{"type":"number"}},"required":["scanner","count"]},"RemediationWeekModel":{"type":"object","properties":{"week":{"type":"string","format":"date"},"opened":{"type":"number"},"resolved":{"type":"number"}},"required":["week","opened","resolved"]},"SkippedRedirectModel":{"type":"object","properties":{"host":{"type":"string"},"assetId":{"type":"number","nullable":true,"description":"The workspace's asset for that host or its www twin"},"assetValue":{"type":"string","nullable":true,"description":"That asset's value: the host or its www twin"},"assetVerified":{"type":"boolean","description":"That asset is proven, so it is scanned on its own"},"signInService":{"type":"boolean","description":"A well-known sign-in service, which the customer cannot add"},"underAsset":{"type":"boolean","description":"A name under the asset, which a DNS proof of the asset covers"}},"required":["host","assetId","assetValue","assetVerified","signInService","underAsset"]},"AssetDetailModel":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"name":{"type":"string","nullable":true},"type":{"type":"string"},"value":{"type":"string"},"status":{"type":"string"},"canonicalUrl":{"type":"string","nullable":true},"resolvedIp":{"type":"string","nullable":true},"cdnProvider":{"type":"string","nullable":true},"bucketProvider":{"type":"string","nullable":true},"lastCheckedAt":{"type":"string","format":"date-time","nullable":true},"failReason":{"type":"string","nullable":true},"skippedRedirectHost":{"type":"string","nullable":true},"disabledScannerTypes":{"type":"array","items":{"type":"string"}},"portScanMode":{"type":"string"},"nucleiMinSeverity":{"type":"string"},"ownershipVerifiedAt":{"type":"string","format":"date-time","nullable":true},"ownershipToken":{"type":"string"},"ownershipMethod":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"project":{"type":"object"},"scans":{"type":"array","items":{"type":"object"}},"scanSchedules":{"type":"array","items":{"type":"object"}},"attentionReasons":{"type":"array","items":{"type":"string"}},"lastCompletedScanAt":{"type":"string","format":"date-time","nullable":true},"staleAfterDays":{"type":"number"},"severityCounts":{"$ref":"#/components/schemas/SeverityCountsModel"},"issues":{"type":"array","items":{"type":"object"}},"totalFindings":{"type":"number"},"openPorts":{"type":"array","items":{"$ref":"#/components/schemas/OpenPortModel"}},"latestFindings":{"type":"array","items":{"type":"object"}},"technologies":{"type":"array","items":{"type":"object"}},"findingTrend":{"type":"array","items":{"$ref":"#/components/schemas/FindingTrendPointModel"}},"detectedOs":{"type":"object","nullable":true},"issueSummary":{"$ref":"#/components/schemas/IssueSummaryModel"},"daysMonitored":{"type":"number"},"latestScreenshot":{"type":"object","nullable":true},"scannerSummary":{"type":"array","items":{"$ref":"#/components/schemas/ScannerCountModel"}},"remediationProgress":{"type":"array","items":{"$ref":"#/components/schemas/RemediationWeekModel"}},"skippedRedirect":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/SkippedRedirectModel"}]}},"required":["id","projectId","name","type","value","status","canonicalUrl","resolvedIp","cdnProvider","bucketProvider","lastCheckedAt","failReason","skippedRedirectHost","disabledScannerTypes","portScanMode","nucleiMinSeverity","ownershipVerifiedAt","ownershipToken","ownershipMethod","createdAt","updatedAt","project","scans","scanSchedules","attentionReasons","lastCompletedScanAt","staleAfterDays","severityCounts","issues","totalFindings","openPorts","latestFindings","technologies","findingTrend","detectedOs","issueSummary","daysMonitored","latestScreenshot","scannerSummary","remediationProgress","skippedRedirect"]},"UpdateAssetDto":{"type":"object","properties":{"projectId":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"name":{"type":"string","nullable":true,"maxLength":255},"type":{"type":"string"},"value":{"type":"string"},"disabledScannerTypes":{"type":"array","items":{"type":"string","maxLength":50}},"bucketProvider":{"type":"string","nullable":true},"portScanMode":{"type":"string","enum":["full","fast"]},"nucleiMinSeverity":{"type":"string","enum":["low","medium","high","critical"]},"acceptExtraCharge":{"type":"boolean"}}},"OutsideViewItemModel":{"type":"object","properties":{"severity":{"type":"string"},"templateId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"remediation":{"type":"string","nullable":true}},"required":["severity","templateId","name","description","remediation"]},"OutsideViewModel":{"type":"object","properties":{"part":{"type":"string","enum":["web","email","dns","subdomains"]},"host":{"type":"string"},"checkedAt":{"type":"string","format":"date-time"},"status":{"type":"string","enum":["ok","unreachable","unavailable"]},"items":{"type":"array","items":{"$ref":"#/components/schemas/OutsideViewItemModel"}},"facts":{"type":"object","description":"What the part read: the page and its certificate, the mail records, the DNS records, or the subdomain count and a sample"}},"required":["part","host","checkedAt","status","items","facts"]},"OwnershipDnsModel":{"type":"object","properties":{"host":{"type":"string"},"type":{"type":"string"},"value":{"type":"string"}},"required":["host","type","value"]},"OwnershipHttpModel":{"type":"object","properties":{"url":{"type":"string"},"path":{"type":"string"},"content":{"type":"string"}},"required":["url","path","content"]},"OwnershipChallengeModel":{"type":"object","properties":{"token":{"type":"string"},"methods":{"type":"array","items":{"type":"string"}},"dns":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/OwnershipDnsModel"}]},"http":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/OwnershipHttpModel"}]}},"required":["token","methods","dns","http"]},"OwnershipStateModel":{"type":"object","properties":{"verified":{"type":"boolean"},"verifiedAt":{"type":"string","format":"date-time","nullable":true},"method":{"type":"object","nullable":true},"challenge":{"$ref":"#/components/schemas/OwnershipChallengeModel"}},"required":["verified","verifiedAt","method","challenge"]},"FirstScanModel":{"type":"object","properties":{"id":{"type":"number"},"assetId":{"type":"number"},"status":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":"string","format":"date-time","nullable":true},"jobsTotal":{"type":"number"},"jobsDone":{"type":"number"}},"required":["id","assetId","status","createdAt","startedAt","jobsTotal","jobsDone"]},"OwnershipVerifiedModel":{"type":"object","properties":{"verified":{"type":"boolean"},"method":{"type":"object","nullable":true},"alreadyVerified":{"type":"boolean"},"scan":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/FirstScanModel"}]}},"required":["verified","method","alreadyVerified","scan"]},"DiscoveryLastRunModel":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"domain":{"type":"string"},"status":{"type":"string"},"foundCount":{"type":"object","nullable":true},"newCount":{"type":"object","nullable":true},"wildcardDns":{"type":"object","nullable":true},"error":{"type":"object","nullable":true},"finishedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","domain","status","foundCount","newCount","wildcardDns","error","finishedAt","createdAt"]},"DiscoverySummaryModel":{"type":"object","properties":{"projectId":{"type":"number"},"domain":{"type":"string"},"new":{"type":"number"},"newLive":{"type":"number"},"added":{"type":"number"},"ignored":{"type":"number"},"lastRun":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/DiscoveryLastRunModel"}]}},"required":["projectId","domain","new","newLive","added","ignored","lastRun"]},"DiscoveryProjectModel":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"},"color":{"type":"string"}},"required":["id","name","color"]},"DiscoveredHostModel":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"domain":{"type":"string"},"host":{"type":"string"},"sources":{"type":"array","items":{"type":"string"}},"resolves":{"type":"object","nullable":true},"resolvedIp":{"type":"object","nullable":true},"cname":{"type":"object","nullable":true},"wildcard":{"type":"object","nullable":true},"status":{"type":"string"},"assetId":{"type":"object","nullable":true},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"project":{"$ref":"#/components/schemas/DiscoveryProjectModel"}},"required":["id","projectId","domain","host","sources","resolves","resolvedIp","cname","wildcard","status","assetId","firstSeenAt","lastSeenAt","project"]},"DiscoveryRunDto":{"type":"object","properties":{"projectId":{"type":"integer","minimum":1,"maximum":9007199254740991},"domain":{"type":"string"}},"required":["projectId"]},"DiscoveryRunModel":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"domain":{"type":"string"},"status":{"type":"string"},"trigger":{"type":"string"},"foundCount":{"type":"number"},"newCount":{"type":"number"},"wildcardDns":{"type":"boolean"},"error":{"type":"string","nullable":true},"createdByUserId":{"type":"number","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"finishedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","projectId","domain","status","trigger","foundCount","newCount","wildcardDns","error","createdByUserId","startedAt","finishedAt","createdAt"]},"DiscoveryAddHostsDto":{"type":"object","properties":{"ids":{"type":"array","description":"Required. The ids of the discovered hostnames to add.","items":{"type":"integer"}},"acceptExtraCharge":{"type":"boolean"}}},"DiscoveryAddResultModel":{"type":"object","properties":{"id":{"type":"number"},"host":{"type":"string"},"assetId":{"type":"number"},"created":{"type":"boolean"},"error":{"type":"string"}},"required":["id","host"]},"DiscoveryAddResultsModel":{"type":"object","properties":{"results":{"type":"array","items":{"$ref":"#/components/schemas/DiscoveryAddResultModel"}}},"required":["results"]},"ScanProjectModel":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},"ScanAssetSummaryModel":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"object","nullable":true},"value":{"type":"string"},"type":{"type":"string"},"project":{"$ref":"#/components/schemas/ScanProjectModel"}},"required":["id","name","value","type","project"]},"ScanFindingCountModel":{"type":"object","properties":{"findings":{"type":"number"}},"required":["findings"]},"ScanListItemModel":{"type":"object","properties":{"id":{"type":"number"},"assetId":{"type":"number"},"status":{"type":"string"},"triggeredBy":{"type":"string"},"triggeredByUserId":{"type":"number","nullable":true},"failureCode":{"type":"string","nullable":true},"failureDetail":{"type":"string","nullable":true},"scannerIp":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"asset":{"$ref":"#/components/schemas/ScanAssetSummaryModel"},"_count":{"$ref":"#/components/schemas/ScanFindingCountModel"},"scanNumber":{"type":"number"},"severities":{"type":"object"}},"required":["id","assetId","status","triggeredBy","triggeredByUserId","failureCode","failureDetail","scannerIp","startedAt","completedAt","createdAt","updatedAt","asset","_count","scanNumber","severities"]},"CreateScanDto":{"type":"object","properties":{"assetId":{"type":"integer","minimum":1,"maximum":9007199254740991},"issueId":{"type":"integer","minimum":1,"maximum":9007199254740991}}},"AssetWithProjectSummaryModel":{"type":"object","properties":{"id":{"type":"number"},"projectId":{"type":"number"},"name":{"type":"string","nullable":true},"type":{"type":"string"},"value":{"type":"string"},"status":{"type":"string"},"canonicalUrl":{"type":"string","nullable":true},"resolvedIp":{"type":"string","nullable":true},"cdnProvider":{"type":"string","nullable":true},"bucketProvider":{"type":"string","nullable":true},"lastCheckedAt":{"type":"string","format":"date-time","nullable":true},"failReason":{"type":"string","nullable":true},"skippedRedirectHost":{"type":"string","nullable":true},"disabledScannerTypes":{"type":"array","items":{"type":"string"}},"portScanMode":{"type":"string"},"nucleiMinSeverity":{"type":"string"},"ownershipVerifiedAt":{"type":"string","format":"date-time","nullable":true},"ownershipToken":{"type":"string"},"ownershipMethod":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"project":{"$ref":"#/components/schemas/ScanProjectModel"}},"required":["id","projectId","name","type","value","status","canonicalUrl","resolvedIp","cdnProvider","bucketProvider","lastCheckedAt","failReason","skippedRedirectHost","disabledScannerTypes","portScanMode","nucleiMinSeverity","ownershipVerifiedAt","ownershipToken","ownershipMethod","createdAt","updatedAt","project"]},"ScanCreatedAppModel":{"type":"object","properties":{"id":{"type":"number"},"assetId":{"type":"number"},"status":{"type":"string"},"triggeredBy":{"type":"string"},"triggeredByUserId":{"type":"number","nullable":true},"failureCode":{"type":"string","nullable":true},"failureDetail":{"type":"string","nullable":true},"scannerIp":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"asset":{"$ref":"#/components/schemas/AssetWithProjectSummaryModel"},"scanners":{"type":"array","items":{"type":"string"}},"forcedScanners":{"type":"array","items":{"type":"string"}},"jobsTotal":{"type":"number"},"jobsDone":{"type":"number"}},"required":["id","assetId","status","triggeredBy","triggeredByUserId","failureCode","failureDetail","scannerIp","startedAt","completedAt","createdAt","updatedAt","asset","scanners","forcedScanners","jobsTotal","jobsDone"]},"ActiveScanModel":{"type":"object","properties":{"jobsTotal":{"type":"number"},"jobsDone":{"type":"number"},"id":{"type":"number"},"assetId":{"type":"number"},"status":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"startedAt":{"type":"string","format":"date-time","nullable":true}},"required":["jobsTotal","jobsDone","id","assetId","status","createdAt","startedAt"]},"ScanWithAssetSummaryModel":{"type":"object","properties":{"id":{"type":"number"},"assetId":{"type":"number"},"status":{"type":"string"},"triggeredBy":{"type":"string"},"triggeredByUserId":{"type":"number","nullable":true},"failureCode":{"type":"string","nullable":true},"failureDetail":{"type":"string","nullable":true},"scannerIp":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"asset":{"$ref":"#/components/schemas/ScanAssetSummaryModel"},"_count":{"$ref":"#/components/schemas/ScanFindingCountModel"}},"required":["id","assetId","status","triggeredBy","triggeredByUserId","failureCode","failureDetail","scannerIp","startedAt","completedAt","createdAt","updatedAt","asset","_count"]},"ScanDetailAppModel":{"type":"object","properties":{"scan":{"$ref":"#/components/schemas/ScanWithAssetSummaryModel"},"summary":{"$ref":"#/components/schemas/SeverityCountsModel"}},"required":["scan","summary"]},"ScanFindingIssueModel":{"type":"object","properties":{"id":{"type":"number"},"status":{"type":"string"},"title":{"type":"string"}},"required":["id","status","title"]},"ScanFindingModel":{"type":"object","properties":{"id":{"type":"number"},"scanner":{"type":"string"},"severity":{"type":"string"},"templateId":{"type":"object","nullable":true},"name":{"type":"string"},"description":{"type":"object","nullable":true},"matchedAt":{"type":"object","nullable":true},"tags":{"type":"object","nullable":true},"cveIds":{"type":"object","nullable":true},"cvssScore":{"type":"object","nullable":true},"remediation":{"type":"object","nullable":true},"reference":{"type":"object","nullable":true},"createdAt":{"type":"string","format":"date-time"},"issue":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ScanFindingIssueModel"}]},"category":{"type":"string"}},"required":["id","scanner","severity","templateId","name","description","matchedAt","tags","cveIds","cvssScore","remediation","reference","createdAt","issue","category"]},"ScanIssueModel":{"type":"object","properties":{"id":{"type":"number"},"title":{"type":"string"},"severity":{"type":"string"},"status":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"assignee":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonNameModel"}]},"_count":{"type":"object"},"foundAt":{"type":"string","format":"date-time"},"fixedAt":{"type":"string","format":"date-time","nullable":true},"daysToFix":{"type":"object","nullable":true},"foundInScanId":{"type":"object","nullable":true}},"required":["id","title","severity","status","createdAt","updatedAt","assignee","_count","foundAt","fixedAt","daysToFix","foundInScanId"]},"ScanScheduleModel":{"type":"object","properties":{"id":{"type":"number"},"assetId":{"type":"number"},"name":{"type":"string"},"frequency":{"type":"string"},"dayOfWeek":{"type":"number","nullable":true},"dayOfMonth":{"type":"number","nullable":true},"time":{"type":"string"},"intervalDays":{"type":"number","nullable":true},"windowStartHour":{"type":"number","nullable":true},"windowEndHour":{"type":"number","nullable":true},"windowDays":{"type":"array","items":{"type":"number"}},"enabled":{"type":"boolean"},"lastRunAt":{"type":"string","format":"date-time","nullable":true},"nextRunAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"asset":{"$ref":"#/components/schemas/AssetWithProjectSummaryModel"}},"required":["id","assetId","name","frequency","dayOfWeek","dayOfMonth","time","intervalDays","windowStartHour","windowEndHour","windowDays","enabled","lastRunAt","nextRunAt","createdAt","updatedAt","asset"]},"CreateScheduleDto":{"type":"object","properties":{"assetId":{"type":"integer","description":"Required. The asset to scan."},"frequency":{"type":"string","enum":["daily","weekly","monthly","interval"],"description":"Required."},"dayOfWeek":{"type":"integer","minimum":0,"maximum":6,"description":"Weekly: 0 = Sunday … 6 = Saturday."},"dayOfMonth":{"type":"integer","minimum":1,"maximum":31,"description":"Monthly: the day of the month."},"time":{"type":"string","pattern":"^\\d{2}:\\d{2}$","description":"Required. The time of day, UTC (HH:MM).","example":"03:30"},"intervalDays":{"type":"integer","nullable":true,"minimum":2,"maximum":30},"windowStartHour":{"type":"integer","nullable":true,"minimum":0,"maximum":23},"windowEndHour":{"type":"integer","nullable":true,"minimum":0,"maximum":23},"windowDays":{"type":"array","items":{"type":"integer","minimum":0,"maximum":6}}}},"UpdateScheduleDto":{"type":"object","properties":{"name":{"type":"string","description":"Ignored: the name is derived from when the schedule runs."},"frequency":{"type":"string"},"dayOfWeek":{"type":"integer","nullable":true,"minimum":-9007199254740991,"maximum":9007199254740991},"dayOfMonth":{"type":"integer","nullable":true,"minimum":-9007199254740991,"maximum":9007199254740991},"time":{"type":"string"},"enabled":{"type":"boolean"},"intervalDays":{"type":"integer","nullable":true,"minimum":2,"maximum":30},"windowStartHour":{"type":"integer","nullable":true,"minimum":0,"maximum":23},"windowEndHour":{"type":"integer","nullable":true,"minimum":0,"maximum":23},"windowDays":{"type":"array","items":{"type":"integer","minimum":0,"maximum":6}}}},"FindingScanModel":{"type":"object","properties":{"id":{"type":"number"},"assetId":{"type":"number"},"status":{"type":"string"},"triggeredBy":{"type":"string"},"triggeredByUserId":{"type":"number","nullable":true},"failureCode":{"type":"string","nullable":true},"failureDetail":{"type":"string","nullable":true},"scannerIp":{"type":"string","nullable":true},"startedAt":{"type":"string","format":"date-time","nullable":true},"completedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"asset":{"$ref":"#/components/schemas/ScanAssetSummaryModel"}},"required":["id","assetId","status","triggeredBy","triggeredByUserId","failureCode","failureDetail","scannerIp","startedAt","completedAt","createdAt","updatedAt","asset"]},"FindingAppModel":{"type":"object","properties":{"id":{"type":"number"},"scanId":{"type":"number","nullable":true},"investigationId":{"type":"number","nullable":true},"scanner":{"type":"string"},"severity":{"type":"string"},"templateId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string","nullable":true},"matchedAt":{"type":"string","nullable":true},"tags":{"type":"string","nullable":true},"cveIds":{"type":"string","nullable":true},"reference":{"type":"string","nullable":true},"remediation":{"type":"string","nullable":true},"cvssScore":{"type":"number","nullable":true},"cvssMetrics":{"type":"string","nullable":true},"rawJson":{"type":"object","nullable":true},"issueId":{"type":"number","nullable":true},"createdAt":{"type":"string","format":"date-time"},"scan":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/FindingScanModel"}]},"issue":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/ScanFindingIssueModel"}]},"category":{"type":"string"}},"required":["id","scanId","investigationId","scanner","severity","templateId","name","description","matchedAt","tags","cveIds","reference","remediation","cvssScore","cvssMetrics","rawJson","issueId","createdAt","scan","issue","category"]},"IssueAssetProjectModel":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"string"}},"required":["id","name"]},"IssueAssetModel":{"type":"object","properties":{"id":{"type":"number"},"name":{"type":"object","nullable":true},"value":{"type":"string"},"type":{"type":"string"},"cdnProvider":{"type":"object","nullable":true},"project":{"$ref":"#/components/schemas/IssueAssetProjectModel"}},"required":["id","name","value","type","cdnProvider","project"]},"IssueLatestFindingSummaryModel":{"type":"object","properties":{"scanner":{"type":"string"},"remediation":{"type":"object","nullable":true},"reference":{"type":"object","nullable":true},"matchedAt":{"type":"object","nullable":true},"scanId":{"type":"object","nullable":true},"name":{"type":"string"},"templateId":{"type":"object","nullable":true}},"required":["scanner","remediation","reference","matchedAt","scanId","name","templateId"]},"IssueCountsModel":{"type":"object","properties":{"findings":{"type":"number"}},"required":["findings"]},"IssueVerificationModel":{"type":"object","properties":{"status":{"type":"string","enum":["queued","running","done","failed","skipped"]},"scanId":{"type":"number","nullable":true},"reason":{"type":"string","nullable":true,"description":"Why no re-check started: limit, asset_not_active, ownership_unverified, error"},"nextScheduledAt":{"format":"date-time","type":"string","nullable":true,"description":"The asset's next scheduled scan, when no re-check started"}},"required":["status","scanId","reason","nextScheduledAt"]},"IssueAppListItemModel":{"type":"object","properties":{"id":{"type":"number"},"workspaceId":{"type":"number"},"assetId":{"type":"number"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"severity":{"type":"string"},"status":{"type":"string"},"templateId":{"type":"string","nullable":true},"dedupKey":{"type":"string"},"assignedTo":{"type":"number","nullable":true},"resolution":{"type":"string","nullable":true},"resolvedBy":{"type":"string","nullable":true},"resolvedByScanId":{"type":"number","nullable":true},"resolvedByUserId":{"type":"number","nullable":true},"dismissedByUserId":{"type":"number","nullable":true},"category":{"type":"string"},"dueDate":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"lastReopenedAt":{"type":"string","format":"date-time","nullable":true},"dismissReason":{"type":"string","nullable":true},"dismissNotes":{"type":"string","nullable":true},"dismissExpiresAt":{"type":"string","format":"date-time","nullable":true},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"lastCheckedAt":{"type":"string","format":"date-time","nullable":true},"reachability":{"type":"string"},"verificationScanId":{"type":"number","nullable":true},"verificationSkipped":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"assignee":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonNameModel"}]},"resolvedByUser":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonNameModel"}]},"dismissedByUser":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonNameModel"}]},"asset":{"$ref":"#/components/schemas/IssueAssetModel"},"findings":{"type":"array","items":{"$ref":"#/components/schemas/IssueLatestFindingSummaryModel"}},"_count":{"$ref":"#/components/schemas/IssueCountsModel"},"seenInLatestScan":{"type":"boolean"},"proof":{"type":"object","nullable":true},"reproduce":{"type":"object","nullable":true},"vantage":{"type":"object","nullable":true},"verification":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/IssueVerificationModel"}]}},"required":["id","workspaceId","assetId","title","description","severity","status","templateId","dedupKey","assignedTo","resolution","resolvedBy","resolvedByScanId","resolvedByUserId","dismissedByUserId","category","dueDate","resolvedAt","lastReopenedAt","dismissReason","dismissNotes","dismissExpiresAt","firstSeenAt","lastSeenAt","lastCheckedAt","reachability","verificationScanId","verificationSkipped","createdAt","updatedAt","assignee","resolvedByUser","dismissedByUser","asset","findings","_count","seenInLatestScan","proof","reproduce","vantage","verification"]},"IssueStatusCountsModel":{"type":"object","properties":{"open":{"type":"number"},"in_progress":{"type":"number"},"resolved":{"type":"number"},"dismissed":{"type":"number"}},"required":["open","in_progress","resolved","dismissed"]},"IssueCountsSummaryModel":{"type":"object","properties":{"current":{"type":"number"},"fixed":{"type":"number"},"dismissed":{"type":"number"},"total":{"type":"number"},"byStatus":{"$ref":"#/components/schemas/IssueStatusCountsModel"}},"required":["current","fixed","dismissed","total","byStatus"]},"SlaTargetsDaysModel":{"type":"object","properties":{"critical":{"type":"number"},"high":{"type":"number"},"medium":{"type":"number"},"low":{"type":"number"}},"required":["critical","high","medium","low"]},"IssuesPageModel":{"type":"object","properties":{"issues":{"type":"array","items":{"$ref":"#/components/schemas/IssueAppListItemModel"}},"total":{"type":"number"},"page":{"type":"number"},"limit":{"type":"number"},"counts":{"$ref":"#/components/schemas/IssueCountsSummaryModel"},"severityBreakdown":{"type":"object"},"slaTargets":{"$ref":"#/components/schemas/SlaTargetsDaysModel"}},"required":["issues","total","page","limit","counts","severityBreakdown","slaTargets"]},"IssueDetectionModel":{"type":"object","properties":{"id":{"type":"number"},"scanId":{"type":"object","nullable":true},"createdAt":{"type":"string","format":"date-time"}},"required":["id","scanId","createdAt"]},"CdnFrontingModel":{"type":"object","properties":{"asset":{"type":"string"},"name":{"type":"string"},"source":{"type":"string"}},"required":["asset","name","source"]},"IssueCommentModel":{"type":"object","properties":{"id":{"type":"number"},"body":{"type":"string"},"authorName":{"type":"string"},"userId":{"type":"object","nullable":true},"createdAt":{"type":"string","format":"date-time"},"editedAt":{"type":"string","format":"date-time","nullable":true}},"required":["id","body","authorName","userId","createdAt","editedAt"]},"IssueAppDetailModel":{"type":"object","properties":{"id":{"type":"number"},"workspaceId":{"type":"number"},"assetId":{"type":"number"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"severity":{"type":"string"},"status":{"type":"string"},"templateId":{"type":"string","nullable":true},"dedupKey":{"type":"string"},"assignedTo":{"type":"number","nullable":true},"resolution":{"type":"string","nullable":true},"resolvedBy":{"type":"string","nullable":true},"resolvedByScanId":{"type":"number","nullable":true},"resolvedByUserId":{"type":"number","nullable":true},"dismissedByUserId":{"type":"number","nullable":true},"category":{"type":"string"},"dueDate":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"lastReopenedAt":{"type":"string","format":"date-time","nullable":true},"dismissReason":{"type":"string","nullable":true},"dismissNotes":{"type":"string","nullable":true},"dismissExpiresAt":{"type":"string","format":"date-time","nullable":true},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"lastCheckedAt":{"type":"string","format":"date-time","nullable":true},"reachability":{"type":"string"},"verificationScanId":{"type":"number","nullable":true},"verificationSkipped":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"latestFinding":{"type":"object","nullable":true},"detectionHistory":{"type":"array","items":{"$ref":"#/components/schemas/IssueDetectionModel"}},"totalDetections":{"type":"number"},"cdnFronting":{"type":"array","items":{"$ref":"#/components/schemas/CdnFrontingModel"}},"comments":{"type":"array","items":{"$ref":"#/components/schemas/IssueCommentModel"}},"proof":{"type":"object","nullable":true},"reproduce":{"type":"object","nullable":true},"vantage":{"type":"object","nullable":true},"raw":{"type":"object"},"evidence":{"type":"object","nullable":true},"verification":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/IssueVerificationModel"}]}},"required":["id","workspaceId","assetId","title","description","severity","status","templateId","dedupKey","assignedTo","resolution","resolvedBy","resolvedByScanId","resolvedByUserId","dismissedByUserId","category","dueDate","resolvedAt","lastReopenedAt","dismissReason","dismissNotes","dismissExpiresAt","firstSeenAt","lastSeenAt","lastCheckedAt","reachability","verificationScanId","verificationSkipped","createdAt","updatedAt","latestFinding","detectionHistory","totalDetections","cdnFronting","comments","proof","reproduce","vantage","raw","evidence","verification"]},"UpdateIssueStatusDto":{"type":"object","properties":{"status":{"type":"string","enum":["open","in_progress","resolved"],"description":"Required. Dismissing has its own endpoint."},"resolution":{"type":"string","nullable":true}}},"IssueDetailModel":{"type":"object","properties":{"id":{"type":"number"},"workspaceId":{"type":"number"},"assetId":{"type":"number"},"title":{"type":"string"},"description":{"type":"string","nullable":true},"severity":{"type":"string"},"status":{"type":"string"},"templateId":{"type":"string","nullable":true},"dedupKey":{"type":"string"},"assignedTo":{"type":"number","nullable":true},"resolution":{"type":"string","nullable":true},"resolvedBy":{"type":"string","nullable":true},"resolvedByScanId":{"type":"number","nullable":true},"resolvedByUserId":{"type":"number","nullable":true},"dismissedByUserId":{"type":"number","nullable":true},"category":{"type":"string"},"dueDate":{"type":"string","format":"date-time","nullable":true},"resolvedAt":{"type":"string","format":"date-time","nullable":true},"lastReopenedAt":{"type":"string","format":"date-time","nullable":true},"dismissReason":{"type":"string","nullable":true},"dismissNotes":{"type":"string","nullable":true},"dismissExpiresAt":{"type":"string","format":"date-time","nullable":true},"firstSeenAt":{"type":"string","format":"date-time"},"lastSeenAt":{"type":"string","format":"date-time"},"lastCheckedAt":{"type":"string","format":"date-time","nullable":true},"reachability":{"type":"string"},"verificationScanId":{"type":"number","nullable":true},"verificationSkipped":{"type":"string","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"assignee":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonNameModel"}]},"asset":{"$ref":"#/components/schemas/IssueAssetModel"},"_count":{"$ref":"#/components/schemas/IssueCountsModel"},"resolvedByUser":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonNameModel"}]},"dismissedByUser":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/PersonNameModel"}]},"verification":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/IssueVerificationModel"}]}},"required":["id","workspaceId","assetId","title","description","severity","status","templateId","dedupKey","assignedTo","resolution","resolvedBy","resolvedByScanId","resolvedByUserId","dismissedByUserId","category","dueDate","resolvedAt","lastReopenedAt","dismissReason","dismissNotes","dismissExpiresAt","firstSeenAt","lastSeenAt","lastCheckedAt","reachability","verificationScanId","verificationSkipped","createdAt","updatedAt","assignee","asset","_count","resolvedByUser","dismissedByUser"]},"AssignIssueDto":{"type":"object","properties":{"assigneeId":{"type":"integer","nullable":true,"minimum":1,"maximum":2147483647}},"required":["assigneeId"]},"CommentBodyDto":{"type":"object","properties":{"body":{"type":"string","minLength":1,"maxLength":5000,"description":"Required. The note."}}},"DismissIssueDto":{"type":"object","properties":{"reason":{"type":"string","enum":["false_positive","accepted_risk","mitigating_control","not_applicable","noise"],"description":"Required."},"notes":{"type":"string","nullable":true},"expiresIn":{"type":"string","nullable":true}}},"ReportSummaryModel":{"type":"object","properties":{"period":{"type":"object"},"issues":{"type":"object"},"findings":{"type":"object"},"scans":{"type":"object"},"recentScans":{"type":"array","items":{"type":"object"}}},"required":["period","issues","findings","scans","recentScans"]},"VulnerableAssetModel":{"type":"object","properties":{"id":{"type":"number"},"value":{"type":"string"},"type":{"type":"string"},"project":{"type":"object"},"findingsCount":{"type":"number"},"scansCount":{"type":"number"}},"required":["id","value","type","project","findingsCount","scansCount"]},"ReportSlaModel":{"type":"object","properties":{"slaTargets":{"type":"object"},"window":{"type":"number"},"daysToFix":{"type":"object"},"avgDays":{"type":"object","nullable":true},"overallAvgDays":{"type":"object","nullable":true},"resolvedInPeriod":{"type":"number"},"compliance":{"type":"object"},"overdue":{"type":"object"}},"required":["slaTargets","window","daysToFix","avgDays","overallAvgDays","resolvedInPeriod","compliance","overdue"]},"AssessmentCreatedByModel":{"type":"object","properties":{"firstName":{"type":"string"},"lastName":{"type":"string"}},"required":["firstName","lastName"]},"AssessmentModel":{"type":"object","properties":{"id":{"type":"number"},"workspaceId":{"type":"number"},"scopeType":{"type":"string"},"scopeId":{"type":"number","nullable":true},"scopeName":{"type":"string"},"status":{"type":"string"},"error":{"type":"string","nullable":true},"trigger":{"type":"string"},"createdByUserId":{"type":"number","nullable":true},"shareExpiresAt":{"type":"string","format":"date-time","nullable":true},"shareRevokedAt":{"type":"string","format":"date-time","nullable":true},"generatedAt":{"type":"string","format":"date-time","nullable":true},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"createdByUser":{"nullable":true,"type":"object","allOf":[{"$ref":"#/components/schemas/AssessmentCreatedByModel"}]},"hasNarrative":{"type":"boolean"},"shareUrl":{"type":"object","nullable":true},"sharePdfUrl":{"type":"object","nullable":true},"shareLive":{"type":"boolean"},"data":{"type":"object","nullable":true},"narrative":{"type":"object","nullable":true}},"required":["id","workspaceId","scopeType","scopeId","scopeName","status","error","trigger","createdByUserId","shareExpiresAt","shareRevokedAt","generatedAt","createdAt","updatedAt","hasNarrative","shareUrl","sharePdfUrl","shareLive"]},"AssessmentListModel":{"type":"object","properties":{"reports":{"type":"array","items":{"$ref":"#/components/schemas/AssessmentModel"}}},"required":["reports"]},"CreateAssessmentDto":{"type":"object","properties":{"scopeType":{"type":"string","enum":["workspace","project","asset"],"description":"Required. What the report covers."},"scopeId":{"type":"integer","description":"The project's or asset's id; not needed for the workspace."}}},"ShareAssessmentDto":{"type":"object","properties":{"days":{"type":"integer","minimum":0,"maximum":365,"description":"How long the link works, in days (30 by default, 0 for no expiry)."}}},"AssessmentDeletedModel":{"type":"object","properties":{"deleted":{"type":"boolean","example":true}},"required":["deleted"]},"AuditActorModel":{"type":"object","properties":{"type":{"type":"string","enum":["user","admin","system","anonymous"]},"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true},"email":{"type":"string","nullable":true},"label":{"type":"string"}},"required":["type","id","name","email","label"]},"AuditCredentialModel":{"type":"object","properties":{"type":{"type":"string","enum":["api_key","oauth_app"]},"id":{"type":"number","nullable":true},"name":{"type":"string","nullable":true}},"required":["type","id","name"]},"AuditTargetModel":{"type":"object","properties":{"type":{"type":"string","nullable":true},"id":{"type":"string","nullable":true},"label":{"type":"string","nullable":true}},"required":["type","id","label"]},"AuditEventModel":{"type":"object","properties":{"id":{"type":"number"},"createdAt":{"type":"string","format":"date-time"},"action":{"type":"string","description":"The catalogue action, e.g. asset.deleted"},"category":{"type":"string"},"categoryLabel":{"type":"string"},"summary":{"type":"string","description":"The sentence after the actor's label: \"deleted asset api.example.com\""},"actor":{"$ref":"#/components/schemas/AuditActorModel"},"source":{"type":"string","enum":["app","management","ai_agent","public","worker","api","oauth"]},"viaAi":{"type":"boolean","description":"Done by FortWatch AI for the actor (source ai_agent)"},"via":{"nullable":true,"description":"Done through an API key (source api) or an OAuth app (source oauth)","type":"object","allOf":[{"$ref":"#/components/schemas/AuditCredentialModel"}]},"target":{"$ref":"#/components/schemas/AuditTargetModel"},"changes":{"type":"object","nullable":true,"description":"{ field: [before, after] }"},"metadata":{"type":"object","nullable":true},"ip":{"type":"string","nullable":true},"userAgent":{"type":"string","nullable":true}},"required":["id","createdAt","action","category","categoryLabel","summary","actor","source","viaAi","via","target","changes","metadata","ip","userAgent"]},"AuditEventPageModel":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AuditEventModel"}},"total":{"type":"number"}},"required":["items","total"]},"AuditFilterOptionModel":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"}},"required":["key","label"]},"AuditActionOptionModel":{"type":"object","properties":{"key":{"type":"string"},"category":{"type":"string"},"text":{"type":"string","description":"The catalogue sentence, placeholders included"}},"required":["key","category","text"]},"AuditLogFiltersModel":{"type":"object","properties":{"categories":{"type":"array","items":{"$ref":"#/components/schemas/AuditFilterOptionModel"}},"actions":{"type":"array","items":{"$ref":"#/components/schemas/AuditActionOptionModel"}},"actors":{"type":"array","items":{"$ref":"#/components/schemas/AuditFilterOptionModel"}},"retentionDays":{"type":"number"}},"required":["categories","actions","actors","retentionDays"]},"Error":{"type":"object","required":["message"],"properties":{"message":{"type":"string","description":"What went wrong, in plain words."},"code":{"type":"string","description":"A stable code to branch on, when there is one (e.g. SCOPE_REQUIRED, RATE_LIMITED)."}}}},"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","bearerFormat":"fwk_…","description":"An API key from Settings → API access, sent as Authorization: Bearer fwk_…"},"oauth":{"type":"oauth2","description":"An OAuth access token (fwa_…). The authorization code flow requires PKCE (S256).","flows":{"authorizationCode":{"authorizationUrl":"https://app.fortwatch.ai/oauth/authorize","tokenUrl":"https://api.fortwatch.ai/oauth/token","refreshUrl":"https://api.fortwatch.ai/oauth/token","scopes":{"assets:read":"Read assets","assets:write":"Change assets","scans:read":"Read scans","scans:write":"Change scans","issues:read":"Read issues","issues:write":"Change issues","reports:read":"Read reports","reports:write":"Change reports","audit:read":"Read the audit log","audit:write":"Change the audit log"}},"clientCredentials":{"tokenUrl":"https://api.fortwatch.ai/oauth/token","scopes":{"assets:read":"Read assets","assets:write":"Change assets","scans:read":"Read scans","scans:write":"Change scans","issues:read":"Read issues","issues:write":"Change issues","reports:read":"Read reports","reports:write":"Change reports","audit:read":"Read the audit log","audit:write":"Change the audit log"}}}}}}}