Set colours and theme (options + logo)
Overview
Set the colours, theme options, and logo in one call.
Use this as an alternative to Set colours and theme when you also want to upload a logo.
You'll need the theme values and optionally a logo.
The theme is saved and applied. The saving user is taken from the token, so there's no user_id field. The response has the saved theme and the account's white-label branding, with image fields as full URLs (null when unset).
Prerequisites
- A bearer token. See Authentication.
- The
company_idof the account you're theming, inside your own account tree. - 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/theme-options/save
Authentication
Partner or Account token
- The target
company_idmust be inside your own account tree. - A Partner token can target any account under the partner; an Account token only its own account.
- A
company_idoutside your tree is rejected with422.
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 |
|---|---|---|---|
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, saved as sent. |
logo_image | file (image) | No | JPEG or PNG, at most 400 KB. Replaces the account's white-label logo. |
Request payload
JSON, theme options only:
{
"company_id": 5994,
"theme_options": "{\"mode\":\"light\",\"primaryColor\":\"#f26b21\"}"
}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.deleted_at | string or null | null. |
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 branding: id, company_id, domain_name, white_url, title and status when white label is set up, and the image 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": {
"id": 5,
"user_id": 3011,
"company_id": 5994,
"theme_options": "{\"mode\":\"light\",\"primaryColor\":\"#f26b21\"}",
"deleted_at": null,
"created_at": "2026-09-28T14:54:45.000000Z",
"updated_at": "2026-09-28T14:54:46.000000Z"
},
"white_label": {
"company_id": 5994,
"logo": null,
"login_logo": null,
"mobile_logo": null,
"favicon": null
}
}
}Examples
Success payload
See Response payload.
Error payload
422 Required fields missing
{
"message": "The company id field is required. (and 1 more error)",
"errors": {
"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 Account doesn't exist
{
"message": "The selected company id is invalid. (and 1 more error)",
"errors": {
"company_id": [
"The selected company id is invalid.",
"The selected company id does not belong to your company hierarchy."
]
}
}| Status | Meaning |
|---|---|
200 | The theme was saved. |
401 | The token is missing, expired or invalid. |
422 | company_id or theme_options is missing, company_id doesn't exist or 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/theme-options/save" \
--header 'Authorization: Bearer <bearer-token>' \
--header 'Accept: application/json' \
--form 'company_id=5994' \
--form 'theme_options={"mode":"system","primaryColor":"#f1874c"}' \
--form 'logo_image=@logo_image.png'Updated 17 days ago
