Skip to content

Depot portal remote

Registers the remote access routes; mountOrg calls it.

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/portal/v1/orgs/{clientID}/remote/endpoints

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/endpoints”

GETportal:remote:useportal facemspIdempotent

Source: [object Object]

listRemoteEndpoints lists the endpoints the member can reach now, with the mode a session would take and whether it is recorded.

NameInTypeRequiredDescription
clientIDpathstringYes
StatusBodyDescription
200application/json, PageRemoteEndpointSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:use.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
itemsrequiredarray of RemoteEndpoint
items[].agentIdrequiredstring
items[].allowedModerequiredstring
items[].capabilitiesarray of string
items[].grantIdrequiredstring
items[].hostnamerequiredstring
items[].onlinerequiredboolean
items[].osFamilystring
items[].recordingrequiredboolean
items[].screenCapturestring
items[].siteNamestring or null
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/endpoints' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}”

GETportal:remote:useportal facemspIdempotent

Source: [object Object]

getRemoteEndpoint is one endpoint the member can reach; 404 no_grant when they hold no live grant on it, whether or not it exists.

NameInTypeRequiredDescription
agentIDpathstringYes
clientIDpathstringYes
StatusBodyDescription
200application/json, RemoteEndpointSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:use.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
agentIdrequiredstring
allowedModerequiredstring
capabilitiesarray of string
grantIdrequiredstring
hostnamerequiredstring
onlinerequiredboolean
osFamilystring
recordingrequiredboolean
screenCapturestring
siteNamestring or null
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/endpoints/<agentID>' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/policy

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/policy”

GETportal:remote:useportal facemspIdempotent

Source: [object Object]

getRemoteSessionPolicy previews the policy a session would get: the mode the relay would choose, the modes it allows, recording, and what may cross the clipboard and file channels.

NameInTypeRequiredDescription
agentIDpathstringYes
clientIDpathstringYes
StatusBodyDescription
200application/json, RemoteSessionPolicySuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:use.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
allowedModesrequiredarray of string
moderequiredstring
recordingRequiredrequiredboolean
transferrequiredRemoteTransferPolicyView

RemoteTransferPolicyView is the clipboard and file-transfer policy the relay will sign into the session's token, as the console reads it.

transfer.audit_hash_to_endpointrequiredstring, one of keyed, none, plain
transfer.audit_hash_to_technicianrequiredstring
transfer.audit_names_to_endpointrequiredstring, one of file_name, full_path, name_hash, path_hash
transfer.audit_names_to_technicianrequiredstring
transfer.audit_sizes_to_endpointrequiredstring, one of exact, summary
transfer.audit_sizes_to_technicianrequiredstring
transfer.clipboard_imagesrequiredarray of string
transfer.clipboard_textrequiredarray of string
transfer.filesrequiredarray of string
transfer.lockedByrequiredobject
transfer.max_file_bytesinteger

int64.

transfer.max_session_bytesinteger

int64.

transfer.require_verificationboolean
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/endpoints/<agentID>/policy' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

POST /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/sessions/{sessionID}/resume

Section titled “POST /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/sessions/{sessionID}/resume”

POSTportal:remote:useportal facemsp

Source: [object Object]

resumeRemoteSession resumes a session paused for idle (RD_VIEWER_UI_CONTRACTS 7.2), for the member running it, under a live grant, after a re-authentication made since the pause.

Until there is one it answers reauth_required, which the portal turns into its re-auth dialog and a retry: the portal’s form of the console’s 428 step-up.

SensitiveAuthAt, not SensitiveSeenAt: the second moves on every sensitive request, so it would let a click during the pause pass for a re-auth.

NameInTypeRequiredDescription
agentIDpathstringYes
clientIDpathstringYes
sessionIDpathstringYes
StatusBodyDescription
204NoneSuccess, with no body.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:use.
404application/problem+json, ProblemDetailsNo resource matches that id.
Terminal window
# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/remote/endpoints/<agentID>/sessions/<sessionID>/resume' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/signal

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/signal”

GETportal:remote:useportal facemspIdempotentWebSocket

Source: [object Object]

remoteSignal upgrades to the remote session WebSocket for one endpoint.

It refuses in the Teams tab (remote pages open in the browser), demands a re-authentication within five minutes when the MSP requires step-up, and resolves the grants before upgrading.

NameInTypeRequiredDescription
agentIDpathstringYes
clientIDpathstringYes
StatusBodyDescription
101NoneSwitching protocols. The connection continues as a websocket; see x-outpost-transport.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:use.
404application/problem+json, ProblemDetailsNo resource matches that id.
Terminal window
# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
# This endpoint upgrades to a WebSocket. The sample shows the handshake only.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/api/portal/v1/orgs/<clientID>/remote/endpoints/<agentID>/signal' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/targets

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/endpoints/{agentID}/targets”

GETportal:remote:useportal facemspIdempotent

Source: [object Object]

getRemoteTargets lists the sessions on an endpoint the member holds a grant on (console users, RDP logons, the sign-in screen), asked of the agent now.

NameInTypeRequiredDescription
agentIDpathstringYes
clientIDpathstringYes
StatusBodyDescription
200application/json, array of RemoteTargetSuccess.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:use.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
[].availablerequiredboolean
[].displayrequiredstring
[].displayStaterequiredstring
[].kindrequiredstring
[].lockStaterequiredstring
[].occupiedrequiredboolean
[].osSessionIdrequiredstring
[].reasonrequiredstring
[].refrequiredstring
[].sessionTyperequiredstring
[].staterequiredstring
[].userrequiredstring
[].windowsSessionIdrequiredinteger
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/endpoints/<agentID>/targets' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

GET /api/portal/v1/orgs/{clientID}/remote/grants

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/grants”

GETportal:remote:grantportal facemspIdempotent

Source: [object Object]

listRemoteGrants lists the organization’s remote access grants; revoked ones too with ?includeRevoked=true.

NameInTypeRequiredDescription
clientIDpathstringYes
includeRevokedquerystringNo
StatusBodyDescription
200application/json, PageGrantViewSuccess.
400NoneThe request was refused.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:grant.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
itemsrequiredarray of GrantView
items[].capabilitiesrequiredarray of string
items[].coveredEndpointCountrequiredinteger
items[].createdAtrequiredstring (date-time)
items[].createdByrequiredActor

Actor is who created a grant on the wire (contract 8.4 Actor).

items[].createdBy.kindrequiredstring
items[].createdBy.labelstring or null
items[].createdBy.refrequiredstring
items[].endsAtstring (date-time) or null
items[].groupIdstring or null
items[].idrequiredstring
items[].liverequiredboolean
items[].memberIdstring or null
items[].moderequiredstring
items[].noterequiredstring
items[].recordingRequiredrequiredboolean
items[].revokeReasonstring or null
items[].revokedAtstring (date-time) or null
items[].startsAtrequiredstring (date-time)
items[].targetKindrequiredstring
items[].targetLabelrequiredstring
items[].targetRefstring or null
pagerequiredinteger
pageSizerequiredinteger
totalrequiredinteger
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/grants?includeRevoked=<includeRevoked>' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

POST /api/portal/v1/orgs/{clientID}/remote/grants

Section titled “POST /api/portal/v1/orgs/{clientID}/remote/grants”

POSTportal:remote:grantportal facemsp

Source: [object Object]

createRemoteGrant gives a person or group remote access to an endpoint, site, device group, tag or their assigned endpoints, within the MSP’s ceiling and only to people who hold remote access.

NameInTypeRequiredDescription
clientIDpathstringYes

Required, sent as application/json.

The body is any.

StatusBodyDescription
201application/json, GrantViewCreated.
400NoneThe request was refused.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:grant.
404application/problem+json, ProblemDetailsNo resource matches that id.

201 response body

FieldTypeDescription
capabilitiesrequiredarray of string
coveredEndpointCountrequiredinteger
createdAtrequiredstring (date-time)
createdByrequiredActor

Actor is who created a grant on the wire (contract 8.4 Actor).

createdBy.kindrequiredstring
createdBy.labelstring or null
createdBy.refrequiredstring
endsAtstring (date-time) or null
groupIdstring or null
idrequiredstring
liverequiredboolean
memberIdstring or null
moderequiredstring
noterequiredstring
recordingRequiredrequiredboolean
revokeReasonstring or null
revokedAtstring (date-time) or null
startsAtrequiredstring (date-time)
targetKindrequiredstring
targetLabelrequiredstring
targetRefstring or null
Terminal window
# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
curl -X POST 'https://depot.example.com/api/portal/v1/orgs/<clientID>/remote/grants' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b '__Host-portal_session=<portal-session>' \
--data '"string"'

GET /api/portal/v1/orgs/{clientID}/remote/grants/{grantID}

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/grants/{grantID}”

GETportal:remote:grantportal facemspIdempotent

Source: [object Object]

getRemoteGrant reads one grant.

NameInTypeRequiredDescription
clientIDpathstringYes
grantIDpathstringYes
StatusBodyDescription
200application/json, GrantViewSuccess.
400NoneThe request was refused.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:grant.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
capabilitiesrequiredarray of string
coveredEndpointCountrequiredinteger
createdAtrequiredstring (date-time)
createdByrequiredActor

Actor is who created a grant on the wire (contract 8.4 Actor).

createdBy.kindrequiredstring
createdBy.labelstring or null
createdBy.refrequiredstring
endsAtstring (date-time) or null
groupIdstring or null
idrequiredstring
liverequiredboolean
memberIdstring or null
moderequiredstring
noterequiredstring
recordingRequiredrequiredboolean
revokeReasonstring or null
revokedAtstring (date-time) or null
startsAtrequiredstring (date-time)
targetKindrequiredstring
targetLabelrequiredstring
targetRefstring or null
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/grants/<grantID>' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

DELETE /api/portal/v1/orgs/{clientID}/remote/grants/{grantID}

Section titled “DELETE /api/portal/v1/orgs/{clientID}/remote/grants/{grantID}”

DELETEportal:remote:grantportal facemspIdempotent

Source: [object Object]

revokeRemoteGrant revokes a grant; live sessions under it end at once.

NameInTypeRequiredDescription
clientIDpathstringYes
grantIDpathstringYes
StatusBodyDescription
204NoneSuccess, with no body.
400NoneThe request was refused.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:grant.
404application/problem+json, ProblemDetailsNo resource matches that id.
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/grants/<grantID>' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

GET /api/portal/v1/orgs/{clientID}/remote/policy

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/policy”

GETportal:remote:useportal facemspIdempotent

Source: [object Object]

getRemotePolicy reads the organization’s remote policy and what the MSP leaves of it.

NameInTypeRequiredDescription
clientIDpathstringYes
StatusBodyDescription
200application/json, PolicyViewSuccess.
400NoneThe request was refused.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:use.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
allowedModesrequiredarray of string
consentRequiredrequiredboolean
defaultAssignedModerequiredstring
defaultOtherModerequiredstring
effectiveAllowedModesrequiredarray of string
maxGrantDaysinteger or null
recordingRequiredrequiredboolean
remoteEnabledrequiredboolean
rowVersionrequiredinteger

int64.

stepUpMfarequiredboolean
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/policy' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-session>'

PUT /api/portal/v1/orgs/{clientID}/remote/policy

Section titled “PUT /api/portal/v1/orgs/{clientID}/remote/policy”

PUTportal:remote:grantportal facemspIdempotent

Source: [object Object]

putRemotePolicy sets which modes the organization allows and the default mode for new grants, within the MSP’s ceiling.

NameInTypeRequiredDescription
clientIDpathstringYes

Required, sent as application/json.

The body is any.

StatusBodyDescription
200application/json, PolicyViewSuccess.
400NoneThe request was refused.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:grant.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
allowedModesrequiredarray of string
consentRequiredrequiredboolean
defaultAssignedModerequiredstring
defaultOtherModerequiredstring
effectiveAllowedModesrequiredarray of string
maxGrantDaysinteger or null
recordingRequiredrequiredboolean
remoteEnabledrequiredboolean
rowVersionrequiredinteger

int64.

stepUpMfarequiredboolean
Terminal window
# Sign in first. __Host-portal_session is a session cookie, so send it with every request.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X PUT 'https://depot.example.com/api/portal/v1/orgs/<clientID>/remote/policy' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-b '__Host-portal_session=<portal-session>' \
--data '"string"'

GET /api/portal/v1/orgs/{clientID}/remote/targets

Section titled “GET /api/portal/v1/orgs/{clientID}/remote/targets”

GETportal:remote:grantportal facemspIdempotent

Source: [object Object]

listGrantTargets lists what a new grant can reach: the organization’s endpoints, sites, device groups and tags.

NameInTypeRequiredDescription
clientIDpathstringYes
StatusBodyDescription
200application/json, TargetChoicesSuccess.
400NoneThe request was refused.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold portal:remote:grant.
404application/problem+json, ProblemDetailsNo resource matches that id.

200 response body

FieldTypeDescription
deviceGroupsrequiredarray of TargetChoice
deviceGroups[].labelrequiredstring
deviceGroups[].refrequiredstring
endpointsrequiredarray of TargetChoice
endpoints[].labelrequiredstring
endpoints[].refrequiredstring
sitesrequiredarray of TargetChoice
sites[].labelrequiredstring
sites[].refrequiredstring
tagsrequiredarray of TargetChoice
tags[].labelrequiredstring
tags[].refrequiredstring
Terminal window
# Sign in first. __Host-portal_session 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/portal/v1/orgs/<clientID>/remote/targets' \
-H 'X-Csrf-Token: <portal-csrf>' \
-H 'Accept: application/json' \
-b '__Host-portal_session=<portal-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.