Skip to content

Futures · Order flow

Futures absorption

Absorption called in captured prints: net aggression into a low or high that holds.
GET/v1/futures/absorptionfuturesAbsorption
On this page

Historical absorption from the same model as the terminal's Futures Absorption widget. A test starts when price reaches a recent low (or high). Sellers are absorbed when net aggressive selling keeps hitting that low after it was first tested, the low makes no new print beyond two ticks for hold_seconds, sellers hold at least min_share of classified volume and price is back inside zone_ticks of the low; buyers absorbed is the mirror at a holding high. The threshold scales with the contract's own volume (the larger of min_delta and delta_ratio times the median classified contracts per minute), and unknown-side prints never count as aggression. The window defaults to the last 15 minutes and is at most 24 hours; up to 15 earlier whole minutes of the same session are read to establish the volume baseline, and nothing is called before one whole observed minute. It is a heuristic on captured executions, not proof of hidden orders; capture gaps stay gaps.

Example request

curl -sS --get "https://api.ordermap.si/v1/futures/absorption" \
  -H "Authorization: Bearer $ORDERMAP_API_KEY" \
  --data-urlencode symbol=ES

Set ORDERMAP_API_KEY to your key. Replace the dates with a recent trading date.

Parameters

11 parameters, none required.

ParameterType and limitsDescription
symbolqueryoptionalstringat most 3 characterspattern ^[A-Za-z0-9]{1,3}$Futures product root, for example ES, NQ, CL or GC. Without contract the current front month is used and returned in the response.
contractqueryoptionalstringat most 6 characterspattern ^[A-Za-z0-9]{1,3}[FGHJKMNQUVXZfghjkmnquvxz][0-9]{1,2}$Exact dated contract: root, month code and year, for example ESZ6 (December 2026). Two-digit years are accepted and returned in the one-digit form (ESZ26 is ESZ6). Only the front month and the contracts listed by /v1/futures/contracts are served.
start_timequeryoptionalintegerunix-msmin 946684800000max 4102444800000Start of the window (inclusive): calls at or after it are returned.
end_timequeryoptionalintegerunix-msmin 946684800000max 4102444800000End of the window (exclusive).
hold_secondsqueryoptionalintegerdefault 15min 3max 600Seconds the low or high must go without a new extreme before a call.
min_deltaqueryoptionalintegerdefault 10min 1max 1000000Smallest net aggression, in contracts, that can be called.
delta_ratioqueryoptionalnumberdefault 0.04min 0max 5Net aggression must also reach this multiple of the median classified volume per minute.
min_sharequeryoptionalnumberdefault 0.55min 0.5max 1Share of classified volume the aggressor side must hold, from 0.5 to 1.
zone_ticksqueryoptionalintegerdefault 8min 1max 500Ticks from the extreme that count as testing it; the call is confirmed inside this zone.
retest_secondsqueryoptionalintegerdefault 30min 3max 1800A return to the extreme after this long away starts a new test.
sidequeryoptionalstringbuysellReturn only sellers absorbed (sell) or buyers absorbed (buy).

Response

StatusMeaningBody
200Successful response.Schema below
400Invalid, unknown or repeated parameters, or an invalid cursor.Error object
401Missing or invalid API key.Error object
403The plan, dataset release or account state does not allow this request.Error object
422The request is valid but no data exists for it.Error object
429Rate limit, burst limit or cooldown; wait Retry-After seconds.Retry-AfterError object
500Internal error.Error object
503Data temporarily unavailable; retry after Retry-After seconds.Retry-AfterError object
504The request timed out.Error object

Authenticated responses carry the X-RateLimit-* headers (see rate limits); 429 and 503 add Retry-After.

200 response body

  • dataarray<object>required13 fields inside
    • aggressor_sharenumberrequiredaggressor_volume divided by classified_volume.
    • aggressor_volumeintegerrequiredAggressor contracts since the test began.
    • classified_volumeintegerrequiredBuy plus sell contracts since the test began.
    • contractstringrequiredDated contract.
    • end_timeintegerunix-msrequiredLatest print that grew the absorption. Unix epoch milliseconds (UTC).
    • idstringrequiredIdentifier of the absorption, stable while its test continues.
    • net_aggressionintegerrequiredAggressor contracts minus the other side's since the test began (unknown-side prints excluded).
    • pricenumberrequiredThe holding low or high.
    • price_ticksstringrequiredprice as an integer count of ticks, as a string.
    • sidestringrequiredAbsorbed aggressor: sell when sellers were absorbed at a holding low, buy when buyers were absorbed at a holding high.buysell
    • start_timeintegerunix-msrequiredFirst print of the test of that low or high. Unix epoch milliseconds (UTC).
    • thresholdnumberrequiredNet aggression the call required: the larger of min_delta and delta_ratio times the median classified volume per minute.
    • trigger_timeintegerunix-msrequiredWhen the absorption was called: the extreme had held for hold_seconds, net aggression reached the threshold and price was back at the extreme. Unix epoch milliseconds (UTC).
  • metaobjectrequiredMeta object

Example response

{
  "data": [
    {
      "aggressor_share": 0.5865,
      "aggressor_volume": 61,
      "classified_volume": 104,
      "contract": "NQZ6",
      "end_time": 1792979848900,
      "id": "4c1f0a9e2d7b6c5a8e3f1d0b9a7c6e5f4d3b2a1c0e9f8d7c6b5a4e3d2c1b0a9f",
      "net_aggression": 18,
      "price": 29163.75,
      "price_ticks": "116655",
      "side": "sell",
      "start_time": 1792979827763,
      "threshold": 13.84,
      "trigger_time": 1792979848900
    }
  ],
  "meta": {
    "as_of": 1760659200123,
    "coverage": {
      "complete": true
    },
    "delay_ms": 0,
    "delayed": false,
    "request_id": "0199f0c2-5a1e-7c3b-9d4e-2b6f8a1c3d5e",
    "source": "cme"
  }
}

Values are illustrative. Missing values are null, never 0.