> For the complete documentation index, see [llms.txt](https://docs.reya.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.reya.xyz/developers/devnet/api-reference/rest-api-reference/reference-data.md).

# Reference Data

Market definitions, fee parameters, asset configuration, etc.

## Get perp market definitions

> Canonical perp market definitions endpoint for perpOB. Replaces the removed AMM-era \`/marketDefinitions\` route.

```json
{"openapi":"3.0.3","info":{"title":"Reya DEX Trading API v2","version":"3.5.2"},"tags":[{"name":"Reference Data","description":"Market definitions, fee parameters, asset configuration, etc."}],"servers":[{"url":"/v2"}],"paths":{"/perpMarketDefinitions":{"get":{"summary":"Get perp market definitions","description":"Canonical perp market definitions endpoint for perpOB. Replaces the removed AMM-era `/marketDefinitions` route.","operationId":"getPerpMarketDefinitions","tags":["Reference Data"],"responses":{"200":{"description":"List of perp market definitions","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/MarketDefinition"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"MarketDefinition":{"title":"MarketDefinition","type":"object","required":["symbol","marketId","minOrderQty","qtyStepSize","tickSize","liquidationMarginParameter","initialMarginParameter","maxLeverage","oiCap"],"properties":{"symbol":{"$ref":"#/components/schemas/Symbol"},"marketId":{"$ref":"#/components/schemas/UnsignedInteger","description":"Numerical identifier for each market, only needed to generate signatures"},"minOrderQty":{"$ref":"#/components/schemas/UnsignedDecimal"},"qtyStepSize":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Minimum size increment"},"tickSize":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Minimum price increment"},"liquidationMarginParameter":{"$ref":"#/components/schemas/UnsignedDecimal","description":"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."},"initialMarginParameter":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Minimum percentage of notional that needs to be covered post trade; if the account does not satisfy this requirement, trades will not get executed."},"maxLeverage":{"$ref":"#/components/schemas/UnsignedInteger","description":"Maximum leverage allowed"},"oiCap":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Maximum one-sided open interest in units for a given market."}},"additionalProperties":true},"Symbol":{"title":"Symbol","type":"string","pattern":"^[A-Za-z0-9]+$","description":"Trading symbol (e.g., BTCRUSDPERP, WETHRUSD)"},"UnsignedInteger":{"title":"UnsignedInteger","type":"integer","minimum":0},"UnsignedDecimal":{"title":"UnsignedDecimal","type":"string","pattern":"^\\d+(\\.\\d+)?([eE][+-]?\\d+)?$"},"RequestError":{"title":"RequestError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/RequestErrorCode"},"message":{"type":"string","description":"Human-readable error message"},"retryAfterMs":{"type":"integer","minimum":1,"description":"Minimum wait in milliseconds before retrying the rejected operation. Included for `RATE_LIMITED_ERROR`; omitted for errors without a retry hint, including resting-order caps and `CAPACITY_LIMITED_ERROR`. The same field appears in the REST HTTP 400 body and the order-entry WebSocket's `{ ok: false, error }` response. When present, it is a positive integer. Wait at least this long; it does not reserve capacity, and concurrent requests can consume the account's available budget."}},"additionalProperties":true},"RequestErrorCode":{"title":"RequestErrorCode","type":"string","enum":["SYMBOL_NOT_FOUND_ERROR","NO_ACCOUNTS_FOUND_ERROR","NO_PRICES_FOUND_FOR_SYMBOL_ERROR","INPUT_VALIDATION_ERROR","CREATE_ORDER_OTHER_ERROR","CANCEL_ORDER_OTHER_ERROR","ORDER_DEADLINE_PASSED_ERROR","ORDER_DEADLINE_TOO_HIGH_ERROR","INVALID_NONCE_ERROR","UNAVAILABLE_MATCHING_ENGINE_ERROR","UNAUTHORIZED_SIGNATURE_ERROR","NUMERIC_OVERFLOW_ERROR","CANCEL_ALL_AFTER_OTHER_ERROR","ORDER_NOT_FOUND_ERROR","POST_ONLY_WOULD_CROSS_ERROR","MODIFY_QTY_BELOW_FILLED_ERROR","EMPTY_MODIFY_ERROR","MODIFY_ORDER_OTHER_ERROR","RATE_LIMITED_ERROR","INSUFFICIENT_BALANCE_ERROR","PRICE_QTY_BOUNDS_ERROR","SERVICE_DISABLED_ERROR","UNAUTHORIZED_ACCOUNT_ERROR","TRADING_HALTED_ERROR","DUPLICATE_CLIENT_ORDER_ID_ERROR","ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR","ACCOUNT_BELOW_INITIAL_MARGIN_ERROR","OPEN_INTEREST_CAP_ERROR","OPEN_INTEREST_BUDGET_ERROR","REDUCE_ONLY_CONDITION_NOT_MET_ERROR","CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR","TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR","TRIGGER_LIMIT_OUTSIDE_BAND_ERROR","TRIGGER_ALREADY_EXISTS_ERROR","ORDER_EXPIRES_TOO_SOON_ERROR","OPEN_ORDER_COUNT_EXCEEDED_ERROR","OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR","CAPACITY_LIMITED_ERROR","NOT_WHITELISTED_ERROR","ACCOUNT_SUSPENDED_ERROR","UNAVAILABLE_ACCOUNT_OWNER_ERROR"],"description":"Machine-readable request rejection code. REST returns HTTP 400; the order-entry WebSocket returns the same code in its correlated error response. See the REST API HTTP 400 response reference for per-code meanings and retry guidance."},"ServerError":{"title":"ServerError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/ServerErrorCode"},"message":{"type":"string","description":"Human-readable error message"}},"additionalProperties":true},"ServerErrorCode":{"title":"ServerErrorCode","type":"string","enum":["INTERNAL_SERVER_ERROR"],"description":"Standardized error codes for API responses"}},"responses":{"BadRequest":{"description":"Standardized error codes for API responses. Branch on `error`, not the free-text\n`message` or HTTP status. Every venue rejection on REST uses HTTP 400 with a\n`RequestError` body. The order-entry WebSocket returns the same code and optional\n`retryAfterMs` in its `{ ok: false, error }` response. HTTP 429 is reserved for\ninfrastructure-level (per-IP) limits in front of the API and is never a venue\nverdict.\n\nValidation and authorization:\n- `INPUT_VALIDATION_ERROR`: correct the request's fields or order-class combination\n  before resubmitting. Immutable fields on a modify must match the existing order.\n- `SYMBOL_NOT_FOUND_ERROR`, `NO_ACCOUNTS_FOUND_ERROR`,\n  `NO_PRICES_FOUND_FOR_SYMBOL_ERROR`: the requested market, account data, or price\n  data is unavailable; check the request and current market/account state.\n- `NUMERIC_OVERFLOW_ERROR`, `PRICE_QTY_BOUNDS_ERROR`: a numeric value is out of\n  range, or price/quantity is invalid for the market. Check price increments and\n  quantity limits.\n- `UNAUTHORIZED_SIGNATURE_ERROR`: the signature is invalid or unauthorized.\n  `UNAUTHORIZED_ACCOUNT_ERROR`: the signer is not permitted to act on the target\n  order. For an armed protective stop, modify and cancel require the signer that\n  created it.\n- `INVALID_NONCE_ERROR`: use a fresh, monotonically increasing nonce for the signer\n  and re-sign.\n- `ORDER_DEADLINE_PASSED_ERROR`, `ORDER_DEADLINE_TOO_HIGH_ERROR`: the signature's\n  `deadline` has passed or is too far in the future. Correct it and re-sign. This\n  deadline controls request acceptance, not the lifetime of an accepted order.\n- `ORDER_EXPIRES_TOO_SOON_ERROR`: a GTT order's `expiresAfter` leaves insufficient\n  time for execution and settlement. Choose a later expiry and re-sign. GTT orders\n  can be cancelled before their signed expiry to allow settlement; for a protective\n  stop this applies to both its armed phase and its fired child.\n- `SERVICE_DISABLED_ERROR`, `TRADING_HALTED_ERROR`: order entry is unavailable for\n  the market. Check market availability before submitting again.\n- `DUPLICATE_CLIENT_ORDER_ID_ERROR`: the client ID belongs to a live order.\n  Reconcile that order before submitting another.\n- `ORDER_NOT_FOUND_ERROR`: the target order was not found. Refresh its state before\n  retrying.\n- `EMPTY_MODIFY_ERROR`: a LIMIT modification makes no change. An armed trigger may\n  be re-signed at unchanged prices.\n- `MODIFY_QTY_BELOW_FILLED_ERROR`: the modified total quantity must exceed the\n  quantity already filled.\n- `POST_ONLY_WOULD_CROSS_ERROR`: the order would execute immediately. Choose a\n  non-crossing price or change the post-only intent and re-sign.\n- The `*_OTHER_ERROR` codes are operation-specific failures without a more specific\n  code. Use `message` for display or troubleshooting; do not parse it as a stable\n  machine-readable contract.\n\nPre-trade risk checks:\n- `ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR`: the account does not meet the required\n  liquidation-margin or balance conditions.\n- `ACCOUNT_BELOW_INITIAL_MARGIN_ERROR`: the proposed trade does not meet the\n  account's initial-margin or collateral requirements. An account already below\n  initial margin may trade only when the trade improves its health.\n- `INSUFFICIENT_BALANCE_ERROR`: the account cannot fund the order.\n- `OPEN_INTEREST_CAP_ERROR`, `OPEN_INTEREST_BUDGET_ERROR`: the trade exceeds the\n  market's available open-interest capacity.\n- `REDUCE_ONLY_CONDITION_NOT_MET_ERROR`: the order would not strictly reduce the\n  current position, for example because there is no position, the side is wrong, or\n  the size would reverse it.\n\nA request refused by risk checks is rejected in full. A rejected create produces no\norder; a rejected modify leaves the existing order unchanged. These failures require\na change in account or market state, a smaller order, more collateral, or a user\ndecision; do not automatically retry them unchanged. Resting-order cancellations\nappear separately as `cancelReason: RISK_CANCELLED`. A protective stop whose child\nfails risk checks is cancelled with `RISK_REJECTED`; see `CancelReason`.\n\nProtective stops:\n- `TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR`: an IOC trigger cannot carry `expiresAfter`.\n  Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid\n  time-in-force/expiry combinations can also return `INPUT_VALIDATION_ERROR`.\n  Correct the combination and re-sign.\n- `TRIGGER_LIMIT_OUTSIDE_BAND_ERROR`: the stop's `limitPx` is outside the permitted\n  range around `triggerPx`, or stops are unavailable for the market. Move the limit\n  closer to the trigger and re-sign when the price is out of range. If the message\n  indicates stops are unavailable, changing the price will not resolve it.\n- `TRIGGER_ALREADY_EXISTS_ERROR`: the account already has an armed stop of the same\n  type on that market. At most one stop-loss and one take-profit may be armed per\n  account and market. Modify or cancel the existing stop before replacing it.\n\nRate limits and resting-order caps:\n- `RATE_LIMITED_ERROR`: the account's request budget for this operation is\n  exhausted. Create and modify share a placement budget; single cancels, bulk\n  cancels, and cancel-all-after control have separate budgets. Budgets are shared\n  across markets, signers, REST, and WebSocket requests for the same account. Wait\n  at least `retryAfterMs` milliseconds before retrying. This is a minimum wait, not\n  a reserved request slot; concurrent traffic can use the available budget.\n  Disarming an armed cancel-all-after countdown is never throttled. A disarm when no\n  countdown is armed can be throttled.\n- `OPEN_ORDER_COUNT_EXCEEDED_ERROR`: a new resting order would exceed the account's\n  total or per-market resting-order count. Cancel orders or allow them to fill\n  before placing more. Modifications do not increase the count.\n- `OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR`: the account's combined resting-order\n  notional would exceed its limit. Notional is remaining quantity multiplied by\n  limit price for resting GTC/GTT orders. Creates are checked against the submitted\n  quantity before any immediate fills; modifications are checked against the\n  resulting notional. IOC orders and armed triggers are exempt; fired trigger\n  children that rest count toward the limits. Cancel or shrink resting orders, or\n  submit a smaller order.\n\nResting-order cap errors carry no `retryAfterMs`: waiting alone does not resolve\nthem. `CAPACITY_LIMITED_ERROR` means the venue temporarily cannot accept a create or\nmodify. It carries no retry hint; use backoff with jitter. Cancels and\ncancel-all-after operations are not refused for venue capacity, though their\nseparate account rate limits still apply.\n\nTemporary availability:\n- `CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`: an order that would execute\n  immediately cannot currently pass the required pre-trade checks. Retry after a\n  short delay. Existing resting orders remain in place; non-crossing orders and\n  cancellations remain available.\n- `UNAVAILABLE_MATCHING_ENGINE_ERROR`, `UNAVAILABLE_ACCOUNT_OWNER_ERROR`: the\n  request could not be evaluated and was not accepted. Retry it unchanged after a\n  short delay. These differ from `CAPACITY_LIMITED_ERROR`, which calls for backoff\n  with jitter.\n\nPermission errors such as `NOT_WHITELISTED_ERROR` and `ACCOUNT_SUSPENDED_ERROR` are\nnot resolved by automatic retries. Contact support if an expected operation is\nrefused.\n\nRetry policy: retry unchanged after a short delay for\n`CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`,\n`UNAVAILABLE_MATCHING_ENGINE_ERROR`, and `UNAVAILABLE_ACCOUNT_OWNER_ERROR`; retry\n`RATE_LIMITED_ERROR` after at least `retryAfterMs`; retry `CAPACITY_LIMITED_ERROR`\nusing backoff with jitter. Correct validation failures and re-sign where required.\nReconcile order state before retrying an unanswered request, because a transport\ntimeout or disconnect does not establish that the request was rejected.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestError"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}}}
```

## GET /spotMarketDefinitions

> Get spot market definitions

```json
{"openapi":"3.0.3","info":{"title":"Reya DEX Trading API v2","version":"3.5.2"},"tags":[{"name":"Reference Data","description":"Market definitions, fee parameters, asset configuration, etc."}],"servers":[{"url":"/v2"}],"paths":{"/spotMarketDefinitions":{"get":{"summary":"Get spot market definitions","operationId":"getSpotMarketDefinitions","tags":["Reference Data"],"responses":{"200":{"description":"List of spot market definitions","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SpotMarketDefinition"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"SpotMarketDefinition":{"title":"SpotMarketDefinition","type":"object","required":["symbol","marketId","baseAsset","quoteAsset","minOrderQty","qtyStepSize","tickSize"],"properties":{"symbol":{"$ref":"#/components/schemas/Symbol"},"marketId":{"$ref":"#/components/schemas/UnsignedInteger","description":"Numerical identifier for each spot market"},"baseAsset":{"type":"string","description":"Base asset symbol"},"quoteAsset":{"type":"string","description":"Quote asset symbol"},"minOrderQty":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Minimum order quantity (base asset)"},"qtyStepSize":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Minimum size increment (base asset)"},"tickSize":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Minimum price increment"}},"additionalProperties":true},"Symbol":{"title":"Symbol","type":"string","pattern":"^[A-Za-z0-9]+$","description":"Trading symbol (e.g., BTCRUSDPERP, WETHRUSD)"},"UnsignedInteger":{"title":"UnsignedInteger","type":"integer","minimum":0},"UnsignedDecimal":{"title":"UnsignedDecimal","type":"string","pattern":"^\\d+(\\.\\d+)?([eE][+-]?\\d+)?$"},"RequestError":{"title":"RequestError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/RequestErrorCode"},"message":{"type":"string","description":"Human-readable error message"},"retryAfterMs":{"type":"integer","minimum":1,"description":"Minimum wait in milliseconds before retrying the rejected operation. Included for `RATE_LIMITED_ERROR`; omitted for errors without a retry hint, including resting-order caps and `CAPACITY_LIMITED_ERROR`. The same field appears in the REST HTTP 400 body and the order-entry WebSocket's `{ ok: false, error }` response. When present, it is a positive integer. Wait at least this long; it does not reserve capacity, and concurrent requests can consume the account's available budget."}},"additionalProperties":true},"RequestErrorCode":{"title":"RequestErrorCode","type":"string","enum":["SYMBOL_NOT_FOUND_ERROR","NO_ACCOUNTS_FOUND_ERROR","NO_PRICES_FOUND_FOR_SYMBOL_ERROR","INPUT_VALIDATION_ERROR","CREATE_ORDER_OTHER_ERROR","CANCEL_ORDER_OTHER_ERROR","ORDER_DEADLINE_PASSED_ERROR","ORDER_DEADLINE_TOO_HIGH_ERROR","INVALID_NONCE_ERROR","UNAVAILABLE_MATCHING_ENGINE_ERROR","UNAUTHORIZED_SIGNATURE_ERROR","NUMERIC_OVERFLOW_ERROR","CANCEL_ALL_AFTER_OTHER_ERROR","ORDER_NOT_FOUND_ERROR","POST_ONLY_WOULD_CROSS_ERROR","MODIFY_QTY_BELOW_FILLED_ERROR","EMPTY_MODIFY_ERROR","MODIFY_ORDER_OTHER_ERROR","RATE_LIMITED_ERROR","INSUFFICIENT_BALANCE_ERROR","PRICE_QTY_BOUNDS_ERROR","SERVICE_DISABLED_ERROR","UNAUTHORIZED_ACCOUNT_ERROR","TRADING_HALTED_ERROR","DUPLICATE_CLIENT_ORDER_ID_ERROR","ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR","ACCOUNT_BELOW_INITIAL_MARGIN_ERROR","OPEN_INTEREST_CAP_ERROR","OPEN_INTEREST_BUDGET_ERROR","REDUCE_ONLY_CONDITION_NOT_MET_ERROR","CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR","TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR","TRIGGER_LIMIT_OUTSIDE_BAND_ERROR","TRIGGER_ALREADY_EXISTS_ERROR","ORDER_EXPIRES_TOO_SOON_ERROR","OPEN_ORDER_COUNT_EXCEEDED_ERROR","OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR","CAPACITY_LIMITED_ERROR","NOT_WHITELISTED_ERROR","ACCOUNT_SUSPENDED_ERROR","UNAVAILABLE_ACCOUNT_OWNER_ERROR"],"description":"Machine-readable request rejection code. REST returns HTTP 400; the order-entry WebSocket returns the same code in its correlated error response. See the REST API HTTP 400 response reference for per-code meanings and retry guidance."},"ServerError":{"title":"ServerError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/ServerErrorCode"},"message":{"type":"string","description":"Human-readable error message"}},"additionalProperties":true},"ServerErrorCode":{"title":"ServerErrorCode","type":"string","enum":["INTERNAL_SERVER_ERROR"],"description":"Standardized error codes for API responses"}},"responses":{"BadRequest":{"description":"Standardized error codes for API responses. Branch on `error`, not the free-text\n`message` or HTTP status. Every venue rejection on REST uses HTTP 400 with a\n`RequestError` body. The order-entry WebSocket returns the same code and optional\n`retryAfterMs` in its `{ ok: false, error }` response. HTTP 429 is reserved for\ninfrastructure-level (per-IP) limits in front of the API and is never a venue\nverdict.\n\nValidation and authorization:\n- `INPUT_VALIDATION_ERROR`: correct the request's fields or order-class combination\n  before resubmitting. Immutable fields on a modify must match the existing order.\n- `SYMBOL_NOT_FOUND_ERROR`, `NO_ACCOUNTS_FOUND_ERROR`,\n  `NO_PRICES_FOUND_FOR_SYMBOL_ERROR`: the requested market, account data, or price\n  data is unavailable; check the request and current market/account state.\n- `NUMERIC_OVERFLOW_ERROR`, `PRICE_QTY_BOUNDS_ERROR`: a numeric value is out of\n  range, or price/quantity is invalid for the market. Check price increments and\n  quantity limits.\n- `UNAUTHORIZED_SIGNATURE_ERROR`: the signature is invalid or unauthorized.\n  `UNAUTHORIZED_ACCOUNT_ERROR`: the signer is not permitted to act on the target\n  order. For an armed protective stop, modify and cancel require the signer that\n  created it.\n- `INVALID_NONCE_ERROR`: use a fresh, monotonically increasing nonce for the signer\n  and re-sign.\n- `ORDER_DEADLINE_PASSED_ERROR`, `ORDER_DEADLINE_TOO_HIGH_ERROR`: the signature's\n  `deadline` has passed or is too far in the future. Correct it and re-sign. This\n  deadline controls request acceptance, not the lifetime of an accepted order.\n- `ORDER_EXPIRES_TOO_SOON_ERROR`: a GTT order's `expiresAfter` leaves insufficient\n  time for execution and settlement. Choose a later expiry and re-sign. GTT orders\n  can be cancelled before their signed expiry to allow settlement; for a protective\n  stop this applies to both its armed phase and its fired child.\n- `SERVICE_DISABLED_ERROR`, `TRADING_HALTED_ERROR`: order entry is unavailable for\n  the market. Check market availability before submitting again.\n- `DUPLICATE_CLIENT_ORDER_ID_ERROR`: the client ID belongs to a live order.\n  Reconcile that order before submitting another.\n- `ORDER_NOT_FOUND_ERROR`: the target order was not found. Refresh its state before\n  retrying.\n- `EMPTY_MODIFY_ERROR`: a LIMIT modification makes no change. An armed trigger may\n  be re-signed at unchanged prices.\n- `MODIFY_QTY_BELOW_FILLED_ERROR`: the modified total quantity must exceed the\n  quantity already filled.\n- `POST_ONLY_WOULD_CROSS_ERROR`: the order would execute immediately. Choose a\n  non-crossing price or change the post-only intent and re-sign.\n- The `*_OTHER_ERROR` codes are operation-specific failures without a more specific\n  code. Use `message` for display or troubleshooting; do not parse it as a stable\n  machine-readable contract.\n\nPre-trade risk checks:\n- `ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR`: the account does not meet the required\n  liquidation-margin or balance conditions.\n- `ACCOUNT_BELOW_INITIAL_MARGIN_ERROR`: the proposed trade does not meet the\n  account's initial-margin or collateral requirements. An account already below\n  initial margin may trade only when the trade improves its health.\n- `INSUFFICIENT_BALANCE_ERROR`: the account cannot fund the order.\n- `OPEN_INTEREST_CAP_ERROR`, `OPEN_INTEREST_BUDGET_ERROR`: the trade exceeds the\n  market's available open-interest capacity.\n- `REDUCE_ONLY_CONDITION_NOT_MET_ERROR`: the order would not strictly reduce the\n  current position, for example because there is no position, the side is wrong, or\n  the size would reverse it.\n\nA request refused by risk checks is rejected in full. A rejected create produces no\norder; a rejected modify leaves the existing order unchanged. These failures require\na change in account or market state, a smaller order, more collateral, or a user\ndecision; do not automatically retry them unchanged. Resting-order cancellations\nappear separately as `cancelReason: RISK_CANCELLED`. A protective stop whose child\nfails risk checks is cancelled with `RISK_REJECTED`; see `CancelReason`.\n\nProtective stops:\n- `TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR`: an IOC trigger cannot carry `expiresAfter`.\n  Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid\n  time-in-force/expiry combinations can also return `INPUT_VALIDATION_ERROR`.\n  Correct the combination and re-sign.\n- `TRIGGER_LIMIT_OUTSIDE_BAND_ERROR`: the stop's `limitPx` is outside the permitted\n  range around `triggerPx`, or stops are unavailable for the market. Move the limit\n  closer to the trigger and re-sign when the price is out of range. If the message\n  indicates stops are unavailable, changing the price will not resolve it.\n- `TRIGGER_ALREADY_EXISTS_ERROR`: the account already has an armed stop of the same\n  type on that market. At most one stop-loss and one take-profit may be armed per\n  account and market. Modify or cancel the existing stop before replacing it.\n\nRate limits and resting-order caps:\n- `RATE_LIMITED_ERROR`: the account's request budget for this operation is\n  exhausted. Create and modify share a placement budget; single cancels, bulk\n  cancels, and cancel-all-after control have separate budgets. Budgets are shared\n  across markets, signers, REST, and WebSocket requests for the same account. Wait\n  at least `retryAfterMs` milliseconds before retrying. This is a minimum wait, not\n  a reserved request slot; concurrent traffic can use the available budget.\n  Disarming an armed cancel-all-after countdown is never throttled. A disarm when no\n  countdown is armed can be throttled.\n- `OPEN_ORDER_COUNT_EXCEEDED_ERROR`: a new resting order would exceed the account's\n  total or per-market resting-order count. Cancel orders or allow them to fill\n  before placing more. Modifications do not increase the count.\n- `OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR`: the account's combined resting-order\n  notional would exceed its limit. Notional is remaining quantity multiplied by\n  limit price for resting GTC/GTT orders. Creates are checked against the submitted\n  quantity before any immediate fills; modifications are checked against the\n  resulting notional. IOC orders and armed triggers are exempt; fired trigger\n  children that rest count toward the limits. Cancel or shrink resting orders, or\n  submit a smaller order.\n\nResting-order cap errors carry no `retryAfterMs`: waiting alone does not resolve\nthem. `CAPACITY_LIMITED_ERROR` means the venue temporarily cannot accept a create or\nmodify. It carries no retry hint; use backoff with jitter. Cancels and\ncancel-all-after operations are not refused for venue capacity, though their\nseparate account rate limits still apply.\n\nTemporary availability:\n- `CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`: an order that would execute\n  immediately cannot currently pass the required pre-trade checks. Retry after a\n  short delay. Existing resting orders remain in place; non-crossing orders and\n  cancellations remain available.\n- `UNAVAILABLE_MATCHING_ENGINE_ERROR`, `UNAVAILABLE_ACCOUNT_OWNER_ERROR`: the\n  request could not be evaluated and was not accepted. Retry it unchanged after a\n  short delay. These differ from `CAPACITY_LIMITED_ERROR`, which calls for backoff\n  with jitter.\n\nPermission errors such as `NOT_WHITELISTED_ERROR` and `ACCOUNT_SUSPENDED_ERROR` are\nnot resolved by automatic retries. Contact support if an expected operation is\nrefused.\n\nRetry policy: retry unchanged after a short delay for\n`CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`,\n`UNAVAILABLE_MATCHING_ENGINE_ERROR`, and `UNAVAILABLE_ACCOUNT_OWNER_ERROR`; retry\n`RATE_LIMITED_ERROR` after at least `retryAfterMs`; retry `CAPACITY_LIMITED_ERROR`\nusing backoff with jitter. Correct validation failures and re-sign where required.\nReconcile order state before retrying an unanswered request, because a transport\ntimeout or disconnect does not establish that the request was rejected.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestError"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}}}
```

## GET /assetDefinitions

> Get asset definitions

```json
{"openapi":"3.0.3","info":{"title":"Reya DEX Trading API v2","version":"3.5.2"},"tags":[{"name":"Reference Data","description":"Market definitions, fee parameters, asset configuration, etc."}],"servers":[{"url":"/v2"}],"paths":{"/assetDefinitions":{"get":{"summary":"Get asset definitions","operationId":"getAssetDefinitions","tags":["Reference Data"],"responses":{"200":{"description":"List of asset definitions","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetDefinition"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"AssetDefinition":{"title":"AssetDefinition","type":"object","required":["asset","priceHaircut","liquidationDiscount","status","decimals","displayDecimals"],"properties":{"asset":{"$ref":"#/components/schemas/Asset"},"spotMarketSymbol":{"$ref":"#/components/schemas/Symbol"},"priceHaircut":{"$ref":"#/components/schemas/UnsignedDecimal","description":"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."},"liquidationDiscount":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Discount in the token price when liquidating collateral."},"status":{"type":"string","enum":["ENABLED","WITHDRAWAL_ONLY"],"description":"Status of asset (ENABLED = deposits and withdrawals allowed, WITHDRAWAL_ONLY = only withdrawals allowed)"},"decimals":{"$ref":"#/components/schemas/UnsignedInteger","description":"Number of decimal places for record keeping amounts of this asset (e.g. 18 for ETH, 6 for RUSD)"},"displayDecimals":{"$ref":"#/components/schemas/UnsignedInteger","description":"Number of decimal places shown for display purposes in frontends"}},"additionalProperties":true},"Asset":{"title":"Asset","type":"string","pattern":"^[A-Za-z0-9]+$"},"Symbol":{"title":"Symbol","type":"string","pattern":"^[A-Za-z0-9]+$","description":"Trading symbol (e.g., BTCRUSDPERP, WETHRUSD)"},"UnsignedDecimal":{"title":"UnsignedDecimal","type":"string","pattern":"^\\d+(\\.\\d+)?([eE][+-]?\\d+)?$"},"UnsignedInteger":{"title":"UnsignedInteger","type":"integer","minimum":0},"RequestError":{"title":"RequestError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/RequestErrorCode"},"message":{"type":"string","description":"Human-readable error message"},"retryAfterMs":{"type":"integer","minimum":1,"description":"Minimum wait in milliseconds before retrying the rejected operation. Included for `RATE_LIMITED_ERROR`; omitted for errors without a retry hint, including resting-order caps and `CAPACITY_LIMITED_ERROR`. The same field appears in the REST HTTP 400 body and the order-entry WebSocket's `{ ok: false, error }` response. When present, it is a positive integer. Wait at least this long; it does not reserve capacity, and concurrent requests can consume the account's available budget."}},"additionalProperties":true},"RequestErrorCode":{"title":"RequestErrorCode","type":"string","enum":["SYMBOL_NOT_FOUND_ERROR","NO_ACCOUNTS_FOUND_ERROR","NO_PRICES_FOUND_FOR_SYMBOL_ERROR","INPUT_VALIDATION_ERROR","CREATE_ORDER_OTHER_ERROR","CANCEL_ORDER_OTHER_ERROR","ORDER_DEADLINE_PASSED_ERROR","ORDER_DEADLINE_TOO_HIGH_ERROR","INVALID_NONCE_ERROR","UNAVAILABLE_MATCHING_ENGINE_ERROR","UNAUTHORIZED_SIGNATURE_ERROR","NUMERIC_OVERFLOW_ERROR","CANCEL_ALL_AFTER_OTHER_ERROR","ORDER_NOT_FOUND_ERROR","POST_ONLY_WOULD_CROSS_ERROR","MODIFY_QTY_BELOW_FILLED_ERROR","EMPTY_MODIFY_ERROR","MODIFY_ORDER_OTHER_ERROR","RATE_LIMITED_ERROR","INSUFFICIENT_BALANCE_ERROR","PRICE_QTY_BOUNDS_ERROR","SERVICE_DISABLED_ERROR","UNAUTHORIZED_ACCOUNT_ERROR","TRADING_HALTED_ERROR","DUPLICATE_CLIENT_ORDER_ID_ERROR","ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR","ACCOUNT_BELOW_INITIAL_MARGIN_ERROR","OPEN_INTEREST_CAP_ERROR","OPEN_INTEREST_BUDGET_ERROR","REDUCE_ONLY_CONDITION_NOT_MET_ERROR","CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR","TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR","TRIGGER_LIMIT_OUTSIDE_BAND_ERROR","TRIGGER_ALREADY_EXISTS_ERROR","ORDER_EXPIRES_TOO_SOON_ERROR","OPEN_ORDER_COUNT_EXCEEDED_ERROR","OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR","CAPACITY_LIMITED_ERROR","NOT_WHITELISTED_ERROR","ACCOUNT_SUSPENDED_ERROR","UNAVAILABLE_ACCOUNT_OWNER_ERROR"],"description":"Machine-readable request rejection code. REST returns HTTP 400; the order-entry WebSocket returns the same code in its correlated error response. See the REST API HTTP 400 response reference for per-code meanings and retry guidance."},"ServerError":{"title":"ServerError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/ServerErrorCode"},"message":{"type":"string","description":"Human-readable error message"}},"additionalProperties":true},"ServerErrorCode":{"title":"ServerErrorCode","type":"string","enum":["INTERNAL_SERVER_ERROR"],"description":"Standardized error codes for API responses"}},"responses":{"BadRequest":{"description":"Standardized error codes for API responses. Branch on `error`, not the free-text\n`message` or HTTP status. Every venue rejection on REST uses HTTP 400 with a\n`RequestError` body. The order-entry WebSocket returns the same code and optional\n`retryAfterMs` in its `{ ok: false, error }` response. HTTP 429 is reserved for\ninfrastructure-level (per-IP) limits in front of the API and is never a venue\nverdict.\n\nValidation and authorization:\n- `INPUT_VALIDATION_ERROR`: correct the request's fields or order-class combination\n  before resubmitting. Immutable fields on a modify must match the existing order.\n- `SYMBOL_NOT_FOUND_ERROR`, `NO_ACCOUNTS_FOUND_ERROR`,\n  `NO_PRICES_FOUND_FOR_SYMBOL_ERROR`: the requested market, account data, or price\n  data is unavailable; check the request and current market/account state.\n- `NUMERIC_OVERFLOW_ERROR`, `PRICE_QTY_BOUNDS_ERROR`: a numeric value is out of\n  range, or price/quantity is invalid for the market. Check price increments and\n  quantity limits.\n- `UNAUTHORIZED_SIGNATURE_ERROR`: the signature is invalid or unauthorized.\n  `UNAUTHORIZED_ACCOUNT_ERROR`: the signer is not permitted to act on the target\n  order. For an armed protective stop, modify and cancel require the signer that\n  created it.\n- `INVALID_NONCE_ERROR`: use a fresh, monotonically increasing nonce for the signer\n  and re-sign.\n- `ORDER_DEADLINE_PASSED_ERROR`, `ORDER_DEADLINE_TOO_HIGH_ERROR`: the signature's\n  `deadline` has passed or is too far in the future. Correct it and re-sign. This\n  deadline controls request acceptance, not the lifetime of an accepted order.\n- `ORDER_EXPIRES_TOO_SOON_ERROR`: a GTT order's `expiresAfter` leaves insufficient\n  time for execution and settlement. Choose a later expiry and re-sign. GTT orders\n  can be cancelled before their signed expiry to allow settlement; for a protective\n  stop this applies to both its armed phase and its fired child.\n- `SERVICE_DISABLED_ERROR`, `TRADING_HALTED_ERROR`: order entry is unavailable for\n  the market. Check market availability before submitting again.\n- `DUPLICATE_CLIENT_ORDER_ID_ERROR`: the client ID belongs to a live order.\n  Reconcile that order before submitting another.\n- `ORDER_NOT_FOUND_ERROR`: the target order was not found. Refresh its state before\n  retrying.\n- `EMPTY_MODIFY_ERROR`: a LIMIT modification makes no change. An armed trigger may\n  be re-signed at unchanged prices.\n- `MODIFY_QTY_BELOW_FILLED_ERROR`: the modified total quantity must exceed the\n  quantity already filled.\n- `POST_ONLY_WOULD_CROSS_ERROR`: the order would execute immediately. Choose a\n  non-crossing price or change the post-only intent and re-sign.\n- The `*_OTHER_ERROR` codes are operation-specific failures without a more specific\n  code. Use `message` for display or troubleshooting; do not parse it as a stable\n  machine-readable contract.\n\nPre-trade risk checks:\n- `ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR`: the account does not meet the required\n  liquidation-margin or balance conditions.\n- `ACCOUNT_BELOW_INITIAL_MARGIN_ERROR`: the proposed trade does not meet the\n  account's initial-margin or collateral requirements. An account already below\n  initial margin may trade only when the trade improves its health.\n- `INSUFFICIENT_BALANCE_ERROR`: the account cannot fund the order.\n- `OPEN_INTEREST_CAP_ERROR`, `OPEN_INTEREST_BUDGET_ERROR`: the trade exceeds the\n  market's available open-interest capacity.\n- `REDUCE_ONLY_CONDITION_NOT_MET_ERROR`: the order would not strictly reduce the\n  current position, for example because there is no position, the side is wrong, or\n  the size would reverse it.\n\nA request refused by risk checks is rejected in full. A rejected create produces no\norder; a rejected modify leaves the existing order unchanged. These failures require\na change in account or market state, a smaller order, more collateral, or a user\ndecision; do not automatically retry them unchanged. Resting-order cancellations\nappear separately as `cancelReason: RISK_CANCELLED`. A protective stop whose child\nfails risk checks is cancelled with `RISK_REJECTED`; see `CancelReason`.\n\nProtective stops:\n- `TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR`: an IOC trigger cannot carry `expiresAfter`.\n  Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid\n  time-in-force/expiry combinations can also return `INPUT_VALIDATION_ERROR`.\n  Correct the combination and re-sign.\n- `TRIGGER_LIMIT_OUTSIDE_BAND_ERROR`: the stop's `limitPx` is outside the permitted\n  range around `triggerPx`, or stops are unavailable for the market. Move the limit\n  closer to the trigger and re-sign when the price is out of range. If the message\n  indicates stops are unavailable, changing the price will not resolve it.\n- `TRIGGER_ALREADY_EXISTS_ERROR`: the account already has an armed stop of the same\n  type on that market. At most one stop-loss and one take-profit may be armed per\n  account and market. Modify or cancel the existing stop before replacing it.\n\nRate limits and resting-order caps:\n- `RATE_LIMITED_ERROR`: the account's request budget for this operation is\n  exhausted. Create and modify share a placement budget; single cancels, bulk\n  cancels, and cancel-all-after control have separate budgets. Budgets are shared\n  across markets, signers, REST, and WebSocket requests for the same account. Wait\n  at least `retryAfterMs` milliseconds before retrying. This is a minimum wait, not\n  a reserved request slot; concurrent traffic can use the available budget.\n  Disarming an armed cancel-all-after countdown is never throttled. A disarm when no\n  countdown is armed can be throttled.\n- `OPEN_ORDER_COUNT_EXCEEDED_ERROR`: a new resting order would exceed the account's\n  total or per-market resting-order count. Cancel orders or allow them to fill\n  before placing more. Modifications do not increase the count.\n- `OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR`: the account's combined resting-order\n  notional would exceed its limit. Notional is remaining quantity multiplied by\n  limit price for resting GTC/GTT orders. Creates are checked against the submitted\n  quantity before any immediate fills; modifications are checked against the\n  resulting notional. IOC orders and armed triggers are exempt; fired trigger\n  children that rest count toward the limits. Cancel or shrink resting orders, or\n  submit a smaller order.\n\nResting-order cap errors carry no `retryAfterMs`: waiting alone does not resolve\nthem. `CAPACITY_LIMITED_ERROR` means the venue temporarily cannot accept a create or\nmodify. It carries no retry hint; use backoff with jitter. Cancels and\ncancel-all-after operations are not refused for venue capacity, though their\nseparate account rate limits still apply.\n\nTemporary availability:\n- `CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`: an order that would execute\n  immediately cannot currently pass the required pre-trade checks. Retry after a\n  short delay. Existing resting orders remain in place; non-crossing orders and\n  cancellations remain available.\n- `UNAVAILABLE_MATCHING_ENGINE_ERROR`, `UNAVAILABLE_ACCOUNT_OWNER_ERROR`: the\n  request could not be evaluated and was not accepted. Retry it unchanged after a\n  short delay. These differ from `CAPACITY_LIMITED_ERROR`, which calls for backoff\n  with jitter.\n\nPermission errors such as `NOT_WHITELISTED_ERROR` and `ACCOUNT_SUSPENDED_ERROR` are\nnot resolved by automatic retries. Contact support if an expected operation is\nrefused.\n\nRetry policy: retry unchanged after a short delay for\n`CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`,\n`UNAVAILABLE_MATCHING_ENGINE_ERROR`, and `UNAVAILABLE_ACCOUNT_OWNER_ERROR`; retry\n`RATE_LIMITED_ERROR` after at least `retryAfterMs`; retry `CAPACITY_LIMITED_ERROR`\nusing backoff with jitter. Correct validation failures and re-sign where required.\nReconcile order state before retrying an unanswered request, because a transport\ntimeout or disconnect does not establish that the request was rejected.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestError"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}}}
```

## GET /globalFeeParameters

> Get global fee parameters

```json
{"openapi":"3.0.3","info":{"title":"Reya DEX Trading API v2","version":"3.5.2"},"tags":[{"name":"Reference Data","description":"Market definitions, fee parameters, asset configuration, etc."}],"servers":[{"url":"/v2"}],"paths":{"/globalFeeParameters":{"get":{"summary":"Get global fee parameters","operationId":"getGlobalFeeParameters","tags":["Reference Data"],"responses":{"200":{"description":"Global fee parameters","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GlobalFeeParameters"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"GlobalFeeParameters":{"title":"GlobalFeeParameters","type":"object","required":["ogDiscount","refereeDiscount","referrerRebate","affiliateReferrerRebate"],"properties":{"ogDiscount":{"$ref":"#/components/schemas/UnsignedDecimal","description":"OG user discount"},"refereeDiscount":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Referee discount"},"referrerRebate":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Referrer rebate"},"affiliateReferrerRebate":{"$ref":"#/components/schemas/UnsignedDecimal","description":"Affiliate referrer rebate"}},"additionalProperties":true},"UnsignedDecimal":{"title":"UnsignedDecimal","type":"string","pattern":"^\\d+(\\.\\d+)?([eE][+-]?\\d+)?$"},"RequestError":{"title":"RequestError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/RequestErrorCode"},"message":{"type":"string","description":"Human-readable error message"},"retryAfterMs":{"type":"integer","minimum":1,"description":"Minimum wait in milliseconds before retrying the rejected operation. Included for `RATE_LIMITED_ERROR`; omitted for errors without a retry hint, including resting-order caps and `CAPACITY_LIMITED_ERROR`. The same field appears in the REST HTTP 400 body and the order-entry WebSocket's `{ ok: false, error }` response. When present, it is a positive integer. Wait at least this long; it does not reserve capacity, and concurrent requests can consume the account's available budget."}},"additionalProperties":true},"RequestErrorCode":{"title":"RequestErrorCode","type":"string","enum":["SYMBOL_NOT_FOUND_ERROR","NO_ACCOUNTS_FOUND_ERROR","NO_PRICES_FOUND_FOR_SYMBOL_ERROR","INPUT_VALIDATION_ERROR","CREATE_ORDER_OTHER_ERROR","CANCEL_ORDER_OTHER_ERROR","ORDER_DEADLINE_PASSED_ERROR","ORDER_DEADLINE_TOO_HIGH_ERROR","INVALID_NONCE_ERROR","UNAVAILABLE_MATCHING_ENGINE_ERROR","UNAUTHORIZED_SIGNATURE_ERROR","NUMERIC_OVERFLOW_ERROR","CANCEL_ALL_AFTER_OTHER_ERROR","ORDER_NOT_FOUND_ERROR","POST_ONLY_WOULD_CROSS_ERROR","MODIFY_QTY_BELOW_FILLED_ERROR","EMPTY_MODIFY_ERROR","MODIFY_ORDER_OTHER_ERROR","RATE_LIMITED_ERROR","INSUFFICIENT_BALANCE_ERROR","PRICE_QTY_BOUNDS_ERROR","SERVICE_DISABLED_ERROR","UNAUTHORIZED_ACCOUNT_ERROR","TRADING_HALTED_ERROR","DUPLICATE_CLIENT_ORDER_ID_ERROR","ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR","ACCOUNT_BELOW_INITIAL_MARGIN_ERROR","OPEN_INTEREST_CAP_ERROR","OPEN_INTEREST_BUDGET_ERROR","REDUCE_ONLY_CONDITION_NOT_MET_ERROR","CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR","TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR","TRIGGER_LIMIT_OUTSIDE_BAND_ERROR","TRIGGER_ALREADY_EXISTS_ERROR","ORDER_EXPIRES_TOO_SOON_ERROR","OPEN_ORDER_COUNT_EXCEEDED_ERROR","OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR","CAPACITY_LIMITED_ERROR","NOT_WHITELISTED_ERROR","ACCOUNT_SUSPENDED_ERROR","UNAVAILABLE_ACCOUNT_OWNER_ERROR"],"description":"Machine-readable request rejection code. REST returns HTTP 400; the order-entry WebSocket returns the same code in its correlated error response. See the REST API HTTP 400 response reference for per-code meanings and retry guidance."},"ServerError":{"title":"ServerError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/ServerErrorCode"},"message":{"type":"string","description":"Human-readable error message"}},"additionalProperties":true},"ServerErrorCode":{"title":"ServerErrorCode","type":"string","enum":["INTERNAL_SERVER_ERROR"],"description":"Standardized error codes for API responses"}},"responses":{"BadRequest":{"description":"Standardized error codes for API responses. Branch on `error`, not the free-text\n`message` or HTTP status. Every venue rejection on REST uses HTTP 400 with a\n`RequestError` body. The order-entry WebSocket returns the same code and optional\n`retryAfterMs` in its `{ ok: false, error }` response. HTTP 429 is reserved for\ninfrastructure-level (per-IP) limits in front of the API and is never a venue\nverdict.\n\nValidation and authorization:\n- `INPUT_VALIDATION_ERROR`: correct the request's fields or order-class combination\n  before resubmitting. Immutable fields on a modify must match the existing order.\n- `SYMBOL_NOT_FOUND_ERROR`, `NO_ACCOUNTS_FOUND_ERROR`,\n  `NO_PRICES_FOUND_FOR_SYMBOL_ERROR`: the requested market, account data, or price\n  data is unavailable; check the request and current market/account state.\n- `NUMERIC_OVERFLOW_ERROR`, `PRICE_QTY_BOUNDS_ERROR`: a numeric value is out of\n  range, or price/quantity is invalid for the market. Check price increments and\n  quantity limits.\n- `UNAUTHORIZED_SIGNATURE_ERROR`: the signature is invalid or unauthorized.\n  `UNAUTHORIZED_ACCOUNT_ERROR`: the signer is not permitted to act on the target\n  order. For an armed protective stop, modify and cancel require the signer that\n  created it.\n- `INVALID_NONCE_ERROR`: use a fresh, monotonically increasing nonce for the signer\n  and re-sign.\n- `ORDER_DEADLINE_PASSED_ERROR`, `ORDER_DEADLINE_TOO_HIGH_ERROR`: the signature's\n  `deadline` has passed or is too far in the future. Correct it and re-sign. This\n  deadline controls request acceptance, not the lifetime of an accepted order.\n- `ORDER_EXPIRES_TOO_SOON_ERROR`: a GTT order's `expiresAfter` leaves insufficient\n  time for execution and settlement. Choose a later expiry and re-sign. GTT orders\n  can be cancelled before their signed expiry to allow settlement; for a protective\n  stop this applies to both its armed phase and its fired child.\n- `SERVICE_DISABLED_ERROR`, `TRADING_HALTED_ERROR`: order entry is unavailable for\n  the market. Check market availability before submitting again.\n- `DUPLICATE_CLIENT_ORDER_ID_ERROR`: the client ID belongs to a live order.\n  Reconcile that order before submitting another.\n- `ORDER_NOT_FOUND_ERROR`: the target order was not found. Refresh its state before\n  retrying.\n- `EMPTY_MODIFY_ERROR`: a LIMIT modification makes no change. An armed trigger may\n  be re-signed at unchanged prices.\n- `MODIFY_QTY_BELOW_FILLED_ERROR`: the modified total quantity must exceed the\n  quantity already filled.\n- `POST_ONLY_WOULD_CROSS_ERROR`: the order would execute immediately. Choose a\n  non-crossing price or change the post-only intent and re-sign.\n- The `*_OTHER_ERROR` codes are operation-specific failures without a more specific\n  code. Use `message` for display or troubleshooting; do not parse it as a stable\n  machine-readable contract.\n\nPre-trade risk checks:\n- `ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR`: the account does not meet the required\n  liquidation-margin or balance conditions.\n- `ACCOUNT_BELOW_INITIAL_MARGIN_ERROR`: the proposed trade does not meet the\n  account's initial-margin or collateral requirements. An account already below\n  initial margin may trade only when the trade improves its health.\n- `INSUFFICIENT_BALANCE_ERROR`: the account cannot fund the order.\n- `OPEN_INTEREST_CAP_ERROR`, `OPEN_INTEREST_BUDGET_ERROR`: the trade exceeds the\n  market's available open-interest capacity.\n- `REDUCE_ONLY_CONDITION_NOT_MET_ERROR`: the order would not strictly reduce the\n  current position, for example because there is no position, the side is wrong, or\n  the size would reverse it.\n\nA request refused by risk checks is rejected in full. A rejected create produces no\norder; a rejected modify leaves the existing order unchanged. These failures require\na change in account or market state, a smaller order, more collateral, or a user\ndecision; do not automatically retry them unchanged. Resting-order cancellations\nappear separately as `cancelReason: RISK_CANCELLED`. A protective stop whose child\nfails risk checks is cancelled with `RISK_REJECTED`; see `CancelReason`.\n\nProtective stops:\n- `TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR`: an IOC trigger cannot carry `expiresAfter`.\n  Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid\n  time-in-force/expiry combinations can also return `INPUT_VALIDATION_ERROR`.\n  Correct the combination and re-sign.\n- `TRIGGER_LIMIT_OUTSIDE_BAND_ERROR`: the stop's `limitPx` is outside the permitted\n  range around `triggerPx`, or stops are unavailable for the market. Move the limit\n  closer to the trigger and re-sign when the price is out of range. If the message\n  indicates stops are unavailable, changing the price will not resolve it.\n- `TRIGGER_ALREADY_EXISTS_ERROR`: the account already has an armed stop of the same\n  type on that market. At most one stop-loss and one take-profit may be armed per\n  account and market. Modify or cancel the existing stop before replacing it.\n\nRate limits and resting-order caps:\n- `RATE_LIMITED_ERROR`: the account's request budget for this operation is\n  exhausted. Create and modify share a placement budget; single cancels, bulk\n  cancels, and cancel-all-after control have separate budgets. Budgets are shared\n  across markets, signers, REST, and WebSocket requests for the same account. Wait\n  at least `retryAfterMs` milliseconds before retrying. This is a minimum wait, not\n  a reserved request slot; concurrent traffic can use the available budget.\n  Disarming an armed cancel-all-after countdown is never throttled. A disarm when no\n  countdown is armed can be throttled.\n- `OPEN_ORDER_COUNT_EXCEEDED_ERROR`: a new resting order would exceed the account's\n  total or per-market resting-order count. Cancel orders or allow them to fill\n  before placing more. Modifications do not increase the count.\n- `OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR`: the account's combined resting-order\n  notional would exceed its limit. Notional is remaining quantity multiplied by\n  limit price for resting GTC/GTT orders. Creates are checked against the submitted\n  quantity before any immediate fills; modifications are checked against the\n  resulting notional. IOC orders and armed triggers are exempt; fired trigger\n  children that rest count toward the limits. Cancel or shrink resting orders, or\n  submit a smaller order.\n\nResting-order cap errors carry no `retryAfterMs`: waiting alone does not resolve\nthem. `CAPACITY_LIMITED_ERROR` means the venue temporarily cannot accept a create or\nmodify. It carries no retry hint; use backoff with jitter. Cancels and\ncancel-all-after operations are not refused for venue capacity, though their\nseparate account rate limits still apply.\n\nTemporary availability:\n- `CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`: an order that would execute\n  immediately cannot currently pass the required pre-trade checks. Retry after a\n  short delay. Existing resting orders remain in place; non-crossing orders and\n  cancellations remain available.\n- `UNAVAILABLE_MATCHING_ENGINE_ERROR`, `UNAVAILABLE_ACCOUNT_OWNER_ERROR`: the\n  request could not be evaluated and was not accepted. Retry it unchanged after a\n  short delay. These differ from `CAPACITY_LIMITED_ERROR`, which calls for backoff\n  with jitter.\n\nPermission errors such as `NOT_WHITELISTED_ERROR` and `ACCOUNT_SUSPENDED_ERROR` are\nnot resolved by automatic retries. Contact support if an expected operation is\nrefused.\n\nRetry policy: retry unchanged after a short delay for\n`CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`,\n`UNAVAILABLE_MATCHING_ENGINE_ERROR`, and `UNAVAILABLE_ACCOUNT_OWNER_ERROR`; retry\n`RATE_LIMITED_ERROR` after at least `retryAfterMs`; retry `CAPACITY_LIMITED_ERROR`\nusing backoff with jitter. Correct validation failures and re-sign where required.\nReconcile order state before retrying an unanswered request, because a transport\ntimeout or disconnect does not establish that the request was rejected.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestError"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}}}
```

## GET /feeTiers

> Get fee tiers

```json
{"openapi":"3.0.3","info":{"title":"Reya DEX Trading API v2","version":"3.5.2"},"tags":[{"name":"Reference Data","description":"Market definitions, fee parameters, asset configuration, etc."}],"servers":[{"url":"/v2"}],"paths":{"/feeTiers":{"get":{"summary":"Get fee tiers","operationId":"getFeeTierParameters","tags":["Reference Data"],"responses":{"200":{"description":"List of fee tier parameters","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/FeeTierParameters"}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"500":{"$ref":"#/components/responses/InternalServerError"}}}}},"components":{"schemas":{"FeeTierParameters":{"title":"FeeTierParameters","type":"object","required":["tierId","takerFee","makerFee","volume30d","tierType"],"properties":{"tierId":{"$ref":"#/components/schemas/UnsignedInteger"},"takerFee":{"$ref":"#/components/schemas/SignedDecimal","description":"Taker fee rate (fee will be qty * takerFee)"},"makerFee":{"$ref":"#/components/schemas/SignedDecimal","description":"Maker fee rate (fee will be qty * makerFee)"},"volume30d":{"$ref":"#/components/schemas/UnsignedDecimal","description":"30-day volume level required for this fee tier to be applied to a wallet"},"tierType":{"$ref":"#/components/schemas/TierType"}},"additionalProperties":true},"UnsignedInteger":{"title":"UnsignedInteger","type":"integer","minimum":0},"SignedDecimal":{"title":"SignedDecimal","type":"string","pattern":"^-?\\d+(\\.\\d+)?([eE][+-]?\\d+)?$"},"UnsignedDecimal":{"title":"UnsignedDecimal","type":"string","pattern":"^\\d+(\\.\\d+)?([eE][+-]?\\d+)?$"},"TierType":{"title":"TierType","type":"string","enum":["REGULAR","VIP"],"description":"Fee tier type (REGULAR = Standard tier, VIP = VIP tier)"},"RequestError":{"title":"RequestError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/RequestErrorCode"},"message":{"type":"string","description":"Human-readable error message"},"retryAfterMs":{"type":"integer","minimum":1,"description":"Minimum wait in milliseconds before retrying the rejected operation. Included for `RATE_LIMITED_ERROR`; omitted for errors without a retry hint, including resting-order caps and `CAPACITY_LIMITED_ERROR`. The same field appears in the REST HTTP 400 body and the order-entry WebSocket's `{ ok: false, error }` response. When present, it is a positive integer. Wait at least this long; it does not reserve capacity, and concurrent requests can consume the account's available budget."}},"additionalProperties":true},"RequestErrorCode":{"title":"RequestErrorCode","type":"string","enum":["SYMBOL_NOT_FOUND_ERROR","NO_ACCOUNTS_FOUND_ERROR","NO_PRICES_FOUND_FOR_SYMBOL_ERROR","INPUT_VALIDATION_ERROR","CREATE_ORDER_OTHER_ERROR","CANCEL_ORDER_OTHER_ERROR","ORDER_DEADLINE_PASSED_ERROR","ORDER_DEADLINE_TOO_HIGH_ERROR","INVALID_NONCE_ERROR","UNAVAILABLE_MATCHING_ENGINE_ERROR","UNAUTHORIZED_SIGNATURE_ERROR","NUMERIC_OVERFLOW_ERROR","CANCEL_ALL_AFTER_OTHER_ERROR","ORDER_NOT_FOUND_ERROR","POST_ONLY_WOULD_CROSS_ERROR","MODIFY_QTY_BELOW_FILLED_ERROR","EMPTY_MODIFY_ERROR","MODIFY_ORDER_OTHER_ERROR","RATE_LIMITED_ERROR","INSUFFICIENT_BALANCE_ERROR","PRICE_QTY_BOUNDS_ERROR","SERVICE_DISABLED_ERROR","UNAUTHORIZED_ACCOUNT_ERROR","TRADING_HALTED_ERROR","DUPLICATE_CLIENT_ORDER_ID_ERROR","ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR","ACCOUNT_BELOW_INITIAL_MARGIN_ERROR","OPEN_INTEREST_CAP_ERROR","OPEN_INTEREST_BUDGET_ERROR","REDUCE_ONLY_CONDITION_NOT_MET_ERROR","CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR","TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR","TRIGGER_LIMIT_OUTSIDE_BAND_ERROR","TRIGGER_ALREADY_EXISTS_ERROR","ORDER_EXPIRES_TOO_SOON_ERROR","OPEN_ORDER_COUNT_EXCEEDED_ERROR","OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR","CAPACITY_LIMITED_ERROR","NOT_WHITELISTED_ERROR","ACCOUNT_SUSPENDED_ERROR","UNAVAILABLE_ACCOUNT_OWNER_ERROR"],"description":"Machine-readable request rejection code. REST returns HTTP 400; the order-entry WebSocket returns the same code in its correlated error response. See the REST API HTTP 400 response reference for per-code meanings and retry guidance."},"ServerError":{"title":"ServerError","type":"object","required":["error","message"],"properties":{"error":{"$ref":"#/components/schemas/ServerErrorCode"},"message":{"type":"string","description":"Human-readable error message"}},"additionalProperties":true},"ServerErrorCode":{"title":"ServerErrorCode","type":"string","enum":["INTERNAL_SERVER_ERROR"],"description":"Standardized error codes for API responses"}},"responses":{"BadRequest":{"description":"Standardized error codes for API responses. Branch on `error`, not the free-text\n`message` or HTTP status. Every venue rejection on REST uses HTTP 400 with a\n`RequestError` body. The order-entry WebSocket returns the same code and optional\n`retryAfterMs` in its `{ ok: false, error }` response. HTTP 429 is reserved for\ninfrastructure-level (per-IP) limits in front of the API and is never a venue\nverdict.\n\nValidation and authorization:\n- `INPUT_VALIDATION_ERROR`: correct the request's fields or order-class combination\n  before resubmitting. Immutable fields on a modify must match the existing order.\n- `SYMBOL_NOT_FOUND_ERROR`, `NO_ACCOUNTS_FOUND_ERROR`,\n  `NO_PRICES_FOUND_FOR_SYMBOL_ERROR`: the requested market, account data, or price\n  data is unavailable; check the request and current market/account state.\n- `NUMERIC_OVERFLOW_ERROR`, `PRICE_QTY_BOUNDS_ERROR`: a numeric value is out of\n  range, or price/quantity is invalid for the market. Check price increments and\n  quantity limits.\n- `UNAUTHORIZED_SIGNATURE_ERROR`: the signature is invalid or unauthorized.\n  `UNAUTHORIZED_ACCOUNT_ERROR`: the signer is not permitted to act on the target\n  order. For an armed protective stop, modify and cancel require the signer that\n  created it.\n- `INVALID_NONCE_ERROR`: use a fresh, monotonically increasing nonce for the signer\n  and re-sign.\n- `ORDER_DEADLINE_PASSED_ERROR`, `ORDER_DEADLINE_TOO_HIGH_ERROR`: the signature's\n  `deadline` has passed or is too far in the future. Correct it and re-sign. This\n  deadline controls request acceptance, not the lifetime of an accepted order.\n- `ORDER_EXPIRES_TOO_SOON_ERROR`: a GTT order's `expiresAfter` leaves insufficient\n  time for execution and settlement. Choose a later expiry and re-sign. GTT orders\n  can be cancelled before their signed expiry to allow settlement; for a protective\n  stop this applies to both its armed phase and its fired child.\n- `SERVICE_DISABLED_ERROR`, `TRADING_HALTED_ERROR`: order entry is unavailable for\n  the market. Check market availability before submitting again.\n- `DUPLICATE_CLIENT_ORDER_ID_ERROR`: the client ID belongs to a live order.\n  Reconcile that order before submitting another.\n- `ORDER_NOT_FOUND_ERROR`: the target order was not found. Refresh its state before\n  retrying.\n- `EMPTY_MODIFY_ERROR`: a LIMIT modification makes no change. An armed trigger may\n  be re-signed at unchanged prices.\n- `MODIFY_QTY_BELOW_FILLED_ERROR`: the modified total quantity must exceed the\n  quantity already filled.\n- `POST_ONLY_WOULD_CROSS_ERROR`: the order would execute immediately. Choose a\n  non-crossing price or change the post-only intent and re-sign.\n- The `*_OTHER_ERROR` codes are operation-specific failures without a more specific\n  code. Use `message` for display or troubleshooting; do not parse it as a stable\n  machine-readable contract.\n\nPre-trade risk checks:\n- `ACCOUNT_BELOW_LIQUIDATION_MARGIN_ERROR`: the account does not meet the required\n  liquidation-margin or balance conditions.\n- `ACCOUNT_BELOW_INITIAL_MARGIN_ERROR`: the proposed trade does not meet the\n  account's initial-margin or collateral requirements. An account already below\n  initial margin may trade only when the trade improves its health.\n- `INSUFFICIENT_BALANCE_ERROR`: the account cannot fund the order.\n- `OPEN_INTEREST_CAP_ERROR`, `OPEN_INTEREST_BUDGET_ERROR`: the trade exceeds the\n  market's available open-interest capacity.\n- `REDUCE_ONLY_CONDITION_NOT_MET_ERROR`: the order would not strictly reduce the\n  current position, for example because there is no position, the side is wrong, or\n  the size would reverse it.\n\nA request refused by risk checks is rejected in full. A rejected create produces no\norder; a rejected modify leaves the existing order unchanged. These failures require\na change in account or market state, a smaller order, more collateral, or a user\ndecision; do not automatically retry them unchanged. Resting-order cancellations\nappear separately as `cancelReason: RISK_CANCELLED`. A protective stop whose child\nfails risk checks is cancelled with `RISK_REJECTED`; see `CancelReason`.\n\nProtective stops:\n- `TRIGGER_IOC_MUST_NOT_EXPIRE_ERROR`: an IOC trigger cannot carry `expiresAfter`.\n  Only GTT orders carry an expiry; GTC and IOC must omit it. Invalid\n  time-in-force/expiry combinations can also return `INPUT_VALIDATION_ERROR`.\n  Correct the combination and re-sign.\n- `TRIGGER_LIMIT_OUTSIDE_BAND_ERROR`: the stop's `limitPx` is outside the permitted\n  range around `triggerPx`, or stops are unavailable for the market. Move the limit\n  closer to the trigger and re-sign when the price is out of range. If the message\n  indicates stops are unavailable, changing the price will not resolve it.\n- `TRIGGER_ALREADY_EXISTS_ERROR`: the account already has an armed stop of the same\n  type on that market. At most one stop-loss and one take-profit may be armed per\n  account and market. Modify or cancel the existing stop before replacing it.\n\nRate limits and resting-order caps:\n- `RATE_LIMITED_ERROR`: the account's request budget for this operation is\n  exhausted. Create and modify share a placement budget; single cancels, bulk\n  cancels, and cancel-all-after control have separate budgets. Budgets are shared\n  across markets, signers, REST, and WebSocket requests for the same account. Wait\n  at least `retryAfterMs` milliseconds before retrying. This is a minimum wait, not\n  a reserved request slot; concurrent traffic can use the available budget.\n  Disarming an armed cancel-all-after countdown is never throttled. A disarm when no\n  countdown is armed can be throttled.\n- `OPEN_ORDER_COUNT_EXCEEDED_ERROR`: a new resting order would exceed the account's\n  total or per-market resting-order count. Cancel orders or allow them to fill\n  before placing more. Modifications do not increase the count.\n- `OPEN_ORDER_NOTIONAL_EXCEEDED_ERROR`: the account's combined resting-order\n  notional would exceed its limit. Notional is remaining quantity multiplied by\n  limit price for resting GTC/GTT orders. Creates are checked against the submitted\n  quantity before any immediate fills; modifications are checked against the\n  resulting notional. IOC orders and armed triggers are exempt; fired trigger\n  children that rest count toward the limits. Cancel or shrink resting orders, or\n  submit a smaller order.\n\nResting-order cap errors carry no `retryAfterMs`: waiting alone does not resolve\nthem. `CAPACITY_LIMITED_ERROR` means the venue temporarily cannot accept a create or\nmodify. It carries no retry hint; use backoff with jitter. Cancels and\ncancel-all-after operations are not refused for venue capacity, though their\nseparate account rate limits still apply.\n\nTemporary availability:\n- `CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`: an order that would execute\n  immediately cannot currently pass the required pre-trade checks. Retry after a\n  short delay. Existing resting orders remain in place; non-crossing orders and\n  cancellations remain available.\n- `UNAVAILABLE_MATCHING_ENGINE_ERROR`, `UNAVAILABLE_ACCOUNT_OWNER_ERROR`: the\n  request could not be evaluated and was not accepted. Retry it unchanged after a\n  short delay. These differ from `CAPACITY_LIMITED_ERROR`, which calls for backoff\n  with jitter.\n\nPermission errors such as `NOT_WHITELISTED_ERROR` and `ACCOUNT_SUSPENDED_ERROR` are\nnot resolved by automatic retries. Contact support if an expected operation is\nrefused.\n\nRetry policy: retry unchanged after a short delay for\n`CROSSING_ORDERS_TEMPORARILY_UNAVAILABLE_ERROR`,\n`UNAVAILABLE_MATCHING_ENGINE_ERROR`, and `UNAVAILABLE_ACCOUNT_OWNER_ERROR`; retry\n`RATE_LIMITED_ERROR` after at least `retryAfterMs`; retry `CAPACITY_LIMITED_ERROR`\nusing backoff with jitter. Correct validation failures and re-sign where required.\nReconcile order state before retrying an unanswered request, because a transport\ntimeout or disconnect does not establish that the request was rejected.\n","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RequestError"}}}},"InternalServerError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ServerError"}}}}}}}
```
