# Read your journal's headline figures

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

API: Nexus.

The figures the Journal shows first, over closed trades in `range`: trades, win rate, net P&L, profit factor, your best and worst trade, and consistency.

- `measuredTrades` is how many trades carry a realized P&L. `netPnl: 0` with `measuredTrades: 0` means nothing was measured, not a breakeven.
- `winRate` leaves breakeven trades out. `profitFactor` is `0` when nothing was lost, and `consistencyPercent` is `0` when nothing was won: neither is a score.
- `meta` says which account was read.

## 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`) |

## Example request

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

## Responses

### 200

The figures.

Your bot's last 30 days.:

```json
{
  "data": {
    "range": "30d",
    "trades": 24,
    "contracts": 61,
    "measuredTrades": 24,
    "wins": 14,
    "losses": 9,
    "breakeven": 1,
    "winRate": 60.87,
    "netPnl": 1240.5,
    "avgWin": 182.4,
    "avgLoss": 145.9,
    "profitFactor": 1.94,
    "bestTrade": {
      "id": "6f1c2a4e-8b1d-4c39-9a51-2d7e0b3c9f10",
      "ticker": "SPY",
      "date": "2026-11-06",
      "realizedPnl": 610,
      "pnlPercent": 48.4
    },
    "consistencyPercent": 21.4,
    "activeDays": 12,
    "greenDays": 8,
    "redDays": 4
  },
  "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."
  }
}
```
