Branding & launcher
The organisation's colours, logo, sign-in page background and wording, and custom links added to everyone's app launcher.
| Method | Path | Summary |
|---|---|---|
| GET | /v1/admin/tenant/custom-links | List launcher links |
| POST | /v1/admin/tenant/custom-links | Add a launcher link |
| PATCH | /v1/admin/tenant/custom-links/:id | Change a launcher link |
| DELETE | /v1/admin/tenant/custom-links/:id | Remove a launcher link |
| GET | /v1/admin/tenant/branding | Get the tenant's branding settings |
| PUT | /v1/admin/tenant/branding | Set colours and sign-in wording |
| POST | /v1/admin/tenant/branding/logo | Upload the tenant's branding logo |
| POST | /v1/admin/tenant/branding/background | Upload the tenant's branding background image |
| DELETE | /v1/admin/tenant/branding/logo | Remove the tenant's branding logo |
| DELETE | /v1/admin/tenant/branding/background | Remove the tenant's branding background image |
| GET | /v1/admin/tenant/branding/image/:id | Serve a tenant branding image (logo or background) |
#List launcher links
/v1/admin/tenant/custom-links- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean | |
links | array of object | |
links[].id | integer | |
links[].tenant_id | integer | |
links[].name | string | |
links[].url | string | |
links[].icon_url | string, or null | |
links[].position | integer | |
links[].is_active | boolean | |
links[].created_by | integer | |
links[].created_at | string (date-time) | |
links[].updated_at | string (date-time) |
Example response
{
"success": true,
"links": [
{
"id": 42,
"tenant_id": 1,
"name": "Example name",
"url": "https://example.com/…",
"icon_url": "https://example.com/…",
"position": 1,
"is_active": true,
"created_by": 1,
"created_at": "2026-11-12T09:30:00.000Z",
"updated_at": "2026-11-12T09:30:00.000Z"
}
]
}Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links' -Headers $headers#Add a launcher link
/v1/admin/tenant/custom-links- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Request body JSON
| Name | Type | Description |
|---|---|---|
namerequired | string | The label people see. |
urlrequired | string | Where it goes (http or https). |
icon_url | string | An image for its icon. |
Response 201
| Field | Type | Description |
|---|---|---|
success | boolean | |
link | any |
Example response
{
"success": true,
"link": null
}Errors
| Status | Message |
|---|---|
| 400 | name is required |
| 400 | url must be a valid http(s) URL |
| 400 | icon_url must be a valid http(s) URL |
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…"}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…"}),
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…"},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…"}'
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links' -Headers $headers -ContentType 'application/json' -Body $body#Change a launcher link
/v1/admin/tenant/custom-links/:id- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Request body JSON
| Name | Type | Description |
|---|---|---|
namerequired | string | |
url | string | |
icon_url | string | |
is_active | boolean | Show or hide it. |
position | integer | Its place in the list. |
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean |
Example response
{
"success": true
}Errors
| Status | Message |
|---|---|
| 400 | name cannot be empty |
| 400 | url must be a valid http(s) URL |
| 400 | icon_url must be a valid http(s) URL |
| 404 | Link not found |
Example request
curl -X PATCH 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…","is_active":true,"position":1}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42', {
method: 'PATCH',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…","is_active":true,"position":1}),
});
const data = await res.json();import os, requests
r = requests.patch(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…","is_active":True,"position":1},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"name":"Example name","url":"https://example.com/…","icon_url":"https://example.com/…","is_active":true,"position":1}'
Invoke-RestMethod -Method PATCH -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42' -Headers $headers -ContentType 'application/json' -Body $body#Remove a launcher link
/v1/admin/tenant/custom-links/:id- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/:id- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean |
Example response
{
"success": true
}Errors
| Status | Message |
|---|---|
| 404 | Link not found |
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/custom-links/42' -Headers $headers#Get the tenant's branding settings
/v1/admin/tenant/brandingGet the tenant's branding settings. Requires the GLOBAL_ADMIN role. Returns colors, login headline/subtext, and logo/background image URLs (or all-null defaults if no branding row exists yet).
- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean | |
branding | object | |
branding.primaryColor | any | |
branding.accentColor | any | |
branding.loginHeadline | any | |
branding.loginSubtext | string | |
branding.logoUrl | string, or null | |
branding.backgroundUrl | string, or null |
Example response
{
"success": true,
"branding": {
"primaryColor": null,
"accentColor": null,
"loginHeadline": null,
"loginSubtext": "string",
"logoUrl": "https://example.com/…",
"backgroundUrl": "https://example.com/…"
}
}Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding' -Headers $headers#Set colours and sign-in wording
/v1/admin/tenant/brandingSet the tenant's branding colors and login wording. Requires the GLOBAL_ADMIN role. Colors must be 6-digit hex (e.g. #1f9d57). login_headline max 255 chars, login_subtext max 500 chars. Upserts the tenant_branding row.
- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Request body JSON
| Name | Type | Description |
|---|---|---|
primary_color | any | Hex colour, e.g. #1f9d57. |
accent_color | any | Hex colour. |
login_headline | string | Sign-in page headline, up to 255 characters. |
login_subtext | string | Sign-in page text, up to 500 characters. |
Response 200
| Field | Type | Description |
|---|---|---|
success | boolean |
Example response
{
"success": true
}Errors
| Status | Message |
|---|---|
| 400 | … must be a hex color like #1f9d57 |
| 400 | login_headline is too long (max 255 characters) |
| 400 | login_subtext is too long (max 500 characters) |
Example request
curl -X PUT 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding' \
-H "X-API-Key: $BRAMBLE_KEY" \
-H "Content-Type: application/json" \
-d '{"primary_color":"…","accent_color":"…","login_headline":"string","login_subtext":"string"}'const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding', {
method: 'PUT',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"primary_color":"…","accent_color":"…","login_headline":"string","login_subtext":"string"}),
});
const data = await res.json();import os, requests
r = requests.put(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
json={"primary_color":"…","accent_color":"…","login_headline":"string","login_subtext":"string"},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
$body = '{"primary_color":"…","accent_color":"…","login_headline":"string","login_subtext":"string"}'
Invoke-RestMethod -Method PUT -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding' -Headers $headers -ContentType 'application/json' -Body $body#Upload the tenant's branding logo
/v1/admin/tenant/branding/logoUpload the tenant's branding logo. Requires the GLOBAL_ADMIN role. Multipart upload, field name "image", 4 MB max, image mimetypes only. Replaces and deletes any existing logo BLOB in the same transaction.
- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo' -Headers $headers#Upload the tenant's branding background image
/v1/admin/tenant/branding/backgroundUpload the tenant's branding background image. Requires the GLOBAL_ADMIN role. Multipart upload, field name "image", 4 MB max, image mimetypes only. Replaces and deletes any existing background BLOB in the same transaction.
- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Example request
curl -X POST 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background', {
method: 'POST',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.post(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method POST -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background' -Headers $headers#Remove the tenant's branding logo
/v1/admin/tenant/branding/logoRemove the tenant's branding logo. Requires the GLOBAL_ADMIN role. Deletes the stored BLOB and clears logo_image_id.
- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/logo' -Headers $headers#Remove the tenant's branding background image
/v1/admin/tenant/branding/backgroundRemove the tenant's branding background image. Requires the GLOBAL_ADMIN role. Deletes the stored BLOB and clears background_image_id.
- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background- Requires
- Signed-in session,
X-API-Key, or a Bramble app access token (Authorization: Bearer).
Role:GLOBAL_ADMIN.
Example request
curl -X DELETE 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background', {
method: 'DELETE',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.delete(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method DELETE -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/background' -Headers $headers#Serve a tenant branding image (logo or background)
/v1/admin/tenant/branding/image/:idServe a tenant branding image (logo or background). Public, no authentication — embedded on the pre-login tenant login page and inside the admin panel. Not scoped by the caller's tenant since there isn't one pre-login; the image id itself is the only key.
- Address
https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/image/:id- Requires
- None: public, or protected by a token in the address or body.
Path parameters
| Name | Type | Description |
|---|---|---|
idrequired | integer |
Response
A body.
Example request
curl -X GET 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/image/42' \
-H "X-API-Key: $BRAMBLE_KEY"const res = await fetch('https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/image/42', {
method: 'GET',
headers: { 'X-API-Key': process.env.BRAMBLE_KEY },
});
const data = await res.json();import os, requests
r = requests.get(
"https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/image/42",
headers={"X-API-Key": os.environ["BRAMBLE_KEY"]},
)
r.raise_for_status()
data = r.json()$headers = @{ 'X-API-Key' = $env:BRAMBLE_KEY }
Invoke-RestMethod -Method GET -Uri 'https://<your-org>.brambleit.cloud/api/v1/admin/tenant/branding/image/42' -Headers $headersWas this page helpful?
Thanks for your feedback.