Skip to content

Depot approvals msp

Registers the MSP’s approval and request routes.

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

GETmsp facemspIdempotent

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

Source: [object Object]

listApprovals lists a client’s approvals, newest first; status and source filter as on the portal, sourceRef narrows to one record (a ticket page’s own approvals).

NameInTypeRequiredDescription
clientIDpathstringYes
pagequeryintegerNoOne-based page number. Defaults to 1.
pageSizequeryintegerNoRows per page, 1 to 200. Defaults to 50.
sourcequerystringNo
sourceRefquerystringNo
statusquerystringNo
StatusBodyDescription
200application/json, PagedResultApprovalViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
404application/problem+json, ProblemDetailsNo client matches that id.
500application/problem+json, ProblemDetailsCould not read the client’s portal settings.

200 response body

FieldTypeDescription
itemsrequiredarray of ApprovalView
items[].amountCentsinteger or null

int64.

items[].awaitingrequiredarray of ApprovalAwaitingView
items[].awaiting[].memberIdrequiredstring
items[].awaiting[].namerequiredstring
items[].bodyrequiredstring
items[].canDeciderequiredboolean
items[].canRespondrequiredboolean
items[].consentTextrequiredstring
items[].consentVersionrequiredinteger
items[].currencystring or null
items[].dueAtstring (date-time) or null
items[].idrequiredstring
items[].kindrequiredstring
items[].projectIdstring or null
items[].quorumrequiredstring
items[].raisedAtrequiredstring (date-time)
items[].raisedByrequiredApprovalActorView

ApprovalActorView is who raised a request.

items[].raisedBy.kindrequiredstring
items[].raisedBy.labelstring or null
items[].raisedBy.refrequiredstring
items[].resolvedAtstring (date-time) or null
items[].responsesrequiredarray of ApprovalResponseView
items[].responses[].commentstring or null
items[].responses[].decisionrequiredstring
items[].responses[].idrequiredstring
items[].responses[].memberIdrequiredstring
items[].responses[].memberNamerequiredstring
items[].responses[].respondedAtrequiredstring (date-time)
items[].responses[].signatureMethodrequiredstring
items[].responses[].signerNamerequiredstring
items[].routerequiredApprovalRouteView

ApprovalRouteView is who a request is routed to.

items[].route.kindrequiredstring
items[].route.memberIdsrequiredarray of string
items[].route.roleIdstring or null
items[].sourcerequiredstring
items[].sourceErrorstring or null
items[].sourceLabelstring or null
items[].sourceRefstring or null
items[].statusrequiredstring
items[].titlerequiredstring
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/clients/<clientID>/approvals?page=0&pageSize=0&source=<source>&sourceRef=<sourceRef>&status=<status>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTmsp facemsp

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

Source: [object Object]

raiseApproval asks the client to decide something.

It is routed to a portal role (whoever holds it when they answer) or to named active members; the routed members are told (approval.awaiting). One open approval per source record.

NameInTypeRequiredDescription
clientIDpathstringYes

Required, sent as application/json.

FieldTypeDescription
amountCentsinteger or null

int64.

bodyrequiredstring
currencyrequiredstring
dueAtstring (date-time) or null
quorumrequiredstring
routerequiredobject
route.kindrequiredstring
route.memberIdsrequiredarray of string
route.roleIdrequiredstring
sourcerequiredstring
sourceRefrequiredstring
titlerequiredstring
StatusBodyDescription
201application/json, ApprovalViewCreated.
400application/problem+json, ProblemDetailsThe request body is not valid JSON.
403application/problem+json, ProblemDetailsThe identity does not hold the required permission.
404application/problem+json, ProblemDetailsNo client matches that id.
500application/problem+json, ProblemDetailsCould not read the client’s portal settings.

201 response body

FieldTypeDescription
amountCentsinteger or null

int64.

awaitingrequiredarray of ApprovalAwaitingView
awaiting[].memberIdrequiredstring
awaiting[].namerequiredstring
bodyrequiredstring
canDeciderequiredboolean
canRespondrequiredboolean
consentTextrequiredstring
consentVersionrequiredinteger
currencystring or null
dueAtstring (date-time) or null
idrequiredstring
kindrequiredstring
projectIdstring or null
quorumrequiredstring
raisedAtrequiredstring (date-time)
raisedByrequiredApprovalActorView

ApprovalActorView is who raised a request.

raisedBy.kindrequiredstring
raisedBy.labelstring or null
raisedBy.refrequiredstring
resolvedAtstring (date-time) or null
responsesrequiredarray of ApprovalResponseView
responses[].commentstring or null
responses[].decisionrequiredstring
responses[].idrequiredstring
responses[].memberIdrequiredstring
responses[].memberNamerequiredstring
responses[].respondedAtrequiredstring (date-time)
responses[].signatureMethodrequiredstring
responses[].signerNamerequiredstring
routerequiredApprovalRouteView

ApprovalRouteView is who a request is routed to.

route.kindrequiredstring
route.memberIdsrequiredarray of string
route.roleIdstring or null
sourcerequiredstring
sourceErrorstring or null
sourceLabelstring or null
sourceRefstring or null
statusrequiredstring
titlerequiredstring
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/clients/<clientID>/approvals' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"amountCents": 0,
"body": "string",
"currency": "string",
"dueAt": "2026-01-01T00:00:00Z",
"quorum": "string",
"route": {
"kind": "string",
"memberIds": [
"string"
],
"roleId": "string"
},
"source": "string",
"sourceRef": "string",
"title": "string"
}'

GET /api/v1/clients/{clientID}/approvals/{approvalID}

Section titled “GET /api/v1/clients/{clientID}/approvals/{approvalID}”

GETmsp facemspIdempotent

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

Source: [object Object]

getApproval opens one approval with its signed answers.

NameInTypeRequiredDescription
approvalIDpathstringYesA uuid.
clientIDpathstringYes
StatusBodyDescription
200application/json, ApprovalViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
404application/problem+json, ProblemDetailsNo client matches that id.
500application/problem+json, ProblemDetailsCould not read the client’s portal settings.

200 response body

FieldTypeDescription
amountCentsinteger or null

int64.

awaitingrequiredarray of ApprovalAwaitingView
awaiting[].memberIdrequiredstring
awaiting[].namerequiredstring
bodyrequiredstring
canDeciderequiredboolean
canRespondrequiredboolean
consentTextrequiredstring
consentVersionrequiredinteger
currencystring or null
dueAtstring (date-time) or null
idrequiredstring
kindrequiredstring
projectIdstring or null
quorumrequiredstring
raisedAtrequiredstring (date-time)
raisedByrequiredApprovalActorView

ApprovalActorView is who raised a request.

raisedBy.kindrequiredstring
raisedBy.labelstring or null
raisedBy.refrequiredstring
resolvedAtstring (date-time) or null
responsesrequiredarray of ApprovalResponseView
responses[].commentstring or null
responses[].decisionrequiredstring
responses[].idrequiredstring
responses[].memberIdrequiredstring
responses[].memberNamerequiredstring
responses[].respondedAtrequiredstring (date-time)
responses[].signatureMethodrequiredstring
responses[].signerNamerequiredstring
routerequiredApprovalRouteView

ApprovalRouteView is who a request is routed to.

route.kindrequiredstring
route.memberIdsrequiredarray of string
route.roleIdstring or null
sourcerequiredstring
sourceErrorstring or null
sourceLabelstring or null
sourceRefstring or null
statusrequiredstring
titlerequiredstring
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/clients/<clientID>/approvals/<approvalID>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/clients/{clientID}/approvals/{approvalID}/withdraw

Section titled “POST /api/v1/clients/{clientID}/approvals/{approvalID}/withdraw”

POSTmsp facemsp

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

Source: [object Object]

withdrawApproval takes an open approval back; the source gets the note.

NameInTypeRequiredDescription
approvalIDpathstringYesA uuid.
clientIDpathstringYes
StatusBodyDescription
200application/json, ApprovalViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
403application/problem+json, ProblemDetailsThe identity does not hold the required permission.
404application/problem+json, ProblemDetailsNo client matches that id.
500application/problem+json, ProblemDetailsCould not read the client’s portal settings.

200 response body

FieldTypeDescription
amountCentsinteger or null

int64.

awaitingrequiredarray of ApprovalAwaitingView
awaiting[].memberIdrequiredstring
awaiting[].namerequiredstring
bodyrequiredstring
canDeciderequiredboolean
canRespondrequiredboolean
consentTextrequiredstring
consentVersionrequiredinteger
currencystring or null
dueAtstring (date-time) or null
idrequiredstring
kindrequiredstring
projectIdstring or null
quorumrequiredstring
raisedAtrequiredstring (date-time)
raisedByrequiredApprovalActorView

ApprovalActorView is who raised a request.

raisedBy.kindrequiredstring
raisedBy.labelstring or null
raisedBy.refrequiredstring
resolvedAtstring (date-time) or null
responsesrequiredarray of ApprovalResponseView
responses[].commentstring or null
responses[].decisionrequiredstring
responses[].idrequiredstring
responses[].memberIdrequiredstring
responses[].memberNamerequiredstring
responses[].respondedAtrequiredstring (date-time)
responses[].signatureMethodrequiredstring
responses[].signerNamerequiredstring
routerequiredApprovalRouteView

ApprovalRouteView is who a request is routed to.

route.kindrequiredstring
route.memberIdsrequiredarray of string
route.roleIdstring or null
sourcerequiredstring
sourceErrorstring or null
sourceLabelstring or null
sourceRefstring or null
statusrequiredstring
titlerequiredstring
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/clients/<clientID>/approvals/<approvalID>/withdraw' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/clients/{clientID}/portal/requests

Section titled “GET /api/v1/clients/{clientID}/portal/requests”

GETclientportal:readmsp facemspIdempotent

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

Source: [object Object]

listRequests lists a client’s onboarding and offboarding requests.

NameInTypeRequiredDescription
clientIDpathstringYes
kindquerystringNo
statusquerystringNo
StatusBodyDescription
200application/json, array of PortalRequestViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold clientportal:read.
404application/problem+json, ProblemDetailsNo client matches that id.
500application/problem+json, ProblemDetailsCould not read the client’s portal settings.

200 response body

FieldTypeDescription
[].accessEndsAtstring (date-time) or null
[].completedAtstring (date-time) or null
[].effectiveAtstring (date-time) or null
[].formrequiredRequestForm

RequestForm is the request's form (contract 15: name, email, start/end date, equipment, notes).

[].form.devicesarray of RequestDevice
[].form.devices[].actionrequiredstring
[].form.devices[].agentIdstring
[].form.devices[].descriptionrequiredstring
[].form.emailrequiredstring
[].form.endDatestring
[].form.namerequiredstring
[].form.notesstring
[].form.startDatestring
[].idrequiredstring
[].kindrequiredstring
[].rowVersionrequiredinteger

int64.

[].statusrequiredstring
[].submittedAtrequiredstring (date-time)
[].submittedByrequiredApprovalActorView

ApprovalActorView is who raised a request.

[].submittedBy.kindrequiredstring
[].submittedBy.labelstring or null
[].submittedBy.refrequiredstring
[].targetMemberIdstring or null
[].targetNamedUserIdstring or null
[].ticketIdstring or null
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/clients/<clientID>/portal/requests?kind=<kind>&status=<status>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GET /api/v1/clients/{clientID}/portal/requests/{requestID}

Section titled “GET /api/v1/clients/{clientID}/portal/requests/{requestID}”

GETclientportal:readmsp facemspIdempotent

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

Source: [object Object]

getRequest opens one request.

NameInTypeRequiredDescription
clientIDpathstringYes
requestIDpathstringYesA uuid.
StatusBodyDescription
200application/json, PortalRequestViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold clientportal:read.
404application/problem+json, ProblemDetailsNo client matches that id.
500application/problem+json, ProblemDetailsCould not read the client’s portal settings.

200 response body

FieldTypeDescription
accessEndsAtstring (date-time) or null
completedAtstring (date-time) or null
effectiveAtstring (date-time) or null
formrequiredRequestForm

RequestForm is the request's form (contract 15: name, email, start/end date, equipment, notes).

form.devicesarray of RequestDevice
form.devices[].actionrequiredstring
form.devices[].agentIdstring
form.devices[].descriptionrequiredstring
form.emailrequiredstring
form.endDatestring
form.namerequiredstring
form.notesstring
form.startDatestring
idrequiredstring
kindrequiredstring
rowVersionrequiredinteger

int64.

statusrequiredstring
submittedAtrequiredstring (date-time)
submittedByrequiredApprovalActorView

ApprovalActorView is who raised a request.

submittedBy.kindrequiredstring
submittedBy.labelstring or null
submittedBy.refrequiredstring
targetMemberIdstring or null
targetNamedUserIdstring or null
ticketIdstring or null
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/clients/<clientID>/portal/requests/<requestID>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

PATCH /api/v1/clients/{clientID}/portal/requests/{requestID}

Section titled “PATCH /api/v1/clients/{clientID}/portal/requests/{requestID}”

PATCHclientportal:usersmsp facemsp

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

Source: [object Object]

patchRequest moves a request: in_progress, completed or cancelled (completed and cancelled are final).

Completing an offboarding ends the access of whoever is still active for the person leaving, and the client’s requesters hear the request is done.

NameInTypeRequiredDescription
clientIDpathstringYes
requestIDpathstringYesA uuid.

Required, sent as application/json.

FieldTypeDescription
statusrequiredstring
StatusBodyDescription
200application/json, PortalRequestViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold clientportal:users.
404application/problem+json, ProblemDetailsNo client matches that id.
500application/problem+json, ProblemDetailsCould not read the client’s portal settings.

200 response body

FieldTypeDescription
accessEndsAtstring (date-time) or null
completedAtstring (date-time) or null
effectiveAtstring (date-time) or null
formrequiredRequestForm

RequestForm is the request's form (contract 15: name, email, start/end date, equipment, notes).

form.devicesarray of RequestDevice
form.devices[].actionrequiredstring
form.devices[].agentIdstring
form.devices[].descriptionrequiredstring
form.emailrequiredstring
form.endDatestring
form.namerequiredstring
form.notesstring
form.startDatestring
idrequiredstring
kindrequiredstring
rowVersionrequiredinteger

int64.

statusrequiredstring
submittedAtrequiredstring (date-time)
submittedByrequiredApprovalActorView

ApprovalActorView is who raised a request.

submittedBy.kindrequiredstring
submittedBy.labelstring or null
submittedBy.refrequiredstring
targetMemberIdstring or null
targetNamedUserIdstring or null
ticketIdstring or null
Terminal window
# Sign in first. outpost_console is a session cookie, so send it with every request.
curl -X PATCH 'https://depot.example.com/api/v1/clients/<clientID>/portal/requests/<requestID>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b 'outpost_console=<console-session>' \
--data '{
"status": "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.