Skip to content

Get Open Orders

Retrieve all currently open orders for the authenticated subaccount. This endpoint returns only active orders (not filled or cancelled), with optional filtering by symbol, side, type, and status.

Endpoint

POST https://papi.synthetix.io/v1/trade

Request

Request Format

{
  "params": {
    "action": "getOpenOrders",
    "subAccountId": "1867542890123456789",
    "symbol": "BTC-USDT",
    "limit": 50,
    "offset": 0
  },
  "expiresAfter": 1704067500,
  "signature": {
    "v": 28,
    "r": "0x19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef",
    "s": "0xabcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600abcdef19480589384695193600"
  }
}

Request Parameters

ParameterTypeRequiredDescription
paramsobjectYesRequest parameters wrapper
params.actionstringYesMust be "getOpenOrders"
params.subAccountIdstringYesSubAccount ID to retrieve orders for
params.symbolstringNoFilter orders by specific market symbol (e.g., "BTC-USDT")
params.sidestringNoFilter by order side: "buy" or "sell"
params.typestringNoFilter by order type (e.g., "LIMIT", "MARKET")
params.statusstringNoFilter by order status (e.g., "NEW", "PARTIALLY_FILLED")
params.limitintegerNoMaximum number of orders to return (default: 50)
params.offsetintegerNoNumber of orders to skip for pagination (default: 0)
ParameterTypeRequiredDescription
nonceuint64Yes*Positive integer nonce (must be incrementing and unique per request)
signatureobjectYesEIP-712 signature object
expiresAfteruint64NoUnix milliseconds expiration timestamp (5x rate limit on stale cancels)

:::info Common Parameters These are top-level request parameters. The subAccountId parameter is specified within the params object (see each endpoint's parameter table). :::

:::info SubAccountAction Endpoints Endpoints using SubAccountAction signing (getPositions, getOpenOrders, getOrdersHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates) do not require the nonce parameter. Only signature and optional expiresAfter are needed. :::

Response

Response Structure

FieldTypeDescription
statusstringAlways "ok" for successful requests or "error" for failures
responsearrayArray of open order objects matching filter criteria (omitted when status is "error")
errorobjectError details (only present when status is "error")
request_idstringRequest tracking identifier

Success Response

{
  "status": "ok",
  "response": [
    {
      "order": {
        "venueId": "1958787130134106112",
        "clientId": "cli-1958787130134106112"
      },
      "orderId": "1958787130134106112",
      "symbol": "BTC-USDT",
      "side": "buy",
      "type": "LIMIT",
      "quantity": "0.1",
      "price": "45000.00",
      "triggerPrice": "",
      "triggerPriceType": "",
      "timeInForce": "GTC",
      "reduceOnly": false,
      "postOnly": false,
      "closePosition": false,
      "createdTime": 1755846234000,
      "updatedTime": 1755846234000,
      "filledQuantity": "0.0",
      "takeProfitOrder": {
        "venueId": "1958787130134106115",
        "clientId": "cli-1958787130134106115"
      },
      "takeProfitOrderId": "1958787130134106115",
      "stopLossOrder": {
        "venueId": "1958787130134106116",
        "clientId": "cli-1958787130134106116"
      },
      "stopLossOrderId": "1958787130134106116"
    },
    {
      "order": {
        "venueId": "1958787130134106113",
        "clientId": "cli-1958787130134106113"
      },
      "orderId": "1958787130134106113",
      "symbol": "ETH-USDT",
      "side": "sell",
      "type": "limit",
      "quantity": "2.0",
      "price": "2800.00",
      "triggerPrice": "",
      "triggerPriceType": "",
      "timeInForce": "GTC",
      "reduceOnly": false,
      "postOnly": true,
      "closePosition": false,
      "createdTime": 1755846235000,
      "updatedTime": 1755846235000,
      "filledQuantity": "0.5",
      "takeProfitOrderId": "",
      "stopLossOrderId": ""
    }
  ],
  "request_id": "5ccf215d37e3ae6d"
}

Empty Result

{
  "status": "ok",
  "response": [],
  "request_id": "5ccf215d37e3ae6f"
}

Order Object Fields

FieldTypeDescription
orderobjectCanonical order identifier object
order.venueIdstringCanonical venue-generated order identifier
order.clientIdstringOptional client-provided order identifier
orderIdstringDeprecated legacy order identifier (venue ID string)
symbolstringTrading pair symbol (e.g., "BTC-USDT")
sidestringOrder side: "buy" or "sell"
typestringOrder type (e.g., "LIMIT", "MARKET")
quantitystringTotal order quantity
pricestringOrder price (empty for market orders)
triggerPricestringTrigger price for conditional orders
triggerPriceTypestringTrigger price type: "mark", "last", or "index"
timeInForcestringTime in force: "GTC", "IOC", or "FOK"
reduceOnlybooleanWhether order can only reduce position
postOnlybooleanWhether order must be maker (no immediate match)
closePositionbooleanWhether order closes entire position
createdTimeintegerOrder creation timestamp (Unix milliseconds)
updatedTimeintegerLast update timestamp (Unix milliseconds)
filledQuantitystringQuantity that has been filled
takeProfitOrderobjectCanonical linked take-profit order identifier object
takeProfitOrderIdstringDeprecated linked take-profit venue ID
stopLossOrderobjectCanonical linked stop-loss order identifier object
stopLossOrderIdstringDeprecated linked stop-loss venue ID

Migration Note: Use order.venueId as the canonical order ID. Legacy orderId, takeProfitOrderId, and stopLossOrderId fields are deprecated compatibility fields.

Note on TP/SL Fields: When orders are placed with normalTpsl or positionTpsl grouping, the entry order will contain takeProfitOrder / stopLossOrder linking to the associated TP/SL trigger orders. Deprecated takeProfitOrderId / stopLossOrderId are still returned for compatibility.

Error Response

{
  "status": "error",
  "error": {
    "code": "INVALID_FORMAT",
    "message": "Invalid request body"
  },
  "request_id": "5ccf215d37e3ae6d"
}

Usage Examples

Get All Open Orders

{
  "params": {
    "action": "getOpenOrders",
    "subAccountId": "1867542890123456789"
  },
  "expiresAfter": 1704067500,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

Get Open Orders for Specific Market

{
  "params": {
    "action": "getOpenOrders",
    "subAccountId": "1867542890123456789",
    "symbol": "BTC-USDT"
  },
  "expiresAfter": 1704067500,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

Get Open Buy Orders with Pagination

{
  "params": {
    "action": "getOpenOrders",
    "subAccountId": "1867542890123456789",
    "side": "buy",
    "limit": 100,
    "offset": 0
  },
  "expiresAfter": 1704067500,
  "signature": { "v": 28, "r": "0x...", "s": "0x..." }
}

EIP-712 Signature

const domain = {
  name: "Synthetix",
  version: "1",
  chainId: 1,
  verifyingContract: "0x0000000000000000000000000000000000000000"
};
 
const types = {
  SubAccountAction: [
    { name: "subAccountId", type: "uint256" },
    { name: "action", type: "string" },
    { name: "expiresAfter", type: "uint256" }
  ]
};
 
const message = {
  subAccountId: "1867542890123456789",
  action: "getOpenOrders",
  expiresAfter: 0
};
 
const signature = await signer._signTypedData(domain, types, message);

Implementation Notes

  • Returns only active orders (placed, partially filled)
  • Does not include filled, cancelled, or rejected orders
  • For historical orders with time ranges and status filters, use getOrdersHistory
  • Pagination uses limit/offset approach (default limit: 50)
  • Orders are returned in creation order (newest first)
  • Authentication requires signature by account owner or authorized delegate
  • Linked TP/SL orders: use takeProfitOrder.venueId and stopLossOrder.venueId as canonical IDs (takeProfitOrderId / stopLossOrderId remain deprecated compatibility fields)

Signing

All trading methods are signed using EIP-712. Each successful trading request will contain:

  • A piece of structured data that includes the sender address
  • A signature of the hash of that structured data, signed by the sender

For detailed information on EIP-712 signing, see EIP-712 Signing.

Nonce Management

The nonce system prevents replay attacks and ensures order uniqueness:

  • Use any positive integer as nonce
  • Each nonce must be greater than the previous one (incrementing)
  • Date.now() is a convenient option, not a requirement
  • If nonce conflicts occur, increment by 1 and retry

:::note SubAccountAction Exception SubAccountAction endpoints (getPositions, getOpenOrders, getOrdersHistory, getTrades, getFundingPayments, getSubAccount, getSubAccounts, getDelegatedSigners, getBalanceUpdates) do not require a nonce. Only the signature and optional expiresAfter parameters are needed. :::

Error Handling

Common error scenarios:

Error CodeDescriptionRetryable
UNAUTHORIZEDEIP-712 signature validation failedNo
VALIDATION_ERRORRequest validation failedNo
MISSING_REQUIRED_FIELDRequired field is missingNo
INVALID_FORMATField format is invalidNo
INVALID_VALUEInvalid parameter valueNo
RATE_LIMIT_EXCEEDEDToo many requests in time windowYes
INSUFFICIENT_MARGINNot enough margin for tradeNo
ORDER_NOT_FOUNDOrder does not existNo
OPERATION_TIMEOUTOperation timed outYes
ErrorDescription
Invalid request formatRequest payload could not be parsed
Internal errorFailed to retrieve orders
Subaccount not foundSpecified subaccount does not exist
Invalid symbolSpecified symbol is not recognized
Invalid paginationLimit or offset out of valid range

Comparison with getOrdersHistory

FeaturegetOpenOrdersgetOrdersHistory
PurposeCurrently open orders onlyAll orders with comprehensive history
Time FilteringNot supportedfromTime/toTime range
Status FilteringSingle status filterMultiple status filters
Default ScopeActive orders onlyAll orders (any status)
Use CaseReal-time order managementHistorical analysis and reporting
SortingCreation order (newest first)Configurable sort fields/order