> ## Documentation Index
> Fetch the complete documentation index at: https://finance.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Stop Order

> Trigger a market order automatically when the price reaches your stop level. Used to cut losses or protect gains without watching the screen.

A **stop order** (also called a *stop-market* order) sits dormant until the market touches your `stopPrice`. The moment it does, the stop **converts to a market order** and executes at the best available price. It's the classic tool for cutting a loss or protecting a profit when you can't watch the market.

<Note>
  A stop guarantees **execution once triggered**, not a price. In a fast or gapping market the fill can be worse than the stop level. If you need a price ceiling/floor on the triggered order, use a [Stop-Limit order](/api-reference/orders/stop-limit-order) instead.
</Note>

***

## When to use it

* **Stop-loss:** you're long AAPL at 150 and want to exit if it falls to 145 → a `SELL` stop at `stopPrice: "145.00"`.
* **Protect a gain:** trail your exit up as the position profits.
* **Breakout entry:** buy only once price breaks above resistance → a `BUY` stop above the current price.

### Which way does the stop trigger?

| Side                   | Stop triggers when price…     | Typical placement                                      |
| ---------------------- | ----------------------------- | ------------------------------------------------------ |
| `SELL` / `SELL_SHORT`  | falls to or below `stopPrice` | **below** the current price (stop-loss on a long)      |
| `BUY` / `BUY_TO_COVER` | rises to or above `stopPrice` | **above** the current price (breakout / cover a short) |

***

## How it works

1. You `POST /v1/orders` with `type: "STOP"` and a `stopPrice` — **no `price`**.
2. The order is accepted and waits, inactive, off the visible book.
3. When the market touches `stopPrice`, it becomes a market order and routes immediately.
4. It fills (`FILLED` / `PARTIALLY_FILLED`), streamed as `account.order` events.

***

## Request

| Field       | Type   | Required | Description                                                                                               |
| ----------- | ------ | -------- | --------------------------------------------------------------------------------------------------------- |
| `type`      | string | yes      | Must be `"STOP"`.                                                                                         |
| `stopPrice` | string | yes      | The trigger price as a decimal string. When the market reaches it, the order activates as a market order. |
| `price`     | string | —        | **Do not send.** A stop order has no limit price — it triggers into a *market* order.                     |
| `side`      | string | yes      | `BUY`, `SELL`, `SELL_SHORT`, or `BUY_TO_COVER`.                                                           |
| `qty`       | string | yes      | Number of shares as a decimal string.                                                                     |

### Example — stop-loss: sell 100 AAPL if it drops to 145

```bash cURL theme={null}
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",
    "qty": "100",
    "stopPrice": "145.00",
    "timeInForce": "GTC"
  }'
```

```json Request body theme={null}
{
  "tradingAccountId": "ACC123456",
  "symbol": "AAPL",
  "side": "SELL",
  "type": "STOP",
  "qty": "100",
  "stopPrice": "145.00",
  "timeInForce": "GTC"
}
```

<Warning>
  `stopPrice` is **required** for stop orders; `price` must be **absent**. Stops are commonly placed `GTC` so they persist across sessions until triggered or cancelled.
</Warning>

***

## Response

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

`NEW` here means the stop is **armed and waiting** — it is not yet executing.

***

## Watch it trigger and fill

Until the trigger is hit you'll see the order resting. When `stopPrice` is touched, it converts and fills — delivered as `account.order` events:

```json account.order — triggered & filled theme={null}
{
  "type": "event",
  "timestamp": "2024-01-15T13:45:02Z",
  "payload": {
    "topic": "account",
    "name": "account.order",
    "target": "account:ACC123456",
    "data": {
      "ordId": "ORD-22001",
      "clOrdId": "CLIENT-010",
      "symbol": "AAPL",
      "side": "SELL",
      "type": "STOP",
      "timeInForce": "GTC",
      "qty": "100",
      "stopPrice": "145.00",
      "ordStatus": "FILLED",
      "cumQty": "100",
      "leavesQty": "0",
      "avgPrice": "144.92",
      "securityType": "EQUITY",
      "category": "EQUITY",
      "updatedAt": "2024-01-15T13:45:02Z"
    }
  }
}
```

Note `avgPrice` (`144.92`) came in **below** the `stopPrice` (`145.00`) — that's the market-order behavior after triggering. See the [Limit order → Listen for updates](/api-reference/orders/limit-order#listen-for-updates) section for the connect/subscribe handshake, or the full [Account Updates WebSocket](/websockets/account-updates) reference.

***

## Next steps

<CardGroup cols={2}>
  <Card title="Stop-limit order" icon="sliders" href="/api-reference/orders/stop-limit-order">
    Add a price limit so the triggered order can't fill worse than you allow.
  </Card>

  <Card title="Limit order" icon="tag" href="/api-reference/orders/limit-order">
    Full REST + WebSocket round-trip walkthrough.
  </Card>

  <Card title="Try it live" icon="play" href="/api-reference/orders/place-stop-order">
    Interactive reference for `POST /v1/orders`.
  </Card>

  <Card title="Order Flow" icon="diagram-project" href="/api-reference/orders/order-flow">
    How all order types fit together.
  </Card>
</CardGroup>
