Liquidation map of every market (Builder)
curl --request GET \
--url https://api.ironflow.sh/v1/liquidations/map/all \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ironflow.sh/v1/liquidations/map/all"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ironflow.sh/v1/liquidations/map/all', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ironflow.sh/v1/liquidations/map/all",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ironflow.sh/v1/liquidations/map/all"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ironflow.sh/v1/liquidations/map/all")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ironflow.sh/v1/liquidations/map/all")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"as_of": "2026-11-06T16:48:30Z",
"snapshot": {
"height": 1211490000,
"time": "2026-11-06T16:47:28Z",
"age_s": 62
},
"range_pct": 20,
"side": "both",
"count": 174,
"markets": [
{
"market": "BTC-PERP",
"mark_px": 75782,
"bucket_size": 200,
"long_usd": 208900000,
"short_usd": 62400000,
"levels": [
{
"price_lo": 72600,
"price_hi": 72800,
"long_usd": 21480000,
"long_positions": 412,
"short_usd": 0,
"short_positions": 0,
"cum_long_usd": 208900000,
"cum_short_usd": 0
}
],
"coverage": {
"notional_usd": 3286600394,
"with_liq_px_pct": 98.1,
"portfolio_margin_pct": 6,
"unknown_mode_pct": 0.5
}
}
],
"stale": false,
"method": "Every open position from our node's state snapshot. Liquidation prices follow Hyperliquid's maintenance margin rules; for cross-margin positions they assume the account's other positions stay at mark. Portfolio-margin accounts use Hyperliquid's own liquidationPx. Notional is size times liquidation price. In a real move correlated markets fall together, so cross-margin accounts are liquidated earlier than these prices."
}{
"error": {
"code": "BAD_REQUEST",
"message": "market is required (e.g. BTC-PERP)"
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 60 seconds.",
"upgrade": {
"plan": "explorer",
"price_usdc": 49,
"days": 30,
"unlocks": "<string>",
"limit": "rate",
"lifts": "60 requests a minute now, 100 on Explorer",
"url": "<string>",
"how": "<string>",
"buy_url": "<string>",
"pay_per_call": {}
},
"get_key": {
"method": "POST",
"url": "https://api.ironflow.sh/v1/keys",
"body": {
"email": "[email protected]"
},
"page": "<string>"
},
"dataset": {
"name": "Hyperliquid Liquidations",
"url": "https://huggingface.co/datasets/ironflow/hyperliquid-liquidations?utm_source=api",
"holds": "every liquidation",
"from": "2025-05-25",
"through": "2026-10-31"
},
"ironbox": {
"why": "No rate limits inside an Ironbox: your agent runs next to Hyperliquid with the data on the box.",
"create": "POST https://api.ironflow.sh/v1/ironbox",
"url": "https://ironflow.sh/ironbox?utm_source=api"
},
"stream": "GET https://api.ironflow.sh/v1/liquidations/stream (1 credit a minute)",
"allowed_from": 1794394800000,
"did_you_mean": [
"xyz:GOLD-PERP",
"PAXG-PERP"
]
}
}{
"error": {
"code": "PLAN_REQUIRED",
"message": "One call returns all 174 markets on Builder (149 USDC per 30 days): https://ironflow.sh/upgrade?utm_source=api&plan=builder. Free keys get one market per call: add market=BTC-PERP (GET /v1/liquidations/map/markets lists the markets). Or pay 0.05 USDC for this one call with x402.",
"upgrade": {
"plan": "builder",
"price_usdc": 149,
"days": 30,
"limit": "tier",
"lifts": "included in Builder",
"url": "https://ironflow.sh/upgrade?utm_source=api&plan=builder&limit=tier"
}
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "the liquidation map is not available right now (it is being built or its service did not answer); retry in 30 seconds"
}
}Analytics
Hyperliquid liquidation map of every market
GET /v1/liquidations/map/all returns the liquidation map of every Hyperliquid perp in one call, from one node snapshot. Builder plan, or 0.05 USDC a call with x402.
GET
/
v1
/
liquidations
/
map
/
all
Liquidation map of every market (Builder)
curl --request GET \
--url https://api.ironflow.sh/v1/liquidations/map/all \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.ironflow.sh/v1/liquidations/map/all"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.ironflow.sh/v1/liquidations/map/all', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ironflow.sh/v1/liquidations/map/all",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.ironflow.sh/v1/liquidations/map/all"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.ironflow.sh/v1/liquidations/map/all")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ironflow.sh/v1/liquidations/map/all")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"as_of": "2026-11-06T16:48:30Z",
"snapshot": {
"height": 1211490000,
"time": "2026-11-06T16:47:28Z",
"age_s": 62
},
"range_pct": 20,
"side": "both",
"count": 174,
"markets": [
{
"market": "BTC-PERP",
"mark_px": 75782,
"bucket_size": 200,
"long_usd": 208900000,
"short_usd": 62400000,
"levels": [
{
"price_lo": 72600,
"price_hi": 72800,
"long_usd": 21480000,
"long_positions": 412,
"short_usd": 0,
"short_positions": 0,
"cum_long_usd": 208900000,
"cum_short_usd": 0
}
],
"coverage": {
"notional_usd": 3286600394,
"with_liq_px_pct": 98.1,
"portfolio_margin_pct": 6,
"unknown_mode_pct": 0.5
}
}
],
"stale": false,
"method": "Every open position from our node's state snapshot. Liquidation prices follow Hyperliquid's maintenance margin rules; for cross-margin positions they assume the account's other positions stay at mark. Portfolio-margin accounts use Hyperliquid's own liquidationPx. Notional is size times liquidation price. In a real move correlated markets fall together, so cross-margin accounts are liquidated earlier than these prices."
}{
"error": {
"code": "BAD_REQUEST",
"message": "market is required (e.g. BTC-PERP)"
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 60 seconds.",
"upgrade": {
"plan": "explorer",
"price_usdc": 49,
"days": 30,
"unlocks": "<string>",
"limit": "rate",
"lifts": "60 requests a minute now, 100 on Explorer",
"url": "<string>",
"how": "<string>",
"buy_url": "<string>",
"pay_per_call": {}
},
"get_key": {
"method": "POST",
"url": "https://api.ironflow.sh/v1/keys",
"body": {
"email": "[email protected]"
},
"page": "<string>"
},
"dataset": {
"name": "Hyperliquid Liquidations",
"url": "https://huggingface.co/datasets/ironflow/hyperliquid-liquidations?utm_source=api",
"holds": "every liquidation",
"from": "2025-05-25",
"through": "2026-10-31"
},
"ironbox": {
"why": "No rate limits inside an Ironbox: your agent runs next to Hyperliquid with the data on the box.",
"create": "POST https://api.ironflow.sh/v1/ironbox",
"url": "https://ironflow.sh/ironbox?utm_source=api"
},
"stream": "GET https://api.ironflow.sh/v1/liquidations/stream (1 credit a minute)",
"allowed_from": 1794394800000,
"did_you_mean": [
"xyz:GOLD-PERP",
"PAXG-PERP"
]
}
}{
"error": {
"code": "PLAN_REQUIRED",
"message": "One call returns all 174 markets on Builder (149 USDC per 30 days): https://ironflow.sh/upgrade?utm_source=api&plan=builder. Free keys get one market per call: add market=BTC-PERP (GET /v1/liquidations/map/markets lists the markets). Or pay 0.05 USDC for this one call with x402.",
"upgrade": {
"plan": "builder",
"price_usdc": 149,
"days": 30,
"limit": "tier",
"lifts": "included in Builder",
"url": "https://ironflow.sh/upgrade?utm_source=api&plan=builder&limit=tier"
}
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Retry after 60 seconds."
}
}{
"error": {
"code": "UPSTREAM_UNAVAILABLE",
"message": "the liquidation map is not available right now (it is being built or its service did not answer); retry in 30 seconds"
}
}One call returns the liquidation map of every market, all from the same node state snapshot and the same marks. Each market comes in its own auto bucket size (about 0.25% of its price), with running totals from the price and its long and short totals within
After a 304, count the snapshot’s age from
range_pct.
What is free and what is Builder:
- Builder and Enterprise: every market in one call.
- One call paid with x402: 0.05 USDC on Base, at
https://api.ironflow.sh/x402/v1/liquidations/map/all. No key needed. See pay per call. - Free keys, Explorer and calls without a key: one market per call, with
GET /v1/liquidations/map?market=BTC-PERP. Asking for every market answersPLAN_REQUIREDwith the Builder plan inupgrade(a 402 with the x402 price while pay per call is on).
GET /v1/liquidations/map without market, or with market=all, is the same call.
Poll it with ETag
The map is re-priced with fresh marks every minute and its positions come from a new snapshot about every 12 minutes. Each answer has anETag; send it back as If-None-Match and an unchanged map answers 304 Not Modified with no body:
curl -si -H "Authorization: Bearer $IRONFLOW_KEY" \
-H 'If-None-Match: W/"1211490000-1793900910-f-8c1f0e5a7d2b4c61"' \
https://api.ironflow.sh/v1/liquidations/map/all
snapshot.time.Authorizations
Ironflow API key, format if_xxxx. Free keys at https://ironflow.sh/key. Optional on read endpoints.
Headers
Query Parameters
Response
Every market's liquidation map.
Every market's liquidation map, from one snapshot.