Skip to content

Depot oauth

Registers the authorization server and its consent API on a face mux, outside the license gate, beside the console sign-in 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.

GET /.well-known/oauth-authorization-server

Section titled “GET /.well-known/oauth-authorization-server”

GETNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

As metadata

StatusBodyDescription
200application/json, objectSuccess.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/.well-known/oauth-authorization-server' \
-H 'Accept: application/json'

OPTIONS /.well-known/oauth-authorization-server

Section titled “OPTIONS /.well-known/oauth-authorization-server”

OPTIONSNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Oauth preflight

StatusBodyDescription
204NoneSuccess, with no body.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X OPTIONS 'https://depot.example.com/.well-known/oauth-authorization-server'

GETNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Resource metadata

StatusBodyDescription
200application/json, objectSuccess.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/.well-known/oauth-protected-resource' \
-H 'Accept: application/json'

OPTIONS /.well-known/oauth-protected-resource

Section titled “OPTIONS /.well-known/oauth-protected-resource”

OPTIONSNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Oauth preflight

StatusBodyDescription
204NoneSuccess, with no body.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X OPTIONS 'https://depot.example.com/.well-known/oauth-protected-resource'

GET /.well-known/oauth-protected-resource/mcp

Section titled “GET /.well-known/oauth-protected-resource/mcp”

GETNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Resource metadata

StatusBodyDescription
200application/json, objectSuccess.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/.well-known/oauth-protected-resource/mcp' \
-H 'Accept: application/json'

OPTIONS /.well-known/oauth-protected-resource/mcp

Section titled “OPTIONS /.well-known/oauth-protected-resource/mcp”

OPTIONSNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Oauth preflight

StatusBodyDescription
204NoneSuccess, with no body.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X OPTIONS 'https://depot.example.com/.well-known/oauth-protected-resource/mcp'

GETai:usepublic facehosteditmspremoteIdempotent

Source: [object Object]

getDevice returns the pending device sign-in a user code names.

NameInTypeRequiredDescription
userCodepathstringYes
StatusBodyDescription
200application/json, OauthDeviceViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold ai:use.
404application/problem+json, ProblemDetailsThis request has expired or was already answered.
500application/problem+json, ProblemDetailsThe request failed.

200 response body

FieldTypeDescription
clientIdrequiredstring
clientNamerequiredstring
createdAtrequiredstring (date-time)
expiresAtrequiredstring (date-time)
firstPartyrequiredboolean
requestIprequiredstring
sameNetworkrequiredboolean
scoperequiredstring
userCoderequiredstring
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/oauth/device/<userCode>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POST /api/v1/oauth/device/{userCode}/approve

Section titled “POST /api/v1/oauth/device/{userCode}/approve”

POSTai:usepublic facehosteditmspremote

Source: [object Object]

approveDevice approves a device sign-in under the same rules as consent.

NameInTypeRequiredDescription
userCodepathstringYes
StatusBodyDescription
200application/json, OauthDeviceDecisionSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold ai:use.
404application/problem+json, ProblemDetailsThis request has expired or was already answered.
500application/problem+json, ProblemDetailsThe request failed.

200 response body

FieldTypeDescription
approvedrequiredboolean
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/oauth/device/<userCode>/approve' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTai:usepublic facehosteditmspremote

Source: [object Object]

denyDevice denies a device sign-in; the CLI’s next poll gets access_denied.

NameInTypeRequiredDescription
userCodepathstringYes
StatusBodyDescription
200application/json, OauthDeviceDecisionSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold ai:use.
404application/problem+json, ProblemDetailsThis request has expired or was already answered.
500application/problem+json, ProblemDetailsThe request failed.

200 response body

FieldTypeDescription
approvedrequiredboolean
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/oauth/device/<userCode>/deny' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETai:usepublic facehosteditmspremoteIdempotent

Source: [object Object]

getRequest returns the pending authorization request the consent page shows.

NameInTypeRequiredDescription
idpathstringYes
StatusBodyDescription
200application/json, OauthRequestViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold ai:use.
404application/problem+json, ProblemDetailsThis request has expired or was already answered.
500application/problem+json, ProblemDetailsThe request failed.

200 response body

FieldTypeDescription
clientIdrequiredstring
clientNamerequiredstring
expiresAtrequiredstring (date-time)
firstPartyrequiredboolean
idrequiredstring
redirectHostrequiredstring
scoperequiredstring
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/oauth/requests/<id>' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTai:usepublic facehosteditmspremote

Source: [object Object]

approveRequest approves a pending authorization request and returns the URL the SPA navigates to, carrying a single-use code good for 60 seconds.

NameInTypeRequiredDescription
idpathstringYes
StatusBodyDescription
200application/json, OauthRedirectViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold ai:use.
404application/problem+json, ProblemDetailsThis request has expired or was already answered.
500application/problem+json, ProblemDetailsThe request failed.

200 response body

FieldTypeDescription
redirectUrlrequiredstring
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/oauth/requests/<id>/approve' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

POSTai:usepublic facehosteditmspremote

Source: [object Object]

denyRequest denies a pending authorization request; the client is told access_denied.

NameInTypeRequiredDescription
idpathstringYes
StatusBodyDescription
200application/json, OauthRedirectViewSuccess.
400application/problem+json, ProblemDetailsOne or more validation errors occurred.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold ai:use.
404application/problem+json, ProblemDetailsThis request has expired or was already answered.
500application/problem+json, ProblemDetailsThe request failed.

200 response body

FieldTypeDescription
redirectUrlrequiredstring
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/oauth/requests/<id>/deny' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

GETNo permission neededpublic facehosteditmspremoteIdempotentNot fully resolved

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]

authorize validates the client and its redirect URI FIRST.

Until both are known good, every error is a plain page and never a redirect: a redirect to an unvalidated URI is an open redirector.

NameInTypeRequiredDescription
client_idquerystringNo
code_challengequerystringNo
code_challenge_methodquerystringNo
redirect_uriquerystringNo
resourcequerystringNo
response_typequerystringNo
scopequerystringNo
statequerystringNo
StatusBodyDescription
200NoneSuccess. The body shape was not resolved; see x-outpost-unresolved.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X GET 'https://depot.example.com/oauth/authorize?client_id=<client_id>&code_challenge=<code_challenge>&code_challenge_method=<code_challenge_method>&redirect_uri=<redirect_uri>&resource=<resource>&response_type=<response_type>'

POSTNo permission neededpublic facehosteditmspremoteNot fully resolved

What this page does not know
  • response-status

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]

Device authorization

NameInTypeRequiredDescription
client_idquerystringNo
client_secretquerystringNo
scopequerystringNo
StatusBodyDescription
200application/json, objectSuccess.
Terminal window
# This operation is public. It takes no credentials.
curl -X POST 'https://depot.example.com/oauth/device_authorization?client_id=<client_id>&client_secret=<client_secret>&scope=<scope>' \
-H 'Accept: application/json'

OPTIONSNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Oauth preflight

StatusBodyDescription
204NoneSuccess, with no body.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X OPTIONS 'https://depot.example.com/oauth/device_authorization'

POSTNo permission neededpublic facehosteditmspremoteNot fully resolved

What this page does not know
  • response-status

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]

Register

Required, sent as application/json.

FieldTypeDescription
client_namerequiredstring
grant_typesrequiredarray of string
redirect_urisrequiredarray of string
response_typesrequiredarray of string
software_idrequiredstring
software_versionrequiredstring
token_endpoint_auth_methodrequiredstring
StatusBodyDescription
200application/json, objectSuccess.
201application/json, objectCreated.
400application/problem+json, ProblemDetailsThe request body is not acceptable.
Terminal window
# This operation is public. It takes no credentials.
curl -X POST 'https://depot.example.com/oauth/register' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
--data '{
"client_name": "string",
"grant_types": [
"string"
],
"redirect_uris": [
"string"
],
"response_types": [
"string"
],
"software_id": "string",
"software_version": "string",
"token_endpoint_auth_method": "string"
}'

OPTIONSNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Oauth preflight

StatusBodyDescription
204NoneSuccess, with no body.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X OPTIONS 'https://depot.example.com/oauth/register'

POSTNo permission neededpublic facehosteditmspremoteNot fully resolved

What this page does not know
  • response-status

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]

Revoke

NameInTypeRequiredDescription
client_idquerystringNo
client_secretquerystringNo
tokenquerystringNo
StatusBodyDescription
200application/json, objectSuccess.
Terminal window
# This operation is public. It takes no credentials.
curl -X POST 'https://depot.example.com/oauth/revoke?client_id=<client_id>&client_secret=<client_secret>&token=<token>' \
-H 'Accept: application/json'

OPTIONSNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Oauth preflight

StatusBodyDescription
204NoneSuccess, with no body.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X OPTIONS 'https://depot.example.com/oauth/revoke'

POSTNo permission neededpublic facehosteditmspremoteNot fully resolved

What this page does not know
  • response-status

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]

Token

NameInTypeRequiredDescription
client_idquerystringNo
client_secretquerystringNo
codequerystringNo
code_verifierquerystringNo
device_codequerystringNo
grant_typequerystringNo
redirect_uriquerystringNo
refresh_tokenquerystringNo
StatusBodyDescription
200application/json, objectSuccess.
Terminal window
# This operation is public. It takes no credentials.
curl -X POST 'https://depot.example.com/oauth/token?client_id=<client_id>&client_secret=<client_secret>&code=<code>&code_verifier=<code_verifier>&device_code=<device_code>&grant_type=<grant_type>' \
-H 'Accept: application/json'

OPTIONSNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

Oauth preflight

StatusBodyDescription
204NoneSuccess, with no body.
Terminal window
# This operation is public. It takes no credentials.
# This operation is idempotent. Repeating it does not repeat its effect.
curl -X OPTIONS 'https://depot.example.com/oauth/token'

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.