/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; trailing_stop_offset_too_large— абсолютное смещение трейлинга для LONG привело бы к нулевой или отрицательной цене срабатывания;- ордера на закрытие —
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_exceeds_max_price_impact, order_zero_size_at_execution, slippage_tolerance, market_close_only_at_execution), а его резерв освобождается.
Ордер на увеличение также отменяется с order_exceeds_max_price_impact, когда его влияние на цену без статического спреда превышает рыночный
maxPriceImpact (0 означает отсутствие лимита).
Отправьте заголовок 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 · fp9обязательно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 · fp9 · 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 · fp9 · 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 · fp9 · nullableнеобязательноPrice at which the order fires, fp9 raw. Required for limit, stop, take, stop_market and stop_limit, and ignored for market. stop needs a positive price. take with 0 closes amount of the position at market right away; it is the only order a close-only market accepts.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
65000000000000stopTriggerPricestring · fp9 · 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 · fp9 · 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 · fp9 · 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 · fp9 · nullableнеобязательноTrailing distance as an absolute quote amount, fp9 raw. Exactly one of trailingStopOffset / trailingStopOffsetPercent is required.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopOffsetPercentstring · fp9 · nullableнеобязательноTrailing distance as a price multiplier, fp9 raw: one minus the percent, so 5% is 950000000. The stop trails at the best price × multiplier for long and at the best price × (2 − multiplier) for short. Strictly below 1000000000. Exactly one of trailingStopOffset / trailingStopOffsetPercent is required.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
950000000stopLimitPricestring · fp9 · 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 · fp9 · 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-000000000000traderstring · 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 · fp9обязательноPrice at which the order fires, fp9 raw. 0 when the order carries no trigger.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000requestedTriggerPricestring · fp9 · 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 · fp9обязательноTrigger price of a stop_market / stop_limit order, fp9 raw; 0 for every other type.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000limitPricestring · fp9обязательно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 · fp9обязательноStop-loss attached to the order, fp9 raw. 0 when none is attached.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000takeTriggerPricestring · fp9обязательноTake-profit attached to the order, fp9 raw. 0 when none is attached.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopActivationPricestring · fp9обязательноPrice at which a trailing stop starts trailing, fp9 raw. 0 when it trails from creation.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000trailingStopOffsetstring · fp9обязательно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 · fp9обязательноTrailing distance as a price multiplier, fp9 raw: one minus the percent, so 5% is 950000000. 0 when the distance is absolute.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000leveragestring · fp9 · nullableобязательноLeverage of the order, fp9 raw. Null on close orders, which inherit the leverage of the position.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000positionIdstring · nullableобязательноPosition a close order is attached to. Null for orders that open or grow a position.
stringparentOrderIdstring · nullableобязательно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.
stringamountstring · fp9обязательно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 · fp9 · nullableобязательноIndex price the order executed at, fp9 raw. Null while the order has not executed.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000recentVolumestring · fp9 · nullableобязательноVolume of the previous opens and increases on the same account, market and direction that was still counted in the price impact of this order when it executed, USD fp9 raw. The recovery window is configurable, 60 seconds by default. Fixed at execution. Null for orders that have not executed, close orders and markets without dynamic price impact.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000priceImpactstring · fp9 · nullableобязательноPrice impact applied to this open or increase, excluding the static spread, as a fraction fp9 raw (10000000 = 1%). Includes the recent volume in recentVolume. Fixed at execution. Null for orders that have not executed, close orders and markets without dynamic price impact.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000createdAtstring · date-timeобязательноWhen the order was accepted.
2026-05-01T12:30:00.000ZrealizedPnlstring · fp9 · 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 · fp9 · 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.
truesizeModestring · enumобязательноHow the size was expressed on creation: quote sizes the order by amount, base sizes it by baseSize.
"quote" "base"quotebaseSizestring · fp9 · nullableобязательноOrder size in base asset units, fp9 raw. Null for quote-sized orders.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000reservedAmountstring · fp9 · 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 · nullableобязательно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.
stringreasonstring · 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"force_closevpiobject · nullableобязательноVPI parameters of the market at the moment the order executed. Null while the order has not executed.
Объект · 5 поля
spreadstring · fp9обязательноSpread charged on top of the index price, fp9 raw fraction.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000marketDepthLongstringобязательноDepth on the long side, in whole USD — not fp9.
- pattern
- ^-?[0-9]+(\.[0-9]+)?$
45604631.000000000marketDepthShortstringобязательноDepth on the short side, in whole USD — not fp9.
- pattern
- ^-?[0-9]+(\.[0-9]+)?$
38744214.000000000coefficientLongstring · fp9обязательноPrice-impact coefficient applied to long orders, fp9 raw.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000coefficientShortstring · fp9обязательноPrice-impact coefficient applied to short orders, fp9 raw.
- pattern
- ^(?:-?[1-9][0-9]*|0)$
1000000000Посмотреть пример
{
"spread": "1000000000",
"marketDepthLong": "45604631.000000000",
"marketDepthShort": "38744214.000000000",
"coefficientLong": "1000000000",
"coefficientShort": "1000000000"
}{
"id": "00000000-0000-4000-8000-000000000000",
"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",
"positionId": "string",
"parentOrderId": "string",
"amount": "1000000000",
"indexPrice": "1000000000",
"recentVolume": "1000000000",
"priceImpact": "1000000000",
"createdAt": "2026-05-01T12:30:00.000Z",
"realizedPnl": "1000000000",
"rawRealizedPnl": "1000000000",
"profitAdjustmentApplied": true,
"sizeMode": "quote",
"baseSize": "1000000000",
"reservedAmount": "1000000000",
"errorCode": "string",
"reason": "force_close",
"vpi": {
"spread": "1000000000",
"marketDepthLong": "45604631.000000000",
"marketDepthShort": "38744214.000000000",
"coefficientLong": "1000000000",
"coefficientShort": "1000000000"
}
}