Skip to main content
A stop-limit order combines the two ideas you’ve already seen:
  • a stop (stopPrice) that arms the order, and
  • a limit (price) that controls the price once it’s armed.
When the market touches stopPrice, the order becomes a limit order at your price — instead of a market order. This protects you from a bad fill in a fast market, at the cost of possibly not filling at all if price blows past your limit.
Stop vs. stop-limit in one line: a stop guarantees you get out/in but not at what price; a stop-limit guarantees the price but not that you fill. Choose based on whether execution-certainty or price-certainty matters more.

When to use it

  • You want a stop-loss but refuse to be filled below a floor in a flash crash.
  • You’re entering on a breakout but won’t chase past a certain price.
The gap between stopPrice and price is your tolerance. Too tight and you risk no fill; too wide and you give up price protection.

How it works

  1. You POST /v1/orders with type: "STOP_LIMIT", a stopPrice, and a price.
  2. The order waits, inactive, until the market touches stopPrice.
  3. It then becomes a limit order at price and rests on the book.
  4. It fills only at price or better; otherwise it keeps working (or expires per its timeInForce).

Request

FieldTypeRequiredDescription
typestringyesMust be "STOP_LIMIT".
stopPricestringyesThe trigger price. When the market reaches it, the order activates.
pricestringyesThe limit price the activated order will work at. Fills at this price or better only.
sidestringyesBUY, SELL, SELL_SHORT, or BUY_TO_COVER.
qtystringyesNumber of shares as a decimal string.

Example — stop-loss with a price floor

Sell 100 AAPL: arm at 145.00, but don’t sell below 144.50.
cURL
curl -X POST https://api.aries.com/v1/orders \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "tradingAccountId": "ACC123456",
    "symbol": "AAPL",
    "side": "SELL",
    "type": "STOP_LIMIT",
    "qty": "100",
    "stopPrice": "145.00",
    "price": "144.50",
    "timeInForce": "GTC"
  }'
Request body
{
  "tradingAccountId": "ACC123456",
  "symbol": "AAPL",
  "side": "SELL",
  "type": "STOP_LIMIT",
  "qty": "100",
  "stopPrice": "145.00",
  "price": "144.50",
  "timeInForce": "GTC"
}
A stop-limit order requires both stopPrice and price. Omitting either is rejected.

Response

{
  "success": true,
  "clOrdId": "CLIENT-011",
  "status": "NEW",
  "symbol": "AAPL",
  "side": "SELL",
  "qty": "100",
  "cumQty": "0",
  "leavesQty": "100",
  "avgPrice": "0",
  "transactTime": "2024-01-15T10:30:00Z"
}

Watch it trigger and fill

After stopPrice is touched, the order behaves like a limit order — it may fill in full, partially, or sit working at your price:
account.order — triggered, working as a limit
{
  "type": "event",
  "timestamp": "2024-01-15T13:45:00Z",
  "payload": {
    "topic": "account",
    "name": "account.order",
    "target": "account:ACC123456",
    "data": {
      "ordId": "ORD-22002",
      "clOrdId": "CLIENT-011",
      "symbol": "AAPL",
      "side": "SELL",
      "type": "STOP_LIMIT",
      "timeInForce": "GTC",
      "qty": "100",
      "stopPrice": "145.00",
      "price": "144.50",
      "ordStatus": "PARTIALLY_FILLED",
      "cumQty": "60",
      "leavesQty": "40",
      "avgPrice": "144.61",
      "securityType": "EQUITY",
      "category": "EQUITY",
      "updatedAt": "2024-01-15T13:45:00Z"
    }
  }
}
If the market trades straight through your price after triggering, you may be left PARTIALLY_FILLED or completely unfilled — the limit protected you from a worse price but didn’t guarantee a fill. See the Limit order → Listen for updates handshake and the full Account Updates WebSocket reference.

Next steps

Stop order

The simpler trigger-into-market variant.

Single-leg option

Move on to options orders.

Replace Order

Adjust the stop or limit on a resting order.

Order Flow

How all order types fit together.