Indicator

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 removes (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, on historical data and in exports. Parameters you omit take their default values.

Subscribe message
{
  "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. To change a parameter, open a new subscription.

ParameterTypeDefaultAllowed valuesUnitDescription
daysinteger20 to 30—Number of sessions published, current session included. days, weeks and months cannot all be 0.
monthsinteger00 to 12—Number of months published, current month included (no POC, value area or VWAP). days, weeks and months cannot all be 0.
skipCurrentbooleanfalsetrue · false—Hide the levels of the current period.
timeframeinteger3001 · 5 · 10 · 15 · 30 · 60 · 120 · 180 · 300 · 600 · 900 · 1800 · 3600—Bar duration in seconds: from 1 second (1) to 1 hour (3600).
weeksinteger10 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.

FieldTypeUnitPresentDescription
currentboolean—alwaystrue: level of the current period, which can still change.
keystring—alwaysSession: its closing date YYYY-MM-DD; week: the date of the Sunday it opens; month: YYYY-MM.
labelstring · MP | L | H | O | C | P | VH | VL | VW—alwaysMP 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.
periodstring · day | week | month—alwaysPeriod: session (day), week or month.
pricenumberticksalwaysPrice of the level.

Example messages

Messages as the WebSocket sends them to the subscription above, taken from a real NQ session. Historical data returns the same objects, with the same cursor, without the sub field.

Object in progress
{
  "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
{
  "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
{
  "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.

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"
  ]
}