# Read a month of days

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

API: Nexus.

One month, in New York time: a row for each day that closed a trade, and the month's totals.

- A day or a month with nothing measured has `realizedPnl: null`, never `0`. A day with `0 < measuredCount < tradeCount` is a partial sum.
- `grossProfit`, `grossLoss`, `avgWin` and `avgLoss` come from the trades, so `profitFactor` is the trade figure.
- `bestDay` and `worstDay` are among measured days only, and left out when none was measured.

## 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`) |
| `month` | query | string | no | `YYYY-MM`. Left out, the month in progress. |

## Example request

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

## Responses

### 200

The month.

November on your own wallet.:

```json
{
  "data": {
    "month": "2026-11",
    "timezone": "America/New_York",
    "realizedPnl": 146,
    "tradeCount": 4,
    "measuredCount": 4,
    "wins": 2,
    "losses": 2,
    "breakeven": 0,
    "winRate": 50,
    "greenDays": 1,
    "redDays": 1,
    "flatDays": 0,
    "unmeasuredDays": 0,
    "grossProfit": 760,
    "grossLoss": 614,
    "profitFactor": 1.24,
    "avgWin": 380,
    "avgLoss": 307,
    "riskReward": 1.24,
    "bestDay": {
      "date": "2026-11-06",
      "realizedPnl": 548,
      "tradeCount": 3,
      "measuredCount": 3,
      "wins": 2,
      "losses": 1,
      "breakeven": 0
    },
    "worstDay": {
      "date": "2026-11-10",
      "realizedPnl": -402,
      "tradeCount": 1,
      "measuredCount": 1,
      "wins": 0,
      "losses": 1,
      "breakeven": 0
    },
    "days": [
      {
        "date": "2026-11-06",
        "realizedPnl": 548,
        "tradeCount": 3,
        "measuredCount": 3,
        "wins": 2,
        "losses": 1,
        "breakeven": 0
      },
      {
        "date": "2026-11-10",
        "realizedPnl": -402,
        "tradeCount": 1,
        "measuredCount": 1,
        "wins": 0,
        "losses": 1,
        "breakeven": 0
      }
    ]
  },
  "meta": {
    "account": "main",
    "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."
  }
}
```
