orders.v1.OrdersService
PreviewOrder
Check whether an order is currently admissible without creating an order, claiming its client order ID, or reserving funds.
Request
curl --request POST \ \
--url 'https://api.testnet.polyester.com/orders.v1.OrdersService/PreviewOrder' \
--header 'Content-Type: application/json' \
--header 'Connect-Protocol-Version: 1' \
--data '{
"order": {
"attachedRisk": {
"oco": false,
"stopLoss": {
"child": {
"marketIoc": {}
},
"triggerPriceSource": "LAST_PRICE",
"triggerPriceTicks": "61000250000000"
},
"takeProfit": {
"child": {
"marketIoc": {}
},
"triggerPriceSource": "LAST_PRICE",
"triggerPriceTicks": "61000250000000"
}
},
"baseQtyScaled": "100000",
"clientOrderId": "cli-ord-20250101-001",
"feeAsset": "QUOTE",
"marketIoc": {
"clientRefPriceTicks": "61000250000000",
"maxSlippageTicks": "1"
},
"selfTradePreventionMode": "EXPIRE_MAKER",
"side": "BUY",
"symbolId": 1
},
"subaccountId": "6789012345678"
}'Responses
{
"admissible": false,
"evaluatedAt": "2025-01-01T00:00:00Z",
"protectedPriceBoundTicks": "61000250000000",
"rejection": {
"code": "ERROR_CODE_BAD_REQUEST",
"existingOrderId": "9876543210123",
"rateLimit": {
"limit": "100",
"operationId": "value",
"policyClass": "AUTH_PUBLIC",
"policyVersion": "1",
"reason": "QUOTA_EXCEEDED",
"refillModel": "CONTINUOUS",
"remaining": "1",
"retryAfterMs": "1",
"scope": "CLIENT_IP"
},
"violations": [
{
"fieldPath": "value",
"message": "value",
"ruleId": "value"
}
]
},
"resolvedBaseQtyScaled": "100000"
}orders.v1.PreviewOrderRequestorders.v1.PreviewOrderResponseOptional public subaccount ID. When omitted, subaccount-scoped API keys use their bound subaccount; other callers use their authenticated root account.
Stable numeric pair ID from GetSpotConfig.
Order side.
Exact gross base quantity scaled by the pair's base_quantity_scale from GetSpotConfig.
Hard all-in quote debit limit scaled by the pair's quote_quantity_scale from GetSpotConfig. Valid only for BUY market IOC and BUY limit IOC. The order spends up to this amount at the prices it fills at. Once what is left buys no further quantity step, it ends FILLED; if the book or its price limit stops it first, its remainder is canceled. It can carry attached_risk: the legs protect the quantity it actually buys.
Positive maximum absolute price delta in Q9 execution-price ticks (1 tick = 1e-9 quote units).
Maximum allowed slippage in basis points (1 bp = 0.01%).
Optional client reference price in quote units scaled by 1e9. When omitted, admission uses server-side reference pricing.
Limit price in quote units scaled by 1e9.
Reject the order instead of taking liquidity. Post-only is available only on this resting limit-order variant.
Limit price in quote units scaled by 1e9.
Limit price in quote units scaled by 1e9.
Limit price in quote units scaled by 1e9.
Reject the order instead of taking liquidity.
Exact expiry time in UTC. It must be at least 1 second and at most 30 days after validation time. The order cannot execute when the current time equals this value.
Optional account-scoped identifier for correlation, lookup, and cancellation. While this identifier is retained, reuse returns CONFLICT_DUPLICATE_CLIENT_ORDER_ID for every new submission, even with the same payload. This identifier enables GetOrder reconciliation after a timeout; it does not provide exact replay.
Asset charged for fees. Defaults to QUOTE. BASE is available only for BUY orders; SELL orders must use QUOTE.
Self-trade prevention mode against orders of the same root account, including all its subaccounts. Defaults to EXPIRE_MAKER if unspecified.
Trigger price in quote units scaled by 1e9.
Market child with implicit IOC behavior.
Resting GTC limit child.
Price the take-profit watches. Unspecified or LAST_PRICE watches the last traded price. INDEX_PRICE watches the market's index price; on a market without an index price the order is rejected with terminal reason INDEX_PRICE_UNAVAILABLE before any fill, and a modify that adds such a leg is refused with ERROR_CODE_TRIGGER_PRICE_SOURCE_UNSUPPORTED, leaving the order and its legs unchanged. MARK_PRICE is not supported. A modify naming another source replaces the leg.
Trigger price in quote units scaled by 1e9.
Market child with implicit IOC behavior.
Resting GTC limit child.
Price the stop-loss watches. Unspecified or LAST_PRICE watches the last traded price. INDEX_PRICE watches the market's index price; on a market without an index price the order is rejected with terminal reason INDEX_PRICE_UNAVAILABLE before any fill, and a modify that adds such a leg is refused with ERROR_CODE_TRIGGER_PRICE_SOURCE_UNSUPPORTED, leaving the order and its legs unchanged. MARK_PRICE is not supported. A modify naming another source replaces the leg.
Trailing distance as a price delta in 1e-9 quote-unit ticks.
Trailing distance in basis points (1 bp = 0.01%).
Positive maximum absolute price delta in Q9 execution-price ticks (1 tick = 1e-9 quote units).
Maximum allowed slippage in basis points (1 bp = 0.01%), from 1 to 9999 whichever side the exit trades. An order whose trailing stop sets 10000 is rejected with ERROR_CODE_MAX_SLIPPAGE_INVALID, because a 100% cap would leave an exit that sells no positive price to sell at.
Optional activation price: trailing only starts after this price is reached. If omitted, trailing starts immediately after the parent order fills. Expressed in quote units scaled by 1e9.
Price the trailing stop watches and trails: its peak or trough, activation and fire all follow this price. Unspecified or LAST_PRICE watches the last traded price. INDEX_PRICE watches the market's index price; on a market without an index price the order is rejected with terminal reason INDEX_PRICE_UNAVAILABLE before any fill, and a modify that adds such a leg is refused with ERROR_CODE_TRIGGER_PRICE_SOURCE_UNSUPPORTED, leaving the order and its legs unchanged. MARK_PRICE is not supported. A modify naming another source replaces the leg.
Maximum price of a trailing stop that buys back, in quote units scaled by 1e9: the most its exit pays per unit, at which the quote it may spend is reserved with the exit's fee. Required when the parent order sells, so the trailing stop buys; must be unset when the parent order buys. A rise that fires above it still fires, and the exit fills only at or below it. Changing it with ModifyOrder replaces the leg.
If true, the take-profit and the configured stop leg (stop-loss or trailing stop) are linked and shown as one-cancels-the-other. Requires a take-profit and exactly one stop leg. The legs of every parent share one position and end together as described on RiskPolicy, so this setting does not change when exits are submitted. It decides what canceling an exit order ends: with oco set, canceling one leg's exit ends both legs; without it, only that leg ends and the other keeps protecting the remaining position. Changing only this setting with ModifyOrder keeps the existing legs, with their IDs, arming and a trailing stop's tracked peak; changing a leg's terms, such as its trigger price, limit price or trailing distance, still replaces that leg. Default is false.
Whether the order passed the current validation, policy, risk, and available-balance checks.
Stable error code matching the REST problem+json "code" field.
Protobuf field path relative to the request, using canonical field names.
Stable validation rule identifier suitable for programmatic matching.
Human-readable explanation of the violation.
Machine-readable failure reason.
Active weighted quota. Present for quota-exhaustion responses.
Weighted capacity remaining when the request was rejected.
Minimum relative delay before retrying, in milliseconds.
Policy version used for the decision, when available.
Stable operation identifier shared by all aliases of the same action.
Mutable quota family used for the decision.
Caller dimension that owns the exhausted capacity.
Refill behavior used by the active limiter.
Public order ID holding this account's client order ID when a create is rejected with CONFLICT_DUPLICATE_CLIENT_ORDER_ID. Present only when an existing holder is known; omitted for duplicates rejected within the same batch before an order is assigned. Use GetOrder to obtain its current state.
Gross base quantity resolved for execution. REST returns resolvedBaseQty as a decimal string in base asset units, for example "0.005". Protobuf uses the pair's base_quantity_scale from GetSpotConfig. Present when sizing was resolved.
Protective execution boundary. REST returns protectedPriceBound as a decimal string in quote asset units per base asset unit, for example "2751.6". Protobuf uses quote units scaled by 1e9. This is not an expected fill price. Present when price protection was resolved.
Time at which this admission evaluation completed.
| Key | HTTP status | Connect code | Error | When |
|---|---|---|---|---|
| account-orders-suspended | 400 | failed_precondition | Account Orders Suspended | New orders, changes and trigger orders on this account are suspended until a balance issue is resolved; cancels still work. Nothing changed. |
| account-repairing | 400 | failed_precondition | Account Repairing | This account's orders are being canceled while its balances are brought back in line, so new orders, changes and trigger orders are paused for a short time. Nothing changed; cancels still work. Try again shortly. |
| account-reservation-limit-reached | 429 | resource_exhausted | Account Reservation Limit Reached | The account has its maximum number of fund reservations. |
| account-routing-invalid | 503 | unavailable | Account Routing Invalid | The account cannot place triggers right now; contact support if it persists. |
| account-unknown | 400 | invalid_argument | Account Unknown | Account not found. |
| api-key-market-deny | 403 | permission_denied | API Key Market Deny | API key policy does not allow trading this pair. |
| api-key-policy-required | 403 | permission_denied | API Key Policy Required | This API key must have a policy attached before it can be used for trading. |
| api-key-root-scope-only | 403 | permission_denied | API Key Root Scope Only | This API key is scoped to the master account and cannot trade on sub-accounts. |
| api-key-subaccount-mismatch | 403 | permission_denied | API Key Subaccount Mismatch | This API key is scoped to a different sub-account than the one requested. |
| api-key-sub-scope-only | 403 | permission_denied | API Key Sub Scope Only | This API key is scoped to a specific sub-account and cannot trade on the master account. |
| api-key-unknown | 403 | permission_denied | API Key Unknown | API key referenced in the request could not be resolved by the Orders service. |
| attached-exit-working | 400 | failed_precondition | Attached Exit Working | An exit order placed by one of the order's attached take-profit or stop legs is still working; retry once it completes. |
| attached-legs-exceeded | 400 | invalid_argument | Attached Legs Exceeded | The order already carries every attached take-profit, stop-loss and trailing-stop leg it may hold, so the new leg was refused. Legs being cancelled count until they end; retry once they have ended. |
| attached-risk-not-supported | 501 | unimplemented | Attached Risk Not Supported | Attached take-profit, stop-loss or trailing legs can't be applied here: this market takes none, an attached trailing stop isn't offered yet, or the modify changes them together with the order's price, quantity, client order ID or a replace. Nothing changed. |
| bad-price | 400 | invalid_argument | Bad Price | Price is invalid. |
| bad-qty | 400 | invalid_argument | Bad Quantity | Quantity is invalid. |
| bad-request | 400 | invalid_argument | Bad Request | Invalid request payload. |
| batch-other-item-invalid | 400 | invalid_argument | Batch Other Item Invalid | Another item of the batch is invalid, so the batch was not applied. |
| batch-replace-only-required | 400 | invalid_argument | Batch Replace Only Required | Every item of a batch modify must use REPLACE_ONLY. |
| batch-single-symbol-required | 400 | invalid_argument | Batch Single Symbol Required | Every item of a batch modify must name the same symbol. |
| batch-too-large | 400 | invalid_argument | Batch Too Large | Batch size exceeds the maximum allowed for this operation. |
| cancel-all-after-scope-conflict | 400 | failed_precondition | Cancel-All-After Scope Conflict | A pending cancel-all-after can only be re-armed with a scope that covers it. |
| cancel-all-after-timeout-invalid | 400 | invalid_argument | Cancel-All-After Timeout Invalid | The cancel-all-after timeout must be 0 or between 10 and 120 seconds. |
| cancel-request-expired | 400 | failed_precondition | Cancel Request Expired | Cancel request expired before admission. Use a fresh request ID for a new cancellation. |
| cancel-scope-too-large | 400 | invalid_argument | Cancel Scope Too Large | A cancel-all request may name at most 100 symbols. |
| child-order-inconsistent | 400 | failed_precondition | Child Order Inconsistent | The trigger's child order did not match the order the trigger requested, so the trigger failed and the child order was canceled. |
| child-qty-exceeds-remaining | 400 | invalid_argument | Child Quantity Exceeds Remaining | The new quantity of a TWAP order's slice would leave more than the TWAP's remaining quantity. Nothing changed; a slice can be raised up to what the TWAP still has to execute. |
| child-qty-raise-not-allowed | 400 | invalid_argument | Child Quantity Raise Not Allowed | The quantity of a trigger's child order or a ladder order can't be raised above its planned quantity. Nothing changed. |
| client-order-ids-exhausted | 429 | resource_exhausted | Client Order IDs Exhausted | The account reserves its maximum number of client order IDs; retry later or send no client order ID. |
| client-order-id-capacity-reached | 429 | resource_exhausted | Client Order ID Capacity Reached | The venue cannot reserve a client order ID for another trigger right now; retry later. |
| client-trigger-id-invalid | 400 | invalid_argument | Client Trigger ID Invalid | The client trigger ID must be 1 to 36 bytes. |
| condition-flags-invalid | 400 | invalid_argument | Condition Flags Invalid | The trigger's condition sets an option its trigger type does not take. |
| condition-parameter-set | 400 | invalid_argument | Condition Parameter Set | The trigger's condition sets a parameter its trigger type does not use. |
| conflict-duplicate-client-order-id | 409 | already_exists | Conflict: Duplicate Client Order ID | Duplicate client order ID. |
| conflict-duplicate-client-trigger-id | 409 | already_exists | Conflict: Duplicate Client Trigger ID | Duplicate client trigger ID. |
| conflict-idempotency-key-reuse | 409 | already_exists | Conflict: Idempotency Key Reused | Idempotency key was already used with a different request payload. |
| dry-run-invalid | 400 | invalid_argument | Dry Run Invalid | The dry-run flag must be 0 or 1. |
| duplicate-order-id | 409 | already_exists | Duplicate Order ID | The order identifier is already in use by another order. |
| empty-book | 400 | invalid_argument | Empty Book | Market order cannot execute because the book is empty. |
| fee-asset-invalid | 400 | invalid_argument | Fee Asset Invalid | The trigger's fee asset is not a supported fee asset. |
| fee-asset-not-allowed | 400 | invalid_argument | Fee Source Not Allowed | Fee source not permitted for this pair/side. |
| fee-ceiling-invalid | 400 | invalid_argument | Fee Ceiling Invalid | The trigger's maximum fee rate is not valid. |
| fee-schedule-unavailable | 503 | unavailable | Fee Schedule Unavailable | The market's fees cannot be determined right now; retry later. |
| fok-insufficient-liquidity | 400 | invalid_argument | FOK Insufficient Liquidity | FOK order cannot be fully filled with available liquidity. |
| gateway-misconfigured | 500 | internal | Gateway Misconfigured | The trading gateway is misconfigured for its order service. Retrying does not help; contact support. |
| insufficient-funds | 400 | invalid_argument | Insufficient Funds | Insufficient funds. |
| intent-id-invalid | 400 | invalid_argument | Intent ID Invalid | The cancel-all intent identifier must not be zero. |
| internal-error | 500 | internal | Internal Error | Internal error. |
| invalid-argument | 400 | invalid_argument | Invalid Argument | Invalid argument. |
| invalid-client-order-id | 400 | invalid_argument | Invalid Client Order ID | The client order ID is not valid. |
| invalid-handling-mode | 400 | invalid_argument | Invalid Handling Mode | The order handling mode is not valid. |
| invalid-modify-behavior | 400 | invalid_argument | Invalid Modify Behavior | The modify behavior is not valid. |
| invalid-order-flags | 400 | invalid_argument | Invalid Order Flags | The order flags are not valid for this order. |
| invalid-order-id | 400 | invalid_argument | Invalid Order ID | The order identifier or the replacement order identifier is not valid. |
| invalid-order-type | 400 | invalid_argument | Invalid Order Type | The order type is not valid. |
| invalid-side | 400 | invalid_argument | Invalid Side | The order side is not valid. |
| invalid-stp-mode | 400 | invalid_argument | Invalid Self-Trade Prevention Mode | The self-trade prevention mode is not valid. |
| invalid-time-in-force | 400 | invalid_argument | Invalid Time In Force | The time in force, or its expiry, is not accepted for this order. |
| invalid-trigger-control | 400 | invalid_argument | Invalid Trigger Control | The trigger operation is not valid. |
| invalid-trigger-type | 400 | invalid_argument | Invalid Trigger Type | The trigger type is not valid. |
| ladder-levels-invalid | 400 | invalid_argument | Ladder Levels Invalid | A ladder places from 2 to 100 orders. |
| ladder-level-rejected | 400 | invalid_argument | Ladder Level Rejected | One of the ladder's orders can't be placed, so the ladder was not created. Nothing changed. |
| ladder-range-too-narrow | 400 | invalid_argument | Ladder Range Too Narrow | The ladder's price range is too narrow to place its orders at least one price tick apart. |
| limit-child-slippage-set | 400 | invalid_argument | Limit Child Slippage Set | A TWAP of LIMIT slices takes no slippage bound. |
| market-cap-violation | 400 | invalid_argument | Market Cap Violation | Order violates market-cap limits. |
| market-halted | 400 | invalid_argument | Market Halted | Market is halted. |
| market-ladder-limit-exceeded | 429 | resource_exhausted | Market Ladder Limit Exceeded | The account has its maximum number of ladder orders on this market; retry once one of them ends. |
| market-price-unavailable | 400 | failed_precondition | Market Price Unavailable | Cannot price this MARKET order because no reference price is available. |
| market-quote-stale | 400 | failed_precondition | Market Quote Stale | The market's reference quote is too old to price this market order; send a reference price or retry. |
| market-quote-unhealthy | 400 | failed_precondition | Market Quote Unhealthy | The market's reference quote cannot be used to price this market order; send a reference price or retry. |
| market-trigger-limit-exceeded | 429 | resource_exhausted | Market Trigger Limit Exceeded | The account has its maximum number of triggers on this market; retry once one of them ends. |
| market-twap-limit-exceeded | 429 | resource_exhausted | Market TWAP Limit Exceeded | The account has its maximum number of TWAP orders on this market; retry once one of them ends. |
| max-notional | 400 | invalid_argument | Max Notional | Order notional is above the maximum allowed for this pair. |
| max-open-orders-per-pair | 400 | invalid_argument | Max Open Orders Per Pair | The account has reached its maximum number of resting orders in this market; cancel one first, or send an immediate-or-cancel order. |
| max-open-orders-total | 400 | invalid_argument | Max Open Orders | The account has reached its maximum number of open orders. |
| max-qty | 400 | invalid_argument | Max Quantity | Order quantity is above the maximum allowed for this pair. |
| max-quote-debit-too-small | 400 | invalid_argument | Max Quote Debit Too Small | Max quote debit is too small to resolve one valid order step. |
| max-slippage-invalid | 400 | invalid_argument | Max Slippage Invalid | Maximum slippage is invalid. |
| min-notional | 400 | invalid_argument | Min Notional | Order notional is below the minimum allowed. |
| min-qty | 400 | invalid_argument | Min Quantity | Order quantity is below the minimum allowed. |
| modification-requires-replace | 400 | invalid_argument | Modification Requires Replace | Modify request in AMEND_ONLY mode requires replace semantics. |
| new-account-capacity-reached | 429 | resource_exhausted | New Account Capacity Reached | The venue cannot admit a new account to this market right now; retry later. |
| not-found | 404 | not_found | Not Found | Not found. |
| order-already-terminal | 400 | failed_precondition | Order Already Terminal | The order has already ended (filled, canceled or expired). |
| order-cancel-outcome-unknown | 504 | deadline_exceeded | Order Cancel Outcome Unknown | The order cancellation was not confirmed in time and may still apply; read the order to see whether it applied. For a batch, read back every item; for a cancel all, read open orders; for a cancel all after heartbeat, send it again. |
| order-create-outcome-unknown | 504 | deadline_exceeded | Order Create Outcome Unknown | The order was not confirmed in time and may have been accepted; read it by its client order ID, or read open orders, before retrying. For a batch, read back every item, or retry it with the same request ID and payload within 15 minutes; no item is admitted twice. |
| order-id-conflict | 409 | already_exists | Order ID Conflict | The order identifier is held by a different order. |
| order-limits-unavailable | 400 | failed_precondition | Order Limits Unavailable | This market's order limits aren't set yet, so it can't take new orders. |
| order-modify-in-progress | 503 | unavailable | Order Modify In Progress | An earlier modification of the order is still in progress; retry once it completes. |
| order-modify-outcome-unknown | 504 | deadline_exceeded | Order Modify Outcome Unknown | The order modification was not confirmed in time and may still apply; read the order to see whether it applied. For a batch, read back every item. |
| order-placement-pending | 503 | unavailable | Order Placement Pending | The order's placement has not completed yet; retry shortly. |
| order-repairing | 400 | failed_precondition | Order Repairing | This order is being canceled while the account's balances are brought back in line, so it can't be changed. Nothing changed; cancels still work, and the account's other orders can still be changed. |
| order-sequence-exhausted | 429 | resource_exhausted | Order Sequence Exhausted | The account cannot place more orders in this market; contact support. |
| order-type-not-allowed-in-auction | 400 | failed_precondition | Order Type Not Allowed In Auction | This market is in an auction call and takes only limit orders that rest without crossing the book; market, immediate-or-cancel and fill-or-kill orders are refused. Nothing changed. |
| order-unknown | 404 | not_found | Order Unknown | Order not found. |
| overloaded | 503 | resource_exhausted | Service Overloaded | Too many order requests are in flight for this account; retry after one completes. |
| pair-backlogged | 503 | unavailable | Pair Backlogged | The trading pair is busy with earlier orders; retry shortly. |
| pair-cancel-only | 400 | invalid_argument | Pair Cancel Only | Pair is in cancel-only mode; only cancellations are allowed. |
| pair-delisted | 400 | invalid_argument | Pair Delisted | Pair has been delisted. |
| pair-disabled | 400 | invalid_argument | Pair Disabled | Pair is temporarily disabled. |
| pair-not-listed-yet | 400 | invalid_argument | Pair Not Listed Yet | Pair is not listed yet. |
| pair-post-only | 400 | invalid_argument | Pair Post Only | Pair is in post-only mode; submit with post_only=true. |
| pair-reduce-only | 400 | invalid_argument | Pair Reduce Only | Pair is in reduce-only mode; new spot orders are not allowed. |
| permission-denied | 403 | permission_denied | Permission Denied | Permission denied. |
| policy-market-deny | 403 | permission_denied | Policy Market Deny | Sub-account policy does not allow trading this pair. |
| policy-max-notional | 400 | invalid_argument | Policy Max Notional | Order notional exceeds the maximum allowed for this sub-account. |
| policy-max-open-orders | 400 | invalid_argument | Policy Max Open Orders | Sub-account policy maximum number of open orders has been reached. |
| policy-spot-read-deny | 403 | permission_denied | Spot Read Denied | Effective policy does not allow reading spot data for this API key or sub-account. |
| policy-spot-trade-deny | 403 | permission_denied | Spot Trading Denied | Effective policy does not allow spot trading for this API key or sub-account. |
| policy-trading-halted | 403 | permission_denied | Trading Halted | Trading is halted for this sub-account. |
| policy-unavailable | 503 | unavailable | Policy Unavailable | The account's trading policy cannot be evaluated right now; retry later. |
| post-only-cross | 400 | invalid_argument | Post-Only Cross | Post-only order would cross the book. |
| post-only-limit-only | 400 | invalid_argument | Post-Only Limit Only | Post-only is only supported for LIMIT orders. |
| post-only-not-allowed-in-auction | 400 | failed_precondition | Post Only Not Allowed In Auction | This market is in an auction call; new post-only orders are refused. Nothing changed. |
| price-band-violation | 400 | invalid_argument | Price Band Violation | Order price violates price band limits. |
| price-levels-exhausted | 429 | resource_exhausted | Price Levels Exhausted | The market holds its maximum number of price levels; use a price that already has resting orders, or retry later. |
| price-level-quantity-limit | 400 | failed_precondition | Price Level Quantity Limit | The order would take the total quantity resting at its price past the most a price level can hold. Nothing changed: a new order was not placed, and a modified order keeps resting as it was. Use another price or a smaller quantity, or retry once less quantity rests at this price. |
| price-tick-size | 400 | invalid_argument | Price Tick Size | Price must align with the tick size. |
| qty-at-or-below-filled | 400 | failed_precondition | Quantity At Or Below Filled | The new quantity is at or below the filled quantity; the order ended at its filled quantity and no replacement was created. |
| qty-step-size | 400 | invalid_argument | Quantity Step Size | Quantity must align with the step size. |
| quickswap-account-owner-unknown | 503 | unavailable | QuickSwap Account Not Ready | The QuickSwap account is not ready yet; no order was placed. Retry shortly. |
| quickswap-attached-risk-not-allowed | 400 | invalid_argument | QuickSwap Attached Risk Not Allowed | QuickSwap orders can't carry take-profit or stop-loss legs. |
| quickswap-broker-account-unavailable | 503 | unavailable | QuickSwap Broker Account Unavailable | The broker's fee account isn't available yet; retry shortly. |
| quickswap-broker-fee-terms-invalid | 400 | failed_precondition | QuickSwap Broker Fee Terms Invalid | The broker fee terms are invalid and can't be used. |
| quickswap-broker-fee-terms-mismatch | 400 | invalid_argument | QuickSwap Broker Fee Terms Mismatch | The broker fee terms belong to another broker. |
| quickswap-broker-fee-terms-unavailable | 503 | unavailable | QuickSwap Broker Fee Terms Unavailable | The broker fee terms aren't available yet; retry shortly. |
| quickswap-broker-invalid | 400 | failed_precondition | QuickSwap Broker Invalid | The broker's QuickSwap setup is invalid and can't be used. |
| quickswap-capacity-reached | 429 | resource_exhausted | QuickSwap Capacity Reached | QuickSwap's capacity for fee settings is reached; this order can't be placed. |
| quickswap-disabled | 400 | failed_precondition | QuickSwap Disabled | QuickSwap isn't enabled for this account's trading. |
| quickswap-fee-details-incomplete | 400 | invalid_argument | QuickSwap Fee Details Incomplete | The request's QuickSwap fee details are incomplete: a fee schedule needs a broker, and a broker or broker fee terms need a fee schedule. |
| quickswap-fee-recipient-is-payer | 400 | invalid_argument | QuickSwap Fee Recipient Is Payer | A QuickSwap fee would be paid into the account placing the order. |
| quickswap-fee-schedule-invalid | 400 | failed_precondition | QuickSwap Fee Schedule Invalid | The QuickSwap fee schedule is invalid and can't be used. |
| quickswap-fee-total-too-high | 400 | failed_precondition | QuickSwap Fee Total Too High | The QuickSwap fees together would exceed the order's value. |
| quickswap-market-fee-invalid | 400 | failed_precondition | QuickSwap Market Fee Invalid | The QuickSwap fee for this market is invalid and can't be used. |
| quickswap-market-not-priced | 400 | failed_precondition | QuickSwap Market Not Priced | The requested QuickSwap fee schedule doesn't price this market. |
| quickswap-not-permitted | 403 | permission_denied | QuickSwap Not Permitted | QuickSwap is not available for this request. |
| quickswap-order-not-modifiable | 400 | failed_precondition | QuickSwap Order Not Modifiable | QuickSwap orders can't be amended or replaced. |
| quickswap-setup-invalid | 400 | failed_precondition | QuickSwap Setup Invalid | QuickSwap's setup is invalid, so QuickSwap orders can't be placed. |
| rate-limit-exceeded | 429 | resource_exhausted | Rate Limit Exceeded | Order-admission rate limit exceeded. |
| rate-limit-policy-unavailable | 503 | unavailable | Rate Limit Policy Unavailable | The account's rate limits cannot be evaluated right now; retry later. |
| reduce-only-blocked | 400 | invalid_argument | Reduce-Only Blocked | Order is blocked by reduce-only constraints. |
| replace-onto-own-id | 400 | invalid_argument | Replace Onto Own ID | A replacement order cannot reuse the order identifier it replaces. |
| request-receipts-exhausted | 429 | resource_exhausted | Request Receipts Exhausted | The account has too many recent modify or batch requests; retry shortly. |
| request-too-large | 413 | invalid_argument | Request Too Large | Request body too large. |
| reservation-capacity-reached | 429 | resource_exhausted | Reservation Capacity Reached | The venue cannot reserve funds for another trigger right now; retry later. |
| risk-limit | 400 | invalid_argument | Risk Limit Exceeded | Order would exceed account risk limits. |
| role-spot-trade-deny | 403 | permission_denied | Spot Trading Role Denied | Your role on this sub-account is read-only for spot trading. |
| self-trade-prevented | 400 | failed_precondition | Self-Trade Prevented | Self-trade prevention expired the attached take-profit, stop-loss or trailing stop order because it would have traded with another of the account's resting orders. The attached order stays active and fires again at a new trade at or beyond its trigger price, or once the other order is no longer at the best price. |
| settlement-backlogged | 503 | unavailable | Settlement Backlogged | The account has too many filled orders still settling. Nothing changed; retry once settlement catches up. |
| slippage-bounds-conflict | 400 | invalid_argument | Slippage Bounds Conflict | Give the slippage bound either in ticks or in basis points, not both. |
| slippage-bps-invalid | 400 | invalid_argument | Slippage Basis Points Invalid | The slippage bound in basis points is not valid. |
| slippage-ticks-invalid | 400 | invalid_argument | Slippage Ticks Invalid | The slippage bound in ticks is not valid. |
| stale-quote | 400 | failed_precondition | Stale Quote | Client reference price is stale relative to server market data. |
| stp-mode-not-allowed | 400 | invalid_argument | Self-Trade Prevention Mode Not Allowed | The self-trade prevention mode is not accepted. |
| subaccount-inactive | 400 | failed_precondition | Sub-account Inactive | Sub-account is inactive (disabled or deleted). |
| system-rate-limited | 429 | resource_exhausted | System Rate Limited | The venue's admission capacity is exhausted right now; retry shortly. |
| trailing-child-not-market | 400 | invalid_argument | Trailing Child Not Market | A trailing stop's child order must be a MARKET order. |
| trailing-distance-invalid | 400 | invalid_argument | Trailing Distance Invalid | Trailing stop distance is invalid. |
| trailing-side-not-supported | 400 | invalid_argument | Trailing Side Not Supported | A standalone trailing stop must sell; attached trailing stops take the side opposite their parent. |
| trailing-stop-order-type-unsupported | 400 | invalid_argument | Trailing Stop Order Type Unsupported | Trailing stop attached to an order only supports MARKET child orders in v1. |
| trigger-activation-price-invalid | 400 | invalid_argument | Trigger Activation Price Invalid | The trailing trigger's activation price is not valid. |
| trigger-buy-requires-limit | 400 | invalid_argument | Trigger Buy Requires Limit | A buy trigger's child order must be a LIMIT order. |
| trigger-capacity-reached | 429 | resource_exhausted | Trigger Capacity Reached | The venue holds its maximum number of triggers right now; retry later. |
| trigger-child-price-not-modifiable | 400 | invalid_argument | Trigger Child Price Not Modifiable | The trigger's child order price cannot be modified. |
| trigger-controls-busy | 503 | unavailable | Trigger Controls Busy | The venue is busy with other trigger changes; retry shortly. |
| trigger-control-in-progress | 503 | unavailable | Trigger Control In Progress | An earlier change of the trigger is still in progress; retry once it completes. |
| trigger-control-outcome-unknown | 504 | deadline_exceeded | Trigger Control Outcome Unknown | The trigger change was not confirmed in time; read the trigger to see whether it applied. |
| trigger-control-share-exhausted | 429 | resource_exhausted | Trigger Control Share Exhausted | The account has too many unanswered trigger changes; retry shortly. |
| trigger-create-outcome-unknown | 504 | deadline_exceeded | Trigger Create Outcome Unknown | The trigger was not confirmed in time and may have been created; read the triggers for its client trigger ID before retrying. |
| trigger-direction-invalid | 400 | invalid_argument | Trigger Direction Invalid | The trigger direction must be ABOVE or BELOW. |
| trigger-fire-limit-reached | 429 | resource_exhausted | Trigger Fire Limit Reached | The trigger could not fire again on this market. Create a new trigger. |
| trigger-generations-exhausted | 400 | failed_precondition | Trigger Generations Exhausted | The trigger cannot be changed again; cancel it and create a new one. |
| trigger-limit-exceeded | 429 | resource_exhausted | Trigger Limit Exceeded | The account has its maximum number of triggers. |
| trigger-not-found | 404 | not_found | Trigger Not Found | Trigger not found. |
| trigger-not-modifiable | 400 | invalid_argument | Trigger Not Modifiable | Trigger does not support this lifecycle operation. |
| trigger-patch-empty | 400 | invalid_argument | Trigger Patch Empty | The trigger modification changes nothing. |
| trigger-patch-field-unknown | 400 | invalid_argument | Trigger Patch Field Unknown | The trigger modification names an unknown field. |
| trigger-patch-not-allowed | 400 | invalid_argument | Trigger Patch Not Allowed | Only a trigger modification may carry changes. |
| trigger-patch-price-mode-invalid | 400 | invalid_argument | Trigger Patch Price Mode Invalid | The trigger modification's price mode is not valid. |
| trigger-patch-value-unmasked | 400 | invalid_argument | Trigger Patch Value Unmasked | The trigger modification sets a value for a field it does not name. |
| trigger-price-invalid | 400 | invalid_argument | Trigger Price Invalid | Trigger price is invalid. |
| trigger-price-source-unsupported | 400 | invalid_argument | Trigger Price Source Unsupported | Trigger price source not supported. |
| trigger-qty-invalid | 400 | invalid_argument | Trigger Quantity Invalid | The trigger's child order quantity must be positive. |
| trigger-status-invalid | 400 | invalid_argument | Trigger Status Invalid | Trigger cannot perform this action in its current status. |
| trigger-symbol-mismatch | 400 | invalid_argument | Trigger Symbol Mismatch | The request names a different listed trading pair from the trigger's own. Nothing changed; name the trigger's own pair, or omit the symbol. |
| trigger-type-not-supported | 400 | invalid_argument | Trigger Type Not Supported | This trigger type is not supported yet. |
| trigger-would-trigger-immediately | 400 | failed_precondition | Trigger Would Trigger Immediately | The trigger price is already reached by the price the trigger watches, so the trigger would fire at once. Nothing changed; choose a trigger price the market has not reached. |
| twap-capacity-reached | 429 | resource_exhausted | TWAP Capacity Reached | The market has no room for another TWAP order right now. Retry later. |
| twap-duration-invalid | 400 | invalid_argument | TWAP Duration Invalid | The TWAP duration must be at least 1 second and at most about 292 years. |
| twap-interval-invalid | 400 | invalid_argument | TWAP Interval Invalid | The TWAP slice interval must be at least 100 milliseconds and no longer than its duration. |
| unauthenticated | 401 | unauthenticated | Unauthenticated | Authentication required. |
| unavailable | 503 | unavailable | Service Unavailable | Service temporarily unavailable. |
| unknown-symbol | 400 | invalid_argument | Unknown Symbol | Unknown symbol. |
| unsupported-field-set | 400 | invalid_argument | Unsupported Field Set | The trigger set a field that must be left unset. |
| upstream-error | 502 | unavailable | Upstream Error | Upstream error. |
| validation-error | 400 | invalid_argument | Validation Error | Request validation failed. |