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,weeksandmonthsto choose how many periods to keep on screen. Inconfirmedmode, count the current period:weeks: 2to receive the previous week.
How it is computed
- Publishes the last
dayssessions,weeksweeks andmonthsmonths, current period included.days,weeksandmonthscannot 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 closeConly exists for past periods. The POC, the value area (70% of the volume, built likesession-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 withtimeframe: 3600): the levels of the period that ends are sent final, with the closeC, if they stay in the window; those leaving it are removed (remove, withfinal: true). - With a count of 1 (
weeks: 1by default, ordays: 1), the only period published is the current one: its levels never become final and are removed when the period changes. Inconfirmedmode you therefore receive no level of that period, only theirremoves (ignore aremovefor an unknownid); useweeks: 2to get the previous week. WithskipCurrent, 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.
{
"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.
| 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 returns the same objects, with the same cursor, without the sub field.
{
"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
}
}{
"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
}
}{
"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
{
"$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
{
"$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"
]
}