Skip to content

Depot softwarerequests

Registers the approval routes on the TENANT 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.

GETsoftware:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

List software requests

NameInTypeRequiredDescription
agentIdquerystringNo
dirquerystring, one of asc, descNoSort direction.
packageIdquerystringNo
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
qquerystringNoFree-text search term.
sortquerystring, one of package, requested, stateNoSort key.
statequerystringNo
StatusBodyDescription
200application/json, PagedResultSoftwareRequestViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold software:read.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
itemsrequiredarray of SoftwareRequestView
items[].agentIdrequiredstring
items[].decidedAtstring (date-time) or null
items[].decidedBystring
items[].decisionNotestring
items[].deploymentIdstring
items[].hostnamerequiredstring
items[].justificationrequiredstring
items[].packageIdrequiredstring
items[].packageNamerequiredstring
items[].publicIdrequiredstring
items[].requestedAtrequiredstring (date-time)
items[].requesterrequiredSoftwareRequesterView
items[].requester.displayNamerequiredstring
items[].requester.identifierrequiredstring
items[].requester.sidrequiredstring
items[].staterequiredstring
items[].ticketIdstring
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/software/requests?agentId=<agentId>&dir=asc&packageId=<packageId>&page=0&pageSize=0&q=<q>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETsoftware:readtenant facehosteditmspremoteIdempotent

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

Source: [object Object]

Get software request

NameInTypeRequiredDescription
requestIDpathstringYesA uuid.
StatusBodyDescription
200application/json, SoftwareRequestViewSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold software:read.
404application/problem+json, ProblemDetailsNo resource matches that id.
500application/problem+json, ProblemDetailsNo client store in request context.

200 response body

FieldTypeDescription
agentIdrequiredstring
decidedAtstring (date-time) or null
decidedBystring
decisionNotestring
deploymentIdstring
hostnamerequiredstring
justificationrequiredstring
packageIdrequiredstring
packageNamerequiredstring
publicIdrequiredstring
requestedAtrequiredstring (date-time)
requesterrequiredSoftwareRequesterView
requester.displayNamerequiredstring
requester.identifierrequiredstring
requester.sidrequiredstring
staterequiredstring
ticketIdstring
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/software/requests/<requestID>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/software/requests/{requestID}/approve

Section titled “POST /api/v1/software/requests/{requestID}/approve”

POSTsoftware:approvetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

decideSoftwareRequest serves both approve and deny.

ONE HANDLER, TWO MOUNTS, because the two differ in exactly two places - whether an install is provisioned and what the ticket message says - and everything else about them is identical: the same guard, the same idempotence, the same ticket transition. Two handlers would be two copies of the ordering rules, and the ordering is the part that matters.

IDEMPOTENT AND IT PRESERVES THE ORIGINAL DECIDER. A request that is already decided is answered with the stored row and NOTHING is re-run: no second install, no second ticket message, no rewriting of who made the call. A retried POST from a flaky phone must not turn one approval into two installs.

NameInTypeRequiredDescription
requestIDpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
noterequiredstring
StatusBodyDescription
200application/json, SoftwareRequestViewSuccess.
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 software:approve.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThat package has been retired from the catalog, so this request can no longer be approved. Deny it instead.
422application/problem+json, ProblemDetailsThe request was refused.
500application/problem+json, ProblemDetailsNo client context in request.

200 response body

FieldTypeDescription
agentIdrequiredstring
decidedAtstring (date-time) or null
decidedBystring
decisionNotestring
deploymentIdstring
hostnamerequiredstring
justificationrequiredstring
packageIdrequiredstring
packageNamerequiredstring
publicIdrequiredstring
requestedAtrequiredstring (date-time)
requesterrequiredSoftwareRequesterView
requester.displayNamerequiredstring
requester.identifierrequiredstring
requester.sidrequiredstring
staterequiredstring
ticketIdstring
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/software/requests/<requestID>/approve' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"note": "string"
}'

POST /api/v1/software/requests/{requestID}/deny

Section titled “POST /api/v1/software/requests/{requestID}/deny”

POSTsoftware:approvetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

decideSoftwareRequest serves both approve and deny.

ONE HANDLER, TWO MOUNTS, because the two differ in exactly two places - whether an install is provisioned and what the ticket message says - and everything else about them is identical: the same guard, the same idempotence, the same ticket transition. Two handlers would be two copies of the ordering rules, and the ordering is the part that matters.

IDEMPOTENT AND IT PRESERVES THE ORIGINAL DECIDER. A request that is already decided is answered with the stored row and NOTHING is re-run: no second install, no second ticket message, no rewriting of who made the call. A retried POST from a flaky phone must not turn one approval into two installs.

NameInTypeRequiredDescription
requestIDpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
noterequiredstring
StatusBodyDescription
200application/json, SoftwareRequestViewSuccess.
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 software:approve.
404application/problem+json, ProblemDetailsNo resource matches that id.
409application/problem+json, ProblemDetailsThat package has been retired from the catalog, so this request can no longer be approved. Deny it instead.
422application/problem+json, ProblemDetailsThe request was refused.
500application/problem+json, ProblemDetailsNo client context in request.

200 response body

FieldTypeDescription
agentIdrequiredstring
decidedAtstring (date-time) or null
decidedBystring
decisionNotestring
deploymentIdstring
hostnamerequiredstring
justificationrequiredstring
packageIdrequiredstring
packageNamerequiredstring
publicIdrequiredstring
requestedAtrequiredstring (date-time)
requesterrequiredSoftwareRequesterView
requester.displayNamerequiredstring
requester.identifierrequiredstring
requester.sidrequiredstring
staterequiredstring
ticketIdstring
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/software/requests/<requestID>/deny' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"note": "string"
}'

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.