# Fathom Levels

High, low, open, close, POC and value area of sessions, weeks and months.

## What the indicator shows

- For each session, week and month: open (O), high (H), low (L), midpoint (MP) and, for past periods, close (C).
- For sessions and weeks: POC (P), 70% value area (VH / VL) and VWAP (VW).
- Current period levels move; past period levels are fixed.

## How to use it

- The previous period’s extremes and close act as support and resistance: watch how price reacts when it reaches them.
- The previous session’s POC and value area show where the market accepted price. Price settling outside that area is looking for a new value.
- Use `days`, `weeks` and `months` to choose how many periods to keep on screen. In `confirmed` mode, count the current period: `weeks: 2` to receive the previous week.

## How it is computed

- Publishes the last `days` sessions, `weeks` weeks and `months` months, current period included. `days`, `weeks` and `months` cannot all be 0.
- A session runs from 6:00 pm to 5:00 pm New York time; a week, from Sunday 6:00 pm to Friday 5:00 pm; a month groups the sessions that open during that month: the session of October 1, 2026 opens on September 30 at 6:00 pm, so it counts in September.
- Levels are computed on finished `timeframe`-second bars. The close `C` only exists for past periods. The POC, the value area (70% of the volume, built like `session-profile`’s) and the VWAP are only published for sessions and weeks.
- On an alias (`NQ.front`), periods before the last rollover are computed on the current contract, thinly traded at the time: their levels are not very representative.

## When it updates

- Levels of the current period are sent in progress (`current: true`) and updated on every finished bar.

- The period change is processed when the first bar of the new session closes (6:05 pm with `timeframe: 300`, 7:00 pm with `timeframe: 3600`): the levels of the period that ends are sent final, with the close `C`, if they stay in the window; those leaving it are removed (`remove`, with `final: true`).

- With a count of 1 (`weeks: 1` by default, or `days: 1`), the only period published is the current one: its levels never become final and are removed when the period changes. In `confirmed` mode you therefore receive no level of that period, only their `remove`s (ignore a `remove` for an unknown `id`); use `weeks: 2` to get the previous week. With `skipCurrent`, a count of 1 publishes nothing.

- No reset: past periods stay published while they are in the window.

- **Identifier**: `key-levels`

- **Objects received**: `level`

- **Historical cost**: 1 compute unit per trade

## Subscribe

The same `params` work in [real time](https://fathomcharts.com/docs/websocket.md), on [historical data](https://fathomcharts.com/docs/history.md) and in exports. Parameters you omit take their default values.

**Subscribe message**

```json
{
  "t": "subscribe",
  "sub": "key-levels",
  "instrument": "NQ.front",
  "indicator": "key-levels",
  "params": {
    "days": 2,
    "months": 0,
    "skipCurrent": false,
    "timeframe": 300,
    "weeks": 1
  },
  "mode": "live",
  "from": "live"
}
```

## Parameters

As soon as a parameter differs from its default, the subscription counts as a [custom configuration](https://fathomcharts.com/docs/limits.md#how-limits-are-counted). To change a parameter, open a new subscription.

| Parameter     | Type    | Default | Allowed values                                                                                  | Unit | Description                                                                                                                    |
| ------------- | ------- | ------- | ----------------------------------------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------ |
| `days`        | integer | `2`     | 0 to 30                                                                                         | —    | Number of sessions published, current session included. `days`, `weeks` and `months` cannot all be 0.                          |
| `months`      | integer | `0`     | 0 to 12                                                                                         | —    | Number of months published, current month included (no POC, value area or VWAP). `days`, `weeks` and `months` cannot all be 0. |
| `skipCurrent` | boolean | `false` | true · false                                                                                    | —    | Hide the levels of the current period.                                                                                         |
| `timeframe`   | integer | `300`   | `1` · `5` · `10` · `15` · `30` · `60` · `120` · `180` · `300` · `600` · `900` · `1800` · `3600` | —    | Bar duration in seconds: from 1 second (`1`) to 1 hour (`3600`).                                                               |
| `weeks`       | integer | `1`     | 0 to 12                                                                                         | —    | Number of weeks published, current week included. `days`, `weeks` and `months` cannot all be 0.                                |

## Objects received

Each object keeps the same `id` from one update to the next. Its data is in the `data` field. Prices are in ticks: multiply them by the instrument’s tick size (`GET /v1/instruments`) to get points.

### `level` (sent in progress)

Level; in progress during the current period, final once it ends, removed when the period leaves the window. With a count of 1, the level is removed without ever being final.

`id` format: `<period>:<key>:<label>`. The object is sent in progress (`final: false`), then sent again on every change; each version fully replaces the previous one. Once it can no longer change, its last version carries `final: true`, except for objects whose description says they are removed without a final version.

| Field     | Type                                                                     | Unit  | Present | Description                                                                                                                                                                                                     |
| --------- | ------------------------------------------------------------------------ | ----- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `current` | boolean                                                                  | —     | always  | `true`: level of the current period, which can still change.                                                                                                                                                    |
| `key`     | string                                                                   | —     | always  | Session: its closing date `YYYY-MM-DD`; week: the date of the Sunday it opens; month: `YYYY-MM`.                                                                                                                |
| `label`   | string · `MP` \| `L` \| `H` \| `O` \| `C` \| `P` \| `VH` \| `VL` \| `VW` | —     | always  | `MP` midpoint ((high + low) / 2), `L` low, `H` high, `O` open, `C` close (past periods only), `P` POC, `VH` value area high, `VL` value area low, `VW` VWAP. `P`, `VH`, `VL` and `VW`: sessions and weeks only. |
| `period`  | string · `day` \| `week` \| `month`                                      | —     | always  | Period: session (`day`), week or month.                                                                                                                                                                         |
| `price`   | number                                                                   | ticks | always  | Price of the level.                                                                                                                                                                                             |

## Example messages

Messages as the WebSocket sends them to the subscription above, taken from a real NQ session. [Historical data](https://fathomcharts.com/docs/history.md) returns the same objects, with the same `cursor`, without the `sub` field.

**Object in progress**

```json
{
  "sub": "key-levels",
  "cursor": "20720.0.0",
  "t": "upsert",
  "id": "day:2026-09-24:VH",
  "final": false,
  "ts": "1790208000058746563",
  "data": {
    "period": "day",
    "key": "2026-09-24",
    "label": "VH",
    "price": 123177,
    "current": true
  }
}
```

**Object in progress**

```json
{
  "sub": "key-levels",
  "cursor": "20720.0.2",
  "t": "upsert",
  "id": "week:2026-09-20:VW",
  "final": false,
  "ts": "1790208000058746563",
  "data": {
    "period": "week",
    "key": "2026-09-20",
    "label": "VW",
    "price": 122951.4386543437,
    "current": true
  }
}
```

**Final object**

```json
{
  "sub": "key-levels",
  "cursor": "20720.451308.9",
  "t": "upsert",
  "id": "day:2026-09-24:MP",
  "final": true,
  "ts": "1790287500006398661",
  "data": {
    "period": "day",
    "key": "2026-09-24",
    "label": "MP",
    "price": 122395,
    "current": false
  }
}
```

## JSON schemas

To validate or type your data: the JSON schemas of the parameters and of `data`, also available from `GET /v1/indicators`. The SDK can [generate types from them](https://fathomcharts.com/docs/sdk.md#indicator-types).

**Parameters schema**

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://fathomcharts.com/schemas/key-levels/params.json",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "days": {
      "description": "Number of sessions published, current session included. `days`, `weeks` and `months` cannot all be 0.",
      "type": "integer",
      "default": 2,
      "minimum": 0,
      "maximum": 30
    },
    "months": {
      "description": "Number of months published, current month included (no POC, value area or VWAP). `days`, `weeks` and `months` cannot all be 0.",
      "type": "integer",
      "default": 0,
      "minimum": 0,
      "maximum": 12
    },
    "skipCurrent": {
      "description": "Hide the levels of the current period.",
      "type": "boolean",
      "default": false
    },
    "timeframe": {
      "description": "Bar duration in seconds: from 1 second (`1`) to 1 hour (`3600`).",
      "type": "integer",
      "default": 300,
      "enum": [
        1,
        5,
        10,
        15,
        30,
        60,
        120,
        180,
        300,
        600,
        900,
        1800,
        3600
      ]
    },
    "weeks": {
      "description": "Number of weeks published, current week included. `days`, `weeks` and `months` cannot all be 0.",
      "type": "integer",
      "default": 1,
      "minimum": 0,
      "maximum": 12
    }
  },
  "allOf": [
    {
      "description": "`days`, `weeks` and `months` cannot all be 0.",
      "not": {
        "properties": {
          "days": {
            "const": 0
          },
          "months": {
            "const": 0
          },
          "weeks": {
            "const": 0
          }
        },
        "required": [
          "days",
          "weeks"
        ]
      },
      "x-field": "days"
    }
  ]
}
```

**`data` field schema**

```json
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://fathomcharts.com/schemas/key-levels/data.json",
  "title": "level",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "current": {
      "description": "`true`: level of the current period, which can still change.",
      "type": "boolean"
    },
    "key": {
      "description": "Session: its closing date `YYYY-MM-DD`; week: the date of the Sunday it opens; month: `YYYY-MM`.",
      "type": "string",
      "pattern": "^[0-9]{4}-[0-9]{2}(-[0-9]{2})?$"
    },
    "label": {
      "description": "`MP` midpoint ((high + low) / 2), `L` low, `H` high, `O` open, `C` close (past periods only), `P` POC, `VH` value area high, `VL` value area low, `VW` VWAP. `P`, `VH`, `VL` and `VW`: sessions and weeks only.",
      "type": "string",
      "enum": [
        "MP",
        "L",
        "H",
        "O",
        "C",
        "P",
        "VH",
        "VL",
        "VW"
      ]
    },
    "period": {
      "description": "Period: session (`day`), week or month.",
      "type": "string",
      "enum": [
        "day",
        "week",
        "month"
      ]
    },
    "price": {
      "description": "Price of the level.",
      "type": "number"
    }
  },
  "required": [
    "period",
    "key",
    "label",
    "price",
    "current"
  ]
}
```
