# List your trades

`GET https://app.skylit.ai/api/nexus/v1/trades`

API: Nexus.

Your own options and stock trades, newest first. `account=agent` lists your bot's agent wallet instead of yours.

**Futures:** add `assetClass=futures` to list one futures account's trades. Leave `account` out for your practice account, or send `agent`, `evaluation`, `funded` or an account id. `status=open` lists the open positions with the same numbers as the account read. `status=closed` lists closed trades, flat to flat, with the same P/L your futures journal shows, newest first. Leave `status` out for both, open first. A futures row is a `FuturesTrade`, not a `Trade`. Without `assetClass=futures` the list is options and stocks, same as always.

With `test=true` it lists your test log instead (your 10 newest test orders, futures ones included) and never a real trade.

## Authentication

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

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `assetClass` | query | string | no | `futures` lists one futures account's positions and closed trades. Leave it out for options and stocks. (one of `futures`) |
| `account` | query | string | no | Options and stocks: `agent` lists your bot's wallet; leave it out for yours. Futures: `practice` (or left out), `agent`, `evaluation`, `funded` or an account id. |
| `status` | query | string | no | Which trades to list. (one of `open`, `closed`, `all`; default `all`) |
| `limit` | query | integer | no | Page size. Anything over 200 is read as 200. (default `50`; min 1; max 200) |
| `offset` | query | integer | no | How many trades to skip. (default `0`; min 0; max 100000) |
| `test` | query | string | no | `true` lists your test log instead of your trades. (one of `true`, `false`; default `false`) |

## Example request

```bash
curl "https://app.skylit.ai/api/nexus/v1/trades" \
  -H "Authorization: Bearer $SKYLIT_API_KEY"
```

## Responses

### 200

Your trades. `meta.total` counts every match, not just this page.

One open trade.:

```json
{
  "data": [
    {
      "id": "6f1c2a4e-8b1d-4c39-9a51-2d7e0b3c9f10",
      "userId": "0b8e5d2c-41a7-4f6e-9c3b-7a1d2e4f5a60",
      "ticker": "SPY",
      "strike": 600,
      "expiration": "2026-10-16",
      "direction": "call",
      "assetClass": "options",
      "averageEntryPrice": 1.84,
      "currentPrice": 1.97,
      "totalQuantity": 2,
      "remainingQuantity": 2,
      "status": "active",
      "entryDate": "2026-10-09T14:32:05Z",
      "source": "api"
    }
  ],
  "meta": {
    "total": 1,
    "limit": 50,
    "offset": 0
  }
}
```

assetClass=futures: one open NQ position and one closed MNQ trade in the practice account.:

```json
{
  "data": [
    {
      "assetClass": "futures",
      "status": "open",
      "account": {
        "id": "3c2b1a90-5e4d-4f3a-8b2c-1d0e9f8a7b6c",
        "kind": "practice",
        "name": "Paper"
      },
      "symbol": "NQZ26",
      "side": "long",
      "quantity": 1,
      "avgPrice": 25310.25,
      "breakevenPrice": 25310.46,
      "markPrice": 25322.5,
      "openPnlCents": 24500,
      "pointValueCents": 2000,
      "tickSize": 0.25,
      "tripId": "d4e5f6a7-b8c9-4d0e-9f1a-2b3c4d5e6f7a"
    },
    {
      "assetClass": "futures",
      "status": "closed",
      "account": {
        "id": "3c2b1a90-5e4d-4f3a-8b2c-1d0e9f8a7b6c",
        "kind": "practice",
        "name": "Paper"
      },
      "symbol": "MNQZ26",
      "side": "short",
      "quantity": 2,
      "pointValueCents": 200,
      "tickSize": 0.25,
      "contracts": 2,
      "openedAt": "2026-10-09T15:02:11Z",
      "closedAt": "2026-10-09T15:20:47Z",
      "tradingDay": "2026-10-09",
      "grossCents": 6000,
      "feesCents": 248,
      "netCents": 5752,
      "scaleIns": 0,
      "bestPoints": 18.5,
      "worstPoints": -4.25,
      "tripId": "e5f6a7b8-c9d0-4e1f-8a2b-3c4d5e6f7a8b"
    }
  ],
  "meta": {
    "total": 2,
    "limit": 50,
    "offset": 0,
    "assetClass": "futures",
    "account": {
      "id": "3c2b1a90-5e4d-4f3a-8b2c-1d0e9f8a7b6c",
      "kind": "practice",
      "name": "Paper"
    }
  }
}
```

### 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."
  }
}
```

### 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."
  }
}
```
