Depot portalbranding
Registers the MSP’s branding routes: the default branding on /api/v1/portal/branding and per-client overrides under /api/v1/clients/{clientID}/portal/branding.
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/branding
Section titled “GET /api/portal/v1/branding”GETNo permission neededportal facemspIdempotent
Source: [object Object]
portalBrandingView is the portal’s resolved branding, read before sign-in.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
client | query | string | No | |
org | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, View | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
accentrequired | object | |
accent.darkrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
accent.dark.accentrequired | string | |
accent.dark.inkrequired | string | |
accent.dark.onAccentrequired | string | |
accent.dark.uirequired | string | |
accent.lightrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
accent.light.accentrequired | string | |
accent.light.inkrequired | string | |
accent.light.onAccentrequired | string | |
accent.light.uirequired | string | |
accentHexrequired | string | |
faviconUrl | string or null | |
hidePoweredByrequired | boolean | |
logoDarkUrl | string or null | |
logoLightUrl | string or null | |
portalNamerequired | string | |
rowVersionrequired | integer | int64. |
sourcerequired | string | |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
themerequired | string |
Request samples
Section titled “Request samples”# 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/portal/v1/branding?client=<client>&org=<org>' \ -H 'Accept: application/json'# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'Accept' = 'application/json'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/branding?client=<client>&org=<org>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/branding"params = { "client": "<client>", "org": "<org>",}headers = { "Accept": "application/json",}
response = requests.get(url, params=params, headers=headers, timeout=30)response.raise_for_status()print(response.json())// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/branding?client=<client>&org=<org>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
const url = new URL("https://depot.example.com/api/portal/v1/branding");url.searchParams.set("client", "<client>");url.searchParams.set("org", "<org>");
const response = await fetch(url, { method: "GET", headers: { "Accept": "application/json", },});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/branding?client=<client>&org=<org>");request.Headers.TryAddWithoutValidation("Accept", "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/portal/v1/branding/{asset}
Section titled “GET /api/portal/v1/branding/{asset}”GETNo permission neededportal facemspIdempotentNot 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]
portalBrandingImage serves a branding image: the light or dark logo or the favicon, with the same fallbacks the portal shows.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
asset | path | string | Yes | |
client | query | string | No | |
org | query | string | No | |
v | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | None | Success. The body shape was not resolved; see x-outpost-unresolved. |
304 | None | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
Request samples
Section titled “Request samples”# 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/portal/v1/branding/<asset>?client=<client>&org=<org>&v=<v>' \ -H 'Accept: application/json'# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'Accept' = 'application/json'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/portal/v1/branding/<asset>?client=<client>&org=<org>&v=<v>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/api/portal/v1/branding/<asset>"params = { "client": "<client>", "org": "<org>", "v": "<v>",}headers = { "Accept": "application/json",}
response = requests.get(url, params=params, headers=headers, timeout=30)response.raise_for_status()print(response.json())// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/portal/v1/branding/<asset>?client=<client>&org=<org>&v=<v>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
const url = new URL("https://depot.example.com/api/portal/v1/branding/<asset>");url.searchParams.set("client", "<client>");url.searchParams.set("org", "<org>");url.searchParams.set("v", "<v>");
const response = await fetch(url, { method: "GET", headers: { "Accept": "application/json", },});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/portal/v1/branding/<asset>?client=<client>&org=<org>&v=<v>");request.Headers.TryAddWithoutValidation("Accept", "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/clients/{clientID}/portal/branding
Section titled “GET /api/v1/clients/{clientID}/portal/branding”GETclientportal:brandingmsp facemspIdempotent
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
getPortalBranding reads the MSP’s default portal branding, or one client’s override, with the effective branding the portal shows.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalBrandingSettings | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
clientId | string or null | |
effectiverequired | View | View is the Branding wire shape (contract 8.4) plus hidePoweredBy (12.4). |
effective.accentrequired | object | |
effective.accent.darkrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.dark.accentrequired | string | |
effective.accent.dark.inkrequired | string | |
effective.accent.dark.onAccentrequired | string | |
effective.accent.dark.uirequired | string | |
effective.accent.lightrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.light.accentrequired | string | |
effective.accent.light.inkrequired | string | |
effective.accent.light.onAccentrequired | string | |
effective.accent.light.uirequired | string | |
effective.accentHexrequired | string | |
effective.faviconUrl | string or null | |
effective.hidePoweredByrequired | boolean | |
effective.logoDarkUrl | string or null | |
effective.logoLightUrl | string or null | |
effective.portalNamerequired | string | |
effective.rowVersionrequired | integer | int64. |
effective.sourcerequired | string | |
effective.supportEmail | string or null | |
effective.supportPhone | string or null | |
effective.supportUrl | string or null | |
effective.themerequired | string | |
existsrequired | boolean | |
faviconUrl | string or null | |
hidePoweredBy | boolean or null | |
logoDarkUrl | string or null | |
logoLightUrl | string or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
scoperequired | string | |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Request samples
Section titled “Request samples”# 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/branding' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# 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.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/clients/<clientID>/portal/branding' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# 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.
import requests
url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// 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.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// 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.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// 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.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PUT /api/v1/clients/{clientID}/portal/branding
Section titled “PUT /api/v1/clients/{clientID}/portal/branding”PUTclientportal:brandingmsp facemspIdempotent
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
putPortalBranding saves the text fields of the default branding or of a client’s override.
A client override is created on its first save (rowVersion 0).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
hidePoweredBy | boolean or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalBrandingSettings | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No client matches that id. |
500 | application/problem+json, ProblemDetails | Could not save the portal branding. |
200 response body
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
clientId | string or null | |
effectiverequired | View | View is the Branding wire shape (contract 8.4) plus hidePoweredBy (12.4). |
effective.accentrequired | object | |
effective.accent.darkrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.dark.accentrequired | string | |
effective.accent.dark.inkrequired | string | |
effective.accent.dark.onAccentrequired | string | |
effective.accent.dark.uirequired | string | |
effective.accent.lightrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.light.accentrequired | string | |
effective.accent.light.inkrequired | string | |
effective.accent.light.onAccentrequired | string | |
effective.accent.light.uirequired | string | |
effective.accentHexrequired | string | |
effective.faviconUrl | string or null | |
effective.hidePoweredByrequired | boolean | |
effective.logoDarkUrl | string or null | |
effective.logoLightUrl | string or null | |
effective.portalNamerequired | string | |
effective.rowVersionrequired | integer | int64. |
effective.sourcerequired | string | |
effective.supportEmail | string or null | |
effective.supportPhone | string or null | |
effective.supportUrl | string or null | |
effective.themerequired | string | |
existsrequired | boolean | |
faviconUrl | string or null | |
hidePoweredBy | boolean or null | |
logoDarkUrl | string or null | |
logoLightUrl | string or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
scoperequired | string | |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Request samples
Section titled “Request samples”# 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/clients/<clientID>/portal/branding' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}'# 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.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}'@
$response = Invoke-RestMethod ` -Method Put ` -Uri 'https://depot.example.com/api/v1/clients/<clientID>/portal/branding' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# 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.
import requests
url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "accentHex": "string", "accentSource": "string", "hidePoweredBy": False, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string",}
response = requests.put(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// 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.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}`)
req, err := http.NewRequest(http.MethodPut, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// 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.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding";
const response = await fetch(url, { method: "PUT", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// 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.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Put, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/clients/{clientID}/portal/branding
Section titled “DELETE /api/v1/clients/{clientID}/portal/branding”DELETEclientportal:brandingmsp facemspIdempotent
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
deletePortalClientBranding removes a client’s override, so the client shows the MSP’s default branding again.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
Request samples
Section titled “Request samples”# 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/clients/<clientID>/portal/branding' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# 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.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/clients/<clientID>/portal/branding' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# 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.
import requests
url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// 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.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// 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.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// 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.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/clients/{clientID}/portal/branding/{asset}
Section titled “POST /api/v1/clients/{clientID}/portal/branding/{asset}”POSTclientportal:brandingmsp facemsp
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
uploadPortalBrandingAsset stores a light logo, dark logo or favicon (the request body is the image).
PNG or JPEG for logos, PNG for the favicon; SVG and WebP are refused.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
asset | path | string | Yes | |
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalBrandingSettings | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No client matches that id. |
500 | application/problem+json, ProblemDetails | Could not save the image. |
200 response body
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
clientId | string or null | |
effectiverequired | View | View is the Branding wire shape (contract 8.4) plus hidePoweredBy (12.4). |
effective.accentrequired | object | |
effective.accent.darkrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.dark.accentrequired | string | |
effective.accent.dark.inkrequired | string | |
effective.accent.dark.onAccentrequired | string | |
effective.accent.dark.uirequired | string | |
effective.accent.lightrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.light.accentrequired | string | |
effective.accent.light.inkrequired | string | |
effective.accent.light.onAccentrequired | string | |
effective.accent.light.uirequired | string | |
effective.accentHexrequired | string | |
effective.faviconUrl | string or null | |
effective.hidePoweredByrequired | boolean | |
effective.logoDarkUrl | string or null | |
effective.logoLightUrl | string or null | |
effective.portalNamerequired | string | |
effective.rowVersionrequired | integer | int64. |
effective.sourcerequired | string | |
effective.supportEmail | string or null | |
effective.supportPhone | string or null | |
effective.supportUrl | string or null | |
effective.themerequired | string | |
existsrequired | boolean | |
faviconUrl | string or null | |
hidePoweredBy | boolean or null | |
logoDarkUrl | string or null | |
logoLightUrl | string or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
scoperequired | string | |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Request samples
Section titled “Request samples”# 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>/portal/branding/<asset>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/clients/{clientID}/portal/branding/{asset}
Section titled “DELETE /api/v1/clients/{clientID}/portal/branding/{asset}”DELETEclientportal:brandingmsp facemspIdempotent
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
deletePortalBrandingAsset clears one image, so it falls back again.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
asset | path | string | Yes | |
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No client matches that id. |
500 | application/problem+json, ProblemDetails | Could not remove the image. |
Request samples
Section titled “Request samples”# 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/clients/<clientID>/portal/branding/<asset>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# 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.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# 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.
import requests
url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// 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.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// 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.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// 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.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/clients/<clientID>/portal/branding/<asset>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /api/v1/portal/branding
Section titled “GET /api/v1/portal/branding”GETclientportal:brandingmsp facemspIdempotent
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
getPortalBranding reads the MSP’s default portal branding, or one client’s override, with the effective branding the portal shows.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalBrandingSettings | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No resource matches. |
500 | application/problem+json, ProblemDetails | The request failed. |
200 response body
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
clientId | string or null | |
effectiverequired | View | View is the Branding wire shape (contract 8.4) plus hidePoweredBy (12.4). |
effective.accentrequired | object | |
effective.accent.darkrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.dark.accentrequired | string | |
effective.accent.dark.inkrequired | string | |
effective.accent.dark.onAccentrequired | string | |
effective.accent.dark.uirequired | string | |
effective.accent.lightrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.light.accentrequired | string | |
effective.accent.light.inkrequired | string | |
effective.accent.light.onAccentrequired | string | |
effective.accent.light.uirequired | string | |
effective.accentHexrequired | string | |
effective.faviconUrl | string or null | |
effective.hidePoweredByrequired | boolean | |
effective.logoDarkUrl | string or null | |
effective.logoLightUrl | string or null | |
effective.portalNamerequired | string | |
effective.rowVersionrequired | integer | int64. |
effective.sourcerequired | string | |
effective.supportEmail | string or null | |
effective.supportPhone | string or null | |
effective.supportUrl | string or null | |
effective.themerequired | string | |
existsrequired | boolean | |
faviconUrl | string or null | |
hidePoweredBy | boolean or null | |
logoDarkUrl | string or null | |
logoLightUrl | string or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
scoperequired | string | |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Request samples
Section titled “Request samples”# 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/portal/branding' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# 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.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/api/v1/portal/branding' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# 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.
import requests
url = "https://depot.example.com/api/v1/portal/branding"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.get(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// 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.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/api/v1/portal/branding", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// 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.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/portal/branding";
const response = await fetch(url, { method: "GET", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// 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.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/api/v1/portal/branding");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());PUT /api/v1/portal/branding
Section titled “PUT /api/v1/portal/branding”PUTclientportal:brandingmsp facemspIdempotent
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
putPortalBranding saves the text fields of the default branding or of a client’s override.
A client override is created on its first save (rowVersion 0).
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
clientID | path | string | Yes |
Request body
Section titled “Request body”Required, sent as application/json.
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
hidePoweredBy | boolean or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalBrandingSettings | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No client matches that id. |
500 | application/problem+json, ProblemDetails | Could not save the portal branding. |
200 response body
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
clientId | string or null | |
effectiverequired | View | View is the Branding wire shape (contract 8.4) plus hidePoweredBy (12.4). |
effective.accentrequired | object | |
effective.accent.darkrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.dark.accentrequired | string | |
effective.accent.dark.inkrequired | string | |
effective.accent.dark.onAccentrequired | string | |
effective.accent.dark.uirequired | string | |
effective.accent.lightrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.light.accentrequired | string | |
effective.accent.light.inkrequired | string | |
effective.accent.light.onAccentrequired | string | |
effective.accent.light.uirequired | string | |
effective.accentHexrequired | string | |
effective.faviconUrl | string or null | |
effective.hidePoweredByrequired | boolean | |
effective.logoDarkUrl | string or null | |
effective.logoLightUrl | string or null | |
effective.portalNamerequired | string | |
effective.rowVersionrequired | integer | int64. |
effective.sourcerequired | string | |
effective.supportEmail | string or null | |
effective.supportPhone | string or null | |
effective.supportUrl | string or null | |
effective.themerequired | string | |
existsrequired | boolean | |
faviconUrl | string or null | |
hidePoweredBy | boolean or null | |
logoDarkUrl | string or null | |
logoLightUrl | string or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
scoperequired | string | |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Request samples
Section titled “Request samples”# 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/portal/branding' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -H 'Content-Type: application/json' \ -b 'outpost_console=<console-session>' \ --data '{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}'# 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.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Content-Type' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$body = @'{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}'@
$response = Invoke-RestMethod ` -Method Put ` -Uri 'https://depot.example.com/api/v1/portal/branding' ` -Headers $headers ` -ContentType 'application/json' ` -Body $body
$response | ConvertTo-Json -Depth 10# 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.
import requests
url = "https://depot.example.com/api/v1/portal/branding"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json",}cookies = { "outpost_console": "<console-session>",}payload = { "accentHex": "string", "accentSource": "string", "hidePoweredBy": False, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string",}
response = requests.put(url, headers=headers, cookies=cookies, json=payload, timeout=30)response.raise_for_status()print(response.json())// 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.package main
import ( "bytes" "fmt" "io" "log" "net/http")
func main() { body := []byte(`{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}`)
req, err := http.NewRequest(http.MethodPut, "https://depot.example.com/api/v1/portal/branding", bytes.NewReader(body)) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.Header.Set("Content-Type", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// 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.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/portal/branding";
const response = await fetch(url, { method: "PUT", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", "Content-Type": "application/json", }, credentials: "include", body: JSON.stringify({ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string" }),});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// 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.
using System;using System.Net.Http;using System.Text;
using var client = new HttpClient();
const string body = """{ "accentHex": "string", "accentSource": "string", "hidePoweredBy": false, "portalName": "string", "rowVersion": 0, "supportEmail": "string", "supportPhone": "string", "supportUrl": "string", "theme": "string"}""";
var request = new HttpRequestMessage(HttpMethod.Put, "https://depot.example.com/api/v1/portal/branding");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");request.Content = new StringContent(body, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/portal/branding/{asset}
Section titled “POST /api/v1/portal/branding/{asset}”POSTclientportal:brandingmsp facemsp
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
uploadPortalBrandingAsset stores a light logo, dark logo or favicon (the request body is the image).
PNG or JPEG for logos, PNG for the favicon; SVG and WebP are refused.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
asset | path | string | Yes | |
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalBrandingSettings | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No client matches that id. |
500 | application/problem+json, ProblemDetails | Could not save the image. |
200 response body
| Field | Type | Description |
|---|---|---|
accentHex | string or null | |
accentSource | string or null | |
clientId | string or null | |
effectiverequired | View | View is the Branding wire shape (contract 8.4) plus hidePoweredBy (12.4). |
effective.accentrequired | object | |
effective.accent.darkrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.dark.accentrequired | string | |
effective.accent.dark.inkrequired | string | |
effective.accent.dark.onAccentrequired | string | |
effective.accent.dark.uirequired | string | |
effective.accent.lightrequired | AccentTokens | AccentTokens are one theme's tokens on the wire (contract 8.4 Branding). |
effective.accent.light.accentrequired | string | |
effective.accent.light.inkrequired | string | |
effective.accent.light.onAccentrequired | string | |
effective.accent.light.uirequired | string | |
effective.accentHexrequired | string | |
effective.faviconUrl | string or null | |
effective.hidePoweredByrequired | boolean | |
effective.logoDarkUrl | string or null | |
effective.logoLightUrl | string or null | |
effective.portalNamerequired | string | |
effective.rowVersionrequired | integer | int64. |
effective.sourcerequired | string | |
effective.supportEmail | string or null | |
effective.supportPhone | string or null | |
effective.supportUrl | string or null | |
effective.themerequired | string | |
existsrequired | boolean | |
faviconUrl | string or null | |
hidePoweredBy | boolean or null | |
logoDarkUrl | string or null | |
logoLightUrl | string or null | |
portalName | string or null | |
rowVersionrequired | integer | int64. |
scoperequired | string | |
supportEmail | string or null | |
supportPhone | string or null | |
supportUrl | string or null | |
theme | string or null |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/portal/branding/<asset>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/portal/branding/<asset>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/portal/branding/<asset>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/portal/branding/<asset>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/portal/branding/<asset>";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/portal/branding/<asset>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());DELETE /api/v1/portal/branding/{asset}
Section titled “DELETE /api/v1/portal/branding/{asset}”DELETEclientportal:brandingmsp facemspIdempotent
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
deletePortalBrandingAsset clears one image, so it falls back again.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
asset | path | string | Yes | |
clientID | path | string | Yes |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
204 | None | Success, with no body. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No client matches that id. |
500 | application/problem+json, ProblemDetails | Could not remove the image. |
Request samples
Section titled “Request samples”# 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/portal/branding/<asset>' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# 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.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Delete ` -Uri 'https://depot.example.com/api/v1/portal/branding/<asset>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# 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.
import requests
url = "https://depot.example.com/api/v1/portal/branding/<asset>"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.delete(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// 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.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodDelete, "https://depot.example.com/api/v1/portal/branding/<asset>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// 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.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/portal/branding/<asset>";
const response = await fetch(url, { method: "DELETE", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// 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.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Delete, "https://depot.example.com/api/v1/portal/branding/<asset>");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());POST /api/v1/portal/branding/suggest
Section titled “POST /api/v1/portal/branding/suggest”POSTclientportal:brandingmsp facemsp
From an MSP console, prefix the path with /api/v1/clients/{clientID}/portal/branding to reach one client.
Source: [object Object]
suggestPortalAccent suggests accent colours from a logo (the request body is a PNG or JPEG) and shows what the contrast solve makes of each.
The console can also run the same algorithm in the browser; both give the same swatches for the same pixels.
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | application/json, PortalSwatchSuggestion | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
401 | application/problem+json, ProblemDetails | No signed-in identity. |
403 | application/problem+json, ProblemDetails | The identity does not hold clientportal:branding. |
404 | application/problem+json, ProblemDetails | No resource matches. |
200 response body
| Field | Type | Description |
|---|---|---|
swatchesrequired | array of PortalSwatch | |
swatches[].accentrequired | SolvedAccent | SolvedAccent is one practice colour solved for both themes. |
swatches[].accent.darkrequired | ThemeAccent | ThemeAccent is every accent token for one theme. |
swatches[].accent.dark.accentrequired | string | |
swatches[].accent.dark.inkrequired | string | |
swatches[].accent.dark.onAccentrequired | string | |
swatches[].accent.dark.uirequired | string | |
swatches[].accent.lightrequired | ThemeAccent | ThemeAccent is every accent token for one theme. |
swatches[].accent.light.accentrequired | string | |
swatches[].accent.light.inkrequired | string | |
swatches[].accent.light.onAccentrequired | string | |
swatches[].accent.light.uirequired | string | |
swatches[].hexrequired | string |
Request samples
Section titled “Request samples”# Sign in first. outpost_console is a session cookie, so send it with every request.curl -X POST 'https://depot.example.com/api/v1/portal/branding/suggest' \ -H 'X-CSRF-Token: <csrf-token>' \ -H 'Accept: application/json' \ -b 'outpost_console=<console-session>'# Sign in first. outpost_console is a session cookie, so send it with every request.
$headers = @{ 'X-CSRF-Token' = '<csrf-token>' 'Accept' = 'application/json' 'Cookie' = 'outpost_console=<console-session>'}
$response = Invoke-RestMethod ` -Method Post ` -Uri 'https://depot.example.com/api/v1/portal/branding/suggest' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# Sign in first. outpost_console is a session cookie, so send it with every request.
import requests
url = "https://depot.example.com/api/v1/portal/branding/suggest"headers = { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json",}cookies = { "outpost_console": "<console-session>",}
response = requests.post(url, headers=headers, cookies=cookies, timeout=30)response.raise_for_status()print(response.json())// Sign in first. outpost_console is a session cookie, so send it with every request.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodPost, "https://depot.example.com/api/v1/portal/branding/suggest", nil) if err != nil { log.Fatal(err) }
req.Header.Set("X-CSRF-Token", "<csrf-token>") req.Header.Set("Accept", "application/json") req.AddCookie(&http.Cookie{Name: "outpost_console", Value: "<console-session>"})
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// Sign in first. outpost_console is a session cookie, so send it with every request.// The session cookie is set by signing in. A script cannot set it itself.
const url = "https://depot.example.com/api/v1/portal/branding/suggest";
const response = await fetch(url, { method: "POST", headers: { "X-CSRF-Token": "<csrf-token>", "Accept": "application/json", }, credentials: "include",});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// Sign in first. outpost_console is a session cookie, so send it with every request.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Post, "https://depot.example.com/api/v1/portal/branding/suggest");request.Headers.TryAddWithoutValidation("X-CSRF-Token", "<csrf-token>");request.Headers.TryAddWithoutValidation("Accept", "application/json");request.Headers.TryAddWithoutValidation("Cookie", "outpost_console=<console-session>");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /portal/favicon.ico
Section titled “GET /portal/favicon.ico”GETNo permission neededportal facemspIdempotentNot 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]
portalFavicon is the tab icon: the uploaded favicon, else one made from the logo, in an .ico container.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
client | query | string | No | |
org | query | string | No | |
v | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | None | Success. The body shape was not resolved; see x-outpost-unresolved. |
304 | None | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
500 | application/problem+json, ProblemDetails | The request failed. |
Request samples
Section titled “Request samples”# 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/portal/favicon.ico?client=<client>&org=<org>&v=<v>' \ -H 'Accept: application/json'# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'Accept' = 'application/json'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/portal/favicon.ico?client=<client>&org=<org>&v=<v>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/portal/favicon.ico"params = { "client": "<client>", "org": "<org>", "v": "<v>",}headers = { "Accept": "application/json",}
response = requests.get(url, params=params, headers=headers, timeout=30)response.raise_for_status()print(response.json())// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/portal/favicon.ico?client=<client>&org=<org>&v=<v>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
const url = new URL("https://depot.example.com/portal/favicon.ico");url.searchParams.set("client", "<client>");url.searchParams.set("org", "<org>");url.searchParams.set("v", "<v>");
const response = await fetch(url, { method: "GET", headers: { "Accept": "application/json", },});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/portal/favicon.ico?client=<client>&org=<org>&v=<v>");request.Headers.TryAddWithoutValidation("Accept", "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /portal/icon-192.png
Section titled “GET /portal/icon-192.png”GETNo permission neededportal facemspIdempotentNot 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]
portalIcon is the PWA icon at one size, made from the light logo.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
client | query | string | No | |
org | query | string | No | |
v | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | None | Success. The body shape was not resolved; see x-outpost-unresolved. |
304 | None | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
500 | application/problem+json, ProblemDetails | The request failed. |
Request samples
Section titled “Request samples”# 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/portal/icon-192.png?client=<client>&org=<org>&v=<v>' \ -H 'Accept: application/json'# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'Accept' = 'application/json'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/portal/icon-192.png?client=<client>&org=<org>&v=<v>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/portal/icon-192.png"params = { "client": "<client>", "org": "<org>", "v": "<v>",}headers = { "Accept": "application/json",}
response = requests.get(url, params=params, headers=headers, timeout=30)response.raise_for_status()print(response.json())// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/portal/icon-192.png?client=<client>&org=<org>&v=<v>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
const url = new URL("https://depot.example.com/portal/icon-192.png");url.searchParams.set("client", "<client>");url.searchParams.set("org", "<org>");url.searchParams.set("v", "<v>");
const response = await fetch(url, { method: "GET", headers: { "Accept": "application/json", },});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/portal/icon-192.png?client=<client>&org=<org>&v=<v>");request.Headers.TryAddWithoutValidation("Accept", "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /portal/icon-512.png
Section titled “GET /portal/icon-512.png”GETNo permission neededportal facemspIdempotentNot 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]
portalIcon is the PWA icon at one size, made from the light logo.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
client | query | string | No | |
org | query | string | No | |
v | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | None | Success. The body shape was not resolved; see x-outpost-unresolved. |
304 | None | Success. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
500 | application/problem+json, ProblemDetails | The request failed. |
Request samples
Section titled “Request samples”# 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/portal/icon-512.png?client=<client>&org=<org>&v=<v>' \ -H 'Accept: application/json'# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'Accept' = 'application/json'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/portal/icon-512.png?client=<client>&org=<org>&v=<v>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/portal/icon-512.png"params = { "client": "<client>", "org": "<org>", "v": "<v>",}headers = { "Accept": "application/json",}
response = requests.get(url, params=params, headers=headers, timeout=30)response.raise_for_status()print(response.json())// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/portal/icon-512.png?client=<client>&org=<org>&v=<v>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
const url = new URL("https://depot.example.com/portal/icon-512.png");url.searchParams.set("client", "<client>");url.searchParams.set("org", "<org>");url.searchParams.set("v", "<v>");
const response = await fetch(url, { method: "GET", headers: { "Accept": "application/json", },});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/portal/icon-512.png?client=<client>&org=<org>&v=<v>");request.Headers.TryAddWithoutValidation("Accept", "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());GET /portal/manifest.webmanifest
Section titled “GET /portal/manifest.webmanifest”GETNo permission neededportal facemspIdempotentNot 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]
portalManifest is the PWA web app manifest, branded for the host’s client (or ?client=) and scoped to /portal/.
Parameters
Section titled “Parameters”| Name | In | Type | Required | Description |
|---|---|---|---|---|
client | query | string | No | |
org | query | string | No |
Responses
Section titled “Responses”| Status | Body | Description |
|---|---|---|
200 | None | Success. The body shape was not resolved; see x-outpost-unresolved. |
400 | application/problem+json, ProblemDetails | One or more validation errors occurred. |
500 | application/problem+json, ProblemDetails | The request failed. |
Request samples
Section titled “Request samples”# 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/portal/manifest.webmanifest?client=<client>&org=<org>' \ -H 'Accept: application/json'# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
$headers = @{ 'Accept' = 'application/json'}
$response = Invoke-RestMethod ` -Method Get ` -Uri 'https://depot.example.com/portal/manifest.webmanifest?client=<client>&org=<org>' ` -Headers $headers
$response | ConvertTo-Json -Depth 10# This operation is public. It takes no credentials.# This operation is idempotent. Repeating it does not repeat its effect.
import requests
url = "https://depot.example.com/portal/manifest.webmanifest"params = { "client": "<client>", "org": "<org>",}headers = { "Accept": "application/json",}
response = requests.get(url, params=params, headers=headers, timeout=30)response.raise_for_status()print(response.json())// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.package main
import ( "fmt" "io" "log" "net/http")
func main() { req, err := http.NewRequest(http.MethodGet, "https://depot.example.com/portal/manifest.webmanifest?client=<client>&org=<org>", nil) if err != nil { log.Fatal(err) }
req.Header.Set("Accept", "application/json")
resp, err := http.DefaultClient.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()
out, err := io.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(resp.Status, string(out))}// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
const url = new URL("https://depot.example.com/portal/manifest.webmanifest");url.searchParams.set("client", "<client>");url.searchParams.set("org", "<org>");
const response = await fetch(url, { method: "GET", headers: { "Accept": "application/json", },});
if (!response.ok) { throw new Error(`Request failed with status ${response.status}`);}
const data = await response.json();console.log(data);// This operation is public. It takes no credentials.// This operation is idempotent. Repeating it does not repeat its effect.
using System;using System.Net.Http;
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, "https://depot.example.com/portal/manifest.webmanifest?client=<client>&org=<org>");request.Headers.TryAddWithoutValidation("Accept", "application/json");
var response = await client.SendAsync(request);response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());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.