/ordersРазмещает ордер и возвращает его в том виде, в котором его сохранил торговый движок. Ордера на увеличение (market, limit, stop_market, stop_limit) открывают или увеличивают позицию;
ордера закрытия (stop, take, trailing_stop) привязываются к существующей позиции через positionId.
amount читается в разных единицах для каждого из двух: в ордере на увеличение это сумма в котируемой валюте, зарезервированная из свободного баланса; в ордере на закрытие это размер базового актива позиции для закрытия, при этом ничего не резервируется. Остальные поля размера (expectedAmount, sizeMode, baseSize, leverage) относятся только к ордерам на увеличение.
Помимо схемы на уровне полей, запрос проверяется на:
- Форма для типа. Каждое отклонение здесь — это
400, код которого указывает на проблемную комбинацию полей:- размер —
amount_not_positive,base_size_required,base_size_negative,base_size_not_allowed; - плечо —
leverage_required,leverage_negative; - цена триггера —
trigger_price_required,trigger_price_negative; - стоп-лосс / тейк-профит, привязанные к ордеру на увеличение —
stop_trigger_price_negative,take_trigger_price_negative,stop_trigger_price_gt_trigger_price,stop_trigger_price_lt_trigger_price,take_trigger_price_gt_trigger_price,take_trigger_price_lt_trigger_price; - цена стоп-лимит —
stop_limit_price_required,stop_limit_price_negative,stop_limit_price_gt_trigger_price,stop_limit_price_lt_trigger_price; - трейлинг-стоп —
trailing_stop_activation_price_negative,trailing_stop_offset_required,trailing_stop_offset_conflict,trailing_stop_offset_negative,trailing_stop_offset_percent_negative,trailing_stop_offset_percent_gte_one; - ордера на закрытие —
position_id_required.
- размер —
- Плечо ордера на увеличение. Должно оставаться в границах рынка: не ниже минимума рынка и не выше максимума фазы,
с
invalid_leverage(leverageплюсminLeverageилиmaxLeverageв теле). - Аккаунт. Должен принадлежать вызывающему и находиться в торговом статусе; ордера на увеличение дополнительно отклоняются, пока аккаунт заблокирован лимитом управляемого капитала, и требуют, чтобы
amountбыл доступен как свободный баланс. - Рынок. Должен быть открыт и относиться к категории, в которой аккаунт может торговать (crypto или RWA). Рынок только для закрытия принимает только
take-ордер, созданный без триггерной цены. - Позиция, когда задан
positionId: она должна существовать (position_not_found), быть открытой, находиться на том же аккаунте, принадлежать тому же рынку и иметь то же направление, что и ордер (position_not_available). - Триггерная цена, относительно текущей рыночной цены и — для
stop/take— относительно цены ликвидации позиции (trigger_price_gt_current,trigger_price_lt_current,trigger_price_gt_liquidation,trigger_price_lt_liquidation).market-ордер с прикреплённым стоп-лоссом / тейк-профитом проверяется относительно цены ликвидации, которая будет у его позиции после исполнения:market_price_unavailableкогда нет текущей цены для проверки,order_validation_invariantкогда поля размера, необходимые для этого прогноза, отсутствуют. - Нотионал ордера на увеличение.
(amount − fee) × leverageдолжен укладываться в максимальный открытый нотионал, который рынок допускает в этом направлении (order_exceeds_max_open_notional).
Отложенный ордер здесь не исполняется, поэтому он всё ещё может завершиться ошибкой, когда позже сработает его триггер: тогда он получает статус canceled_by_error и
errorCode (insufficient_reserve_at_execution, order_below_min_notional, order_exceeds_market_depth, order_exceeds_max_open_notional,
order_zero_size_at_execution, slippage_tolerance, market_close_only_at_execution), а его резерв освобождается.
Отправьте заголовок x-idempotency-key, чтобы сделать вызов безопасным при повторной отправке: в пределах окна повторной отправки, указанного в этом заголовке, тот же ключ на том же маршруте воспроизводит сохранённый ответ (помеченный X-Idempotency-Cached: true и X-Idempotency-Timestamp) вместо повторного выполнения, а второй вызов, поступивший, пока первый всё ещё выполняется, получает 409 (idempotency_key_in_flight).
https://api.upscale.tradeПараметры
x-idempotency-keystringнеобязательноКлюч идемпотентности — любая непрозрачная строка, uuid v4 хорошо подходит. Повторный вызов с тем же ключом на этом маршруте в течение 1 часа воспроизводит сохранённый ответ вместо повторного выполнения; при воспроизведении возвращаются X-Idempotency-Cached: true и X-Idempotency-Timestamp. Чтобы отказаться, не указывайте заголовок.
9f1c2b7e-5a3d-4f61-9b0e-2c7d4a8e1f35Тело запроса · обязательно
accountIdstring · uuidобязательноTrader account the order is placed on. Must belong to the caller.
- pattern
- ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
00000000-0000-4000-8000-000000000000marketIdstring · uuidобязательноMarket the order is placed on, as returned by GET /v2/markets.
- pattern
- ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
00000000-0000-4000-8000-000000000000typestring · enumобязательноOrder type. Increase (position-opening) types: market, limit, stop_market, stop_limit. Close types, attached to an existing position: stop, take, trailing_stop. liquidation is raised by the platform itself and add_margin / remove_margin are legacy — none of the three is accepted here.
"market" "limit" "stop" "trailing_stop" "take" "stop_limit" "stop_market"marketdirectionstring · enumобязательноOrder direction. For a close order it must match the direction of the position it is attached to.
"long" "short"longamountstring · int32обязательноWhat the order is sized by, fp9 raw — the unit depends on the order class. On an increase order (market, limit, stop_market, stop_limit) it is a quote amount reserved from the free balance (margin, fee, spread and buffer): the account must hold at least this much, and the reserve is released when the order is cancelled. On a close order (stop, take, trailing_stop) it is the base asset size of the position to close and nothing is reserved; a size larger than the position holds closes it in full.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
100000000000Необязательные поля: 12
positionIdstring · uuid · nullableнеобязательноPosition a close order (stop, take, trailing_stop) is attached to. Required for those types, ignored for increase orders.
- pattern
- ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
00000000-0000-4000-8000-000000000000expectedAmountstring · int32 · nullableнеобязательноSlippage tolerance for increase orders: the position size the caller expects for amount, fp9 raw. Execution outside the tolerance fails with slippage_tolerance. Omitted or 0 — no tolerance check. Not applicable to close orders.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
0leveragestring · int32 · nullableнеобязательноLeverage, fp9 raw (10000000000 = 10x). Required for increase orders and must be within the leverage bounds of the market.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
10000000000triggerPricestring · int32 · nullableнеобязательноPrice at which the order fires, fp9 raw. Required for limit, stop, take, stop_market and stop_limit, and rejected for market. For stop / take, 0 means the order is created without a trigger and can be set later.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
65000000000000stopTriggerPricestring · int32 · nullableнеобязательноStop-loss attached to an increase order, fp9 raw. Must sit below the entry trigger price for long and above it for short.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000takeTriggerPricestring · int32 · nullableнеобязательноTake-profit attached to an increase order, fp9 raw. Must sit above the entry trigger price for long and below it for short.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopActivationPricestring · int32 · nullableнеобязательноPrice at which a trailing_stop starts trailing, fp9 raw. Omitted — the order trails from the moment it is created.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopOffsetstring · int32 · nullableнеобязательноTrailing distance as an absolute quote amount, fp9 raw. Exactly one of trailingStopOffset / trailingStopOffsetPercent is required.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopOffsetPercentstring · int32 · nullableнеобязательноTrailing distance as a fraction of price, fp9 raw and strictly below 1000000000 (100%). Exactly one of trailingStopOffset / trailingStopOffsetPercent is required.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
50000000stopLimitPricestring · int32 · nullableнеобязательноLimit price a stop_limit order is placed at once its trigger fires, fp9 raw. Required for that type; must be at or below the trigger price for long and at or above it for short.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000sizeModestring · enumнеобязательноHow the size of an increase order is expressed: quote (default) sizes it by amount, base sizes it by baseSize while amount stays the reserve. Increase orders only — a close order is always sized by amount in base asset units.
"quote" "base"quotebaseSizestring · int32 · nullableнеобязательноOrder size in base asset units, fp9 raw. Required when sizeMode is base and rejected otherwise, and meaningful for increase orders only.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000{
"accountId": "00000000-0000-4000-8000-000000000000",
"marketId": "00000000-0000-4000-8000-000000000000",
"type": "market",
"direction": "long",
"amount": "100000000000"
}Примеры
curl --request POST 'https://api.upscale.trade/orders' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer YOUR_API_KEY' \
--header 'Content-Type: application/json' \
--data-raw '{
"accountId": "00000000-0000-4000-8000-000000000000",
"marketId": "00000000-0000-4000-8000-000000000000",
"type": "market",
"direction": "long",
"amount": "100000000000"
}'const response = await fetch("https://api.upscale.trade/orders", {
method: "POST",
headers: {
"Accept": "application/json",
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: "{\n \"accountId\": \"00000000-0000-4000-8000-000000000000\",\n \"marketId\": \"00000000-0000-4000-8000-000000000000\",\n \"type\": \"market\",\n \"direction\": \"long\",\n \"amount\": \"100000000000\"\n}",
});
console.log(response.status, await response.text());import requests
response = requests.request(
"POST",
"https://api.upscale.trade/orders",
headers={"Accept":"application/json","Authorization":"Bearer YOUR_API_KEY","Content-Type":"application/json"},
data="{\n \"accountId\": \"00000000-0000-4000-8000-000000000000\",\n \"marketId\": \"00000000-0000-4000-8000-000000000000\",\n \"type\": \"market\",\n \"direction\": \"long\",\n \"amount\": \"100000000000\"\n}",
timeout=30,
)
print(response.status_code, response.text)Ответы
Неавторизовано
Аккаунт принадлежит другому пользователю (account_access_denied), или запрос аутентифицирован с помощью API-ключа, тогда как api_trading отключён на аккаунте (api_trading_not_enabled). Торговля на аккаунте завершена в его текущем статусе (challenge_closed), или аккаунт заблокирован лимитом управляемого капитала (funded_limit_trading_locked). Рынок приостановлен (market_paused) или принимает только ордера на закрытие (market_close_only).
Нет такого аккаунта, рынка или позиции.
Другой вызов с тем же x-idempotency-key всё ещё выполняется (idempotency_key_in_flight). Повторите попытку, когда он завершится.
Превышен лимит частоты запросов API-ключа (api_key_rate_limit_exceeded). Retry-After указывает, когда вернуться; тело содержит бакет (read / write), окно, которое сработало, его лимит и retryAt.
defaultОтветapplication/json
idstring · uuidобязательноOrder identifier.
- pattern
- ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
00000000-0000-4000-8000-000000000000txIdstringобязательноOrder identifier. Kept for backward compatibility, always equal to id.
stringtraderstring · uuidобязательноTrader account the order belongs to.
- pattern
- ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
00000000-0000-4000-8000-000000000000marketstring · uuidобязательноMarket the order is placed on.
- pattern
- ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$
00000000-0000-4000-8000-000000000000statusstring · enumобязательноLifecycle state: active while it waits, executed once filled, canceled when cancelled by the trader or the platform, canceled_by_update when replaced by an edit, canceled_by_position when the position it was attached to went away, canceled_by_error when execution failed — see errorCode.
"active" "canceled" "canceled_by_update" "canceled_by_error" "canceled_by_position" "executed"activetypestring · enumобязательноOrder type. liquidation marks an order the engine raised itself.
"market" "limit" "stop" "trailing_stop" "take" "stop_limit" "stop_market" "liquidation"marketdirectionstring · enumобязательноOrder direction.
"long" "short"longtriggerPricestring · int32обязательноPrice at which the order fires, fp9 raw. 0 when the order carries no trigger.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000requestedTriggerPricestring · int32 · nullableобязательноTrigger price as requested, before the engine pushed it out to the minimum stop distance, fp9 raw. Null when the requested price was kept as is.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000stopPricestring · int32обязательноTrigger price of a stop_market / stop_limit order, fp9 raw; 0 for every other type.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000limitPricestring · int32обязательноPrice the order is placed at once triggered, fp9 raw: the stop-limit price, falling back to the trigger price.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000stopTriggerPricestring · int32обязательноStop-loss attached to the order, fp9 raw. 0 when none is attached.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000takeTriggerPricestring · int32обязательноTake-profit attached to the order, fp9 raw. 0 when none is attached.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopActivationPricestring · int32обязательноPrice at which a trailing stop starts trailing, fp9 raw. 0 when it trails from creation.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopOffsetstring · int32обязательноTrailing distance as an absolute quote amount, fp9 raw. 0 when the distance is set as a percent.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopOffsetPercentstring · int32обязательноTrailing distance as a fraction of price, fp9 raw. 0 when the distance is absolute.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000leveragestring · int32 · nullableобязательноLeverage of the order, fp9 raw. Null on close orders, which inherit the leverage of the position.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000indexstringобязательноOrder identifier. Kept for backward compatibility, always equal to id.
stringpositionIdstring[]обязательноPosition a close order is attached to. Null for orders that open or grow a position.
Элементы массива · string
string
Посмотреть пример
[
"string"
]parentOrderIdstring[]обязательноOrder this one was spawned from: a stop or take created out of stopTriggerPrice / takeTriggerPrice, or the limit order a stop_limit turned into. Null when the order was submitted directly.
Элементы массива · string
string
Посмотреть пример
[
"string"
]expirationstring · date-time · nullableобязательноAlways null. Kept for backward compatibility — orders do not expire on their own.
2026-05-01T12:30:00.000Zamountstring · int32обязательноSize of the order, fp9 raw, in the unit its class uses: on an increase order a quote amount — the reserve while it waits, and what it actually spent once executed; on a close order (stop, take, trailing_stop) the base asset size it closes, as requested at creation.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000indexPricestring · int32 · nullableобязательноIndex price the order executed at, fp9 raw. Null while the order has not executed.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000settlementOraclePricestring · int32обязательноAlways 1000000000 (1.0). Kept for backward compatibility.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000createdAtstring · date-timeобязательноWhen the order was accepted.
2026-05-01T12:30:00.000Zerrorstring[]обязательноAlways null. Kept for backward compatibility — use errorCode.
Элементы массива · string
string
Посмотреть пример
[
"string"
]realizedPnlstring · int32 · nullableобязательноPnl realised by this order, fp9 raw. Set only on an executed close order; null while pending and on orders that open or grow a position.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000rawRealizedPnlstring · int32 · nullableобязательноRealised pnl before the 60-second adjustment, fp9 raw. Differs from realizedPnl only when the adjustment fired.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000profitAdjustmentAppliedbooleanобязательноWhether the 60-second adjustment capped the profit of this order — inside a minute of an open or increase the position pnl cannot grow above what it was at that moment.
trueexecutedAfterPausebooleanобязательноWhether the order executed after a market pause. Not set by the current engine — always false.
truesizeModestring · enumобязательноHow the size was expressed on creation: quote sizes the order by amount, base sizes it by baseSize.
"quote" "base"quotebaseSizestring · int32 · nullableобязательноOrder size in base asset units, fp9 raw. Null for quote-sized orders.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000reservedAmountstring · int32 · nullableобязательноQuote amount reserved when the order with sizeMode=base was created, fp9 raw. Stays at the original reserve after execution, while amount is rewritten to what was spent. Null for quote-sized orders, where amount is the reserve.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000errorCodestring[]обязательноWhy execution failed, set together with status canceled_by_error — for example insufficient_reserve_at_execution, order_below_min_notional, order_exceeds_market_depth or slippage_tolerance. Null otherwise.
Элементы массива · string
string
Посмотреть пример
[
"string"
]reasonstring · enum · nullableобязательноWhy the platform cancelled the order itself, for example force_close or weekly_session_risk_close. Null for trader-driven cancellations.
"force_close" "stop_accounts_fail" "stop_accounts_freeze" "stop_accounts_promote" "stop_accounts_manual" "weekly_session_risk_close" nullforce_close{
"id": "00000000-0000-4000-8000-000000000000",
"txId": "string",
"trader": "00000000-0000-4000-8000-000000000000",
"market": "00000000-0000-4000-8000-000000000000",
"status": "active",
"type": "market",
"direction": "long",
"triggerPrice": "1000000000",
"requestedTriggerPrice": "1000000000",
"stopPrice": "1000000000",
"limitPrice": "1000000000",
"stopTriggerPrice": "1000000000",
"takeTriggerPrice": "1000000000",
"trailingStopActivationPrice": "1000000000",
"trailingStopOffset": "1000000000",
"trailingStopOffsetPercent": "1000000000",
"leverage": "1000000000",
"index": "string",
"positionId": [
"string"
],
"parentOrderId": [
"string"
],
"expiration": "2026-05-01T12:30:00.000Z",
"amount": "1000000000",
"indexPrice": "1000000000",
"settlementOraclePrice": "1000000000",
"createdAt": "2026-05-01T12:30:00.000Z",
"error": [
"string"
],
"realizedPnl": "1000000000",
"rawRealizedPnl": "1000000000",
"profitAdjustmentApplied": true,
"executedAfterPause": true,
"sizeMode": "quote",
"baseSize": "1000000000",
"reservedAmount": "1000000000",
"errorCode": [
"string"
],
"reason": "force_close"
}