Perpetuals API

Whale positions: perpetual positions over $1M open right now

Every open position over $1M right now — account, market, side, size, prices, leverage, margin, PnL, funding — plus the long/short split. Filter by market, side or value.

GET/api/external/perps/perps-whale-positions

What it returns

Every open position worth more than $1,000,000 notional on the perpetual-futures venue this family covers, right now, largest first — the trading account, the coin, which side, size, entry/mark/liquidation price, leverage, margin, unrealized PnL and funding paid — plus a summary of how many are long versus short and their total notional. trader is the same trading-account address perps-trader and perps-trader-positions take, not a wallet on any of this API's chains. Chainless and market-wide: filter to one market with symbol (the ticker perps-markets lists, e.g. "BTC", "kPEPE" — not an instrument id such as "BTC-USD" and not a token mint or contract address). perps-market-positions lists every open position on one market regardless of size. No filter matching anything right now — including a symbol this resource does not track, which reads the same way — answers 200 with an empty list and zero counts, never a 404.

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-positions"
Parameters
ParameterDescription
limit

query · integer · optional

How many positions to return, largest notional first. Defaults to 50; at most 2000. Applied AFTER summary is computed, so summary.count can exceed the number of positions returned. limit ≤ 80 keeps the answer under 32 KB.
symbol

query · string · optional

Keep only one market, by coin ticker, e.g. "BTC". Case-insensitive. Not a token mint or contract address.
side

query · string · optional

Keep only longs or only shorts.longshort
minValueUsd

query · number · optional

Keep only positions whose positionValueUsd is at least this, USD.

Response fields

A JSON response. Every field is always present; null means the value could not be established, never zero.

Response fields of Whale positions: perpetual positions over $1M open right now
FieldTypeDescription
positionsobject[]The positions kept, largest notional first, after every filter and then limit.
positions[].traderstring | nullThe trading account holding this position, e.g. "0x5b5d…". Not a wallet on this API's chains.
positions[].symbolstring | nullThe coin of the perpetual market, e.g. "BTC".
positions[].sidestring | nullLong or short, from the sign of the position size.
positions[].sizenumber | nullPosition size in the market's own units (coins), always positive; side carries the direction.
positions[].positionValueUsdnumber | nullCurrent notional value of the position, USD.
positions[].entryPricenumber | nullAverage entry price, formatted to 4 decimal places. A sub-cent market keeps only 1-2 significant figures (measured), so the true entry can differ slightly from what is published.
positions[].markPricenumber | nullThe mark price used for PnL and liquidation, full precision as sent.
positions[].liquidationPricenumber | nullEstimated liquidation price, to 4 decimal places. null when the venue has none to give for this position (measured on cross-margin longs only); a real liquidation price under $0.00005 would also read null.
positions[].leveragenumber | nullThe position's configured leverage multiplier — not its current effective leverage.
positions[].marginModestring | nullThe margin mode this position uses.
positions[].marginUsdnumber | nullMargin this position uses, USD (on a cross position, positionValueUsd divided by leverage) — not the trading account's total equity.
positions[].unrealizedPnlUsdnumber | nullCurrent unrealized profit and loss, USD.
positions[].fundingPaidUsdnumber | nullNet funding since the position was opened, USD. Positive means the position PAID funding; negative means it RECEIVED funding.
positions[].openedAtnumber | nullUnix seconds the position was opened.
positions[].updatedAtnumber | nullUnix seconds this snapshot was last updated (measured within a few minutes of the read).
summaryobjectComputed over EVERY position matching the filters, before limit truncates positions — count can exceed positions.length when more positions match than limit returns.
summary.countintegerHow many positions matched the filters, before limit.
summary.longobject
summary.long.countintegerHow many matching positions are long.
summary.long.positionValueUsdnumberTheir combined notional value, USD.
summary.shortobject
summary.short.countintegerHow many matching positions are short.
summary.short.positionValueUsdnumberTheir combined notional value, USD.

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