Theme Options - Save (options + logo)
Overview
Create or update the latest RsUserThemeSetting for an account, recording the authenticated user as its author. You supply the theme as a theme_options JSON string. When a logo_image file is also sent, it is stored to S3 and written onto the account's RsWhiteLabel logo. This route differs from /account/white-label/theme/save: it does not take a user_id and always uses the authenticated user.
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 only when you attach logo_image, because a file cannot travel in a JSON body.
Prerequisites
- A bearer token in the
Authorizationheader.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://development-api.shoutaboutus.com |
Endpoint
POST /api/v1/theme-options/save
Authentication
-
Requires a bearer token in the
Authorization: Bearer <bearer-token>header. -
Who can call it: account-level tokens.
-
The target
company_idmust sit inside your own account tree. -
A partner token can target any account beneath it. An account user is limited to its own part of the tree.
-
A
company_idoutside your hierarchy is rejected with422.
Rate limit
- No rate limit.
Request body
| Field | Type | Required | Description |
|---|---|---|---|
company_id | integer | Required | Must be an existing account inside your own account tree. |
theme_options | string | Required | JSON-encoded theme settings, stored verbatim. |
logo_image | file (image) | Optional | JPEG/PNG, max 400 KB. |
How it works
200with{ status, message, data, white_label }:datais the savedRsUserThemeSettingrow;white_labelcarriescompany_idand S3-resolvedlogo/login_logo/mobile_logo/favicon(null when unset).422ifcompany_idis missing/invalid/out of hierarchy,theme_optionsis missing, orlogo_imageis too large / wrong type.
Response
200 OK · 200
200{
"data": {
"status": "success",
"message": "Theme options saved successfully.",
"data": {
"company_id": "6",
"user_id": 3,
"theme_options": "{\"mode\":\"system\",\"skin\":\"default\",\"primaryColor\":\"#f1874c\"}",
"updated_at": "2026-06-16T10:50:03.000000Z",
"created_at": "2026-06-16T10:50:03.000000Z",
"id": 2
},
"white_label": {
"company_id": "6",
"logo": null,
"login_logo": null,
"mobile_logo": null,
"favicon": null
}
}
}422 Validation error · 422
422{
"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."
]
}
}Errors
| Status | Meaning |
|---|---|
401 | The bearer token is missing, expired or invalid |
422 | Validation error |
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=123' \
--form 'theme_options={"mode":"system","skin":"default","primaryColor":"#f1874c"}' \
--form 'logo_image=@logo_image.png'Updated 11 days ago
