# HTTP — `GET /v1/openOrders`

The user's currently open orders. Public endpoint. It fails with HTTP `503`
and `risk_core_unavailable` when the risk core cannot be read.

Only orders the venue has proven on its book are listed. `status` is `open`
for a resting order (including one whose cancel is requested but not yet
confirmed by the venue) and `partially_filled` once confirmed fills exist. A
place request the venue has not proven resting is not an open order yet, even
if a cancel for it is already in flight; track it through `orderUpdates`.

```http
GET /v1/openOrders?user=0x0000000000000000000000000000000000000001&cloid=0x00000000000000000000000000000002
```

| Param | Description |
| --- | --- |
| `user` | EVM address. Defaults like the WebSocket. Malformed values fail with `bad_request`. |
| `cloid` | Optional public client order id to look up. Malformed values fail with `invalid_cloid`. |
| `limit` | Rows per page, clamped to `1` to `500`, default `100`. Values that are not an integer in `0` to `65535` fail with `invalid_query`. Sorted by creation time, then order id, ascending. |
| `cursor` | Optional opaque `nextCursor` from the previous page. Malformed values fail with HTTP 400 and `invalid_cursor`. |

While `hasMore` is `true`, pass `nextCursor` as `cursor` in the next request.
Keep `user` and `cloid` unchanged. Each page starts strictly after the previous
page's last order, even if that order has since closed. Orders with the same
creation time are distinguished by order id.

```jsonc
{
  "status": "ok",
  "data": {
    "user": "0x0000000000000000000000000000000000000001",
    "openOrders": [
      {
        "orderId": "8f20b2e6-8b7a-4a0b-bf3d-6fb70c622f76",
        "cloid": "0x00000000000000000000000000000002",
        "a": "BTC",
        "venue": "lighter",
        "b": "buy",
        "orderKind": "limit",
        "status": "open",
        "size": "1",
        "filledSize": "0",
        "remainingSize": "1",
        "p": "65000",
        "tif": "Alo",
        "createdAtMs": 1780000000000,
        "updatedAtMs": 1780000000100
      }
    ],
    "nextCursor": "oo1_1780000000_0_8f20b2e6-8b7a-4a0b-bf3d-6fb70c622f76",
    "hasMore": false
  },
  "server_time_ms": 1780000000100
}
```

`status` is `open` or `partially_filled`. Limit orders carry `p`
and `tif`; market orders carry `slippage` instead. `avgFillPrice` appears once
something has filled. `size` is the current
effective total size and `remainingSize` is `size - filledSize`. For
reduce-only orders, `size` can shrink without a modify or a fill when the
position shrinks or a newer reduce-only order takes capacity; a trim is
reverted only when the placement that caused it is rejected before venue send.

An empty `openOrders` for a given `cloid` means no open placement exists for
it: the order may be filled, cancelled, failed, uncertain, or never accepted.
Use `orderUpdates` for the lifecycle and
[`GET /v1/userFills`](/api/user-fills) for fill history. A just-accepted
placement can be absent for a short window until the venue acknowledgement is
applied.

Each page reads the current live state. Pages do not share a frozen snapshot.
An order can close or become visible between requests. Restart without a
cursor to refresh the full list; a cursor is not a substitute for `orderUpdates`.
On an empty page, `nextCursor` preserves the supplied cursor, or is `null` if
none was supplied. Stop the walk when `hasMore` is `false`.
