Reference Data
Market definitions, fee parameters, asset configuration, etc.
Canonical perp market definitions endpoint for perpOB. Replaces the removed AMM-era /marketDefinitions route.
List of perp market definitions
Trading symbol (e.g., BTCRUSDPERP, WETHRUSD)
BTCRUSDPERPPattern: ^[A-Za-z0-9]+$Numerical identifier for each market, only needed to generate signatures
10.001Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Minimum size increment
0.001Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Minimum price increment
0.01Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Minimum percentage of notional that needs to be covered to avoid liquidation procedures for a given market; below this value, your account is subject to liquidation procedures. When cross margining, all requirements across markets are covered by the same balance, and all positions are subject to liquidations.
0.05Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Minimum percentage of notional that needs to be covered post trade; if the account does not satisfy this requirement, trades will not get executed.
0.04Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Maximum leverage allowed
40Maximum one-sided open interest in units for a given market.
10000Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Whether first-party market discovery should display this market. False does not restrict API trading, permissions or account/history access.
Standardized error codes for API responses. Branch on error, not the free-text
message or HTTP status. Every venue rejection on REST uses HTTP 400 with a
RequestError body. The order-entry WebSocket returns the same code and optional
retryAfterMs in its { ok: false, error } response. HTTP 429 is reserved for
infrastructure-level (per-IP) limits in front of the API and is never a venue
verdict.
Validation and authorization:
INPUT_VALIDATION_ERROR: correct the request's fields or order-class combination before resubmitting. Immutable fields on a modify must match the existing order.SYMBOL_NOT_FOUND_ERROR,NO_ACCOUNTS_FOUND_ERROR: the requested market or account data is unavailable; check the request and current market/account state.NUMERIC_OVERFLOW_ERROR,PRICE_QTY_BOUNDS_ERROR: a numeric value is out of range, or price/quantity is invalid for the market. Check price increments and quantity limits.UNAUTHORIZED_SIGNATURE_ERROR: the signature is invalid or unauthorized.UNAUTHORIZED_ACCOUNT_ERROR: the signer is not permitted to act on the target order. For an armed protective stop, modify and cancel require the signer that created it.INVALID_NONCE_ERROR: use a fresh, monotonically increasing nonce for the signer and re-sign.ORDER_DEADLINE_PASSED_ERROR,ORDER_DEADLINE_TOO_HIGH_ERROR: the signature'sdeadlinehas passed or is too far in the future. Correct it and re-sign. This deadline controls request acceptance, not the lifetime of an accepted order.ORDER_EXPIRES_TOO_SOON_ERROR: a GTT order'sexpiresAfterleaves insufficient time for execution and settlement. Choose a later expiry and re-sign. GTT orders can be cancelled before their signed expiry to allow settlement; for a protective stop this applies to both its armed phase and its fired child.SERVICE_DISABLED_ERROR,TRADING_HALTED_ERROR: order entry is unavailable for the market. Check market availability before submitting again.DUPLICATE_CLIENT_ORDER_ID_ERROR: the client ID belongs to a live order. Reconcile that order before submitting another.ORDER_NOT_FOUND_ERROR: the target order was not found. Refresh its state before retrying.EMPTY_MODIFY_ERROR: a LIMIT modification makes no change. An armed trigger may be re-signed at unchanged prices.MODIFY_QTY_BELOW_FILLED_ERROR: the modified total quantity must exceed the quantity already filled.POST_ONLY_WOULD_CROSS_ERROR: the order would execute immediately. Choose a non-crossing price or change the post-only intent and re-sign.- The
*_OTHER_ERRORcodes are operation-specific failures without a more specific code. Usemessagefor display or troubleshooting; do not parse it as a stable machine-readable contract.
Pre-trade risk checks:
ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR: the account does not meet the required liquidation-margin or balance conditions.ACCOUNT_BELOW_INITIAL_MARGIN_ERROR: the proposed trade does not meet the account's initial-margin or collateral requirements. An account already below initial margin may trade only when the trade improves its health.INSUFFICIENT_BALANCE_ERROR: the account cannot fund the order.OPEN_INTEREST_CAP_ERROR,OPEN_INTEREST_BUDGET_ERROR: the trade exceeds the market's available open-interest capacity.REDUCE_ONLY_CONDITION_NOT_MET_ERROR: the order would not strictly reduce the current position, for example because there is no position, the side is wrong, or the size would reverse it.
A request refused by risk checks is rejected in full. A rejected create produces no
order; a rejected modify leaves the existing order unchanged. These failures require
a change in account or market state, a smaller order, more collateral, or a user
decision; do not automatically retry them unchanged. Resting-order cancellations
appear separately as cancelReason: RISK_CANCELLED. A protective stop whose child
fails risk checks is cancelled with RISK_REJECTED; see CancelReason.
Protective stops:
TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR: an IOC trigger cannot carryexpiresAfter. Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid time-in-force/expiry combinations can also returnINPUT_VALIDATION_ERROR. Correct the combination and re-sign.TRIGGER_LIMIT_OUTSIDE_BAND_ERROR: the stop'slimitPxis outside the permitted range aroundtriggerPx, or stops are unavailable for the market. Move the limit closer to the trigger and re-sign when the price is out of range. If the message indicates stops are unavailable, changing the price will not resolve it.TRIGGER_ALREADY_EXISTS_ERROR: the account already has an armed stop of the same type on that market. At most one stop-loss and one take-profit may be armed per account and market. Modify or cancel the existing stop before replacing it.
Rate limits and resting-order caps:
RATE_LIMITED_ERROR: the account's request budget for this operation is exhausted. Create and modify share a placement budget; single cancels, bulk cancels, and cancel-all-after control have separate budgets. Budgets are shared across markets, signers, REST, and WebSocket requests for the same account. Wait at leastretryAfterMsmilliseconds before retrying. This is a minimum wait, not a reserved request slot; concurrent traffic can use the available budget. Disarming an armed cancel-all-after countdown is never throttled. A disarm when no countdown is armed can be throttled.OPEN_ORDER_COUNT_EXCEEDED_ERROR: a new resting order would exceed the account's total or per-market resting-order count. Cancel orders or allow them to fill before placing more. Modifications do not increase the count.OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR: the account's combined resting-order notional would exceed its limit. Notional is remaining quantity multiplied by limit price for resting GTC/GTT orders. Creates are checked against the submitted quantity before any immediate fills; modifications are checked against the resulting notional. IOC orders and armed triggers are exempt; fired trigger children that rest count toward the limits. Cancel or shrink resting orders, or submit a smaller order.
Resting-order cap errors carry no retryAfterMs: waiting alone does not resolve
them. CAPACITY_LIMITED_ERROR means the venue temporarily cannot accept a create or
modify. It carries no retry hint; use backoff with jitter. Cancels and
cancel-all-after operations are not refused for venue capacity, though their
separate account rate limits still apply.
Temporary availability:
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR: an order that would execute immediately cannot currently pass the required pre-trade checks. Retry after a short delay. Existing resting orders remain in place; non-crossing orders and cancellations remain available.SERVICE_UNAVAILABLE_ERROR: the request was not accepted. Account-owner, signature or permission checks were unavailable before dispatch, or the transport did not send the request (including a full outbound queue). Re-sign with a fresh nonce and resubmit, retaining the sameclientOrderIdwhen supplied. Back off while the service remains unavailable. An unchanged nonce may already be below the signer's nonce floor because a later request was accepted.ORDER_OUTCOME_UNKNOWN_ERROR: the transport failed after the request may have reached the matching engine. The operation may have been applied. Reconcile open orders and executions before resubmitting; never replace an unresolved attempt with a fresh nonce. Retain the complete signed request, including operation, account, market/filter scope, nonce, and order identifiers. Responses do not provide an acceptance receipt or an outcome-query mechanism. Absence from open orders is not proof of failure: the order may have filled, and read data can lag. Executions correlate by order/fill IDs, not request nonces. Insufficient or ambiguous evidence remains unresolved. ForcancelAllAfter, open orders do not establish whether a timer was armed, refreshed, or disarmed.
Permission errors such as NOT_WHITELISTED_ERROR and ACCOUNT_SUSPENDED_ERROR are
not resolved by automatic retries. Contact support if an expected operation is
refused.
Retry policy: retry unchanged after a short delay for
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR; re-sign with a fresh nonce for
SERVICE_UNAVAILABLE_ERROR; reconcile first for
ORDER_OUTCOME_UNKNOWN_ERROR; retry
RATE_LIMITED_ERROR after at least retryAfterMs; retry CAPACITY_LIMITED_ERROR
using backoff with jitter. Correct validation failures and re-sign where required.
Reconcile order state before retrying an unanswered request, because a transport
timeout or disconnect does not establish that the request was rejected.
Internal server error
GET /v2/perpMarketDefinitions HTTP/1.1
Accept: */*
[
{
"symbol": "BTCRUSDPERP",
"marketId": 1,
"minOrderQty": "0.001",
"qtyStepSize": "0.001",
"tickSize": "0.01",
"liquidationMarginParameter": "0.05",
"initialMarginParameter": "0.04",
"maxLeverage": 40,
"oiCap": "10000",
"uiVisible": true,
"ANY_ADDITIONAL_PROPERTY": "anything"
}
]List of spot market definitions
Trading symbol (e.g., BTCRUSDPERP, WETHRUSD)
BTCRUSDPERPPattern: ^[A-Za-z0-9]+$Numerical identifier for each spot market
1Base asset symbol
ETHQuote asset symbol
RUSDMinimum order quantity (base asset)
0.001Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Minimum size increment (base asset)
0.001Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Minimum price increment
0.01Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Standardized error codes for API responses. Branch on error, not the free-text
message or HTTP status. Every venue rejection on REST uses HTTP 400 with a
RequestError body. The order-entry WebSocket returns the same code and optional
retryAfterMs in its { ok: false, error } response. HTTP 429 is reserved for
infrastructure-level (per-IP) limits in front of the API and is never a venue
verdict.
Validation and authorization:
INPUT_VALIDATION_ERROR: correct the request's fields or order-class combination before resubmitting. Immutable fields on a modify must match the existing order.SYMBOL_NOT_FOUND_ERROR,NO_ACCOUNTS_FOUND_ERROR: the requested market or account data is unavailable; check the request and current market/account state.NUMERIC_OVERFLOW_ERROR,PRICE_QTY_BOUNDS_ERROR: a numeric value is out of range, or price/quantity is invalid for the market. Check price increments and quantity limits.UNAUTHORIZED_SIGNATURE_ERROR: the signature is invalid or unauthorized.UNAUTHORIZED_ACCOUNT_ERROR: the signer is not permitted to act on the target order. For an armed protective stop, modify and cancel require the signer that created it.INVALID_NONCE_ERROR: use a fresh, monotonically increasing nonce for the signer and re-sign.ORDER_DEADLINE_PASSED_ERROR,ORDER_DEADLINE_TOO_HIGH_ERROR: the signature'sdeadlinehas passed or is too far in the future. Correct it and re-sign. This deadline controls request acceptance, not the lifetime of an accepted order.ORDER_EXPIRES_TOO_SOON_ERROR: a GTT order'sexpiresAfterleaves insufficient time for execution and settlement. Choose a later expiry and re-sign. GTT orders can be cancelled before their signed expiry to allow settlement; for a protective stop this applies to both its armed phase and its fired child.SERVICE_DISABLED_ERROR,TRADING_HALTED_ERROR: order entry is unavailable for the market. Check market availability before submitting again.DUPLICATE_CLIENT_ORDER_ID_ERROR: the client ID belongs to a live order. Reconcile that order before submitting another.ORDER_NOT_FOUND_ERROR: the target order was not found. Refresh its state before retrying.EMPTY_MODIFY_ERROR: a LIMIT modification makes no change. An armed trigger may be re-signed at unchanged prices.MODIFY_QTY_BELOW_FILLED_ERROR: the modified total quantity must exceed the quantity already filled.POST_ONLY_WOULD_CROSS_ERROR: the order would execute immediately. Choose a non-crossing price or change the post-only intent and re-sign.- The
*_OTHER_ERRORcodes are operation-specific failures without a more specific code. Usemessagefor display or troubleshooting; do not parse it as a stable machine-readable contract.
Pre-trade risk checks:
ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR: the account does not meet the required liquidation-margin or balance conditions.ACCOUNT_BELOW_INITIAL_MARGIN_ERROR: the proposed trade does not meet the account's initial-margin or collateral requirements. An account already below initial margin may trade only when the trade improves its health.INSUFFICIENT_BALANCE_ERROR: the account cannot fund the order.OPEN_INTEREST_CAP_ERROR,OPEN_INTEREST_BUDGET_ERROR: the trade exceeds the market's available open-interest capacity.REDUCE_ONLY_CONDITION_NOT_MET_ERROR: the order would not strictly reduce the current position, for example because there is no position, the side is wrong, or the size would reverse it.
A request refused by risk checks is rejected in full. A rejected create produces no
order; a rejected modify leaves the existing order unchanged. These failures require
a change in account or market state, a smaller order, more collateral, or a user
decision; do not automatically retry them unchanged. Resting-order cancellations
appear separately as cancelReason: RISK_CANCELLED. A protective stop whose child
fails risk checks is cancelled with RISK_REJECTED; see CancelReason.
Protective stops:
TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR: an IOC trigger cannot carryexpiresAfter. Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid time-in-force/expiry combinations can also returnINPUT_VALIDATION_ERROR. Correct the combination and re-sign.TRIGGER_LIMIT_OUTSIDE_BAND_ERROR: the stop'slimitPxis outside the permitted range aroundtriggerPx, or stops are unavailable for the market. Move the limit closer to the trigger and re-sign when the price is out of range. If the message indicates stops are unavailable, changing the price will not resolve it.TRIGGER_ALREADY_EXISTS_ERROR: the account already has an armed stop of the same type on that market. At most one stop-loss and one take-profit may be armed per account and market. Modify or cancel the existing stop before replacing it.
Rate limits and resting-order caps:
RATE_LIMITED_ERROR: the account's request budget for this operation is exhausted. Create and modify share a placement budget; single cancels, bulk cancels, and cancel-all-after control have separate budgets. Budgets are shared across markets, signers, REST, and WebSocket requests for the same account. Wait at leastretryAfterMsmilliseconds before retrying. This is a minimum wait, not a reserved request slot; concurrent traffic can use the available budget. Disarming an armed cancel-all-after countdown is never throttled. A disarm when no countdown is armed can be throttled.OPEN_ORDER_COUNT_EXCEEDED_ERROR: a new resting order would exceed the account's total or per-market resting-order count. Cancel orders or allow them to fill before placing more. Modifications do not increase the count.OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR: the account's combined resting-order notional would exceed its limit. Notional is remaining quantity multiplied by limit price for resting GTC/GTT orders. Creates are checked against the submitted quantity before any immediate fills; modifications are checked against the resulting notional. IOC orders and armed triggers are exempt; fired trigger children that rest count toward the limits. Cancel or shrink resting orders, or submit a smaller order.
Resting-order cap errors carry no retryAfterMs: waiting alone does not resolve
them. CAPACITY_LIMITED_ERROR means the venue temporarily cannot accept a create or
modify. It carries no retry hint; use backoff with jitter. Cancels and
cancel-all-after operations are not refused for venue capacity, though their
separate account rate limits still apply.
Temporary availability:
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR: an order that would execute immediately cannot currently pass the required pre-trade checks. Retry after a short delay. Existing resting orders remain in place; non-crossing orders and cancellations remain available.SERVICE_UNAVAILABLE_ERROR: the request was not accepted. Account-owner, signature or permission checks were unavailable before dispatch, or the transport did not send the request (including a full outbound queue). Re-sign with a fresh nonce and resubmit, retaining the sameclientOrderIdwhen supplied. Back off while the service remains unavailable. An unchanged nonce may already be below the signer's nonce floor because a later request was accepted.ORDER_OUTCOME_UNKNOWN_ERROR: the transport failed after the request may have reached the matching engine. The operation may have been applied. Reconcile open orders and executions before resubmitting; never replace an unresolved attempt with a fresh nonce. Retain the complete signed request, including operation, account, market/filter scope, nonce, and order identifiers. Responses do not provide an acceptance receipt or an outcome-query mechanism. Absence from open orders is not proof of failure: the order may have filled, and read data can lag. Executions correlate by order/fill IDs, not request nonces. Insufficient or ambiguous evidence remains unresolved. ForcancelAllAfter, open orders do not establish whether a timer was armed, refreshed, or disarmed.
Permission errors such as NOT_WHITELISTED_ERROR and ACCOUNT_SUSPENDED_ERROR are
not resolved by automatic retries. Contact support if an expected operation is
refused.
Retry policy: retry unchanged after a short delay for
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR; re-sign with a fresh nonce for
SERVICE_UNAVAILABLE_ERROR; reconcile first for
ORDER_OUTCOME_UNKNOWN_ERROR; retry
RATE_LIMITED_ERROR after at least retryAfterMs; retry CAPACITY_LIMITED_ERROR
using backoff with jitter. Correct validation failures and re-sign where required.
Reconcile order state before retrying an unanswered request, because a transport
timeout or disconnect does not establish that the request was rejected.
Internal server error
GET /v2/spotMarketDefinitions HTTP/1.1
Accept: */*
[
{
"symbol": "BTCRUSDPERP",
"marketId": 1,
"baseAsset": "ETH",
"quoteAsset": "RUSD",
"minOrderQty": "0.001",
"qtyStepSize": "0.001",
"tickSize": "0.01",
"ANY_ADDITIONAL_PROPERTY": "anything"
}
]List of asset definitions
WSTETHPattern: ^[A-Za-z0-9]+$Trading symbol (e.g., BTCRUSDPERP, WETHRUSD)
BTCRUSDPERPPattern: ^[A-Za-z0-9]+$Notional discount to the value of a collateral when used to satisfy the margin requirements; it does not imply any token conversion, but is rather an accounting adjustment.
0.05Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Discount in the token price when liquidating collateral.
0.03Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Status of asset (ENABLED = deposits and withdrawals allowed, WITHDRAWAL_ONLY = only withdrawals allowed)
ENABLEDPossible values: Number of decimal places for record keeping amounts of this asset (e.g. 18 for ETH, 6 for RUSD)
18Number of decimal places shown for display purposes in frontends
4Standardized error codes for API responses. Branch on error, not the free-text
message or HTTP status. Every venue rejection on REST uses HTTP 400 with a
RequestError body. The order-entry WebSocket returns the same code and optional
retryAfterMs in its { ok: false, error } response. HTTP 429 is reserved for
infrastructure-level (per-IP) limits in front of the API and is never a venue
verdict.
Validation and authorization:
INPUT_VALIDATION_ERROR: correct the request's fields or order-class combination before resubmitting. Immutable fields on a modify must match the existing order.SYMBOL_NOT_FOUND_ERROR,NO_ACCOUNTS_FOUND_ERROR: the requested market or account data is unavailable; check the request and current market/account state.NUMERIC_OVERFLOW_ERROR,PRICE_QTY_BOUNDS_ERROR: a numeric value is out of range, or price/quantity is invalid for the market. Check price increments and quantity limits.UNAUTHORIZED_SIGNATURE_ERROR: the signature is invalid or unauthorized.UNAUTHORIZED_ACCOUNT_ERROR: the signer is not permitted to act on the target order. For an armed protective stop, modify and cancel require the signer that created it.INVALID_NONCE_ERROR: use a fresh, monotonically increasing nonce for the signer and re-sign.ORDER_DEADLINE_PASSED_ERROR,ORDER_DEADLINE_TOO_HIGH_ERROR: the signature'sdeadlinehas passed or is too far in the future. Correct it and re-sign. This deadline controls request acceptance, not the lifetime of an accepted order.ORDER_EXPIRES_TOO_SOON_ERROR: a GTT order'sexpiresAfterleaves insufficient time for execution and settlement. Choose a later expiry and re-sign. GTT orders can be cancelled before their signed expiry to allow settlement; for a protective stop this applies to both its armed phase and its fired child.SERVICE_DISABLED_ERROR,TRADING_HALTED_ERROR: order entry is unavailable for the market. Check market availability before submitting again.DUPLICATE_CLIENT_ORDER_ID_ERROR: the client ID belongs to a live order. Reconcile that order before submitting another.ORDER_NOT_FOUND_ERROR: the target order was not found. Refresh its state before retrying.EMPTY_MODIFY_ERROR: a LIMIT modification makes no change. An armed trigger may be re-signed at unchanged prices.MODIFY_QTY_BELOW_FILLED_ERROR: the modified total quantity must exceed the quantity already filled.POST_ONLY_WOULD_CROSS_ERROR: the order would execute immediately. Choose a non-crossing price or change the post-only intent and re-sign.- The
*_OTHER_ERRORcodes are operation-specific failures without a more specific code. Usemessagefor display or troubleshooting; do not parse it as a stable machine-readable contract.
Pre-trade risk checks:
ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR: the account does not meet the required liquidation-margin or balance conditions.ACCOUNT_BELOW_INITIAL_MARGIN_ERROR: the proposed trade does not meet the account's initial-margin or collateral requirements. An account already below initial margin may trade only when the trade improves its health.INSUFFICIENT_BALANCE_ERROR: the account cannot fund the order.OPEN_INTEREST_CAP_ERROR,OPEN_INTEREST_BUDGET_ERROR: the trade exceeds the market's available open-interest capacity.REDUCE_ONLY_CONDITION_NOT_MET_ERROR: the order would not strictly reduce the current position, for example because there is no position, the side is wrong, or the size would reverse it.
A request refused by risk checks is rejected in full. A rejected create produces no
order; a rejected modify leaves the existing order unchanged. These failures require
a change in account or market state, a smaller order, more collateral, or a user
decision; do not automatically retry them unchanged. Resting-order cancellations
appear separately as cancelReason: RISK_CANCELLED. A protective stop whose child
fails risk checks is cancelled with RISK_REJECTED; see CancelReason.
Protective stops:
TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR: an IOC trigger cannot carryexpiresAfter. Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid time-in-force/expiry combinations can also returnINPUT_VALIDATION_ERROR. Correct the combination and re-sign.TRIGGER_LIMIT_OUTSIDE_BAND_ERROR: the stop'slimitPxis outside the permitted range aroundtriggerPx, or stops are unavailable for the market. Move the limit closer to the trigger and re-sign when the price is out of range. If the message indicates stops are unavailable, changing the price will not resolve it.TRIGGER_ALREADY_EXISTS_ERROR: the account already has an armed stop of the same type on that market. At most one stop-loss and one take-profit may be armed per account and market. Modify or cancel the existing stop before replacing it.
Rate limits and resting-order caps:
RATE_LIMITED_ERROR: the account's request budget for this operation is exhausted. Create and modify share a placement budget; single cancels, bulk cancels, and cancel-all-after control have separate budgets. Budgets are shared across markets, signers, REST, and WebSocket requests for the same account. Wait at leastretryAfterMsmilliseconds before retrying. This is a minimum wait, not a reserved request slot; concurrent traffic can use the available budget. Disarming an armed cancel-all-after countdown is never throttled. A disarm when no countdown is armed can be throttled.OPEN_ORDER_COUNT_EXCEEDED_ERROR: a new resting order would exceed the account's total or per-market resting-order count. Cancel orders or allow them to fill before placing more. Modifications do not increase the count.OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR: the account's combined resting-order notional would exceed its limit. Notional is remaining quantity multiplied by limit price for resting GTC/GTT orders. Creates are checked against the submitted quantity before any immediate fills; modifications are checked against the resulting notional. IOC orders and armed triggers are exempt; fired trigger children that rest count toward the limits. Cancel or shrink resting orders, or submit a smaller order.
Resting-order cap errors carry no retryAfterMs: waiting alone does not resolve
them. CAPACITY_LIMITED_ERROR means the venue temporarily cannot accept a create or
modify. It carries no retry hint; use backoff with jitter. Cancels and
cancel-all-after operations are not refused for venue capacity, though their
separate account rate limits still apply.
Temporary availability:
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR: an order that would execute immediately cannot currently pass the required pre-trade checks. Retry after a short delay. Existing resting orders remain in place; non-crossing orders and cancellations remain available.SERVICE_UNAVAILABLE_ERROR: the request was not accepted. Account-owner, signature or permission checks were unavailable before dispatch, or the transport did not send the request (including a full outbound queue). Re-sign with a fresh nonce and resubmit, retaining the sameclientOrderIdwhen supplied. Back off while the service remains unavailable. An unchanged nonce may already be below the signer's nonce floor because a later request was accepted.ORDER_OUTCOME_UNKNOWN_ERROR: the transport failed after the request may have reached the matching engine. The operation may have been applied. Reconcile open orders and executions before resubmitting; never replace an unresolved attempt with a fresh nonce. Retain the complete signed request, including operation, account, market/filter scope, nonce, and order identifiers. Responses do not provide an acceptance receipt or an outcome-query mechanism. Absence from open orders is not proof of failure: the order may have filled, and read data can lag. Executions correlate by order/fill IDs, not request nonces. Insufficient or ambiguous evidence remains unresolved. ForcancelAllAfter, open orders do not establish whether a timer was armed, refreshed, or disarmed.
Permission errors such as NOT_WHITELISTED_ERROR and ACCOUNT_SUSPENDED_ERROR are
not resolved by automatic retries. Contact support if an expected operation is
refused.
Retry policy: retry unchanged after a short delay for
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR; re-sign with a fresh nonce for
SERVICE_UNAVAILABLE_ERROR; reconcile first for
ORDER_OUTCOME_UNKNOWN_ERROR; retry
RATE_LIMITED_ERROR after at least retryAfterMs; retry CAPACITY_LIMITED_ERROR
using backoff with jitter. Correct validation failures and re-sign where required.
Reconcile order state before retrying an unanswered request, because a transport
timeout or disconnect does not establish that the request was rejected.
Internal server error
GET /v2/assetDefinitions HTTP/1.1
Accept: */*
[
{
"asset": "WSTETH",
"spotMarketSymbol": "BTCRUSDPERP",
"priceHaircut": "0.05",
"liquidationDiscount": "0.03",
"status": "ENABLED",
"decimals": 18,
"displayDecimals": 4,
"ANY_ADDITIONAL_PROPERTY": "anything"
}
]Global fee parameters
OG user discount
0.3Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Referee discount
0.1Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Referrer rebate
0.1Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Affiliate referrer rebate
0.15Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Standardized error codes for API responses. Branch on error, not the free-text
message or HTTP status. Every venue rejection on REST uses HTTP 400 with a
RequestError body. The order-entry WebSocket returns the same code and optional
retryAfterMs in its { ok: false, error } response. HTTP 429 is reserved for
infrastructure-level (per-IP) limits in front of the API and is never a venue
verdict.
Validation and authorization:
INPUT_VALIDATION_ERROR: correct the request's fields or order-class combination before resubmitting. Immutable fields on a modify must match the existing order.SYMBOL_NOT_FOUND_ERROR,NO_ACCOUNTS_FOUND_ERROR: the requested market or account data is unavailable; check the request and current market/account state.NUMERIC_OVERFLOW_ERROR,PRICE_QTY_BOUNDS_ERROR: a numeric value is out of range, or price/quantity is invalid for the market. Check price increments and quantity limits.UNAUTHORIZED_SIGNATURE_ERROR: the signature is invalid or unauthorized.UNAUTHORIZED_ACCOUNT_ERROR: the signer is not permitted to act on the target order. For an armed protective stop, modify and cancel require the signer that created it.INVALID_NONCE_ERROR: use a fresh, monotonically increasing nonce for the signer and re-sign.ORDER_DEADLINE_PASSED_ERROR,ORDER_DEADLINE_TOO_HIGH_ERROR: the signature'sdeadlinehas passed or is too far in the future. Correct it and re-sign. This deadline controls request acceptance, not the lifetime of an accepted order.ORDER_EXPIRES_TOO_SOON_ERROR: a GTT order'sexpiresAfterleaves insufficient time for execution and settlement. Choose a later expiry and re-sign. GTT orders can be cancelled before their signed expiry to allow settlement; for a protective stop this applies to both its armed phase and its fired child.SERVICE_DISABLED_ERROR,TRADING_HALTED_ERROR: order entry is unavailable for the market. Check market availability before submitting again.DUPLICATE_CLIENT_ORDER_ID_ERROR: the client ID belongs to a live order. Reconcile that order before submitting another.ORDER_NOT_FOUND_ERROR: the target order was not found. Refresh its state before retrying.EMPTY_MODIFY_ERROR: a LIMIT modification makes no change. An armed trigger may be re-signed at unchanged prices.MODIFY_QTY_BELOW_FILLED_ERROR: the modified total quantity must exceed the quantity already filled.POST_ONLY_WOULD_CROSS_ERROR: the order would execute immediately. Choose a non-crossing price or change the post-only intent and re-sign.- The
*_OTHER_ERRORcodes are operation-specific failures without a more specific code. Usemessagefor display or troubleshooting; do not parse it as a stable machine-readable contract.
Pre-trade risk checks:
ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR: the account does not meet the required liquidation-margin or balance conditions.ACCOUNT_BELOW_INITIAL_MARGIN_ERROR: the proposed trade does not meet the account's initial-margin or collateral requirements. An account already below initial margin may trade only when the trade improves its health.INSUFFICIENT_BALANCE_ERROR: the account cannot fund the order.OPEN_INTEREST_CAP_ERROR,OPEN_INTEREST_BUDGET_ERROR: the trade exceeds the market's available open-interest capacity.REDUCE_ONLY_CONDITION_NOT_MET_ERROR: the order would not strictly reduce the current position, for example because there is no position, the side is wrong, or the size would reverse it.
A request refused by risk checks is rejected in full. A rejected create produces no
order; a rejected modify leaves the existing order unchanged. These failures require
a change in account or market state, a smaller order, more collateral, or a user
decision; do not automatically retry them unchanged. Resting-order cancellations
appear separately as cancelReason: RISK_CANCELLED. A protective stop whose child
fails risk checks is cancelled with RISK_REJECTED; see CancelReason.
Protective stops:
TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR: an IOC trigger cannot carryexpiresAfter. Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid time-in-force/expiry combinations can also returnINPUT_VALIDATION_ERROR. Correct the combination and re-sign.TRIGGER_LIMIT_OUTSIDE_BAND_ERROR: the stop'slimitPxis outside the permitted range aroundtriggerPx, or stops are unavailable for the market. Move the limit closer to the trigger and re-sign when the price is out of range. If the message indicates stops are unavailable, changing the price will not resolve it.TRIGGER_ALREADY_EXISTS_ERROR: the account already has an armed stop of the same type on that market. At most one stop-loss and one take-profit may be armed per account and market. Modify or cancel the existing stop before replacing it.
Rate limits and resting-order caps:
RATE_LIMITED_ERROR: the account's request budget for this operation is exhausted. Create and modify share a placement budget; single cancels, bulk cancels, and cancel-all-after control have separate budgets. Budgets are shared across markets, signers, REST, and WebSocket requests for the same account. Wait at leastretryAfterMsmilliseconds before retrying. This is a minimum wait, not a reserved request slot; concurrent traffic can use the available budget. Disarming an armed cancel-all-after countdown is never throttled. A disarm when no countdown is armed can be throttled.OPEN_ORDER_COUNT_EXCEEDED_ERROR: a new resting order would exceed the account's total or per-market resting-order count. Cancel orders or allow them to fill before placing more. Modifications do not increase the count.OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR: the account's combined resting-order notional would exceed its limit. Notional is remaining quantity multiplied by limit price for resting GTC/GTT orders. Creates are checked against the submitted quantity before any immediate fills; modifications are checked against the resulting notional. IOC orders and armed triggers are exempt; fired trigger children that rest count toward the limits. Cancel or shrink resting orders, or submit a smaller order.
Resting-order cap errors carry no retryAfterMs: waiting alone does not resolve
them. CAPACITY_LIMITED_ERROR means the venue temporarily cannot accept a create or
modify. It carries no retry hint; use backoff with jitter. Cancels and
cancel-all-after operations are not refused for venue capacity, though their
separate account rate limits still apply.
Temporary availability:
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR: an order that would execute immediately cannot currently pass the required pre-trade checks. Retry after a short delay. Existing resting orders remain in place; non-crossing orders and cancellations remain available.SERVICE_UNAVAILABLE_ERROR: the request was not accepted. Account-owner, signature or permission checks were unavailable before dispatch, or the transport did not send the request (including a full outbound queue). Re-sign with a fresh nonce and resubmit, retaining the sameclientOrderIdwhen supplied. Back off while the service remains unavailable. An unchanged nonce may already be below the signer's nonce floor because a later request was accepted.ORDER_OUTCOME_UNKNOWN_ERROR: the transport failed after the request may have reached the matching engine. The operation may have been applied. Reconcile open orders and executions before resubmitting; never replace an unresolved attempt with a fresh nonce. Retain the complete signed request, including operation, account, market/filter scope, nonce, and order identifiers. Responses do not provide an acceptance receipt or an outcome-query mechanism. Absence from open orders is not proof of failure: the order may have filled, and read data can lag. Executions correlate by order/fill IDs, not request nonces. Insufficient or ambiguous evidence remains unresolved. ForcancelAllAfter, open orders do not establish whether a timer was armed, refreshed, or disarmed.
Permission errors such as NOT_WHITELISTED_ERROR and ACCOUNT_SUSPENDED_ERROR are
not resolved by automatic retries. Contact support if an expected operation is
refused.
Retry policy: retry unchanged after a short delay for
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR; re-sign with a fresh nonce for
SERVICE_UNAVAILABLE_ERROR; reconcile first for
ORDER_OUTCOME_UNKNOWN_ERROR; retry
RATE_LIMITED_ERROR after at least retryAfterMs; retry CAPACITY_LIMITED_ERROR
using backoff with jitter. Correct validation failures and re-sign where required.
Reconcile order state before retrying an unanswered request, because a transport
timeout or disconnect does not establish that the request was rejected.
Internal server error
GET /v2/globalFeeParameters HTTP/1.1
Accept: */*
{
"ogDiscount": "0.3",
"refereeDiscount": "0.1",
"referrerRebate": "0.1",
"affiliateReferrerRebate": "0.15",
"ANY_ADDITIONAL_PROPERTY": "anything"
}List of fee tier parameters
1Taker fee rate (fee will be qty * takerFee)
0.0004Pattern: ^-?\d+(\.\d+)?([eE][+-]?\d+)?$Maker fee rate (fee will be qty * makerFee)
0.0002Pattern: ^-?\d+(\.\d+)?([eE][+-]?\d+)?$30-day volume level required for this fee tier to be applied to a wallet
10000.0Pattern: ^\d+(\.\d+)?([eE][+-]?\d+)?$Fee tier type (REGULAR = Standard tier, VIP = VIP tier)
Standardized error codes for API responses. Branch on error, not the free-text
message or HTTP status. Every venue rejection on REST uses HTTP 400 with a
RequestError body. The order-entry WebSocket returns the same code and optional
retryAfterMs in its { ok: false, error } response. HTTP 429 is reserved for
infrastructure-level (per-IP) limits in front of the API and is never a venue
verdict.
Validation and authorization:
INPUT_VALIDATION_ERROR: correct the request's fields or order-class combination before resubmitting. Immutable fields on a modify must match the existing order.SYMBOL_NOT_FOUND_ERROR,NO_ACCOUNTS_FOUND_ERROR: the requested market or account data is unavailable; check the request and current market/account state.NUMERIC_OVERFLOW_ERROR,PRICE_QTY_BOUNDS_ERROR: a numeric value is out of range, or price/quantity is invalid for the market. Check price increments and quantity limits.UNAUTHORIZED_SIGNATURE_ERROR: the signature is invalid or unauthorized.UNAUTHORIZED_ACCOUNT_ERROR: the signer is not permitted to act on the target order. For an armed protective stop, modify and cancel require the signer that created it.INVALID_NONCE_ERROR: use a fresh, monotonically increasing nonce for the signer and re-sign.ORDER_DEADLINE_PASSED_ERROR,ORDER_DEADLINE_TOO_HIGH_ERROR: the signature'sdeadlinehas passed or is too far in the future. Correct it and re-sign. This deadline controls request acceptance, not the lifetime of an accepted order.ORDER_EXPIRES_TOO_SOON_ERROR: a GTT order'sexpiresAfterleaves insufficient time for execution and settlement. Choose a later expiry and re-sign. GTT orders can be cancelled before their signed expiry to allow settlement; for a protective stop this applies to both its armed phase and its fired child.SERVICE_DISABLED_ERROR,TRADING_HALTED_ERROR: order entry is unavailable for the market. Check market availability before submitting again.DUPLICATE_CLIENT_ORDER_ID_ERROR: the client ID belongs to a live order. Reconcile that order before submitting another.ORDER_NOT_FOUND_ERROR: the target order was not found. Refresh its state before retrying.EMPTY_MODIFY_ERROR: a LIMIT modification makes no change. An armed trigger may be re-signed at unchanged prices.MODIFY_QTY_BELOW_FILLED_ERROR: the modified total quantity must exceed the quantity already filled.POST_ONLY_WOULD_CROSS_ERROR: the order would execute immediately. Choose a non-crossing price or change the post-only intent and re-sign.- The
*_OTHER_ERRORcodes are operation-specific failures without a more specific code. Usemessagefor display or troubleshooting; do not parse it as a stable machine-readable contract.
Pre-trade risk checks:
ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR: the account does not meet the required liquidation-margin or balance conditions.ACCOUNT_BELOW_INITIAL_MARGIN_ERROR: the proposed trade does not meet the account's initial-margin or collateral requirements. An account already below initial margin may trade only when the trade improves its health.INSUFFICIENT_BALANCE_ERROR: the account cannot fund the order.OPEN_INTEREST_CAP_ERROR,OPEN_INTEREST_BUDGET_ERROR: the trade exceeds the market's available open-interest capacity.REDUCE_ONLY_CONDITION_NOT_MET_ERROR: the order would not strictly reduce the current position, for example because there is no position, the side is wrong, or the size would reverse it.
A request refused by risk checks is rejected in full. A rejected create produces no
order; a rejected modify leaves the existing order unchanged. These failures require
a change in account or market state, a smaller order, more collateral, or a user
decision; do not automatically retry them unchanged. Resting-order cancellations
appear separately as cancelReason: RISK_CANCELLED. A protective stop whose child
fails risk checks is cancelled with RISK_REJECTED; see CancelReason.
Protective stops:
TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR: an IOC trigger cannot carryexpiresAfter. Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid time-in-force/expiry combinations can also returnINPUT_VALIDATION_ERROR. Correct the combination and re-sign.TRIGGER_LIMIT_OUTSIDE_BAND_ERROR: the stop'slimitPxis outside the permitted range aroundtriggerPx, or stops are unavailable for the market. Move the limit closer to the trigger and re-sign when the price is out of range. If the message indicates stops are unavailable, changing the price will not resolve it.TRIGGER_ALREADY_EXISTS_ERROR: the account already has an armed stop of the same type on that market. At most one stop-loss and one take-profit may be armed per account and market. Modify or cancel the existing stop before replacing it.
Rate limits and resting-order caps:
RATE_LIMITED_ERROR: the account's request budget for this operation is exhausted. Create and modify share a placement budget; single cancels, bulk cancels, and cancel-all-after control have separate budgets. Budgets are shared across markets, signers, REST, and WebSocket requests for the same account. Wait at leastretryAfterMsmilliseconds before retrying. This is a minimum wait, not a reserved request slot; concurrent traffic can use the available budget. Disarming an armed cancel-all-after countdown is never throttled. A disarm when no countdown is armed can be throttled.OPEN_ORDER_COUNT_EXCEEDED_ERROR: a new resting order would exceed the account's total or per-market resting-order count. Cancel orders or allow them to fill before placing more. Modifications do not increase the count.OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR: the account's combined resting-order notional would exceed its limit. Notional is remaining quantity multiplied by limit price for resting GTC/GTT orders. Creates are checked against the submitted quantity before any immediate fills; modifications are checked against the resulting notional. IOC orders and armed triggers are exempt; fired trigger children that rest count toward the limits. Cancel or shrink resting orders, or submit a smaller order.
Resting-order cap errors carry no retryAfterMs: waiting alone does not resolve
them. CAPACITY_LIMITED_ERROR means the venue temporarily cannot accept a create or
modify. It carries no retry hint; use backoff with jitter. Cancels and
cancel-all-after operations are not refused for venue capacity, though their
separate account rate limits still apply.
Temporary availability:
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR: an order that would execute immediately cannot currently pass the required pre-trade checks. Retry after a short delay. Existing resting orders remain in place; non-crossing orders and cancellations remain available.SERVICE_UNAVAILABLE_ERROR: the request was not accepted. Account-owner, signature or permission checks were unavailable before dispatch, or the transport did not send the request (including a full outbound queue). Re-sign with a fresh nonce and resubmit, retaining the sameclientOrderIdwhen supplied. Back off while the service remains unavailable. An unchanged nonce may already be below the signer's nonce floor because a later request was accepted.ORDER_OUTCOME_UNKNOWN_ERROR: the transport failed after the request may have reached the matching engine. The operation may have been applied. Reconcile open orders and executions before resubmitting; never replace an unresolved attempt with a fresh nonce. Retain the complete signed request, including operation, account, market/filter scope, nonce, and order identifiers. Responses do not provide an acceptance receipt or an outcome-query mechanism. Absence from open orders is not proof of failure: the order may have filled, and read data can lag. Executions correlate by order/fill IDs, not request nonces. Insufficient or ambiguous evidence remains unresolved. ForcancelAllAfter, open orders do not establish whether a timer was armed, refreshed, or disarmed.
Permission errors such as NOT_WHITELISTED_ERROR and ACCOUNT_SUSPENDED_ERROR are
not resolved by automatic retries. Contact support if an expected operation is
refused.
Retry policy: retry unchanged after a short delay for
CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR; re-sign with a fresh nonce for
SERVICE_UNAVAILABLE_ERROR; reconcile first for
ORDER_OUTCOME_UNKNOWN_ERROR; retry
RATE_LIMITED_ERROR after at least retryAfterMs; retry CAPACITY_LIMITED_ERROR
using backoff with jitter. Correct validation failures and re-sign where required.
Reconcile order state before retrying an unanswered request, because a transport
timeout or disconnect does not establish that the request was rejected.
Internal server error
GET /v2/feeTiers HTTP/1.1
Accept: */*
[
{
"tierId": 1,
"takerFee": "0.0004",
"makerFee": "0.0002",
"volume30d": "10000.0",
"tierType": "REGULAR",
"ANY_ADDITIONAL_PROPERTY": "anything"
}
]Last updated