AddBrand¶
An optional symbol_set_ids array assigns the initial symbol catalogue. If it
is omitted or empty, the new brand starts with no available symbols. When the
Main Server has negotiated license brand policy version 1, a positive license
allowance also limits new brand creation. A created brand remains pending API
admission until the next authenticated license snapshot.
{"command":"AddBrand","data":{"brand":"demo","dark_logo":"dark.svg","light_logo":"light.svg","favicon":"favicon.ico","terminal_host":"demo.example.com","affiliate_host":"affiliate.example.com","enable":1,"symbol_set_ids":[2,3]}}
Only SuperAdmin can create brands and assign global SymbolSets.
Description: Creates a brand configuration.
Access Control¶
SESSION_ADMINwithsuper_admin = 1. A brand admin cannot create brands.
HTTP Route¶
POST /brand
Request Parameters¶
| Name | Type | Required | Description |
|---|---|---|---|
| brand | string | Yes | Brand name |
| dark_logo | string | Yes | Dark logo path or URL |
| light_logo | string | Yes | Light logo path or URL |
| favicon | string | Yes | Favicon path or URL |
| terminal_host | string | Legacy: Yes; policy v1: No | Legacy mode requires 1–128 characters. Under negotiated policy v1 it may be omitted or empty, with a maximum of 128 characters; an omitted host defaults to empty. |
| affiliate_host | string | Legacy: Yes; policy v1: No | Legacy mode requires 1–128 characters. Under negotiated policy v1 it may be omitted or empty, with a maximum of 128 characters; an omitted host defaults to empty. A configured Affiliate Cabinet hostname has no scheme, port, or path and is served from its root. |
| enable | int | Yes | Enable flag, 0 or 1 |
| can_open_demo | int | No | Allows customer self-service DEMO account opening when set to 1 |
| can_open_real | int | No | Allows customer self-service REAL account opening when set to 1 |
| kyc_required_for_real | int | No | Requires approved customer KYC before REAL account opening when set to 1 |
| authorize_after_registration | int | No | Returns a customer JWT after successful public registration when set to 1; defaults to 0 |
| default_language | string | No | Default terminal language; defaults to en |
| settings | object | No | Additional brand settings object |
Request Example¶
{
"brand": "IonMarkets",
"dark_logo": "/images/ion-dark.svg",
"light_logo": "/images/ion-light.svg",
"favicon": "/images/favicon.ico",
"terminal_host": "terminal.ionmarkets.com",
"affiliate_host": "affiliate.ionmarkets.com",
"enable": 1,
"can_open_demo": 1,
"can_open_real": 0,
"kyc_required_for_real": 1,
"authorize_after_registration": 1,
"default_language": "de",
"settings": {
"primary_color": "#111111"
}
}
Default terminal language¶
default_language defines the language used when a visitor opens a
terminal URL without a language prefix. It must contain one of the supported
two-letter codes:
en, ru, de, es, fr, pt, zh, cn, tr, hu, ja, pl, ko,
vi, jp, id, th, fa, ms, it, cs, ro, ar.
The server normalizes the value to lowercase. A missing or unsupported value
falls back to en.
For a brand with default_language: "de", /sign/in redirects to
/de/sign/in. A URL that already starts with a supported language, such as
/en/sign/in, is served without a redirect. Query parameters are preserved.
Response Example¶
{
"data": "OK"
}
Error Examples¶
{
"error": "INVALID_DATA",
"message": "enable must be between 0 and 1"
}
{
"error": "BRAND_ADD_ERROR",
"message": "..."
}
When a negotiated policy-v1 license has a positive allowance and the limit is
full, AddBrand rejects the new brand with HTTP/TCP status 403:
{
"error": "BRAND_LIMIT_REACHED",
"message": "The license brand allowance has been reached"
}
The server counts existing non-deleted local brands toward the allowance,
including disabled brands. An allowance of 0 is unlimited under policy v1.
Lowering the limit does not remove or disable already admitted brands; it blocks
creation of additional brands until usage falls below the limit. Legacy license
behavior remains unchanged when policy v1 has not been negotiated.