# Move a resting order's price or change its size

`POST https://app.skylit.ai/api/nexus/v1/trading/accounts/{account}/orders/{orderId}/modify`

API: Nexus.

Send `price`, `quantity`, or both. Both change together or neither does.

- **`price`** moves a working limit or stop order (or a bracket's stop or target), like dragging it on the Nexus chart. On a stop-limit, `price` is its limit and `stopPrice` its trigger. The trigger can't move once a trade has hit it.
- **`quantity`** changes a resting entry's size, 1 to 100. Going up is checked like a new order of that size, your evaluation's contract cap included, and the order loses its place in line from that moment. Going down keeps its place. Your stop and target follow the new size, so you can't resize them on their own.
- Futures orders fill all at once, so a filled order can't be resized, and 0 isn't a size: cancel the order instead.

No live price answers `503 no_live_price` and the order stays where it was. On a test order you can rehearse a size change with `quantity` alone. A test order's price can't be moved (`400 test_modify_unavailable`): cancel it and send a new test order at the new price.

## Authentication

Send your Skylit API key as a bearer token: `Authorization: Bearer <key>`. No other header is accepted.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `account` | path | string | yes | `practice`, `agent` (your bot's account), `evaluation` or `funded` (when you have exactly one running), or a futures account id from capabilities. |
| `orderId` | path | string (uuid) | yes | The order's id, from the open, the working list or the history. |

## Request body

`application/json`

```json
{
  "price": 0,
  "quantity": 0,
  "stopPrice": 0,
  "test": false
}
```

## Example request

```bash
curl "https://app.skylit.ai/api/nexus/v1/trading/accounts/practice/orders/b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e/modify" \
  -H "Authorization: Bearer $SKYLIT_API_KEY"
```

## Responses

### 200

The order at its new price or size, with its bracket.

The limit order, moved.:

```json
{
  "data": {
    "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "assetClass": "futures",
    "source": "api",
    "account": {
      "id": "8d7c6b5a-4e3f-4a2b-9c1d-0e1f2a3b4c5d",
      "kind": "evaluation",
      "name": "50K Evaluation"
    },
    "symbol": "NQZ26",
    "side": "buy",
    "quantity": 1,
    "role": "entry",
    "orderType": "limit",
    "status": "working",
    "limitPrice": 25295,
    "placedAt": "2026-10-09T14:36:00Z"
  }
}
```

The entry, now 2 contracts. It's back of the line from now.:

```json
{
  "data": {
    "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "assetClass": "futures",
    "source": "api",
    "account": {
      "id": "8d7c6b5a-4e3f-4a2b-9c1d-0e1f2a3b4c5d",
      "kind": "evaluation",
      "name": "50K Evaluation"
    },
    "symbol": "NQZ26",
    "side": "buy",
    "quantity": 2,
    "role": "entry",
    "orderType": "limit",
    "status": "working",
    "limitPrice": 25295,
    "placedAt": "2026-10-09T14:36:00Z"
  }
}
```

The stop-limit with its new trigger and limit.:

```json
{
  "data": {
    "id": "c3d4e5f6-a7b8-4c9d-8e0f-1a2b3c4d5e6f",
    "assetClass": "futures",
    "source": "api",
    "account": {
      "id": "3c2b1a90-5e4d-4f3a-8b2c-1d0e9f8a7b6c",
      "kind": "practice",
      "name": "Paper"
    },
    "symbol": "NQZ26",
    "side": "buy",
    "quantity": 1,
    "role": "entry",
    "orderType": "stop_limit",
    "status": "working",
    "limitPrice": 25350,
    "stopPrice": 25345,
    "placedAt": "2026-10-12T14:40:00Z"
  }
}
```

### 400

The request was refused before anything was traded. Codes: `bad_request`, `bad_contract`, `invalid_quantity`, `invalid_price`, `unsupported_asset_class`, `unsupported_order_type`, `only_market_orders`, `limit_price_required` (a limit with no `limitPrice`), `invalid_limit_price` (not in cents, or outside 0.01 to 99,999.99 for options or 999,999.99 for stocks), `stop_price_required` (a stop with no `stopPrice`), `invalid_stop_price` (not in cents, or outside 0.01 to 999,999.99), `invalid_take_profit`, `test_orders_unavailable`, `test_modify_unavailable`.

A typo in the body.:

```json
{
  "error": {
    "code": "bad_request",
    "message": "Unknown field \"quantitty\". See the trades API docs for the fields you can send."
  }
}
```

### 401

No key, or a key that isn't valid. Codes: `missing_api_key`, `invalid_api_key`.

No key sent.:

```json
{
  "error": {
    "code": "missing_api_key",
    "message": "Send your Skylit API key in the Authorization header: Authorization: Bearer YOUR_SKYLIT_API_KEY."
  }
}
```

### 403

The key works but the account can't do this. Codes: `account_suspended`, `nexus_access_denied`, `futures_access_denied`.

The account doesn't include Nexus.:

```json
{
  "error": {
    "code": "nexus_access_denied",
    "message": "This Skylit account doesn't include Nexus, so it can't place Nexus trades."
  }
}
```

### 404

Not on your account. Codes: `trade_not_found`, `account_not_found`, `order_not_found`.

Not your trade, or no such trade.:

```json
{
  "error": {
    "code": "trade_not_found",
    "message": "No trade with that id on your account."
  }
}
```

### 409

The order clashes with what you hold or sent before. Codes: `duplicate_position` (with `tradeId`: add to it instead), `trade_closed`, `open_position_limit` (open positions plus resting opens through the API are at 50), `working_order_limit` (50 options and stock orders already resting through the API), `position_size_limit` (an add would take the position past 1,000 contracts or 100,000 shares), `client_order_id_used`, `request_in_progress`, `account_locked`, `account_busy`, `account_ended`, `order_not_working` (it already filled, expired, or was cancelled or rejected), `stop_triggered` (a stop that's been set off is filling now, so it can't be cancelled or changed).

You already hold this contract.:

```json
{
  "error": {
    "code": "duplicate_position",
    "message": "You already hold an open position on this contract. Add to it with POST /api/nexus/v1/trades/{id}/adds (the id is tradeId), or close it first.",
    "tradeId": "6f1c2a4e-8b1d-4c39-9a51-2d7e0b3c9f10"
  }
}
```

### 422

Read fine, but the market or the account says no. Codes: `market_closed`, `contract_expired`, `contract_not_offered`, `price_outside_market`, `insufficient_buying_power`, `account_not_tradable`, `account_ambiguous`, `reduce_only_would_open`, `order_refused`, `order_rejected` (a resting order that tried to fill right away and couldn't; `orderId` points to it). A resting order that can't be covered answers `insufficient_buying_power` with `orderId` too: it's recorded as rejected.

Outside market hours.:

```json
{
  "error": {
    "code": "market_closed",
    "message": "The market is closed for this contract right now, so nothing was filled."
  }
}
```

### 429

Over a rate limit. Wait `Retry-After` seconds, then retry. Codes: `rate_limited`, and `stream_limit_reached` (too many live streams open: 3 per key, 6 per account).

Headers: `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`.

Too many writes from this key.:

```json
{
  "error": {
    "code": "rate_limited",
    "message": "Too many requests (limit 30). Slow down and retry in 12 seconds."
  }
}
```

### 503

Try again in a moment (honour `Retry-After` when it's sent). Codes: `stale_quote` (the quote, or a stock's last trade, is more than 15 seconds old, so nothing filled), `no_live_price`, `rules_pending`, `unavailable`, `auth_unavailable`, `access_check_unavailable`, `api_keys_unavailable`, `trades_api_disabled`, `stream_unavailable` (the live stream isn't on, or the server is restarting: try again shortly, or poll the reads).

Headers: `Retry-After`.

No live price right now.:

```json
{
  "error": {
    "code": "no_live_price",
    "message": "There's no live price for this contract right now, so nothing was filled. Try again in a moment."
  }
}
```
