Skip to content

staff.groups ​

21 methods on staff.groups. Each returns the answer's data and throws NoviqaError on a failed answer.

list ​

GET/admin/v1/groups

List groups

Every group in the caller's group scope, ordered by path (case-insensitive). Not paged.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
searchstring · query
Only groups whose path or description contains this, case-insensitive.
Returns
Promise<Group[]>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.list({
  search: "string"
})
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups?search=string" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": [
    {
      "allow_multiple_trader_sessions": true,
      "auth_type": "plain",
      "clear_accumulated_eod": true,
      "close_fifo": true,
      "company": "HS Markets Ltd",
      "company_email": "string",
      "company_website": "string",
      "compensate_credit": true,
      "connections_enabled": true,
      "created_at": "2026-09-25T10:15:00Z",
      "currency": "USD",
      "currency_digits": 1
    }
  ],
  "request_id": "5b7f2c1e"
}
ts
staff.groups.list(query?: { search? }, options?: RequestOptions): Promise<models.Group[]>

create ​

POST/admin/v1/groups

Create a group

Adds a group. Required: path (1-8 sections joined by , each 1-64 letters, digits, spaces or . _ & # - without leading or trailing spaces, at most 255 characters); it must be inside the caller's group scope, else forbidden. Every other field left out takes a safe default: currency USD with 2 digits, connections on, one-time codes off, password min length 8, hedging, margin call 50% and stop out 30%, leverage 1:100, swaps, trailing stops, expert advisors and order expiration on, daily and monthly reports, full news, mail and notifications on. company left out becomes the licence's main company; any other value must be a company the licence lists (the main company or an added white label), else invalid_input. A complete managers or administrators path segment makes a staff group (case-insensitive, either slash separator, any depth). Validation returns the first broken rule (e.g. stop out between 0 and the margin call level, leverage 1-10000, password min length 8-16, deposit/withdraw/support URLs http or https). A path already used answers conflict; an unknown leverage_profile_id invalid_input. The new group gets one group symbol row with mask *, so it can trade every symbol until its rows say otherwise. Answers the stored group (version 1). Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs every one of: config.groups.

Request body
allow_multiple_trader_sessionsboolean
Permit independent trader logins; staff sessions are always independent.
auth_typeAuthType
AuthType is how a terminal proves its identity to sign in. - plain: password only - certificate_1024: password plus a 1024-bit signed certificate - certificate_2048: password plus a 2048-bit signed certificate
plain certificate_1024 certificate_2048
clear_accumulated_eodboolean
release held-back daily profit at day end; does not forgive commission
close_fifoboolean
positions close oldest first
companystring
company_emailstring
company_websitestring
compensate_creditboolean
writing off a negative balance also writes off credit
connections_enabledboolean
created_atstring
UTC time, RFC 3339.
currencystring
deposit currency of every account
currency_digitsinteger
money rounding
daily_pl_clear_on_closeboolean
legacy alias for clear_accumulated_eod; releases held profit at day end
daily_pl_modeDailyPLMode
DailyPLMode says how profit and loss fixed during the day counts in free margin. - count_both: today's profit and losses both count - count_losses_only: today's profit is held back until the day ends
count_both count_losses_only
default_leverageinteger
initial leverage of new real accounts; each account keeps its own
demo_depositstring
first deposit of new demo accounts Exact decimal as a string. Never parse it into a binary float for money or prices.
demo_leverageinteger
new demo accounts; nil = default leverage
deposit_urlstring
deposit, withdrawal and support pages; they may carry the [lang] and [login] macros. Deposit and withdrawal links are shown to real accounts only.
descriptionstring
Description is free text staff use to tell similar groups apart; it is also searched by name.
enable_deal_cost_calcboolean
show midpoint execution cost in terminal deal history
enforce_country_restrictionsboolean
block trading for accounts in a restricted country
expert_advisors_enabledboolean
free_margin_modeFreeMarginMode
FreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_only
fund_transfer_modeFundTransferMode
FundTransferMode says whether money may move between accounts. - same_client: the same client, any of its groups - same_group: the group or one of its subgroups, any client - same_client_group: the same client, the same group
disabled same_client same_group same_client_group any
generate_statementsboolean
build statements for accounts of this group at all
hedging_prohibitedboolean
no opposite positions on a symbol
history_monthsinteger
how far back accounts see history, 0 = all
interest_ratestring
yearly percent on free balance Exact decimal as a string. Never parse it into a binary float for money or prices.
languagestring
its accounts' mail language unless they choose one; empty = the platform's
leverage_profile_idinteger
floating leverage rules; nil = none
mail_enabledboolean
margin_call_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelType
MarginLevelType says whether margin call and stop out are percents or money.
percent money
margin_modeMarginMode
MarginMode is how positions on the same symbol combine. - netting: one position per symbol - hedging: many positions per symbol, both directions - exchange: margin follows exchange risk rules, not a fixed rate
netting hedging exchange
max_ordersinteger
pending orders, 0 = no limit
max_positionsinteger
0 = no limit
max_positions_volumestring
Exact decimal as a string. Never parse it into a binary float for money or prices.
max_symbolsinteger
simultaneous quoted symbols, 0 = no group limit
negative_balance_protectionboolean
reset a negative balance after stop out
news_categoriesstring[]
empty = every category
news_languagesstring[]
empty = every language
news_modeNewsMode
NewsMode says how much news accounts receive.
off headlines full
notify_balancesboolean
notify_dealsboolean
notify_ordersboolean
order_expiration_enabledboolean
otp_modeOTPMode
OTPMode says where one-time codes are required for a group.
off all web_only
password_min_lengthinteger
pathstring
e.g. real\forex; the path is the identity
report_mail_serverstring
which configured mail server sends this group's automated mail; empty = the default
reports_emailstring
reports_modeReportsMode
ReportsMode says which statements accounts receive.
off daily_monthly daily monthly
require_certificate_confirmationboolean
staff must confirm a new certificate before it trusts it
reset_password_on_firstboolean
new accounts change the password at first sign-in
send_copies_to_supportboolean
also mail a copy to the support mailbox
show_risk_warningboolean
shown once after an account of this group connects
signals_enabledboolean
statements_emailboolean
StatementsEmail sends the statements to each account's e-mail address.
stop_out_fully_hedgedboolean
stop out even if fully hedged
stop_out_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
support_emailstring
support_urlstring
swaps_enabledboolean
templates_folderstring
the company's own mail templates; empty = the standard ones
trailing_stops_enabledboolean
updated_atstring
UTC time, RFC 3339.
versioninteger
virtual_creditstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
withdraw_urlstring
Returns
Promise<Group>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.create({
  currency: "USD",
  currency_digits: 2,
  default_leverage: 500,
  demo_deposit: "10000.00",
  margin_call_level: "100",
  margin_mode: "hedging",
  path: "real\\standard",
  stop_out_level: "50",
  support_email: "support@example.com"
})
bash
curl -X POST "$NOVIQA_API_URL/admin/v1/groups" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "currency": "USD",
  "currency_digits": 2,
  "default_leverage": 500,
  "demo_deposit": "10000.00",
  "margin_call_level": "100",
  "margin_mode": "hedging",
  "path": "real\\standard",
  "stop_out_level": "50",
  "support_email": "support@example.com"
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "allow_multiple_trader_sessions": true,
    "auth_type": "plain",
    "clear_accumulated_eod": true,
    "close_fifo": true,
    "company": "HS Markets Ltd",
    "company_email": "string",
    "company_website": "string",
    "compensate_credit": true,
    "connections_enabled": true,
    "created_at": "2026-09-25T10:15:00Z",
    "currency": "USD",
    "currency_digits": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.create(body: models.Group, options?: RequestOptions): Promise<models.Group>

marginSettings ​

GET/admin/v1/groups/margin-settings

List scoped group margin settings

Only margin fields, group identity and currency are returned; staff groups are excluded.

More details

Rights: the staff member needs at least one of: config.groups, groups.margin_edit.

Returns
Promise<MarginSettings[]>
The answer's data.
Errors
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.marginSettings()
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups/margin-settings" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": [
    {
      "currency": "USD",
      "currency_digits": 1,
      "daily_pl_clear_on_close": true,
      "daily_pl_mode": "count_both",
      "free_margin_mode": "ignore_pl",
      "margin_call_level": "1.08452",
      "margin_level_type": "percent",
      "margin_mode": "netting",
      "path": "real\\standard",
      "stop_out_level": "1.08452",
      "version": 1
    }
  ],
  "request_id": "5b7f2c1e"
}
ts
staff.groups.marginSettings(options?: RequestOptions): Promise<group.MarginSettings[]>

retrieve ​

GET/admin/v1/groups/{path}

Get a group

One group's settings. Keep version: every change must send it back. A group outside the caller's group scope answers forbidden; an unknown group not_found.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<Group>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.retrieve("string")
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups/string" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "allow_multiple_trader_sessions": true,
    "auth_type": "plain",
    "clear_accumulated_eod": true,
    "close_fifo": true,
    "company": "HS Markets Ltd",
    "company_email": "string",
    "company_website": "string",
    "compensate_credit": true,
    "connections_enabled": true,
    "created_at": "2026-09-25T10:15:00Z",
    "currency": "USD",
    "currency_digits": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.retrieve(path: string, options?: RequestOptions): Promise<models.Group>

update ​

PATCH/admin/v1/groups/{path}

Change a group

Changes the fields sent. version is required and must equal the stored version, else conflict (reload and retry); created_at and updated_at cannot be sent. Sending path renames the group and every group below it (the new path must also be in the caller's scope); the accounts of the renamed groups are signed out and must sign in again. allow_multiple_trader_sessions defaults to true for new groups. When false, each trader login replaces earlier trader sessions. When true, independent trader sessions coexist. Switching it off applies on the next trader login; staff sessions are unaffected. Turning connections_enabled off signs out every account of the group at once. company is checked against the licence only when it changes. The result must pass every group rule (see create). A change that alters nothing answers the group as it is. Answers the saved group (under its new path when renamed). A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Request body
allow_multiple_trader_sessionsboolean
Permit independent trader logins; staff sessions are always independent.
auth_typeAuthType
AuthType is how a terminal proves its identity to sign in. - plain: password only - certificate_1024: password plus a 1024-bit signed certificate - certificate_2048: password plus a 2048-bit signed certificate
plain certificate_1024 certificate_2048
clear_accumulated_eodboolean
release held-back daily profit at day end; does not forgive commission
close_fifoboolean
positions close oldest first
companystring
company_emailstring
company_websitestring
compensate_creditboolean
writing off a negative balance also writes off credit
connections_enabledboolean
created_atstring
UTC time, RFC 3339.
currencystring
deposit currency of every account
currency_digitsinteger
money rounding
daily_pl_clear_on_closeboolean
legacy alias for clear_accumulated_eod; releases held profit at day end
daily_pl_modeDailyPLMode
DailyPLMode says how profit and loss fixed during the day counts in free margin. - count_both: today's profit and losses both count - count_losses_only: today's profit is held back until the day ends
count_both count_losses_only
default_leverageinteger
initial leverage of new real accounts; each account keeps its own
demo_depositstring
first deposit of new demo accounts Exact decimal as a string. Never parse it into a binary float for money or prices.
demo_leverageinteger
new demo accounts; nil = default leverage
deposit_urlstring
deposit, withdrawal and support pages; they may carry the [lang] and [login] macros. Deposit and withdrawal links are shown to real accounts only.
descriptionstring
Description is free text staff use to tell similar groups apart; it is also searched by name.
enable_deal_cost_calcboolean
show midpoint execution cost in terminal deal history
enforce_country_restrictionsboolean
block trading for accounts in a restricted country
expert_advisors_enabledboolean
free_margin_modeFreeMarginMode
FreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_only
fund_transfer_modeFundTransferMode
FundTransferMode says whether money may move between accounts. - same_client: the same client, any of its groups - same_group: the group or one of its subgroups, any client - same_client_group: the same client, the same group
disabled same_client same_group same_client_group any
generate_statementsboolean
build statements for accounts of this group at all
hedging_prohibitedboolean
no opposite positions on a symbol
history_monthsinteger
how far back accounts see history, 0 = all
interest_ratestring
yearly percent on free balance Exact decimal as a string. Never parse it into a binary float for money or prices.
languagestring
its accounts' mail language unless they choose one; empty = the platform's
leverage_profile_idinteger
floating leverage rules; nil = none
mail_enabledboolean
margin_call_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelType
MarginLevelType says whether margin call and stop out are percents or money.
percent money
margin_modeMarginMode
MarginMode is how positions on the same symbol combine. - netting: one position per symbol - hedging: many positions per symbol, both directions - exchange: margin follows exchange risk rules, not a fixed rate
netting hedging exchange
max_ordersinteger
pending orders, 0 = no limit
max_positionsinteger
0 = no limit
max_positions_volumestring
Exact decimal as a string. Never parse it into a binary float for money or prices.
max_symbolsinteger
simultaneous quoted symbols, 0 = no group limit
negative_balance_protectionboolean
reset a negative balance after stop out
news_categoriesstring[]
empty = every category
news_languagesstring[]
empty = every language
news_modeNewsMode
NewsMode says how much news accounts receive.
off headlines full
notify_balancesboolean
notify_dealsboolean
notify_ordersboolean
order_expiration_enabledboolean
otp_modeOTPMode
OTPMode says where one-time codes are required for a group.
off all web_only
password_min_lengthinteger
pathstring
e.g. real\forex; the path is the identity
report_mail_serverstring
which configured mail server sends this group's automated mail; empty = the default
reports_emailstring
reports_modeReportsMode
ReportsMode says which statements accounts receive.
off daily_monthly daily monthly
require_certificate_confirmationboolean
staff must confirm a new certificate before it trusts it
reset_password_on_firstboolean
new accounts change the password at first sign-in
send_copies_to_supportboolean
also mail a copy to the support mailbox
show_risk_warningboolean
shown once after an account of this group connects
signals_enabledboolean
statements_emailboolean
StatementsEmail sends the statements to each account's e-mail address.
stop_out_fully_hedgedboolean
stop out even if fully hedged
stop_out_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
support_emailstring
support_urlstring
swaps_enabledboolean
templates_folderstring
the company's own mail templates; empty = the standard ones
trailing_stops_enabledboolean
updated_atstring
UTC time, RFC 3339.
versioninteger
virtual_creditstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
withdraw_urlstring
Returns
Promise<Group>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.update("string", {
  max_positions: 200,
  otp_mode: "web_only",
  stop_out_level: "40",
  version: 3
})
bash
curl -X PATCH "$NOVIQA_API_URL/admin/v1/groups/string" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "max_positions": 200,
  "otp_mode": "web_only",
  "stop_out_level": "40",
  "version": 3
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "allow_multiple_trader_sessions": true,
    "auth_type": "plain",
    "clear_accumulated_eod": true,
    "close_fifo": true,
    "company": "HS Markets Ltd",
    "company_email": "string",
    "company_website": "string",
    "compensate_credit": true,
    "connections_enabled": true,
    "created_at": "2026-09-25T10:15:00Z",
    "currency": "USD",
    "currency_digits": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.update(path: string, body: models.Group, options?: RequestOptions): Promise<models.Group>

delete ​

DELETE/admin/v1/groups/{path}

Delete a group

Removes a group with its group symbol rows, commissions and leverage switches. Refused with conflict while it has accounts, groups below it, or other records still refer to it. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<null>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.delete("string")
bash
curl -X DELETE "$NOVIQA_API_URL/admin/v1/groups/string" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": null,
  "request_id": "5b7f2c1e"
}
ts
staff.groups.delete(path: string, options?: RequestOptions): Promise<null>

listCommissions ​

GET/admin/v1/groups/{path}/commissions

List a group's commissions

The group's commission rules with their tiers, by position (1-based). A staff group has no commissions and answers invalid_input. A group outside the caller's group scope answers forbidden; an unknown group not_found.

More details

Rights: the staff member needs at least one of: config.groups, groups.commission_edit.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<Commission[]>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.listCommissions("string")
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups/string/commissions" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": [
    {
      "charge_at": "string",
      "description": "string",
      "entry_filter": "string",
      "group_path": "string",
      "id": 1,
      "kind": "string",
      "mask": "string",
      "name": "Ann Smith",
      "position": 1,
      "profit_filter": "string",
      "range_basis": "string",
      "reasons": [
        "string"
      ]
    }
  ],
  "request_id": "5b7f2c1e"
}
ts
staff.groups.listCommissions(path: string, options?: RequestOptions): Promise<models.Commission[]>

createCommissions ​

POST/admin/v1/groups/{path}/commissions

Add a group commission

Adds a commission rule to the group. Required: name (1-64 characters, no leading or trailing spaces), mask (symbols it applies to, same syntax as group symbol masks) and tiers (1-100, sorted by range without overlap; only the last may be open-ended with range_to 0; value above 0; unit currency needs currency, other units must leave it empty; numbers at most 14 whole digits and 10 decimals). Defaults: kind standard, range_basis volume, charge_at instant, entry_filter/side_filter/profit_filter all. Fee rules support only instant timing; fee with daily or monthly charge_at is refused with invalid_input. reasons (distinct deal reasons: client, dealer, stop_loss, take_profit, stop_out, expiry, activation) empty means every reason. turnover_currency only for turnover_money ranges. group_path may be left out; if sent it must equal the group in the URL. position (1-based) inserts the rule there, moving the rules at and below it down; 0 or left out puts it last. A staff group answers invalid_input. Answers the stored rule. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs at least one of: config.groups, groups.commission_edit.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Request body
charge_atstring
instant | daily | monthly
descriptionstring
free text explaining the rule to other staff
entry_filterstring
all | in | out
group_pathstring
idinteger
kindstring
standard | agent | fee
maskstring
symbols it applies to
namestring
positioninteger
profit_filterstring
all | profitable | losing
range_basisstring
volume | turnover_money | turnover_volume
reasonsstring[]
empty = every deal reason
side_filterstring
all | buy | sell
tiersCommissionTier_input[]
turnover_currencystring
turnover_money ranges only; empty = deposit currency
versioninteger
Returns
Promise<Commission>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.createCommissions("string", {
  charge_at: "instant",
  entry_filter: "all",
  mask: "Forex\\*",
  name: "Forex per lot",
  tiers: [
    {
      currency: "USD",
      maximum: "0",
      minimum: "0",
      per: "lot",
      range_from: "0",
      range_to: "0",
      unit: "currency",
      value: "3.5"
    }
  ]
})
bash
curl -X POST "$NOVIQA_API_URL/admin/v1/groups/string/commissions" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "charge_at": "instant",
  "entry_filter": "all",
  "mask": "Forex\\*",
  "name": "Forex per lot",
  "tiers": [
    {
      "currency": "USD",
      "maximum": "0",
      "minimum": "0",
      "per": "lot",
      "range_from": "0",
      "range_to": "0",
      "unit": "currency",
      "value": "3.5"
    }
  ]
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "charge_at": "string",
    "description": "string",
    "entry_filter": "string",
    "group_path": "string",
    "id": 1,
    "kind": "string",
    "mask": "string",
    "name": "Ann Smith",
    "position": 1,
    "profit_filter": "string",
    "range_basis": "string",
    "reasons": [
      "string"
    ]
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.createCommissions(path: string, body: models.Commission, options?: RequestOptions): Promise<models.Commission>

retrieveCommissions ​

GET/admin/v1/groups/{path}/commissions/{id}

Get a group commission

One commission rule with its tiers. Keep version: every change must send it back. A rule of another group answers not_found. A group outside the caller's group scope answers forbidden; an unknown group not_found.

More details

Rights: the staff member needs at least one of: config.groups, groups.commission_edit.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequired
Commission rule id.
Returns
Promise<Commission>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.retrieveCommissions("string", 1)
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups/string/commissions/1" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "charge_at": "string",
    "description": "string",
    "entry_filter": "string",
    "group_path": "string",
    "id": 1,
    "kind": "string",
    "mask": "string",
    "name": "Ann Smith",
    "position": 1,
    "profit_filter": "string",
    "range_basis": "string",
    "reasons": [
      "string"
    ]
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.retrieveCommissions(path: string, id: number, options?: RequestOptions): Promise<models.Commission>

updateCommissions ​

PATCH/admin/v1/groups/{path}/commissions/{id}

Change a group commission

Changes the fields sent. version is required and must equal the rule's version, else conflict. id, group_path and position cannot be sent (move a rule with its move call). tiers and reasons, when sent, replace the whole list. The result must pass every rule of adding one. A change that alters nothing answers the rule as it is. Answers the saved rule. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs at least one of: config.groups, groups.commission_edit.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequired
Commission rule id.
Request body
charge_atstring
instant | daily | monthly
descriptionstring
free text explaining the rule to other staff
entry_filterstring
all | in | out
group_pathstring
idinteger
kindstring
standard | agent | fee
maskstring
symbols it applies to
namestring
positioninteger
profit_filterstring
all | profitable | losing
range_basisstring
volume | turnover_money | turnover_volume
reasonsstring[]
empty = every deal reason
side_filterstring
all | buy | sell
tiersCommissionTier_input[]
turnover_currencystring
turnover_money ranges only; empty = deposit currency
versioninteger
Returns
Promise<Commission>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.updateCommissions("string", 1, {
  charge_at: "daily",
  reasons: [
    "client",
    "dealer"
  ],
  version: 2
})
bash
curl -X PATCH "$NOVIQA_API_URL/admin/v1/groups/string/commissions/1" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "charge_at": "daily",
  "reasons": [
    "client",
    "dealer"
  ],
  "version": 2
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "charge_at": "string",
    "description": "string",
    "entry_filter": "string",
    "group_path": "string",
    "id": 1,
    "kind": "string",
    "mask": "string",
    "name": "Ann Smith",
    "position": 1,
    "profit_filter": "string",
    "range_basis": "string",
    "reasons": [
      "string"
    ]
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.updateCommissions(path: string, id: number, body: models.Commission, options?: RequestOptions): Promise<models.Commission>

deleteCommissions ​

DELETE/admin/v1/groups/{path}/commissions/{id}

Delete a group commission

Removes the rule with its tiers; the rules below it move up one place. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs at least one of: config.groups, groups.commission_edit.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequired
Commission rule id.
Returns
Promise<null>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.deleteCommissions("string", 1)
bash
curl -X DELETE "$NOVIQA_API_URL/admin/v1/groups/string/commissions/1" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": null,
  "request_id": "5b7f2c1e"
}
ts
staff.groups.deleteCommissions(path: string, id: number, options?: RequestOptions): Promise<null>

commissionsMove ​

POST/admin/v1/groups/{path}/commissions/{id}/move

Move a group commission

Puts the rule at position (1-based; past the end = last) within its group, shifting the rules in between. Both position and version are required positive numbers; a stale version answers conflict. Moving bumps the rule's version. Answers the rule at its new place. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs at least one of: config.groups, groups.commission_edit.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequired
Commission rule id.
Request body
positioninteger
new 1-based place in the group's list; past the end = last
versioninteger
the rule's version you last read
Returns
Promise<Commission>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.commissionsMove("string", 1, {
  position: 1,
  version: 3
})
bash
curl -X POST "$NOVIQA_API_URL/admin/v1/groups/string/commissions/1/move" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "position": 1,
  "version": 3
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "charge_at": "string",
    "description": "string",
    "entry_filter": "string",
    "group_path": "string",
    "id": 1,
    "kind": "string",
    "mask": "string",
    "name": "Ann Smith",
    "position": 1,
    "profit_filter": "string",
    "range_basis": "string",
    "reasons": [
      "string"
    ]
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.commissionsMove(path: string, id: number, body: http.docCommissionMove, options?: RequestOptions): Promise<models.Commission>

copy ​

POST/admin/v1/groups/{path}/copy

Copy a group

Creates the group in the body (every setting, with a new path, validated as in Create a group) as a copy of the group in the URL: its symbol rows, in order, and its commission rules with their tiers are copied in the same transaction, so the copy is either complete or not made. Both groups must be in the caller's group scope. One journal line names the source and how many rows and rules were copied. Answers the stored group. Unknown source not_found; a path already used conflict.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Request body
allow_multiple_trader_sessionsboolean
Permit independent trader logins; staff sessions are always independent.
auth_typeAuthType
AuthType is how a terminal proves its identity to sign in. - plain: password only - certificate_1024: password plus a 1024-bit signed certificate - certificate_2048: password plus a 2048-bit signed certificate
plain certificate_1024 certificate_2048
clear_accumulated_eodboolean
release held-back daily profit at day end; does not forgive commission
close_fifoboolean
positions close oldest first
companystring
company_emailstring
company_websitestring
compensate_creditboolean
writing off a negative balance also writes off credit
connections_enabledboolean
created_atstring
UTC time, RFC 3339.
currencystring
deposit currency of every account
currency_digitsinteger
money rounding
daily_pl_clear_on_closeboolean
legacy alias for clear_accumulated_eod; releases held profit at day end
daily_pl_modeDailyPLMode
DailyPLMode says how profit and loss fixed during the day counts in free margin. - count_both: today's profit and losses both count - count_losses_only: today's profit is held back until the day ends
count_both count_losses_only
default_leverageinteger
initial leverage of new real accounts; each account keeps its own
demo_depositstring
first deposit of new demo accounts Exact decimal as a string. Never parse it into a binary float for money or prices.
demo_leverageinteger
new demo accounts; nil = default leverage
deposit_urlstring
deposit, withdrawal and support pages; they may carry the [lang] and [login] macros. Deposit and withdrawal links are shown to real accounts only.
descriptionstring
Description is free text staff use to tell similar groups apart; it is also searched by name.
enable_deal_cost_calcboolean
show midpoint execution cost in terminal deal history
enforce_country_restrictionsboolean
block trading for accounts in a restricted country
expert_advisors_enabledboolean
free_margin_modeFreeMarginMode
FreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_only
fund_transfer_modeFundTransferMode
FundTransferMode says whether money may move between accounts. - same_client: the same client, any of its groups - same_group: the group or one of its subgroups, any client - same_client_group: the same client, the same group
disabled same_client same_group same_client_group any
generate_statementsboolean
build statements for accounts of this group at all
hedging_prohibitedboolean
no opposite positions on a symbol
history_monthsinteger
how far back accounts see history, 0 = all
interest_ratestring
yearly percent on free balance Exact decimal as a string. Never parse it into a binary float for money or prices.
languagestring
its accounts' mail language unless they choose one; empty = the platform's
leverage_profile_idinteger
floating leverage rules; nil = none
mail_enabledboolean
margin_call_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelType
MarginLevelType says whether margin call and stop out are percents or money.
percent money
margin_modeMarginMode
MarginMode is how positions on the same symbol combine. - netting: one position per symbol - hedging: many positions per symbol, both directions - exchange: margin follows exchange risk rules, not a fixed rate
netting hedging exchange
max_ordersinteger
pending orders, 0 = no limit
max_positionsinteger
0 = no limit
max_positions_volumestring
Exact decimal as a string. Never parse it into a binary float for money or prices.
max_symbolsinteger
simultaneous quoted symbols, 0 = no group limit
negative_balance_protectionboolean
reset a negative balance after stop out
news_categoriesstring[]
empty = every category
news_languagesstring[]
empty = every language
news_modeNewsMode
NewsMode says how much news accounts receive.
off headlines full
notify_balancesboolean
notify_dealsboolean
notify_ordersboolean
order_expiration_enabledboolean
otp_modeOTPMode
OTPMode says where one-time codes are required for a group.
off all web_only
password_min_lengthinteger
pathstring
e.g. real\forex; the path is the identity
report_mail_serverstring
which configured mail server sends this group's automated mail; empty = the default
reports_emailstring
reports_modeReportsMode
ReportsMode says which statements accounts receive.
off daily_monthly daily monthly
require_certificate_confirmationboolean
staff must confirm a new certificate before it trusts it
reset_password_on_firstboolean
new accounts change the password at first sign-in
send_copies_to_supportboolean
also mail a copy to the support mailbox
show_risk_warningboolean
shown once after an account of this group connects
signals_enabledboolean
statements_emailboolean
StatementsEmail sends the statements to each account's e-mail address.
stop_out_fully_hedgedboolean
stop out even if fully hedged
stop_out_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
support_emailstring
support_urlstring
swaps_enabledboolean
templates_folderstring
the company's own mail templates; empty = the standard ones
trailing_stops_enabledboolean
updated_atstring
UTC time, RFC 3339.
versioninteger
virtual_creditstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
withdraw_urlstring
Returns
Promise<Group>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.copy("string", {
  allow_multiple_trader_sessions: true,
  auth_type: "plain",
  clear_accumulated_eod: true,
  close_fifo: true,
  company: "HS Markets Ltd",
  company_email: "string",
  company_website: "string",
  compensate_credit: true,
  connections_enabled: true,
  created_at: "2026-09-25T10:15:00Z",
  currency: "USD",
  currency_digits: 1
})
bash
curl -X POST "$NOVIQA_API_URL/admin/v1/groups/string/copy" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "allow_multiple_trader_sessions": true,
  "auth_type": "plain",
  "clear_accumulated_eod": true,
  "close_fifo": true,
  "company": "HS Markets Ltd",
  "company_email": "string",
  "company_website": "string",
  "compensate_credit": true,
  "connections_enabled": true,
  "created_at": "2026-09-25T10:15:00Z",
  "currency": "USD",
  "currency_digits": 1
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "allow_multiple_trader_sessions": true,
    "auth_type": "plain",
    "clear_accumulated_eod": true,
    "close_fifo": true,
    "company": "HS Markets Ltd",
    "company_email": "string",
    "company_website": "string",
    "compensate_credit": true,
    "connections_enabled": true,
    "created_at": "2026-09-25T10:15:00Z",
    "currency": "USD",
    "currency_digits": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.copy(path: string, body: models.Group, options?: RequestOptions): Promise<models.Group>

margin ​

GET/admin/v1/groups/{path}/margin

Read group margin settings

Requires group configuration or margin-edit permission and the target group in scope. Other group configuration is excluded.

More details

Rights: the staff member needs at least one of: config.groups, groups.margin_edit.

Parameters
pathstring · pathrequired
URL-encoded group path.
Returns
Promise<MarginSettings>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.margin("string")
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups/string/margin" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "currency": "USD",
    "currency_digits": 1,
    "daily_pl_clear_on_close": true,
    "daily_pl_mode": "count_both",
    "free_margin_mode": "ignore_pl",
    "margin_call_level": "1.08452",
    "margin_level_type": "percent",
    "margin_mode": "netting",
    "path": "real\\standard",
    "stop_out_level": "1.08452",
    "version": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.margin(path: string, options?: RequestOptions): Promise<group.MarginSettings>

updateMargin ​

PATCH/admin/v1/groups/{path}/margin

Edit group margin settings

Sparse patch with version; only margin_mode, margin_level_type, margin_call_level, stop_out_level, free_margin_mode, daily_pl_mode and daily_pl_clear_on_close are writable. Other fields are rejected. Uses normal group validation and optimistic concurrency.

More details

Rights: the staff member needs at least one of: config.groups, groups.margin_edit.

Parameters
pathstring · pathrequired
URL-encoded group path.
Request body
currencystring
currency_digitsinteger
daily_pl_clear_on_closeboolean
daily_pl_modeDailyPLMode
DailyPLMode says how profit and loss fixed during the day counts in free margin. - count_both: today's profit and losses both count - count_losses_only: today's profit is held back until the day ends
count_both count_losses_only
free_margin_modeFreeMarginMode
FreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_only
margin_call_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelType
MarginLevelType says whether margin call and stop out are percents or money.
percent money
margin_modeMarginMode
MarginMode is how positions on the same symbol combine. - netting: one position per symbol - hedging: many positions per symbol, both directions - exchange: margin follows exchange risk rules, not a fixed rate
netting hedging exchange
pathstring
stop_out_levelstring
Exact decimal as a string. Never parse it into a binary float for money or prices.
versioninteger
Returns
Promise<MarginSettings>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.updateMargin("string", {
  currency: "USD",
  currency_digits: 1,
  daily_pl_clear_on_close: true,
  daily_pl_mode: "count_both",
  free_margin_mode: "ignore_pl",
  margin_call_level: "1.08452",
  margin_level_type: "percent",
  margin_mode: "netting",
  path: "real\\standard",
  stop_out_level: "1.08452",
  version: 1
})
bash
curl -X PATCH "$NOVIQA_API_URL/admin/v1/groups/string/margin" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "currency": "USD",
  "currency_digits": 1,
  "daily_pl_clear_on_close": true,
  "daily_pl_mode": "count_both",
  "free_margin_mode": "ignore_pl",
  "margin_call_level": "1.08452",
  "margin_level_type": "percent",
  "margin_mode": "netting",
  "path": "real\\standard",
  "stop_out_level": "1.08452",
  "version": 1
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "currency": "USD",
    "currency_digits": 1,
    "daily_pl_clear_on_close": true,
    "daily_pl_mode": "count_both",
    "free_margin_mode": "ignore_pl",
    "margin_call_level": "1.08452",
    "margin_level_type": "percent",
    "margin_mode": "netting",
    "path": "real\\standard",
    "stop_out_level": "1.08452",
    "version": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.updateMargin(path: string, body: group.MarginSettings, options?: RequestOptions): Promise<group.MarginSettings>

retrievePreview ​

GET/admin/v1/groups/{path}/preview/{symbolID}

Preview a symbol as a group trades it

The symbol's settings after every matching row of the group is applied, plus the group's spread markup. An archived symbol, or one no row matches, answers invalid_input (the group cannot trade it); an unknown symbol not_found. A group outside the caller's group scope answers forbidden; an unknown group not_found.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
symbolIDinteger · pathrequired
Symbol id.
Returns
Promise<TradeSymbol>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.retrievePreview("string", 1)
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups/string/preview/1" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "allow_negative_prices": true,
    "allowed_expirations": [
      "string"
    ],
    "allowed_fill_policies": [
      "string"
    ],
    "allowed_order_types": [
      "string"
    ],
    "background_color": "string",
    "base_currency": "string",
    "base_currency_digits": 1,
    "basis_symbol": "string",
    "book_depth": 1,
    "book_depth_unlimited": true,
    "calc_type": "forex",
    "category": "string"
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.retrievePreview(path: string, symbolID: number, options?: RequestOptions): Promise<models.TradeSymbol>

listSymbols ​

GET/admin/v1/groups/{path}/symbols

List a group's symbol rows

The group's symbol rows (per-symbol overrides) in the order they are applied, by position (0-based). For a symbol, every row whose mask matches its name or path applies in turn, so a later row wins; a symbol no row matches cannot be traded in the group. A group outside the caller's group scope answers forbidden; an unknown group not_found.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<GroupSymbol[]>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.listSymbols("string")
bash
curl -X GET "$NOVIQA_API_URL/admin/v1/groups/string/symbols" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": [
    {
      "group_path": "string",
      "id": 1,
      "mask": "string",
      "override": {
        "allowed_expirations": [
          "string"
        ],
        "allowed_fill_policies": [
          "string"
        ],
        "allowed_order_types": [
          "string"
        ],
        "book_depth": 1,
        "book_depth_unlimited": true,
        "currency_margin_rate": "1.08452",
        "execution_type": "instant",
        "fast_confirmation_of_requotes": true,
        "freeze_level_pts": 1,
        "hedged_margin_larger_leg": true,
        "instant_max_age_sec": 1,
        "instant_max_loss_dev_pts": 1
      },
      "position": 1,
      "updated_at": "2026-09-25T10:15:00Z",
      "version": 1
    }
  ],
  "request_id": "5b7f2c1e"
}
ts
staff.groups.listSymbols(path: string, options?: RequestOptions): Promise<models.GroupSymbol[]>

createSymbols ​

POST/admin/v1/groups/{path}/symbols

Add a symbol row to a group

Appends a row at the end of the list (it applies last, so it wins). Required: mask (1-128 letters, digits, spaces, . _ & # - * or ; * stands for any run of characters, matched case-insensitively against each symbol's name and path, e.g. *, Forex\*, EURUSD). version is ignored. Every override setting left out or null is inherited from the symbol; override.margin_rates changes only the kinds it lists. A mask already used in the group answers conflict. Every symbol the row affects is checked with the group's rows applied, and a result that breaks a symbol rule (e.g. volume min above volume max) answers invalid_input naming the symbol. Answers the stored row. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Request body
maskstring
overrideSymbolOverride
SymbolOverride holds the symbol settings a group may change. nil = inherit.
versioninteger
required to replace, ignored on create
Returns
Promise<GroupSymbol>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.createSymbols("string", {
  mask: "Forex\\*",
  override: {
    spread_markup_ask_pts: 2,
    spread_markup_bid_pts: 2,
    trade_access: "full",
    volume_max: "50"
  }
})
bash
curl -X POST "$NOVIQA_API_URL/admin/v1/groups/string/symbols" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "mask": "Forex\\*",
  "override": {
    "spread_markup_ask_pts": 2,
    "spread_markup_bid_pts": 2,
    "trade_access": "full",
    "volume_max": "50"
  }
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "group_path": "string",
    "id": 1,
    "mask": "string",
    "override": {
      "allowed_expirations": [
        "string"
      ],
      "allowed_fill_policies": [
        "string"
      ],
      "allowed_order_types": [
        "string"
      ],
      "book_depth": 1,
      "book_depth_unlimited": true,
      "currency_margin_rate": "1.08452",
      "execution_type": "instant",
      "fast_confirmation_of_requotes": true,
      "freeze_level_pts": 1,
      "hedged_margin_larger_leg": true,
      "instant_max_age_sec": 1,
      "instant_max_loss_dev_pts": 1
    },
    "position": 1,
    "updated_at": "2026-09-25T10:15:00Z",
    "version": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.createSymbols(path: string, body: group.GroupSymbolInput, options?: RequestOptions): Promise<models.GroupSymbol>

updateSymbolsOrder ​

PUT/admin/v1/groups/{path}/symbols/order

Reorder a group's symbol rows

Sets the order the rows apply in. ids must list every row id of the group exactly once, first applied first (the last one wins); else invalid_input. The symbols whose result changes are checked as when adding a row. Answers the rows in their new order. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Request body
idsinteger[]
Returns
Promise<GroupSymbol[]>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.updateSymbolsOrder("string", {
  ids: [
    12,
    15,
    13
  ]
})
bash
curl -X PUT "$NOVIQA_API_URL/admin/v1/groups/string/symbols/order" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "ids": [
    12,
    15,
    13
  ]
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": [
    {
      "group_path": "string",
      "id": 1,
      "mask": "string",
      "override": {
        "allowed_expirations": [
          "string"
        ],
        "allowed_fill_policies": [
          "string"
        ],
        "allowed_order_types": [
          "string"
        ],
        "book_depth": 1,
        "book_depth_unlimited": true,
        "currency_margin_rate": "1.08452",
        "execution_type": "instant",
        "fast_confirmation_of_requotes": true,
        "freeze_level_pts": 1,
        "hedged_margin_larger_leg": true,
        "instant_max_age_sec": 1,
        "instant_max_loss_dev_pts": 1
      },
      "position": 1,
      "updated_at": "2026-09-25T10:15:00Z",
      "version": 1
    }
  ],
  "request_id": "5b7f2c1e"
}
ts
staff.groups.updateSymbolsOrder(path: string, body: http.orderRequest, options?: RequestOptions): Promise<models.GroupSymbol[]>

updateSymbols ​

PUT/admin/v1/groups/{path}/symbols/{id}

Replace a group symbol row

Overwrites the row's mask and whole override: a setting left out goes back to inherit. version is required and must equal the row's version, else conflict. Mask and resolved-symbol checks are those of adding a row. Answers the saved row. A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequired
Group symbol row id.
Request body
maskstring
overrideSymbolOverride
SymbolOverride holds the symbol settings a group may change. nil = inherit.
versioninteger
required to replace, ignored on create
Returns
Promise<GroupSymbol>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
409conflict: already exists
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.updateSymbols("string", 1, {
  mask: "Forex\\*",
  override: {
    swap_long: "-7.5",
    trade_access: "close_only"
  },
  version: 2
})
bash
curl -X PUT "$NOVIQA_API_URL/admin/v1/groups/string/symbols/1" \
  -H "Authorization: Bearer $NOVIQA_TOKEN" \
  -H "Content-Type: application/json" \
  --data-raw '{
  "mask": "Forex\\*",
  "override": {
    "swap_long": "-7.5",
    "trade_access": "close_only"
  },
  "version": 2
}'
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": {
    "group_path": "string",
    "id": 1,
    "mask": "string",
    "override": {
      "allowed_expirations": [
        "string"
      ],
      "allowed_fill_policies": [
        "string"
      ],
      "allowed_order_types": [
        "string"
      ],
      "book_depth": 1,
      "book_depth_unlimited": true,
      "currency_margin_rate": "1.08452",
      "execution_type": "instant",
      "fast_confirmation_of_requotes": true,
      "freeze_level_pts": 1,
      "hedged_margin_larger_leg": true,
      "instant_max_age_sec": 1,
      "instant_max_loss_dev_pts": 1
    },
    "position": 1,
    "updated_at": "2026-09-25T10:15:00Z",
    "version": 1
  },
  "request_id": "5b7f2c1e"
}
ts
staff.groups.updateSymbols(path: string, id: number, body: group.GroupSymbolInput, options?: RequestOptions): Promise<models.GroupSymbol>

deleteSymbols ​

DELETE/admin/v1/groups/{path}/symbols/{id}

Remove a group symbol row

Deletes one row; the symbols it matched fall back to the other rows (or cannot be traded when none matches). A group outside the caller's group scope answers forbidden; an unknown group not_found. Writes a config line to the journal (visible to staff who may see the group) and bumps the configuration version, so the trading services reload the group within moments.

More details

Rights: the staff member needs every one of: config.groups.

Parameters
pathstring · pathrequired
Group path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequired
Group symbol row id.
Returns
Promise<null>
The answer's data.
Errors
400invalid_input: invalid input
401auth.session_expired: session expired, sign in again
403auth.csrf_invalid: request refused: reload the page and try again
403auth.invalid_terminal: this terminal cannot be used here
403auth.otp_enrol_required: your group requires one-time codes: set them up to continue
403auth.password_change_required: you must change your password first
403forbidden: you do not have access to this action
404not_found: not found
500internal: something went wrong
ts
import { staff } from "@/lib/noviqa"

const data = await staff.groups.deleteSymbols("string", 1)
bash
curl -X DELETE "$NOVIQA_API_URL/admin/v1/groups/string/symbols/1" \
  -H "Authorization: Bearer $NOVIQA_TOKEN"
json
{
  "success": true,
  "code": "ok",
  "message": "done",
  "data": null,
  "request_id": "5b7f2c1e"
}
ts
staff.groups.deleteSymbols(path: string, id: number, options?: RequestOptions): Promise<null>