Skip to content

Depot vulnerabilities

Registers the exposure routes on mux.

This page is generated from the Depot route table. Every operation carries the permission it needs and the anchor an agent can link to.

GET /api/v1/discovery/devices/{publicId}/vulnerabilities

Section titled “GET /api/v1/discovery/devices/{publicId}/vulnerabilities”

GETvuln:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

List device vulnerabilities

NameInTypeRequiredDescription
publicIdpathstringYesA uuid.
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
StatusBodyDescription
200application/json, PagedResultDeviceVulnerabilitySuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold vuln:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
itemsrequiredarray of DeviceVulnerability
items[].cveIdrequiredstring
items[].cvssScorerequirednumber

double.

items[].cvssSeverityrequiredstring
items[].exploitKnownrequiredboolean
items[].firstSeenAtrequiredstring (date-time)
items[].lastSeenAtrequiredstring (date-time)
items[].matchedCperequiredstring
items[].resolvedAtstring (date-time) or null
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/discovery/devices/<publicId>/vulnerabilities?page=0&pageSize=0' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/endpoints/{agentID}/vulnerabilities

Section titled “GET /api/v1/endpoints/{agentID}/vulnerabilities”

GETvuln:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

listEndpointVulnerabilities is the machine’s own tab.

Always flat: on one endpoint the roll-up would be one row per CVE with a count of one.

NameInTypeRequiredDescription
agentIDpathstringYesA uuid.
agentIdquerystringNo
cveIdquerystringNo
dirquerystring, one of asc, descNoSort direction.
exploitKnownquerystringNo
includeUnverifiedquerystringNo
minCvssquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
severityquerystringNo
sortquerystring, one of cve, firstSeen, lastSeen, risk, severityNoSort key.
statequerystringNo
StatusBodyDescription
200application/json, VulnerabilityPageEndpointVulnerabilityViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold vuln:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
countsrequiredVulnerabilityCounts
counts.criticalrequiredinteger
counts.highrequiredinteger
counts.noFixrequiredinteger
counts.unverifiedrequiredinteger
itemsrequiredarray of EndpointVulnerabilityView
items[].advisoryIdstring
items[].advisorySourcestring
items[].agentIdrequiredstring
items[].cveIdrequiredstring
items[].cvssScorerequirednumber

double.

items[].cvssSeverityrequiredstring
items[].ecosystemstring
items[].exploitKnownrequiredboolean
items[].firstSeenrequiredstring (date-time)
items[].fixedVersionstring
items[].hostnamerequiredstring
items[].lastSeenrequiredstring (date-time)
items[].matchSourcerequiredstring, one of curated, distro, fuzzy, nvd_unverified
items[].publicIdrequiredstring
items[].softwareNamerequiredstring
items[].softwareVersionrequiredstring
items[].staterequiredstring
items[].suppressedBystring
items[].suppressedReasonstring
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/endpoints/<agentID>/vulnerabilities?agentId=<agentId>&cveId=<cveId>&dir=asc&exploitKnown=<exploitKnown>&includeUnverified=<includeUnverified>&minCvss=<minCvss>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETvuln:readtenant facehosteditmspremoteIdempotentdownload

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

getVulnerabilityReport answers the same table rolled up by CVE, which is what a vulnerability report is for: what is wrong across the fleet and how widely.

?format=csv and ?format=pdf render the same rows as a download, per the contracts document. A spreadsheet is where a remediation plan actually gets written, a PDF is what it gets circulated as, and the alternative to both is somebody copying CVE ids off a screen.

NameInTypeRequiredDescription
agentIdquerystringNo
cveIdquerystringNo
dirquerystring, one of asc, descNoSort direction.
exploitKnownquerystringNo
formatquerystringNo
includeUnverifiedquerystringNo
minCvssquerystringNo
qquerystringNoFree-text search term.
severityquerystringNo
sortquerystring, one of cve, firstSeen, lastSeen, risk, severityNoSort key.
statequerystringNo
StatusBodyDescription
200application/octet-stream, string (binary)Success.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold vuln:read.
500application/problem+json, ProblemDetailsNo client store in request context.
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/reports/vulnerabilities?agentId=<agentId>&cveId=<cveId>&dir=asc&exploitKnown=<exploitKnown>&format=<format>&includeUnverified=<includeUnverified>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETvuln:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

List vulnerabilities

NameInTypeRequiredDescription
agentIdquerystringNo
cveIdquerystringNo
dirquerystring, one of asc, descNoSort direction.
exploitKnownquerystringNo
groupByquerystringNo
includeUnverifiedquerystringNo
minCvssquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
severityquerystringNo
sortquerystring, one of cve, firstSeen, lastSeen, risk, severityNoSort key.
statequerystringNo
StatusBodyDescription
200application/json, VulnerabilityPageVulnerabilitySummaryViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold vuln:read.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
countsrequiredVulnerabilityCounts
counts.criticalrequiredinteger
counts.highrequiredinteger
counts.noFixrequiredinteger
counts.unverifiedrequiredinteger
itemsrequiredarray of VulnerabilitySummaryView
items[].advisoriesrequiredarray of VulnerabilityAdvisory
items[].advisories[].advisoryIdstring
items[].advisories[].advisorySourcestring
items[].advisories[].ecosystemstring
items[].cveIdrequiredstring
items[].cvssScorerequirednumber

double.

items[].cvssSeverityrequiredstring
items[].endpointCountrequiredinteger
items[].exploitKnownrequiredboolean
items[].firstSeenrequiredstring (date-time)
items[].lastSeenrequiredstring (date-time)
items[].noFixCountrequiredinteger
items[].softwareNamesrequiredarray of string
items[].unverifiedCountrequiredinteger
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/vulnerabilities?agentId=<agentId>&cveId=<cveId>&dir=asc&exploitKnown=<exploitKnown>&groupBy=<groupBy>&includeUnverified=<includeUnverified>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/vulnerabilities/{vulnId}/suppress

Section titled “POST /api/v1/vulnerabilities/{vulnId}/suppress”

POSTalert:managetenant facehosteditmspremote

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

suppressVulnerability records an accepted risk.

Under “alert:manage” rather than a vuln code, per the contracts document. IDEMPOTENT in the store, which preserves the ORIGINAL decider and reason: a retried POST from a flaky connection must not rewrite who accepted the risk.

NameInTypeRequiredDescription
vulnIdpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
reasonrequiredstring
StatusBodyDescription
200application/json, EndpointVulnerabilityViewSuccess.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsOnly a signed-in user can accept a vulnerability risk.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
advisoryIdstring
advisorySourcestring
agentIdrequiredstring
cveIdrequiredstring
cvssScorerequirednumber

double.

cvssSeverityrequiredstring
ecosystemstring
exploitKnownrequiredboolean
firstSeenrequiredstring (date-time)
fixedVersionstring
hostnamerequiredstring
lastSeenrequiredstring (date-time)
matchSourcerequiredstring, one of curated, distro, fuzzy, nvd_unverified
publicIdrequiredstring
softwareNamerequiredstring
softwareVersionrequiredstring
staterequiredstring
suppressedBystring
suppressedReasonstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/v1/vulnerabilities/<vulnId>/suppress' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"reason": "string"
}'

GETvuln:readtenant facehosteditmspremoteIdempotent

From an MSP console, prefix the path with /api/v1/clients/{clientID} to reach one client.

Source: [object Object]

getNvdSyncState answers the mirror’s status, which the console reads to decide whether to show the “no API key” setup notice.

It is CONTROL-PLANE data on a per-client route, which is the one thing to notice here: there is one mirror per Depot, so every client’s console reads the same row. That is correct - a client’s exposure list is only as fresh as the Depot’s mirror - and it is why the response carries no client-specific numbers.

StatusBodyDescription
200application/json, NvdSyncStateViewSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold vuln:read.
500application/problem+json, ProblemDetailsNo control store.

200 response body

FieldTypeDescription
configuredrequiredboolean
cveCountrequiredinteger

int64.

lastSyncedAtstring (date-time) or null
statusrequiredstring
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/v1/vulnerabilities/sync-state' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

Content is licensed CC BY 4.0. Code samples are MIT. Outpost and the Outpost mark are trademarks of Outpost Business Solutions, PBC and are not covered by either license.