Futures · Order flow
Futures absorption
/v1/futures/absorptionfuturesAbsorptionHistorical 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=ESconst params = new URLSearchParams({
symbol: "ES",
});
const res = await fetch(`https://api.ordermap.si/v1/futures/absorption?${params}`, {
headers: { Authorization: `Bearer ${process.env.ORDERMAP_API_KEY}` },
});
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
const { data, meta } = await res.json();
console.log(data, meta.coverage);Set ORDERMAP_API_KEY to your key. Replace the dates with a recent trading date.
Parameters
11 parameters, none required.
| Parameter | Type and limits | Description |
|---|---|---|
symbolqueryoptional | stringat 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. |
contractqueryoptional | stringat 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_queryoptional | integerunix-msmin 946684800000max 4102444800000 | Start of the window (inclusive): calls at or after it are returned. |
end_queryoptional | integerunix-msmin 946684800000max 4102444800000 | End of the window (exclusive). |
hold_queryoptional | integerdefault 15min 3max 600 | Seconds the low or high must go without a new extreme before a call. |
min_queryoptional | integerdefault 10min 1max 1000000 | Smallest net aggression, in contracts, that can be called. |
delta_queryoptional | numberdefault 0.04min 0max 5 | Net aggression must also reach this multiple of the median classified volume per minute. |
min_queryoptional | numberdefault 0.55min 0.5max 1 | Share of classified volume the aggressor side must hold, from 0.5 to 1. |
zone_queryoptional | integerdefault 8min 1max 500 | Ticks from the extreme that count as testing it; the call is confirmed inside this zone. |
retest_queryoptional | integerdefault 30min 3max 1800 | A return to the extreme after this long away starts a new test. |
sidequeryoptional | stringbuysell | Return only sellers absorbed (sell) or buyers absorbed (buy). |
Response
| Status | Meaning | Body |
|---|---|---|
200 | Successful response. | Schema below |
400 | Invalid, unknown or repeated parameters, or an invalid cursor. | Error object |
401 | Missing or invalid API key. | Error object |
403 | The plan, dataset release or account state does not allow this request. | Error object |
422 | The request is valid but no data exists for it. | Error object |
429 | Rate limit, burst limit or cooldown; wait Retry-After seconds.Retry-After | Error object |
500 | Internal error. | Error object |
503 | Data temporarily unavailable; retry after Retry-After seconds.Retry-After | Error object |
504 | The 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 insideaggressor_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.buysellstart_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.
