Skip to main content

Hyperliquid Liquidations: History by Wallet

Look up Hyperliquid liquidations for any address: every liquidated position, its market, method, mark price and size, as a query or a live stream.

The perpetuals page covers the market-wide liquidation feed. This page is the other direction: one address, its liquidation history over the data window (about the last 30 days).

That is the query you need to answer "was this position liquidated or did I close it", to reconstruct a blown-up account, or to fill the gap left when an export shows a position disappearing with no closing trade.

Checking once, or watching continuously?

Every query on this page becomes a live feed by changing query to subscription — see real-time liquidation alerts below. To watch a set of wallets, the whole exchange, or follow the liquidated funds to other chains, see Build on this. Hyperliquid is included in every Bitquery plan alongside Solana, Ethereum, Base, BNB and Tron.

API Key Required

To query or stream data outside the Bitquery IDE, you need an API access token.

Follow the steps here: How to generate Bitquery API token ➤

Every liquidation of one address​

LiquidatedUser is the address whose position was closed. Method is market for an open-market liquidation and backstop when the backstop vault takes over.

A forced fill is recorded for both sides: the liquidated account's own fill, and the fill of every account that took the other side. All of them carry the same LiquidatedUser, so the query filters Trader.Address as well to keep only the liquidated account's own rows. On those rows Position.SizeBefore and Position.Size are the signed size immediately before and after the fill — negative for a short, 0 once the position is fully closed; a partial liquidation leaves the rest open. Sign a fill by Execution.Side (Buy adds, Sell subtracts), as for a trade. Fills of one block share Block.Time; Execution.Index is their execution order, counted together with the trades of the block.

Run it in the IDE: Hyperliquid Wallet Liquidation History ➤

query {
Hyperliquid {
PerpLiquidations(
limit: {count: 100}
orderBy: {descending: [Block_Time, Liquidation_Execution_Index]}
where: {
Liquidation: {
LiquidatedUser: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}
Trader: {Address: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}}
}
Block: {Time: {since_relative: {days_ago: 3}}}
}
) {
Block { Time }
Liquidation {
Market { Symbol Kind }
Method
MarkPx
LiquidatedUser
Execution { Price Size Side Direction Index Hash }
Position { Leverage IsCross Side SizeBefore Size }
Fees { Fee FeeToken }
}
}
}
}

Sample response:

{
"Block": { "Time": "2026-10-13T11:03:08.025489Z" },
"Liquidation": {
"Market": { "Symbol": "STX", "Kind": "hip3" },
"Method": "market",
"MarkPx": "714.56",
"LiquidatedUser": "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c",
"Execution": { "Price": "710.96", "Size": "1.254", "Side": "Sell", "Direction": "Close Long", "Index": 44 },
"Position": { "Leverage": 10, "IsCross": false, "Side": "Long", "SizeBefore": "1.254", "Size": "0" },
"Fees": { "Fee": "0.080238", "FeeToken": "USDC" }
}
}

Execution.Direction reads Close Long because liquidating a long is a sell that closes it — the direction describes the effect on the liquidated position, not the trader's intent. Position.Size 0 means the whole position was closed by this fill.

Liquidation totals per market​

One row per market and method, with the number of liquidation fills, the total size closed and the fees charged. Keep the Trader.Address filter: without it the counterparties' fills are summed in as well and the size doubles.

Run it in the IDE: Hyperliquid Wallet Liquidation Totals ➤

query {
Hyperliquid {
PerpLiquidations(
where: {
Liquidation: {
LiquidatedUser: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}
Trader: {Address: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}}
}
Block: {Time: {since_relative: {days_ago: 3}}}
}
) {
Liquidation { Market { Symbol } Method }
fills: count
size: sum(of: Liquidation_Execution_Size)
fees: sum(of: Liquidation_Fees_Fee)
}
}
}

Liquidations over a date range​

Bound the export to a day, a week, or the window around a specific market event. Liquidation history on the API goes back about 30 days; a range older than that returns nothing. For older data, ask about a Data Store export.

Run it in the IDE: Hyperliquid Liquidations By Date Range ➤

query {
Hyperliquid {
PerpLiquidations(
limit: {count: 100}
orderBy: {ascending: [Block_Time, Liquidation_Execution_Index]}
where: {
Liquidation: {
LiquidatedUser: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}
Trader: {Address: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}}
}
Block: {Time: {since: "2026-10-01T00:00:00Z", till: "2026-10-08T00:00:00Z"}}
}
) {
Block { Time }
Liquidation {
Market { Symbol }
Method
MarkPx
Execution { Price Size Side Direction }
Position { Leverage IsCross Side SizeBefore Size }
Fees { Fee FeeToken }
}
}
}
}

Backstop liquidations only​

Filter on Method to isolate the liquidations the backstop vault absorbed rather than the open market. These carry their own Execution.Direction values: Liquidated Isolated Long, Liquidated Isolated Short or Liquidated Cross Long on the forced fill itself, Auto-Deleveraging on the rows of accounts whose opposite positions were auto-deleveraged against it, and Partial Borrow Liquidation for a spot-borrow liquidation on a spot market. Backstop liquidations are rare, so for most wallets this returns nothing — drop the LiquidatedUser filter to list them exchange-wide.

Run it in the IDE: Hyperliquid Backstop Liquidations By Wallet ➤

query {
Hyperliquid {
PerpLiquidations(
limit: {count: 100}
orderBy: {descending: Block_Time}
where: {
Liquidation: {
LiquidatedUser: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}
Method: {is: "backstop"}
}
Block: {Time: {since_relative: {days_ago: 30}}}
}
) {
Block { Time }
Liquidation {
Market { Symbol }
Method
MarkPx
Trader { Address }
Execution { Price Size Side Direction }
Position { Leverage IsCross SizeBefore Size }
}
}
}
}

Real-time liquidation alerts for one wallet​

Run it in the IDE: Hyperliquid Wallet Liquidation Stream ➤

subscription {
Hyperliquid {
PerpLiquidations(
where: {
Liquidation: {
LiquidatedUser: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}
Trader: {Address: {is: "0xb4f1d3e5153599cd9f59c686dbee4262ac87d75c"}}
}
}
) {
Block { Time }
Liquidation {
Market { Symbol }
Method
MarkPx
LiquidatedUser
Execution { Price Size Side Direction }
Position { Leverage IsCross Side SizeBefore Size }
}
}
}
}

Drop the where clause to stream every liquidation on the exchange, or swap the address for a list to watch a set of accounts (in: [...] on both LiquidatedUser and Trader.Address).

Build on this​

A one-off lookup answers "was I liquidated". The same cube, kept open as a stream, is what bots, risk desks and dashboards run on:

  • Watch a list of wallets. Replace is with in: ["0x…", "0x…"] in both filters of the subscription above to get one stream for every account you care about — your own, a vault's, a set of market makers.
  • Exchange-wide liquidation feed. Drop the where clause and you have every liquidation on Hyperliquid in real time — the input for cascade detection, liquidation heatmaps and Telegram alerts. The perpetuals page has the market-wide variant.
  • Pair it with positions and funding. Query CurrentPositions for the open positions of the accounts you watch (it is a state cube, not a stream), and stream PerpFundings for what the position cost to hold.
  • Follow the money off Hyperliquid. The liquidated address is an ordinary EVM wallet. The same API key covers Solana, Ethereum, Base, BNB, Tron and Bitcoin, so "where did the collateral come from, and where did the rest go" is one more query — see Follow the wallet off Hyperliquid.
  • Lowest latency. For production alerting, the same liquidations arrive over Kafka as protobuf (hyperliquidcore.messages.proto).

Notes​

  • Liquidator is empty in practice — the feed does not name the liquidator. The accounts that took the other side of a forced fill are the rows with the same LiquidatedUser and Execution.Tid and a different Trader.Address.
  • A single blow-up can produce many records: one per fill — a liquidation is often filled against several makers — for every market the account held.
  • Rows written before about 09:40 UTC on 13 October 2026 have Execution.Index 0 and an empty Position.Size.
  • To see what the position looked like before it was closed, pair Position.SizeBefore here with the fills on the Trades API and the funding it accrued on the Funding Payments API.
Build with Bitquery

Ready to run this in production?

Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.