Appearance
staff.groups
21 methods on staff.groups. Each returns the answer's data and throws NoviqaError on a failed answer.
list
GET
/admin/v1/groupsList 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 · queryOnly groups whose path or description contains this, case-insensitive.
Returns
Promise<Group[]>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action500
internal: something went wrongts
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/groupsCreate 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_sessionsbooleanPermit independent trader logins; staff sessions are always independent.
auth_typeAuthTypeAuthType 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 certificateplain certificate_1024 certificate_2048clear_accumulated_eodbooleanrelease held-back daily profit at day end; does not forgive commission
close_fifobooleanpositions close oldest first
companystringcompany_emailstringcompany_websitestringcompensate_creditbooleanwriting off a negative balance also writes off credit
connections_enabledbooleancreated_atstringUTC time, RFC 3339.
currencystringdeposit currency of every account
currency_digitsintegermoney rounding
daily_pl_clear_on_closebooleanlegacy alias for clear_accumulated_eod; releases held profit at day end
daily_pl_modeDailyPLModeDailyPLMode 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 endscount_both count_losses_onlydefault_leverageintegerinitial leverage of new real accounts; each account keeps its own
demo_depositstringfirst deposit of new demo accounts Exact decimal as a string. Never parse it into a binary float for money or prices.
demo_leverageintegernew demo accounts; nil = default leverage
deposit_urlstringdeposit, withdrawal and support pages; they may carry the [lang] and [login] macros. Deposit and withdrawal links are shown to real accounts only.
descriptionstringDescription is free text staff use to tell similar groups apart; it is also searched by name.
enable_deal_cost_calcbooleanshow midpoint execution cost in terminal deal history
enforce_country_restrictionsbooleanblock trading for accounts in a restricted country
expert_advisors_enabledbooleanfree_margin_modeFreeMarginModeFreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_onlyfund_transfer_modeFundTransferModeFundTransferMode 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 groupdisabled same_client same_group same_client_group anygenerate_statementsbooleanbuild statements for accounts of this group at all
hedging_prohibitedbooleanno opposite positions on a symbol
history_monthsintegerhow far back accounts see history, 0 = all
interest_ratestringyearly percent on free balance Exact decimal as a string. Never parse it into a binary float for money or prices.
languagestringits accounts' mail language unless they choose one; empty = the platform's
leverage_profile_idintegerfloating leverage rules; nil = none
mail_enabledbooleanmargin_call_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelTypeMarginLevelType says whether margin call and stop out are percents or money.
percent moneymargin_modeMarginModeMarginMode 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 ratenetting hedging exchangemax_ordersintegerpending orders, 0 = no limit
max_positionsinteger0 = no limit
max_positions_volumestringExact decimal as a string. Never parse it into a binary float for money or prices.
max_symbolsintegersimultaneous quoted symbols, 0 = no group limit
negative_balance_protectionbooleanreset a negative balance after stop out
news_categoriesstring[]empty = every category
news_languagesstring[]empty = every language
news_modeNewsModeNewsMode says how much news accounts receive.
off headlines fullnotify_balancesbooleannotify_dealsbooleannotify_ordersbooleanorder_expiration_enabledbooleanotp_modeOTPModeOTPMode says where one-time codes are required for a group.
off all web_onlypassword_min_lengthintegerpathstringe.g. real\forex; the path is the identity
report_mail_serverstringwhich configured mail server sends this group's automated mail; empty = the default
reports_emailstringreports_modeReportsModeReportsMode says which statements accounts receive.
off daily_monthly daily monthlyrequire_certificate_confirmationbooleanstaff must confirm a new certificate before it trusts it
reset_password_on_firstbooleannew accounts change the password at first sign-in
send_copies_to_supportbooleanalso mail a copy to the support mailbox
show_risk_warningbooleanshown once after an account of this group connects
signals_enabledbooleanstatements_emailbooleanStatementsEmail sends the statements to each account's e-mail address.
stop_out_fully_hedgedbooleanstop out even if fully hedged
stop_out_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
support_emailstringsupport_urlstringswaps_enabledbooleantemplates_folderstringthe company's own mail templates; empty = the standard ones
trailing_stops_enabledbooleanupdated_atstringUTC time, RFC 3339.
versionintegervirtual_creditstringExact decimal as a string. Never parse it into a binary float for money or prices.
withdraw_urlstringReturns
Promise<Group>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action409
conflict: already exists500
internal: something went wrongts
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-settingsList 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
401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<Group>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Request body
allow_multiple_trader_sessionsbooleanPermit independent trader logins; staff sessions are always independent.
auth_typeAuthTypeAuthType 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 certificateplain certificate_1024 certificate_2048clear_accumulated_eodbooleanrelease held-back daily profit at day end; does not forgive commission
close_fifobooleanpositions close oldest first
companystringcompany_emailstringcompany_websitestringcompensate_creditbooleanwriting off a negative balance also writes off credit
connections_enabledbooleancreated_atstringUTC time, RFC 3339.
currencystringdeposit currency of every account
currency_digitsintegermoney rounding
daily_pl_clear_on_closebooleanlegacy alias for clear_accumulated_eod; releases held profit at day end
daily_pl_modeDailyPLModeDailyPLMode 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 endscount_both count_losses_onlydefault_leverageintegerinitial leverage of new real accounts; each account keeps its own
demo_depositstringfirst deposit of new demo accounts Exact decimal as a string. Never parse it into a binary float for money or prices.
demo_leverageintegernew demo accounts; nil = default leverage
deposit_urlstringdeposit, withdrawal and support pages; they may carry the [lang] and [login] macros. Deposit and withdrawal links are shown to real accounts only.
descriptionstringDescription is free text staff use to tell similar groups apart; it is also searched by name.
enable_deal_cost_calcbooleanshow midpoint execution cost in terminal deal history
enforce_country_restrictionsbooleanblock trading for accounts in a restricted country
expert_advisors_enabledbooleanfree_margin_modeFreeMarginModeFreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_onlyfund_transfer_modeFundTransferModeFundTransferMode 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 groupdisabled same_client same_group same_client_group anygenerate_statementsbooleanbuild statements for accounts of this group at all
hedging_prohibitedbooleanno opposite positions on a symbol
history_monthsintegerhow far back accounts see history, 0 = all
interest_ratestringyearly percent on free balance Exact decimal as a string. Never parse it into a binary float for money or prices.
languagestringits accounts' mail language unless they choose one; empty = the platform's
leverage_profile_idintegerfloating leverage rules; nil = none
mail_enabledbooleanmargin_call_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelTypeMarginLevelType says whether margin call and stop out are percents or money.
percent moneymargin_modeMarginModeMarginMode 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 ratenetting hedging exchangemax_ordersintegerpending orders, 0 = no limit
max_positionsinteger0 = no limit
max_positions_volumestringExact decimal as a string. Never parse it into a binary float for money or prices.
max_symbolsintegersimultaneous quoted symbols, 0 = no group limit
negative_balance_protectionbooleanreset a negative balance after stop out
news_categoriesstring[]empty = every category
news_languagesstring[]empty = every language
news_modeNewsModeNewsMode says how much news accounts receive.
off headlines fullnotify_balancesbooleannotify_dealsbooleannotify_ordersbooleanorder_expiration_enabledbooleanotp_modeOTPModeOTPMode says where one-time codes are required for a group.
off all web_onlypassword_min_lengthintegerpathstringe.g. real\forex; the path is the identity
report_mail_serverstringwhich configured mail server sends this group's automated mail; empty = the default
reports_emailstringreports_modeReportsModeReportsMode says which statements accounts receive.
off daily_monthly daily monthlyrequire_certificate_confirmationbooleanstaff must confirm a new certificate before it trusts it
reset_password_on_firstbooleannew accounts change the password at first sign-in
send_copies_to_supportbooleanalso mail a copy to the support mailbox
show_risk_warningbooleanshown once after an account of this group connects
signals_enabledbooleanstatements_emailbooleanStatementsEmail sends the statements to each account's e-mail address.
stop_out_fully_hedgedbooleanstop out even if fully hedged
stop_out_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
support_emailstringsupport_urlstringswaps_enabledbooleantemplates_folderstringthe company's own mail templates; empty = the standard ones
trailing_stops_enabledbooleanupdated_atstringUTC time, RFC 3339.
versionintegervirtual_creditstringExact decimal as a string. Never parse it into a binary float for money or prices.
withdraw_urlstringReturns
Promise<Group>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found409
conflict: already exists500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<null>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found409
conflict: already exists500
internal: something went wrongts
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}/commissionsList 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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<Commission[]>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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}/commissionsAdd 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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Request body
charge_atstringinstant | daily | monthly
descriptionstringfree text explaining the rule to other staff
entry_filterstringall | in | out
group_pathstringidintegerkindstringstandard | agent | fee
maskstringsymbols it applies to
namestringpositionintegerprofit_filterstringall | profitable | losing
range_basisstringvolume | turnover_money | turnover_volume
reasonsstring[]empty = every deal reason
side_filterstringall | buy | sell
tiersCommissionTier_input[]turnover_currencystringturnover_money ranges only; empty = deposit currency
versionintegerReturns
Promise<Commission>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequiredCommission rule id.
Returns
Promise<Commission>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequiredCommission rule id.
Request body
charge_atstringinstant | daily | monthly
descriptionstringfree text explaining the rule to other staff
entry_filterstringall | in | out
group_pathstringidintegerkindstringstandard | agent | fee
maskstringsymbols it applies to
namestringpositionintegerprofit_filterstringall | profitable | losing
range_basisstringvolume | turnover_money | turnover_volume
reasonsstring[]empty = every deal reason
side_filterstringall | buy | sell
tiersCommissionTier_input[]turnover_currencystringturnover_money ranges only; empty = deposit currency
versionintegerReturns
Promise<Commission>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found409
conflict: already exists500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequiredCommission rule id.
Returns
Promise<null>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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}/moveMove 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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequiredCommission rule id.
Request body
positionintegernew 1-based place in the group's list; past the end = last
versionintegerthe rule's version you last read
Returns
Promise<Commission>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found409
conflict: already exists500
internal: something went wrongts
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}/copyCopy 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 · pathrequiredRequest body
allow_multiple_trader_sessionsbooleanPermit independent trader logins; staff sessions are always independent.
auth_typeAuthTypeAuthType 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 certificateplain certificate_1024 certificate_2048clear_accumulated_eodbooleanrelease held-back daily profit at day end; does not forgive commission
close_fifobooleanpositions close oldest first
companystringcompany_emailstringcompany_websitestringcompensate_creditbooleanwriting off a negative balance also writes off credit
connections_enabledbooleancreated_atstringUTC time, RFC 3339.
currencystringdeposit currency of every account
currency_digitsintegermoney rounding
daily_pl_clear_on_closebooleanlegacy alias for clear_accumulated_eod; releases held profit at day end
daily_pl_modeDailyPLModeDailyPLMode 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 endscount_both count_losses_onlydefault_leverageintegerinitial leverage of new real accounts; each account keeps its own
demo_depositstringfirst deposit of new demo accounts Exact decimal as a string. Never parse it into a binary float for money or prices.
demo_leverageintegernew demo accounts; nil = default leverage
deposit_urlstringdeposit, withdrawal and support pages; they may carry the [lang] and [login] macros. Deposit and withdrawal links are shown to real accounts only.
descriptionstringDescription is free text staff use to tell similar groups apart; it is also searched by name.
enable_deal_cost_calcbooleanshow midpoint execution cost in terminal deal history
enforce_country_restrictionsbooleanblock trading for accounts in a restricted country
expert_advisors_enabledbooleanfree_margin_modeFreeMarginModeFreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_onlyfund_transfer_modeFundTransferModeFundTransferMode 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 groupdisabled same_client same_group same_client_group anygenerate_statementsbooleanbuild statements for accounts of this group at all
hedging_prohibitedbooleanno opposite positions on a symbol
history_monthsintegerhow far back accounts see history, 0 = all
interest_ratestringyearly percent on free balance Exact decimal as a string. Never parse it into a binary float for money or prices.
languagestringits accounts' mail language unless they choose one; empty = the platform's
leverage_profile_idintegerfloating leverage rules; nil = none
mail_enabledbooleanmargin_call_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelTypeMarginLevelType says whether margin call and stop out are percents or money.
percent moneymargin_modeMarginModeMarginMode 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 ratenetting hedging exchangemax_ordersintegerpending orders, 0 = no limit
max_positionsinteger0 = no limit
max_positions_volumestringExact decimal as a string. Never parse it into a binary float for money or prices.
max_symbolsintegersimultaneous quoted symbols, 0 = no group limit
negative_balance_protectionbooleanreset a negative balance after stop out
news_categoriesstring[]empty = every category
news_languagesstring[]empty = every language
news_modeNewsModeNewsMode says how much news accounts receive.
off headlines fullnotify_balancesbooleannotify_dealsbooleannotify_ordersbooleanorder_expiration_enabledbooleanotp_modeOTPModeOTPMode says where one-time codes are required for a group.
off all web_onlypassword_min_lengthintegerpathstringe.g. real\forex; the path is the identity
report_mail_serverstringwhich configured mail server sends this group's automated mail; empty = the default
reports_emailstringreports_modeReportsModeReportsMode says which statements accounts receive.
off daily_monthly daily monthlyrequire_certificate_confirmationbooleanstaff must confirm a new certificate before it trusts it
reset_password_on_firstbooleannew accounts change the password at first sign-in
send_copies_to_supportbooleanalso mail a copy to the support mailbox
show_risk_warningbooleanshown once after an account of this group connects
signals_enabledbooleanstatements_emailbooleanStatementsEmail sends the statements to each account's e-mail address.
stop_out_fully_hedgedbooleanstop out even if fully hedged
stop_out_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
support_emailstringsupport_urlstringswaps_enabledbooleantemplates_folderstringthe company's own mail templates; empty = the standard ones
trailing_stops_enabledbooleanupdated_atstringUTC time, RFC 3339.
versionintegervirtual_creditstringExact decimal as a string. Never parse it into a binary float for money or prices.
withdraw_urlstringReturns
Promise<Group>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found409
conflict: already exists500
internal: something went wrongts
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}/marginRead 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 · pathrequiredURL-encoded group path.
Returns
Promise<MarginSettings>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action500
internal: something went wrongts
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}/marginEdit 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 · pathrequiredURL-encoded group path.
Request body
currencystringcurrency_digitsintegerdaily_pl_clear_on_closebooleandaily_pl_modeDailyPLModeDailyPLMode 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 endscount_both count_losses_onlyfree_margin_modeFreeMarginModeFreeMarginMode says how floating profit and loss count in free margin.
ignore_pl use_pl profit_only loss_onlymargin_call_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
margin_level_typeMarginLevelTypeMarginLevelType says whether margin call and stop out are percents or money.
percent moneymargin_modeMarginModeMarginMode 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 ratenetting hedging exchangepathstringstop_out_levelstringExact decimal as a string. Never parse it into a binary float for money or prices.
versionintegerReturns
Promise<MarginSettings>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action409
conflict: already exists500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
symbolIDinteger · pathrequiredSymbol id.
Returns
Promise<TradeSymbol>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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}/symbolsList 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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Returns
Promise<GroupSymbol[]>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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}/symbolsAdd 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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
Request body
maskstringoverrideSymbolOverrideSymbolOverride holds the symbol settings a group may change. nil = inherit.
versionintegerrequired to replace, ignored on create
Returns
Promise<GroupSymbol>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found409
conflict: already exists500
internal: something went wrongts
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/orderReorder 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 · pathrequiredGroup 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
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequiredGroup symbol row id.
Request body
maskstringoverrideSymbolOverrideSymbolOverride holds the symbol settings a group may change. nil = inherit.
versionintegerrequired to replace, ignored on create
Returns
Promise<GroupSymbol>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found409
conflict: already exists500
internal: something went wrongts
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 · pathrequiredGroup path, URL-encoded (the backslash is %5C), e.g. real%5Cstandard for real\standard.
idinteger · pathrequiredGroup symbol row id.
Returns
Promise<null>The answer's
data.Errors
400
invalid_input: invalid input401
auth.session_expired: session expired, sign in again403
auth.csrf_invalid: request refused: reload the page and try again403
auth.invalid_terminal: this terminal cannot be used here403
auth.otp_enrol_required: your group requires one-time codes: set them up to continue403
auth.password_change_required: you must change your password first403
forbidden: you do not have access to this action404
not_found: not found500
internal: something went wrongts
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>