Skip to content

Depot branding

Registers the guarded write routes on the tenant API 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.

GETNo permission neededpublic facehosteditmspremoteIdempotent

Source: [object Object]

getBranding answers what the sign-in page needs to draw its heading.

Unauthenticated. It reads the tenant the hostname already resolved to, so the only organization it can name is the one whose sign-in page is being asked for, and that name is on the certificate, in the hostname, and printed on the invoice: nothing here is a disclosure.

EVERY FAILURE DEGRADES RATHER THAN ERRORS. A missing tenant, a missing store, or a store that will not answer all produce a 200 with an empty name and no logo. This is the first call the login page makes and the last thing it should be able to do is prevent somebody signing in; the page is designed to render identically when this returns nothing, so returning nothing is a complete answer rather than a swallowed error.

StatusBodyDescription
200application/json, BrandingViewSuccess.

200 response body

FieldTypeDescription
logoUrlstring or null
organizationNamerequiredstring
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/api/v1/console/branding' \
-H 'Accept: application/json'

GETNo permission neededpublic facehosteditmspremoteIdempotentdownloadNot 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]

downloadLogo streams the logo to anybody who asks.

Read the file header before changing any header this writes.

The Cache-Control here is “public”, which is the exact OPPOSITE of what downloadTicketAttachment sets, for the exact opposite reason. An attachment is one customer’s private file reached by a URL that carries no credential, so no shared cache may hold it. A logo is deliberately shown to strangers, and the only thing that varies it is the hostname, which IS the tenant boundary and is part of every cache key there is. Five minutes is short enough that a replaced logo appears promptly and long enough that a sign-in page under load does not re-read a blob store for every visitor.

StatusBodyDescription
200application/octet-stream, string (binary)Success. The body shape was not resolved; see x-outpost-unresolved.
304NoneSuccess.
404application/problem+json, ProblemDetailsNo logo has been uploaded.
500application/problem+json, ProblemDetailsNo client store in request context.
502application/problem+json, ProblemDetailsThe logo could not be read.
503application/problem+json, ProblemDetailsLogo storage is not configured on this Depot.
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/api/v1/console/branding/logo' \
-H 'Accept: application/json'

PUTclient:managetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

uploadLogo takes one image as the raw request body.

Raw body rather than multipart, following uploadTicketAttachment: there is one file and no other fields, so multipart would add a parser, a spool and its own limits to carry no information. The type travels in Content-Type, which is where an HTTP client already puts it.

StatusBodyDescription
200application/json, BrandingViewSuccess.
400application/problem+json, ProblemDetailsThe request body could not be read.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold client:manage.
413application/problem+json, ProblemDetailsThe request was refused.
415application/problem+json, ProblemDetailsA logo must be a PNG, JPEG or WebP image. SVG is not accepted, because it can carry script.
500application/problem+json, ProblemDetailsNo client store in request context.
502application/problem+json, ProblemDetailsThe logo could not be stored. The previous logo is unchanged.
503application/problem+json, ProblemDetailsLogo storage is not configured on this Depot.
507application/problem+json, ProblemDetailsThis client’s storage is full. Raise the quota or remove old attachments.

200 response body

FieldTypeDescription
logoUrlstring or null
organizationNamerequiredstring
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 PUT 'https://depot.example.com/api/v1/organization/branding/logo' \
-H 'X-CSRF-Token: <csrf-token>' \
-H 'Accept: application/json' \
-b 'outpost_console=<console-session>'

DELETEclient:managetenant facehosteditmspremoteIdempotent

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

Source: [object Object]

deleteLogo returns the sign-in page to the default wordmark.

StatusBodyDescription
204NoneSuccess, with no body.
401application/problem+json, ProblemDetailsNo signed-in identity.
403application/problem+json, ProblemDetailsThe identity does not hold client:manage.
500application/problem+json, ProblemDetailsNo client store in request context.
502application/problem+json, ProblemDetailsThe logo could not be read.
503application/problem+json, ProblemDetailsLogo storage is not 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 DELETE 'https://depot.example.com/api/v1/organization/branding/logo' \
-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.