Indicator

Fathom Flow

Is that volume burst actually moving price? Track impulses and absorption zones to put every move in context.

Combines four readings of the order flow: accelerations (one-second windows with exceptional volume), exhaustions (cumulative delta reversing after a peak), slowdowns (profile of the latest ticks) and absorptions (a consolidation followed by a breakout, which sets projected control and extreme levels). Each drawing is published when its bar closes, republished on every state change, and becomes final once it can no longer change. The computation restarts every week.

Identifier
flow-tracker
Objects received
drawing
Calculation
Since the start of the week
Historical cost
1 unit per trade

Subscribe

The same params work in real time, on historical data and in exports. Any you leave out take their default value.

Subscribe message
{
  "t": "subscribe",
  "sub": "flow-tracker",
  "instrument": "NQ.front",
  "indicator": "flow-tracker",
  "params": {
    "absorption": "medium",
    "acceleration": "medium",
    "exhaustion": "medium",
    "levelMode": "conservative",
    "projectionBars": 10,
    "slowdown": "medium",
    "timeframe": 60
  },
  "mode": "live",
  "from": "live"
}

Parameters

As soon as a parameter differs from its default, the subscription counts as a custom configuration. A new value may require preparing a new calculation (status warming).

ParameterTypeDefaultAllowed valuesUnitDescription
absorptionchoicemediumweak · medium · strong—Absorption sensitivity.
accelerationchoicemediumweak · medium · strong—Acceleration sensitivity (one-second windows).
exhaustionchoicemediumweak · medium · strong—Exhaustion sensitivity.
levelModechoiceconservativeconservative · medium · aggressive—Placement of the control and extreme levels.
projectionBarsinteger101 to 1,000barsHow long levels are projected, in bars.
slowdownchoicemediumweak · medium · strong—Slowdown sensitivity.
timeframeinteger6015 · 60 · 300—Bar duration in seconds: 15, 60 or 300.

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.

drawing updated continuously

Drawing; provisional while it can still change.

Format of the id: <kind>:<weekStart>:<ordinal>. While it changes, the object is sent with final: false, and each new version fully replaces the previous one. Its last version carries final: true.

FieldTypeUnitPresentDescription
kindstring · acceleration | exhaustion | slowdown | control | extreme—alwaysType: acceleration (rectangle), exhaustion and slowdown (arrows), control and extreme (lines).
activeboolean—sometimesRectangle or line still being projected.
barstringtimestamp (ns)alwaysStart of the anchor bar.
endnumberbarssometimesEnd of the drawing, in bars from the anchor bar; present on finished rectangles and lines.
highintegertickssometimesTop of a rectangle.
labelstring · AC | PC | AE | PE—sometimesLine: control (C) or extreme (E), from absorption (A) or price (P).
lowintegertickssometimesBottom of a rectangle.
priceintegertickssometimesPrice of an arrow or a line.
sidestring · buy | sell—sometimesLine: delta side of the absorbed group.
startnumberbarsalwaysStart of the drawing, in bars from the anchor bar.
upboolean—alwaysBullish direction.
variantinteger—sometimesExhaustion: 0 when detected on volumes, 1 on trade counts.
visibleboolean—alwaysWhether the drawing is shown; a slowdown can be hidden, then shown again.

Calculation warm-up

The calculation starts over at the beginning of every week (Saturday 00:00 UTC). During the weekend close it keeps the state of the past week; objects still open are finalized on the first trade of the new week. If nobody is using your parameters yet, the server first recomputes the week since its start (status warming), then goes live (status live).

Historical data follows the same rules: a query over a past period returns exactly what the real-time stream published.

Example messages

Messages received with the subscription parameters above. Over WebSocket, each message also carries sub and cursor.

Final version
{
  "t": "upsert",
  "id": "slowdown:2026-09-19:732",
  "final": true,
  "ts": "1790208060524236599",
  "data": {
    "kind": "slowdown",
    "bar": "1790207760000000000",
    "start": 0,
    "price": 123043,
    "up": false,
    "visible": false
  }
}
In-progress version
{
  "t": "upsert",
  "id": "slowdown:2026-09-19:733",
  "final": false,
  "ts": "1790208060524236599",
  "data": {
    "kind": "slowdown",
    "bar": "1790208000000000000",
    "start": 0,
    "price": 123024,
    "up": false,
    "visible": false
  }
}
Final version
{
  "t": "upsert",
  "id": "exhaustion:2026-09-19:737",
  "final": true,
  "ts": "1790209200076693991",
  "data": {
    "kind": "exhaustion",
    "bar": "1790209140000000000",
    "start": 0,
    "price": 122953,
    "up": true,
    "visible": true,
    "variant": 0
  }
}
In-progress version
{
  "t": "upsert",
  "id": "control:2026-09-19:741",
  "final": false,
  "ts": "1790209920141869579",
  "data": {
    "kind": "control",
    "bar": "1790209860000000000",
    "start": 0,
    "price": 122927,
    "up": true,
    "visible": true,
    "active": true,
    "label": "AC",
    "side": "sell"
  }
}
In-progress version
{
  "t": "upsert",
  "id": "extreme:2026-09-19:742",
  "final": false,
  "ts": "1790209920141869579",
  "data": {
    "kind": "extreme",
    "bar": "1790209860000000000",
    "start": 0,
    "price": 122913,
    "up": true,
    "visible": true,
    "active": true,
    "label": "AE",
    "side": "sell"
  }
}
Final version
{
  "t": "upsert",
  "id": "control:2026-09-19:741",
  "final": true,
  "ts": "1790210520086671473",
  "data": {
    "kind": "control",
    "bar": "1790209860000000000",
    "start": 0,
    "end": 10,
    "price": 122927,
    "up": true,
    "visible": true,
    "active": false,
    "label": "AC",
    "side": "sell"
  }
}

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/flow-tracker/params.json",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "absorption": {
      "type": "string",
      "default": "medium",
      "enum": [
        "weak",
        "medium",
        "strong"
      ],
      "description": "Absorption sensitivity."
    },
    "acceleration": {
      "type": "string",
      "default": "medium",
      "enum": [
        "weak",
        "medium",
        "strong"
      ],
      "description": "Acceleration sensitivity (one-second windows)."
    },
    "exhaustion": {
      "type": "string",
      "default": "medium",
      "enum": [
        "weak",
        "medium",
        "strong"
      ],
      "description": "Exhaustion sensitivity."
    },
    "levelMode": {
      "type": "string",
      "default": "conservative",
      "enum": [
        "conservative",
        "medium",
        "aggressive"
      ],
      "description": "Placement of the control and extreme levels."
    },
    "projectionBars": {
      "type": "integer",
      "default": 10,
      "minimum": 1,
      "maximum": 1000,
      "description": "How long levels are projected, in bars."
    },
    "slowdown": {
      "type": "string",
      "default": "medium",
      "enum": [
        "weak",
        "medium",
        "strong"
      ],
      "description": "Slowdown sensitivity."
    },
    "timeframe": {
      "type": "integer",
      "default": 60,
      "enum": [
        15,
        60,
        300
      ],
      "description": "Bar duration in seconds: 15, 60 or 300."
    }
  }
}
Schema of the data field
JSON
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://fathomcharts.com/schemas/flow-tracker/data.json",
  "title": "drawing",
  "type": "object",
  "additionalProperties": false,
  "required": [
    "kind",
    "bar",
    "start",
    "up",
    "visible"
  ],
  "properties": {
    "kind": {
      "type": "string",
      "enum": [
        "acceleration",
        "exhaustion",
        "slowdown",
        "control",
        "extreme"
      ],
      "description": "Type: acceleration (rectangle), exhaustion and slowdown (arrows), control and extreme (lines)."
    },
    "active": {
      "type": "boolean",
      "description": "Rectangle or line still being projected."
    },
    "bar": {
      "type": "string",
      "pattern": "^[0-9]+$",
      "description": "Start of the anchor bar."
    },
    "end": {
      "type": "number",
      "description": "End of the drawing, in bars from the anchor bar; present on finished rectangles and lines."
    },
    "high": {
      "type": "integer",
      "description": "Top of a rectangle."
    },
    "label": {
      "type": "string",
      "enum": [
        "AC",
        "PC",
        "AE",
        "PE"
      ],
      "description": "Line: control (C) or extreme (E), from absorption (A) or price (P)."
    },
    "low": {
      "type": "integer",
      "description": "Bottom of a rectangle."
    },
    "price": {
      "type": "integer",
      "description": "Price of an arrow or a line."
    },
    "side": {
      "type": "string",
      "enum": [
        "buy",
        "sell"
      ],
      "description": "Line: delta side of the absorbed group."
    },
    "start": {
      "type": "number",
      "description": "Start of the drawing, in bars from the anchor bar."
    },
    "up": {
      "type": "boolean",
      "description": "Bullish direction."
    },
    "variant": {
      "type": "integer",
      "description": "Exhaustion: 0 when detected on volumes, 1 on trade counts."
    },
    "visible": {
      "type": "boolean",
      "description": "Whether the drawing is shown; a slowdown can be hidden, then shown again."
    }
  }
}