Set colours and theme
Overview
Set the colours and theme options used across the branded experience.
Use this to match your brand. A second endpoint, Set colours and theme (options + logo), does the same with slightly different inputs; use whichever fits.
You'll need the theme values.
The theme is saved and applied. The response has the saved theme plus the account's white-label record, with every image field as a full URL (or null where unset). Uploading a logo also creates the account's white-label record if it doesn't exist yet, which is why white_label can come back with most fields missing on a first upload.
Prerequisites
- A bearer token. See Authentication.
- The
company_idof the account you're theming, inside your own account tree. - Your user id (
user_id). - To upload a logo: a JPEG or PNG no larger than 400 KB.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/account/white-label/theme/save
Authentication
Partner or Account token
company_idmust be inside your own account tree. A Partner token can theme any account under the partner; an Account token only its own account.user_idis recorded as who saved the theme; send your own user id.- An account outside your tree, or one that doesn't exist, is rejected with
422.
Rate limit
This endpoint has no rate limit.
Request parameters
None.
Request body
Choose the content type to match what you are sending:
| You are sending | Content type |
|---|---|
| Theme options only | application/json |
| Theme options and a logo file | multipart/form-data |
Both accept the same fields. Use multipart/form-data whenever you attach logo_image, because a file can't travel in a JSON body. Send each field as its own form part and let curl set the boundary; don't set Content-Type yourself.
| Field | Type | Required | Description |
|---|---|---|---|
user_id | integer | Yes | Your user id, recorded as who saved the theme. Must be an existing user. |
company_id | integer | Yes | The account to theme. Must exist and be inside your account tree. |
theme_options | string | Yes | The theme settings as a JSON-encoded string, e.g. {"mode":"system","primaryColor":"#f1874c"}. Saved as sent and returned unchanged. Note this is a string, not a nested object. |
logo_image | file | No | JPEG or PNG, at most 400 KB. Replaces the account's white-label logo. |
Request payload
JSON, theme options only:
{
"user_id": 3011,
"company_id": 5994,
"theme_options": "{\"mode\":\"system\",\"primaryColor\":\"#f1874c\"}"
}With a logo, send the same fields as form parts, plus logo_image (see Example request).
Response body
The payload is inside data.
| Field | Type | Description |
|---|---|---|
status | string | success. |
message | string | Theme options saved successfully. |
data | object | The saved theme. |
data.id | integer | The theme setting's id. |
data.user_id | integer or null | The user who last saved the theme. |
data.company_id | integer | The account. |
data.theme_options | string | The theme settings, as saved (a JSON-encoded string). |
data.created_at | string | When the theme was first saved (ISO 8601). |
data.updated_at | string | When the theme was last saved (ISO 8601). |
white_label | object | The account's white-label record (all of its fields when it exists, see Get branding), with image fields as full URLs. |
white_label.company_id | integer | The account. |
white_label.logo | string or null | URL of the main logo, or null. |
white_label.login_logo | string or null | URL of the login-page logo, or null. |
white_label.mobile_logo | string or null | URL of the mobile logo, or null. |
white_label.favicon | string or null | URL of the favicon, or null. |
Response payload
{
"data": {
"status": "success",
"message": "Theme options saved successfully.",
"data": {
"company_id": 5994,
"user_id": 3011,
"theme_options": "{\"mode\":\"system\",\"primaryColor\":\"#f1874c\"}",
"updated_at": "2026-09-28T14:54:45.000000Z",
"created_at": "2026-09-28T14:54:45.000000Z",
"id": 5
},
"white_label": {
"company_id": 5994,
"logo": "https://d2ny6zb7otrnhl.cloudfront.net/white-label/logo/evjRaIHr6bWR4gsfk2vAaLUI49XMAcKB6lEFCIZA.png",
"id": 8,
"login_logo": null,
"mobile_logo": null,
"favicon": null
}
}
}Examples
Success payload
See Response payload.
Error payload
422 Required fields missing
{
"message": "The user id field is required. (and 2 more errors)",
"errors": {
"user_id": [
"The user id field is required."
],
"company_id": [
"The company id field is required."
],
"theme_options": [
"The theme options field is required."
]
}
}422 Account outside your tree
{
"message": "The selected company id does not belong to your company hierarchy.",
"errors": {
"company_id": [
"The selected company id does not belong to your company hierarchy."
]
}
}422 Logo too large
{
"message": "The logo image field must not be greater than 400 kilobytes.",
"errors": {
"logo_image": [
"The logo image field must not be greater than 400 kilobytes."
]
}
}| Status | Meaning |
|---|---|
200 | The theme was saved. |
401 | The token is missing, expired or invalid. |
422 | A required field is missing, user_id or company_id doesn't exist, company_id is outside your tree, or the logo is too large or the wrong type. |
500 | Unexpected server error. |
Example request
curl --request POST \
--url "https://production-api.shoutaboutus.com/api/v1/account/white-label/theme/save" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--form 'user_id=3011' \
--form 'company_id=5994' \
--form 'theme_options={"mode":"system","primaryColor":"#f1874c"}' \
--form 'logo_image=@logo_image.png'Updated 17 days ago
