# Split your closed trades by one dimension

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

API: Nexus.

Closed trades in `range`, split along `by`. Only slices with trades come back.

- `best` and `worst` are the slices with the highest and lowest `avgPnl` among those with at least `minSampleForVerdict` (5) measured trades, and are left out when none qualifies.

## 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` | query | string | no | `main` (your own simulated wallet, the default) or `agent` (your bot's). (one of `main`, `agent`) |
| `range` | query | string | no | How far back, in New York time. Left out, `30d`. (one of `7d`, `30d`, `90d`, `ytd`, `all`; default `30d`) |
| `by` | query | string | no | The dimension. Left out, `duration`. `session` is when the trade was opened, `weekday` the day it was closed, `playbook` the setup you tagged it with. (one of `duration`, `session`, `weekday`, `direction`, `ticker`, `playbook`; default `duration`) |

## Example request

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

## Responses

### 200

The slices.

Your bot's trades by session over 90 days.:

```json
{
  "data": {
    "range": "90d",
    "by": "session",
    "buckets": [
      {
        "key": "ny-am",
        "label": "NY AM (9:30–12)",
        "trades": 18,
        "measuredTrades": 18,
        "wins": 10,
        "losses": 8,
        "winRate": 55.56,
        "netPnl": 410,
        "avgPnl": 22.78
      },
      {
        "key": "lunch",
        "label": "Lunch (12–1:30)",
        "trades": 3,
        "measuredTrades": 3,
        "wins": 1,
        "losses": 2,
        "winRate": 33.33,
        "netPnl": -95,
        "avgPnl": -31.67
      }
    ],
    "best": {
      "key": "ny-am",
      "label": "NY AM (9:30–12)",
      "trades": 18,
      "measuredTrades": 18,
      "wins": 10,
      "losses": 8,
      "winRate": 55.56,
      "netPnl": 410,
      "avgPnl": 22.78
    },
    "minSampleForVerdict": 5
  },
  "meta": {
    "account": "agent",
    "port": null
  }
}
```

### 400

Code: `bad_request`. `account`, `range`, `by` or `month` isn't one of the allowed values, or `account=main` was sent to `agent/edge`. The message says which.

A range that isn't allowed.:

```json
{
  "error": {
    "code": "bad_request",
    "message": "range must be one of 7d, 30d, 90d, ytd, all."
  }
}
```

### 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 this can't be read. Codes: `feature_disabled` (you sent `port`: ports aren't available yet, so leave it out), `account_suspended`, `nexus_access_denied`.

You sent `port`.:

```json
{
  "error": {
    "code": "feature_disabled",
    "message": "Ports aren't open to members yet."
  }
}
```

### 404

Code: `user_not_found`. This Skylit account hasn't used Nexus yet, so it has no journal.

No Nexus account yet.:

```json
{
  "error": {
    "code": "user_not_found",
    "message": "This Skylit account hasn't used Nexus yet, so it has no journal."
  }
}
```

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

### 500

Something went wrong on our side. If you sent a `clientOrderId`, retry with the same one. Code: `internal_error`.

Retry with the same clientOrderId.:

```json
{
  "error": {
    "code": "internal_error",
    "message": "Something went wrong on our side. If you sent a clientOrderId, retry with the same one (it can't fill twice). Otherwise check your account before retrying."
  }
}
```
