Skip to content

Create a brand

POST
/api/brands

Creates a brand. The call is safe to retry: when a brand with the same slug and name exists, it is returned with 200. Create workspaces under the brand with POST /api/workspaces. Requires the brands:write scope and an API key without a brand or workspace restriction.

object
name
required

Brand name, as customers know it.

string
>= 1 characters
Example
Example Company
slug
required

Short identifier of lowercase letters, digits and hyphens, unique within the account. Fixed once the brand is created; the first brand of a new account, born with the placeholder slug new-account, takes a slug derived from its name on its first rename.

string
>= 1 characters <= 100 characters /^[a-z0-9-]+$/
Example
example-company
emailFromName
required

Sender name on email sent for this brand.

string
>= 1 characters
Example
Example Company
status

An inactive brand is paused. Defaults to ‘active’.

string
Allowed values: active inactive
logoUrl

Https URL of the brand logo, shown at the top of emails. Upload a file with POST /api/brands/{brandId}/logo instead.

string format: uri
primaryColor

Primary brand colour.

string
<= 20 characters
secondaryColor

Secondary brand colour.

string
<= 20 characters
personaInstructions

The assistant’s personality for this brand.

string
brandInstructions

Instructions the assistant follows in every conversation of this brand.

string
aiSenderName

Name the assistant signs with.

string
<= 255 characters
aiSenderTitle

Title the assistant signs with.

string
<= 255 characters
supportedLanguages

Language codes this brand operates in. Workspaces of the brand choose their operating language from this set.

Array<string>
primaryLanguage

Default language; one of supportedLanguages.

string | null

A brand with this slug and name exists; it is returned.

A brand: how customers know the business. Workspaces sit under a brand.

object
id
required
string format: uuid
tenantId
required

The account the brand belongs to.

string format: uuid
name
required
string
Example
Example Company
slug
required
string
Example
example-company
status
required
string
Allowed values: active inactive
logoUrl
string | null
primaryColor
string | null
secondaryColor
string | null
emailFromName
required
string
Example
Example Company
personaInstructions
string | null
brandInstructions
string | null
aiSenderName
string | null
aiSenderTitle
string | null
aiSenderImageUrl
string | null
supportedLanguages
required
Array<string>
primaryLanguage
string | null
personaVoice

The assistant’s voice per language on voice channels.

object
createdAt
required
string format: date-time
updatedAt
required
string format: date-time

The brand was created.

A brand: how customers know the business. Workspaces sit under a brand.

object
id
required
string format: uuid
tenantId
required

The account the brand belongs to.

string format: uuid
name
required
string
Example
Example Company
slug
required
string
Example
example-company
status
required
string
Allowed values: active inactive
logoUrl
string | null
primaryColor
string | null
secondaryColor
string | null
emailFromName
required
string
Example
Example Company
personaInstructions
string | null
brandInstructions
string | null
aiSenderName
string | null
aiSenderTitle
string | null
aiSenderImageUrl
string | null
supportedLanguages
required
Array<string>
primaryLanguage
string | null
personaVoice

The assistant’s voice per language on voice channels.

object
createdAt
required
string format: date-time
updatedAt
required
string format: date-time

The caller may not change brands. People need the owner or admin role. An API key needs the brands:write scope; a key restricted to a brand or workspace receives code: "key_lock" for an action its restriction does not cover.

Standard error response returned by all endpoints on failure.

object
error
required

A human-readable error message describing what went wrong.

string
Example
Conversation not found
code

A machine-readable reason on some refusals, for example ‘key_lock’ when an API key’s brand or workspace restriction does not cover the action.

string
Example
key_lock
missing_scopes

On a 403 for an API key without a scope the endpoint requires: the scopes the key lacks.

Array<string>
Example
[
"mcp:write"
]
entryId

On a 409 with code duplicate_question or duplicate_rule_text: the knowledge base entry or policy that already holds the question or rule text.

string format: uuid
Example
11223344-5566-4788-99aa-bbccddeeff00
connectionId

On a 422 about one MCP connection a request names, from an assignment or an agent create or update (a connection that does not exist, one listed twice, or one that does not declare a tool named): the connection, as the request named it.

string
undeclaredTools

On the same 422: the tool names the connection does not declare.

Array<string>
Example
[
"get_orders"
]
declaredTools

On the same 422: the tools the connection declares.

Array<string>
Example
[
"get_order",
"search_orders"
]

A different brand in the account holds this slug. The body names it.

The slug belongs to a different brand in the account.

object
error
required
string
Example
A brand with this slug already exists
brandId

The brand that holds the slug.

string | null format: uuid

Validation error. One or more fields are missing or invalid; logoUrl must use https.

Standard error response returned by all endpoints on failure.

object
error
required

A human-readable error message describing what went wrong.

string
Example
Conversation not found
code

A machine-readable reason on some refusals, for example ‘key_lock’ when an API key’s brand or workspace restriction does not cover the action.

string
Example
key_lock
missing_scopes

On a 403 for an API key without a scope the endpoint requires: the scopes the key lacks.

Array<string>
Example
[
"mcp:write"
]
entryId

On a 409 with code duplicate_question or duplicate_rule_text: the knowledge base entry or policy that already holds the question or rule text.

string format: uuid
Example
11223344-5566-4788-99aa-bbccddeeff00
connectionId

On a 422 about one MCP connection a request names, from an assignment or an agent create or update (a connection that does not exist, one listed twice, or one that does not declare a tool named): the connection, as the request named it.

string
undeclaredTools

On the same 422: the tool names the connection does not declare.

Array<string>
Example
[
"get_orders"
]
declaredTools

On the same 422: the tools the connection declares.

Array<string>
Example
[
"get_order",
"search_orders"
]

A new voice in personaVoice could not be checked because the voice list could not be read. Nothing was written; retry the request.

Standard error response returned by all endpoints on failure.

object
error
required

A human-readable error message describing what went wrong.

string
Example
Conversation not found
code

A machine-readable reason on some refusals, for example ‘key_lock’ when an API key’s brand or workspace restriction does not cover the action.

string
Example
key_lock
missing_scopes

On a 403 for an API key without a scope the endpoint requires: the scopes the key lacks.

Array<string>
Example
[
"mcp:write"
]
entryId

On a 409 with code duplicate_question or duplicate_rule_text: the knowledge base entry or policy that already holds the question or rule text.

string format: uuid
Example
11223344-5566-4788-99aa-bbccddeeff00
connectionId

On a 422 about one MCP connection a request names, from an assignment or an agent create or update (a connection that does not exist, one listed twice, or one that does not declare a tool named): the connection, as the request named it.

string
undeclaredTools

On the same 422: the tool names the connection does not declare.

Array<string>
Example
[
"get_orders"
]
declaredTools

On the same 422: the tools the connection declares.

Array<string>
Example
[
"get_order",
"search_orders"
]