Perpetuals API
Whale alerts: perpetual positions over $1M just opened or closed
The latest $1M+ perpetual positions opened or closed, newest first: account, coin, side, size, entry and liquidation price, USD value. About the last two hours; filter by coin, side or action.
/api/external/perps/perps-whale-alertsWhat it returns
A live feed of large positions on the perpetual-futures venue this family covers: every open or close of a position worth over $1M, newest first, with the trading account, the coin, the side, the size in coin units, the entry and liquidation prices and the position value in USD. The feed holds only the latest alerts — measured 2026-09-22, the 50 newest, about two hours — so coverageFrom says how far back it reached, and a filter that matches nothing answers an empty list rather than a 404. trader is a trading-account address, the same one perps-trader and perps-trader-positions take, not a wallet on any of this API's chains.
Chains
This endpoint is not tied to a chain: it takes no chain in its request.
Request
Send your key in the x-dex-data-key header. Replace each <placeholder> with a real value.
curl -H "x-dex-data-key: $DEXDATA_API_KEY" \ "https://api.dexdata.io/api/external/perps/perps-whale-alerts"
| Parameter | Description |
|---|---|
limitquery · integer · optional | How many alerts to return, newest first. Defaults to 50; at most 200. |
symbolquery · string · optional | Keep only one coin, by ticker, e.g. "BTC". Case-insensitive. Not a token mint or contract address. |
sidequery · string · optional | Keep only longs or only shorts.longshort |
actionquery · string · optional | Keep only opens or only closes.openclose |
minValueUsdquery · number · optional | Keep only alerts whose positionValueUsd is at least this, USD (an alert without one fails). |
Response fields
A JSON response. Every field is always present; null means the value could not be established, never zero.
| Field | Type | Description |
|---|---|---|
alerts | object[] | The alerts kept, newest first. Empty when no alert in the feed matches the filters. |
alerts[].trader | string | The trading account that moved, e.g. "0x7f47…". Not a wallet on this API's chains. |
alerts[].symbol | string | The coin of the perpetual market, e.g. "BTC". |
alerts[].side | string | Which way the position faces. |
alerts[].action | string | Whether the position was opened or closed. |
alerts[].size | number | Position size in COIN UNITS, not USD. Always positive; side gives the direction. |
alerts[].entryPrice | number | null | Average entry price of the position, USD. |
alerts[].liquidationPrice | number | null | The price at which the position would be liquidated, USD. null when none was published. Values far from the market (a short liquidating at billions) mean the position is barely leveraged. The latest figure held for the position, so it can change between calls. |
alerts[].positionValueUsd | number | null | The position value in USD, the latest figure held for the position: it is not frozen when the alert fires and can change between calls while the position stays open. It need not equal size × entryPrice or size × the current price; do not recompute it. |
alerts[].alertedAt | integer | When the alert fired, Unix seconds. |
coverageFrom | integer | When the oldest alert in the whole feed fired, Unix seconds, before any filter: how far back this answer looked. |
Start building with DexData today
Sign in, create a key and make your first call in a minute. Free credits every month, and you only pay for calls that succeed.
Get a free API key