Skip to content

Depot compliance

Registers the compliance 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.

GETcompliance:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

List compliance evidence packs

NameInTypeRequiredDescription
dirquerystring, one of asc, descNoSort direction.
frameworkquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
sortquerystring, one of framework, generated, period, sizeNoSort key.
statusquerystring, one of plain, sealedNoComma-separated set. An unrecognised value is refused.
StatusBodyDescription
200application/json, PagedResultEvidencePackViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:read.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
itemsrequiredarray of EvidencePackView
items[].advisoryrequiredboolean
items[].contentSha256requiredstring
items[].contentTyperequiredstring
items[].createdAtrequiredstring (date-time)
items[].fileNamerequiredstring
items[].frameworkrequiredstring
items[].frameworkNamerequiredstring
items[].generatedAtrequiredstring (date-time)
items[].generatedBystring
items[].periodEndrequiredstring
items[].periodStartrequiredstring
items[].publicIdrequiredstring
items[].sizeBytesrequiredinteger

int64.

items[].summaryrequiredEvidencePackSummary

evidencePackSummary is the headline of a stored pack, read back out of its own manifest.

items[].summary.chainsrequiredarray of EvidencePackChainSummary
items[].summary.chains[].anchorIdinteger

int64.

items[].summary.chains[].brokenAtinteger

int64.

items[].summary.chains[].chainrequiredstring
items[].summary.chains[].entriesrequiredinteger
items[].summary.chains[].entriesInPeriodrequiredinteger
items[].summary.chains[].intactrequiredboolean
items[].summary.chains[].statusrequiredstring
items[].summary.compliancePercentnumber or null

double.

items[].summary.controlCountrequiredinteger
items[].summary.countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

items[].summary.counts.compliantrequiredinteger
items[].summary.counts.exceptedrequiredinteger
items[].summary.counts.gaprequiredinteger
items[].summary.counts.notApplicablerequiredinteger
items[].summary.counts.notMeasuredrequiredinteger
items[].summary.endpointCountrequiredinteger
items[].summary.exceptionCountrequiredinteger
items[].summary.policySnapshotCountrequiredinteger
items[].summary.settingCountrequiredinteger
items[].summary.truncatedrequiredboolean
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/compliance/evidence-packs?dir=asc&framework=<framework>&page=0&pageSize=0&q=<q>&sort=framework' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTcompliance:managetenant facehosteditmspremote

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

Source: [object Object]

generateComplianceEvidencePack renders one pack and files it.

Required, sent as application/json.

FieldTypeDescription
frameworkrequiredstring
periodEndrequiredstring
periodStartrequiredstring
StatusBodyDescription
201application/json, EvidencePackViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsAuthentication is required: a compliance exception has to record who asked for it.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:manage.
500application/problem+json, ProblemDetailsNo client store in request context.
503application/problem+json, ProblemDetailsEvidence packs need storage, and no storage profile is configured on this Depot.

201 response body

FieldTypeDescription
advisoryrequiredboolean
contentSha256requiredstring
contentTyperequiredstring
createdAtrequiredstring (date-time)
fileNamerequiredstring
frameworkrequiredstring
frameworkNamerequiredstring
generatedAtrequiredstring (date-time)
generatedBystring
periodEndrequiredstring
periodStartrequiredstring
publicIdrequiredstring
sizeBytesrequiredinteger

int64.

summaryrequiredEvidencePackSummary

evidencePackSummary is the headline of a stored pack, read back out of its own manifest.

summary.chainsrequiredarray of EvidencePackChainSummary
summary.chains[].anchorIdinteger

int64.

summary.chains[].brokenAtinteger

int64.

summary.chains[].chainrequiredstring
summary.chains[].entriesrequiredinteger
summary.chains[].entriesInPeriodrequiredinteger
summary.chains[].intactrequiredboolean
summary.chains[].statusrequiredstring
summary.compliancePercentnumber or null

double.

summary.controlCountrequiredinteger
summary.countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

summary.counts.compliantrequiredinteger
summary.counts.exceptedrequiredinteger
summary.counts.gaprequiredinteger
summary.counts.notApplicablerequiredinteger
summary.counts.notMeasuredrequiredinteger
summary.endpointCountrequiredinteger
summary.exceptionCountrequiredinteger
summary.policySnapshotCountrequiredinteger
summary.settingCountrequiredinteger
summary.truncatedrequiredboolean
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/compliance/evidence-packs' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"framework": "string",
"periodEnd": "string",
"periodStart": "string"
}'

DELETE /api/v1/compliance/evidence-packs/{publicId}

Section titled “DELETE /api/v1/compliance/evidence-packs/{publicId}”

DELETEcompliance:managetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

deleteComplianceEvidencePack retires one pack by hand.

THE ROW GOES FIRST AND THE OBJECTS SECOND, which is the sweeper’s order and for the sweeper’s reason: bytes that outlive their row are an orphan the storage accountant reports, while a row whose bytes are gone is a download that 404s and reads to a customer as lost evidence.

The delete is audited on the operator chain. A document that has already been handed to a third party disappearing from the record is precisely the event an auditor would want to see minuted, and the row records who removed it.

NameInTypeRequiredDescription
publicIdpathstringYesA uuid.
StatusBodyDescription
204NoneSuccess, with no body.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
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 DELETE 'https://depot.example.com/api/v1/compliance/evidence-packs/<publicId>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/compliance/evidence-packs/{publicId}/download

Section titled “GET /api/v1/compliance/evidence-packs/{publicId}/download”

GETcompliance:readtenant facehosteditmspremoteIdempotentdownloadNot fully resolved

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

What this page does not know
  • response

These are parts of the route the extractor could not read from the source. Everything else on this page came straight from it.

Source: [object Object]

downloadComplianceEvidencePack streams the stored PDF.

It serves the real content type rather than attachments.go’s forced application/octet-stream, and that difference is deliberate. The rule there exists because the bytes were UPLOADED by somebody and could be an HTML document that would run on the console’s origin. These bytes were RENDERED BY THIS PROCESS from a template it owns, so the type is a fact rather than a claim. The disposition is still “attachment” and nosniff is still set: a compliance document belongs in the reader’s filing system, not in a tab.

NameInTypeRequiredDescription
publicIdpathstringYesA uuid.
StatusBodyDescription
200application/octet-stream, string (binary)Success. The body shape was not resolved; see x-outpost-unresolved.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.
502application/problem+json, ProblemDetailsThe document could not be read from storage.
503application/problem+json, ProblemDetailsEvidence packs need storage, and no storage profile is configured on this Depot.
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/compliance/evidence-packs/<publicId>/download' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETcompliance:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

listComplianceExceptions answers the register.

ponytail: the store returns every matching row and this pages the slice, so a client with ten thousand exceptions materializes ten thousand. The register is a human-reviewed list bounded by how many gaps an organisation is willing to sign for, and the count is in the tens. What matters is that the total below is the FILTERED total - it is the length of what the filter returned, not of the table - so paging cannot promise a page that is not there. The upgrade when a tenant proves that wrong is a paged store method beside this one, which is what the two callers in internal/evidencepack need this one left alone for.

NameInTypeRequiredDescription
dirquerystring, one of asc, descNoSort direction.
frameworkquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
scopeTypequerystringNo
settingKeyquerystringNo
sortquerystring, one of created, expires, framework, setting, statusNoSort key.
statusquerystringNo
StatusBodyDescription
200application/json, PagedResultComplianceExceptionViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:read.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
itemsrequiredarray of ComplianceExceptionView
items[].approvedAtstring (date-time) or null
items[].approvedBystring
items[].createdAtrequiredstring (date-time)
items[].expiresAtrequiredstring (date-time)
items[].frameworkrequiredstring
items[].justificationrequiredstring
items[].publicIdrequiredstring
items[].requestedByrequiredstring
items[].revokedAtstring (date-time) or null
items[].revokedBystring
items[].scopeIdstring
items[].scopeTyperequiredstring
items[].settingKeyrequiredstring
items[].statusrequiredstring
items[].updatedAtrequiredstring (date-time)
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/compliance/exceptions?dir=asc&framework=<framework>&page=0&pageSize=0&q=<q>&scopeType=<scopeType>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTcompliance:readtenant facehosteditmspremote

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

Source: [object Object]

Create compliance exception

Required, sent as application/json.

FieldTypeDescription
expiresAtrequiredstring (date-time)
frameworkrequiredstring
justificationrequiredstring
scopeIdrequiredstring
scopeTyperequiredstring
settingKeyrequiredstring
StatusBodyDescription
201application/json, ComplianceExceptionViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsAuthentication is required: a compliance exception has to record who asked for it.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:read.
404application/problem+json, ProblemDetailsNo setting matches that key.
409application/problem+json, ProblemDetailsThat exception is not a combination this client’s schema allows.
500application/problem+json, ProblemDetailsNo client store in request context.

201 response body

FieldTypeDescription
approvedAtstring (date-time) or null
approvedBystring
createdAtrequiredstring (date-time)
expiresAtrequiredstring (date-time)
frameworkrequiredstring
justificationrequiredstring
publicIdrequiredstring
requestedByrequiredstring
revokedAtstring (date-time) or null
revokedBystring
scopeIdstring
scopeTyperequiredstring
settingKeyrequiredstring
statusrequiredstring
updatedAtrequiredstring (date-time)
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/compliance/exceptions' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"expiresAt": "2026-01-01T00:00:00Z",
"framework": "string",
"justification": "string",
"scopeId": "string",
"scopeType": "string",
"settingKey": "string"
}'

POST /api/v1/compliance/exceptions/{publicId}/approve

Section titled “POST /api/v1/compliance/exceptions/{publicId}/approve”

POSTcompliance:managetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

Approve compliance exception

NameInTypeRequiredDescription
publicIdpathstringYesA uuid.
StatusBodyDescription
200application/json, ComplianceExceptionViewSuccess.
401application/problem+json, ProblemDetailsAuthentication is required: a compliance exception has to record who asked for it.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsAn exception has to be approved by somebody other than the operator who requested it.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
approvedAtstring (date-time) or null
approvedBystring
createdAtrequiredstring (date-time)
expiresAtrequiredstring (date-time)
frameworkrequiredstring
justificationrequiredstring
publicIdrequiredstring
requestedByrequiredstring
revokedAtstring (date-time) or null
revokedBystring
scopeIdstring
scopeTyperequiredstring
settingKeyrequiredstring
statusrequiredstring
updatedAtrequiredstring (date-time)
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 POST 'https://depot.example.com/api/v1/compliance/exceptions/<publicId>/approve' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/compliance/exceptions/{publicId}/revoke

Section titled “POST /api/v1/compliance/exceptions/{publicId}/revoke”

POSTcompliance:managetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

Revoke compliance exception

NameInTypeRequiredDescription
publicIdpathstringYesA uuid.
StatusBodyDescription
200application/json, ComplianceExceptionViewSuccess.
401application/problem+json, ProblemDetailsAuthentication is required: a compliance exception has to record who asked for it.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:manage.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThis exception cannot be revoked: it has already been revoked or has expired.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
approvedAtstring (date-time) or null
approvedBystring
createdAtrequiredstring (date-time)
expiresAtrequiredstring (date-time)
frameworkrequiredstring
justificationrequiredstring
publicIdrequiredstring
requestedByrequiredstring
revokedAtstring (date-time) or null
revokedBystring
scopeIdstring
scopeTyperequiredstring
settingKeyrequiredstring
statusrequiredstring
updatedAtrequiredstring (date-time)
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 POST 'https://depot.example.com/api/v1/compliance/exceptions/<publicId>/revoke' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTcompliance:managetenant facehosteditmspremote

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

Source: [object Object]

Create compliance gap alerts

Required, sent as application/json.

FieldTypeDescription
agentIdsrequiredarray of string
frameworkrequiredstring
levelrequiredstring
settingKeyrequiredstring
StatusBodyDescription
201application/json, objectCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:manage.
404application/problem+json, ProblemDetailsEndpoint or control not found.
409application/problem+json, ProblemDetailsCould not raise the remediation alert.
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.
curl -X POST 'https://depot.example.com/api/v1/compliance/gaps/alerts' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"agentIds": [
"string"
],
"framework": "string",
"level": "string",
"settingKey": "string"
}'

POSTcompliance:managetenant facehosteditmspremote

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

Source: [object Object]

Create compliance gap ticket

Required, sent as application/json.

FieldTypeDescription
agentIdsrequiredarray of string
frameworkrequiredstring
levelrequiredstring
settingKeyrequiredstring
StatusBodyDescription
201application/json, GapTicketResultCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:manage.
404application/problem+json, ProblemDetailsNo baseline matches that framework, setting and control.
409application/problem+json, ProblemDetailsThat ticket is not a combination this client’s schema allows.
500application/problem+json, ProblemDetailsNo client store in request context.

201 response body

FieldTypeDescription
affectedEndpointsrequiredinteger
numberrequiredinteger

int64.

referencerequiredstring
tagstring
taggedrequiredboolean
ticketPublicIdrequiredstring
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/compliance/gaps/ticket' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"agentIds": [
"string"
],
"framework": "string",
"level": "string",
"settingKey": "string"
}'

GETcompliance:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

listCompliancePosture answers every framework this client has DECLARED, with its totals.

Declared, not every framework that exists. A console offering eleven rows of zeroes to a customer who has adopted one scheme would bury the one line that matters, and “we are not measured against PCI” is already said by PCI’s absence. The per-framework route below still answers for an undeclared framework, so a picker can ask “what would CJIS look like” without this list having to pre-empt it.

StatusBodyDescription
200application/json, SummarySuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:read.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
endpointCountrequiredinteger
frameworksrequiredarray of FrameworkSummary
frameworks[].advisoryrequiredboolean
frameworks[].compliancePercentnumber or null

double.

frameworks[].controlCountrequiredinteger
frameworks[].countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

frameworks[].counts.compliantrequiredinteger
frameworks[].counts.exceptedrequiredinteger
frameworks[].counts.gaprequiredinteger
frameworks[].counts.notApplicablerequiredinteger
frameworks[].counts.notMeasuredrequiredinteger
frameworks[].endpointCountrequiredinteger
frameworks[].frameworkrequiredstring
frameworks[].settingCountrequiredinteger
generatedAtrequiredstring (date-time)
truncatedrequiredboolean
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/compliance/posture' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/compliance/posture/{framework}

Section titled “GET /api/v1/compliance/posture/{framework}”

GETcompliance:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

getCompliancePosture answers one framework, broken down by control.

NameInTypeRequiredDescription
frameworkpathstringYes
StatusBodyDescription
200application/json, FrameworkPostureSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:read.
404application/problem+json, ProblemDetailsFramework must be one of “soc2”, “cjis”, “pci_dss”, “hipaa”, “nist_800_171”, “nist_800_53”, “cmmc_l2”, “iso_27001”, “stig”, “ms_baseline”, “cis”.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
advisoryrequiredboolean
compliancePercentnumber or null

double.

controlCountrequiredinteger
controlsrequiredarray of ControlPosture
controls[].compliancePercentnumber or null

double.

controls[].countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

controls[].counts.compliantrequiredinteger
controls[].counts.exceptedrequiredinteger
controls[].counts.gaprequiredinteger
controls[].counts.notApplicablerequiredinteger
controls[].counts.notMeasuredrequiredinteger
controls[].levelrequiredstring
controls[].settingsrequiredarray of SettingPosture
controls[].settings[].citationstring
controls[].settings[].compliancePercentnumber or null

double.

controls[].settings[].countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

controls[].settings[].counts.compliantrequiredinteger
controls[].settings[].counts.exceptedrequiredinteger
controls[].settings[].counts.gaprequiredinteger
controls[].settings[].counts.notApplicablerequiredinteger
controls[].settings[].counts.notMeasuredrequiredinteger
controls[].settings[].descriptionstring
controls[].settings[].enforcementrequiredstring
controls[].settings[].expectedrequiredany

Arbitrary JSON.

controls[].settings[].settingKeyrequiredstring
countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

counts.compliantrequiredinteger
counts.exceptedrequiredinteger
counts.gaprequiredinteger
counts.notApplicablerequiredinteger
counts.notMeasuredrequiredinteger
endpointCountrequiredinteger
frameworkrequiredstring
generatedAtrequiredstring (date-time)
settingCountrequiredinteger
truncatedrequiredboolean
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/compliance/posture/<framework>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/compliance/posture/{framework}/controls/{level}

Section titled “GET /api/v1/compliance/posture/{framework}/controls/{level}”

GETcompliance:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

getComplianceControl answers one control, per machine.

The {level} segment is a framework’s own control identifier and its shape varies wildly between schemes: “CC6.8” for SOC 2, “164.312(a)(2)(iv)” for HIPAA, “WNDF-AV-000010” for a STIG. Go’s ServeMux hands it over already percent-decoded, so a console that escapes the segment gets the literal back, and nothing here needs to parse it - it is matched against the catalog by equality and never interpreted.

NameInTypeRequiredDescription
frameworkpathstringYes
levelpathstringYes
StatusBodyDescription
200application/json, ControlDetailSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold compliance:read.
404application/problem+json, ProblemDetailsFramework must be one of “soc2”, “cjis”, “pci_dss”, “hipaa”, “nist_800_171”, “nist_800_53”, “cmmc_l2”, “iso_27001”, “stig”, “ms_baseline”, “cis”.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
advisoryrequiredboolean
compliancePercentnumber or null

double.

countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

counts.compliantrequiredinteger
counts.exceptedrequiredinteger
counts.gaprequiredinteger
counts.notApplicablerequiredinteger
counts.notMeasuredrequiredinteger
endpointsrequiredarray of EndpointVerdict
endpoints[].agentIdrequiredstring
endpoints[].annotationstring, one of , blocked_on_escrow, converging, drift, failed, plan_capability_unavailable, stale, uncomparable, unreported, unsupported
endpoints[].exceptionIdstring
endpoints[].expectedrequiredany

Arbitrary JSON.

endpoints[].hostnamerequiredstring
endpoints[].observedrequiredany

Arbitrary JSON.

endpoints[].openTicketRefstring
endpoints[].osFamilystring
endpoints[].reportedAtstring (date-time) or null
endpoints[].settingKeyrequiredstring
endpoints[].statusstring
endpoints[].verdictrequiredstring, one of compliant, excepted, gap, not_applicable, not_measured
frameworkrequiredstring
generatedAtrequiredstring (date-time)
levelrequiredstring
settingsrequiredarray of SettingPosture
settings[].citationstring
settings[].compliancePercentnumber or null

double.

settings[].countsrequiredCounts

Counts is a tally of verdicts over some population - one setting across a fleet, one control, one whole framework.

settings[].counts.compliantrequiredinteger
settings[].counts.exceptedrequiredinteger
settings[].counts.gaprequiredinteger
settings[].counts.notApplicablerequiredinteger
settings[].counts.notMeasuredrequiredinteger
settings[].descriptionstring
settings[].enforcementrequiredstring
settings[].expectedrequiredany

Arbitrary JSON.

settings[].settingKeyrequiredstring
truncatedrequiredboolean
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/compliance/posture/<framework>/controls/<level>' \
-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.