Live, structured data on every open position on Hyperliquid, read from our own node.
Tilt runs its own Hyperliquid node and turns the whole exchange into structured, queryable data: every open position on every perp on every dex (native and HIP-3) with its size, leverage, liquidation price and PnL; every fill and liquidation as it happens, and every one since the index began; every resting stop and take-profit; and derived views such as the liquidation map. Data is typically under a second behind the chain. Every response says exactly how old it is.
Base URL https://api.tilt.markets/v1
Pointing an agent at this? Give it tilt.markets/llms.txt. It knows how to get a key and what to call.
Start
1Get a key. Any identifier works: an email, a name, a project. Nothing to verify.
curl -X POST https://api.tilt.markets/v1/keys \ -H 'Content-Type: application/json' \ -d '{"identifier": "you@example.com"}'2Send it on every request.
export TILT_KEY=tilt_live_... curl -H "Authorization: Bearer $TILT_KEY" https://api.tilt.markets/v1/markets
3Pull the whole book for a market, or the slice you need.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/positions?side=long&max_distance_to_liquidation_pct=5"
Conventions
- One envelope:
{ "data": ..., "as_of": { "block", "time", "lag_ms" }, "next": cursor|null }. - Sides are
long/shorton positions andbuy/sellon orders. NeverA/B. - Units live in field names:
size_coin,notional_usd,price_usd,leverage,*_pct(0–100). - Times are ISO 8601 UTC. Blocks are Hyperliquid L1 block numbers.
- Every derived number carries a
definition. - Cursor pagination: pass
nextback as?cursor=. - One error shape:
{ "error": { "code", "message" } }. Unknown or invalid query parameters are a400, never ignored. - Limits (free tier): 300 requests per minute and 20,000 per day per key, 3 stream connections, 1,000,000 stream messages a day. Every response carries
RateLimit-Limit,RateLimit-Remaining,RateLimit-Reset(seconds) andX-Daily-Limit,X-Daily-Remaining,X-Daily-Reset(seconds to 00:00 UTC). A429addsRetry-Afterand itscodeisrate_limited(per minute) ordaily_limit. More is one request away:POST /v1/limits/request. A key turned off for abuse gets403 key_revoked.
Coverage is measured, not assumed: GET /v1/status reports our positions against the exchange's published open interest every minute, plus latency and the last spot check against the public API.
- Free tier on every key: 300 requests a minute, 20,000 a day, 3 stream connections. Details and how to get more under Limits below.
- GET/v1
- POST/keys
- POST/limits/request
- GET/markets
- GET/tokens
- GET/markets/{market}
- GET/markets/{market}/positions
- GET/markets/{market}/leverage
- GET/markets/{market}/liquidation-map
- GET/markets/{market}/exit-orders
- GET/markets/{market}/book
- GET/markets/{market}/book-history
- GET/markets/{market}/health
- GET/wallets/{address}
- GET/wallets/{address}/positions
- GET/wallets/{address}/orders
- GET/wallets/{address}/position-history
- GET/wallets/{address}/fills
- GET/wallets/{address}/order-events
- GET/wallets/{address}/twaps
- GET/wallets/{address}/ledger
- GET/markets/{market}/order-events
- GET/markets/{market}/twaps
- GET/wallets/{address}/funding
- GET/markets/{market}/funding-history
- GET/twaps
- GET/twaps/flow
- GET/twaps/stats
- GET/twaps/{id}
- GET/fills
- GET/liquidations
- GET/stream
- GET/status
Endpoints
GET/v1
Machine-readable start page · no key needed
No key needed. Returns what this API is, how to get a key, and every endpoint with one example. Agents should call this first.
curl https://api.tilt.markets/v1
Live example not available right now (The operation was aborted due to timeout).
› Fields
- name string
- description string
- get_a_key stringHow to obtain a key in one request.
- docs string
- openapi string
- llms_txt string
- status stringThe machine-readable status route.
- stream stringThe WebSocket stream URL and its channels.
- endpoints array
- method string
- path string
- summary string
- example string
POST/v1/keys
Create an API key · no key needed
Free, instant, no verification. Any identifier works; it is only used so you can find your own keys later. Keep the key private.
curl -X POST https://api.tilt.markets/v1/keys \
-H 'Content-Type: application/json' \
-d '{"identifier": "you@example.com"}'{
"key": "tilt_live_xxxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxxxxxxxx",
"rate_limit": {
"requests_per_minute": 300,
"requests_per_day": 20000,
"stream_connections": 3,
"stream_messages_per_day": 1000000
},
"more": "Free tier. If you hit a limit, POST https://api.tilt.markets/v1/limits/request with your key, an email and what you are building; a person reads it and replies.",
"usage": "Send as: Authorization: Bearer <key>"
}› Fields
- key string
- rate_limit object
- requests_per_minute integer
- usage stringSend as Authorization: Bearer <key>
POST/v1/limits/request
Ask for higher limits · no key needed
Every key starts on the free tier: 300 requests a minute, 20,000 a day, 3 stream connections with 100 subscriptions each, 1,000,000 stream messages a day. Hit one and the 429 says which. To go past it, send your key, an email and what you are building. A person reads it within minutes and replies to the email, usually within a day, with limits raised on the same key. No form, no account, no card.
curl -X POST https://api.tilt.markets/v1/limits/request \
-H 'Content-Type: application/json' \
-d '{"key": "tilt_live_...", "email": "you@example.com", "use_case": "What you are building", "requested": "5,000/min and 2M/day"}'{
"received": true,
"message": "Got it. A person reads these and replies to you@example.com, usually within a day. Your current limits stay in place until then.",
"current": {
"rpm": 300,
"daily": 20000,
"streamConnections": 3,
"streamSubscriptions": 100,
"streamMessagesDaily": 1000000
}
}› Fields
- received boolean
- message string
- current objectYour current limits.
GET/v1/markets
Every market
Every perp on the native dex and on HIP-3 dexes, with live mark, funding, open interest and volume, followed by every spot pair with type: spot (id such as @107, symbol such as HYPE/USDC, supply and volume). Spot pairs have fills and order events under their id; balances are per wallet. Filter with type.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| type | query | string, perp | spot | Only perps, or only spot pairs. Default is both. |
- Parameters
type · query · string, perp | spot
Only perps, or only spot pairs. Default is both.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets"
Live example not available right now (The operation was aborted due to timeout).
› Fields Market[]
- id string
- type string, perp | spot
- dex stringEmpty for the native dex, otherwise the HIP-3 dex name.
- mark_price_usd number
- mid_price_usd number, nullable
- funding_rate_hourly numberFraction per hour. Positive means longs pay shorts.
- open_interest_coin numberBoth sides summed, as Hyperliquid publishes it.
- open_interest_usd numberOne side, at mark.
- volume_24h_usd number
- max_leverage integer
- size_decimals integer
- tracked booleanTrue when positions, exit orders and liquidation maps are available (every perp). False for spot pairs, which have fills and order events only.
- book booleanTrue when the order book is followed for this market (the largest by open interest and spot volume).
- symbol stringSpot only, e.g. HYPE/USDC.
- base_token stringSpot only.
- quote_token stringSpot only.
- prev_day_price_usd numberSpot only.
- volume_24h_base numberSpot only, in the base token.
- circulating_supply numberSpot only.
- total_supply numberSpot only.
GET/v1/tokens
Every spot token
Name, decimals, whether it is a canonical Hyperliquid token, and its HyperEVM contract when it has one. Spot pair ids map to tokens through /markets?type=spot.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/tokens"
Live example not available right now (The operation was aborted due to timeout).
GET/v1/markets/{market}
One market, live
Mark and mid price, hourly funding, open interest, 24h volume, max leverage and size decimals for one perp; supply and volume for one spot pair. Spot pairs resolve by id (@107) or symbol (HYPE/USDC).
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC"
Live example not available right now (The operation was aborted due to timeout).
› Fields Market
- id string
- type string, perp | spot
- dex stringEmpty for the native dex, otherwise the HIP-3 dex name.
- mark_price_usd number
- mid_price_usd number, nullable
- funding_rate_hourly numberFraction per hour. Positive means longs pay shorts.
- open_interest_coin numberBoth sides summed, as Hyperliquid publishes it.
- open_interest_usd numberOne side, at mark.
- volume_24h_usd number
- max_leverage integer
- size_decimals integer
- tracked booleanTrue when positions, exit orders and liquidation maps are available (every perp). False for spot pairs, which have fills and order events only.
- book booleanTrue when the order book is followed for this market (the largest by open interest and spot volume).
- symbol stringSpot only, e.g. HYPE/USDC.
- base_token stringSpot only.
- quote_token stringSpot only.
- prev_day_price_usd numberSpot only.
- volume_24h_base numberSpot only, in the base token.
- circulating_supply numberSpot only.
- total_supply numberSpot only.
GET/v1/markets/{market}/positions
Every open position in a market
The whole book for this market, one row per wallet, each within a second of its last fill. Sorted by notional descending by default. Use filters to pull the slice you need: side=long&max_distance_to_liquidation_pct=5 is "longs that get liquidated on a 5% drop". Add at=<time> for the book as it was: positions from the newest hourly state snapshot at or before that time (size, entry and leverage; liquidation price and PnL are not in the state). With at, the other filters do not apply and cursor pages by size.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
| at | query | string | A time (ISO 8601 or epoch ms). Returns the book at the newest hourly snapshot at or before it. |
| side | query | string, long | short | Only longs or only shorts. |
| min_notional_usd | query | number | Only positions at least this large at the mark. |
| max_distance_to_liquidation_pct | query | number | Only positions whose liquidation price is within this many percent of the mark. |
| min_leverage | query | number | Only positions at this leverage or higher. |
| sort | query | string, notional_usd | distance_to_liquidation_pct | unrealized_pnl_usd, default notional_usd | Field to sort by. |
| order | query | string, asc | desc, default desc | Sort direction. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).at · query · string
A time (ISO 8601 or epoch ms). Returns the book at the newest hourly snapshot at or before it.
side · query · string, long | short
Only longs or only shorts.
min_notional_usd · query · number
Only positions at least this large at the mark.
max_distance_to_liquidation_pct · query · number
Only positions whose liquidation price is within this many percent of the mark.
min_leverage · query · number
Only positions at this leverage or higher.
sort · query · string, notional_usd | distance_to_liquidation_pct | unrealized_pnl_usd, default notional_usd
Field to sort by.
order · query · string, asc | desc, default desc
Sort direction.
limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/positions?side=long&max_distance_to_liquidation_pct=5"
Live example not available right now (The operation was aborted due to timeout).
› Fields Position[]
- wallet string
- market string
- side string, long | short
- size_coin numberAbsolute size in coin units.
- notional_usd numbersize_coin × mark.
- leverage number
- margin_mode string, cross | isolated
- entry_price_usd number, nullable
- liquidation_price_usd number, nullableNull when the wallet cannot be liquidated at any positive price.
- distance_to_liquidation_pct number, nullableHow far the mark must move against the position, in percent of mark.
- unrealized_pnl_usd number
- margin_used_usd number
- pnl_to_margin number, nullableunrealized_pnl_usd ÷ margin_used_usd. −0.5 means half the margin is lost.
- updated_at stringWhen this row last changed.
GET/v1/markets/{market}/leverage
Open interest by leverage and by distance to liquidation
The market's open positions folded into buckets, long and short, by the leverage the trader set (1x to 3x, 3x to 5x, and so on) and by how far the mark must move to reach their liquidation price. Rebuilt every second from every position.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/leverage"
Live example not available right now (The operation was aborted due to timeout).
› Fields Leverage
- buckets arrayNotional by the leverage the trader set.
- label string
- long_notional_usd number
- short_notional_usd number
- count integer
- distance_bands arrayNotional by distance to liquidation.
- label string
- long_notional_usd number
- short_notional_usd number
- long_count integer
- short_count integer
- definition string
GET/v1/markets/{market}/liquidation-map
Forced flow by price
Notional that gets liquidated at each 1% step from the mark, −30% to +30%. Longs liquidate below the mark, shorts above.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/liquidation-map"
{
"data": {
"mark_price_usd": 81546,
"rungs": [
{
"from_pct": -30,
"price_from_usd": 57082.2,
"price_to_usd": 57897.66,
"long_notional_usd": 30101767.305540003,
"short_notional_usd": 0,
"count": 167
},
{
"from_pct": -29,
"price_from_usd": 57897.66,
"price_to_usd": 58713.12,
"long_notional_usd": 18718825.586880006,
"short_notional_usd": 0,› 25 more lines‹ fold
"count": 169
},
{
"from_pct": -28,
"price_from_usd": 58713.12,
"price_to_usd": 59528.58,
"long_notional_usd": 18008989.674300022,
"short_notional_usd": 0,
"count": 167
},
"… 57 more"
],
"beyond_range": {
"long_notional_usd": 629437320.2512801,
"short_notional_usd": 1031206710.4885244
},
"definition": "Notional whose liquidation price falls in each 1% step from the mark. A long liquidates when the mark falls to its price, a short when it rises."
},
"as_of": {
"block": 1181672985,
"time": "2026-10-13T00:14:50.723Z",
"lag_ms": 106093
},
"next": null
}› Fields LiquidationMap
- mark_price_usd number
- rungs array
- from_pct integerLower edge of the rung relative to mark, e.g. −2 means −2% to −1%.
- price_from_usd number
- price_to_usd number
- long_notional_usd number
- short_notional_usd number
- count integer
- beyond_range object
- long_notional_usd numberLongs with liquidation below −30%.
- short_notional_usd numberShorts with liquidation above +30%.
- definition string
GET/v1/markets/{market}/exit-orders
Resting stops and take-profits by price
Declared exits: orders that would reduce an open position and state intent (trigger orders, reduce-only orders, position TP/SL). Plain limit quotes are not counted. Long stops sit below the mark and long take-profits above; shorts are mirrored.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/exit-orders"
Live example not available right now (The operation was aborted due to timeout).
› Fields ExitOrders
- mark_price_usd number
- rungs array
- from_pct integer
- long_stop_usd number
- long_take_profit_usd number
- short_stop_usd number
- short_take_profit_usd number
- within_5_pct object
- long_stops_usd number
- long_take_profits_usd number
- short_stops_usd number
- short_take_profits_usd number
- largest array
- wallet string
- side string, long | short
- kind string, stop | take_profit
- trigger_price_usd number
- distance_from_mark_pct number
- notional_usd number
- holders_scanned integer
- holders_with_exit_orders integer
- definition string
GET/v1/markets/{market}/book
The order book, twenty levels a side
Live from Hyperliquid's public feed for the largest markets (about the top sixty perps by open interest and twenty spot pairs by volume; /markets shows book: true on those). This is the one dataset on the API served from Hyperliquid's servers rather than our node. Add at=<time> for the newest stored snapshot at or before that time. Snapshots arrive about every three seconds and are kept thirty days.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
| at | query | string | A time; returns the stored snapshot at or before it. |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).at · query · string
A time; returns the stored snapshot at or before it.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/book"
Live example not available right now (The operation was aborted due to timeout).
› Fields Book
- market string
- time stringThe exchange's time for the snapshot.
- bids arrayBest first.
- price_usd number
- size_coin number
- orders integer
- asks arrayBest first.
- price_usd number
- size_coin number
- orders integer
- mid_price_usd number
- spread_bps number, nullable
- bid_depth_1pct_usd numberNotional resting within 1% below mid.
- ask_depth_1pct_usd numberNotional resting within 1% above mid.
GET/v1/markets/{market}/book-history
Mid, spread and depth per snapshot
One row per stored book snapshot, newest first, without the levels. For the levels at one moment use /book?at=.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/book-history?limit=100"
Live example not available right now (The operation was aborted due to timeout).
GET/v1/markets/{market}/health
PnL versus margin, both sides
How much of each side is bleeding or sitting on gains, relative to the margin backing it.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/health"
Live example not available right now (The operation was aborted due to timeout).
› Fields MarketHealth
- buckets array
- label string
- long_notional_usd number
- short_notional_usd number
- count integer
- trapped objectNotional that has lost more than half its margin.
- long_notional_usd number
- short_notional_usd number
- long_pct_of_side number
- short_pct_of_side number
- definition string
GET/v1/wallets/{address}
One wallet, everything, live
Positions in every market, spot balances, open orders, vault equity and staking, read from the node the moment you ask.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string |
- Parameters
address* · path · string
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060"
Live example not available right now (The operation was aborted due to timeout).
› Fields Wallet
- address string
- account_value_usd number
- margin_used_usd number
- withdrawable_usd number
- positions array
- wallet string
- market string
- side string, long | short
- size_coin numberAbsolute size in coin units.
- notional_usd numbersize_coin × mark.
- leverage number
- margin_mode string, cross | isolated
- entry_price_usd number, nullable
- liquidation_price_usd number, nullableNull when the wallet cannot be liquidated at any positive price.
- distance_to_liquidation_pct number, nullableHow far the mark must move against the position, in percent of mark.
- unrealized_pnl_usd number
- margin_used_usd number
- pnl_to_margin number, nullableunrealized_pnl_usd ÷ margin_used_usd. −0.5 means half the margin is lost.
- updated_at stringWhen this row last changed.
- orders array
- market string
- side string, buy | sell
- type string
- price_usd numberTrigger price for trigger orders, limit price otherwise.
- size_coin number
- reduce_only boolean
- is_trigger boolean
- placed_at string
- spot_balances array
- token string
- total number
- hold number
- vault_equities array
- vault string
- equity_usd number
- staking object
- delegated number
- undelegated number
- pending_withdrawal number
GET/v1/wallets/{address}/positions
A wallet's open positions
Every open perp position of this address across every dex, read from the node the moment you ask, with size, entry, leverage, liquidation price and PnL. Add at=<time> for what it held at a past hour, from the state snapshots.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string |
- Parameters
address* · path · string
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/positions"
Live example not available right now (The operation was aborted due to timeout).
› Fields Position[]
- wallet string
- market string
- side string, long | short
- size_coin numberAbsolute size in coin units.
- notional_usd numbersize_coin × mark.
- leverage number
- margin_mode string, cross | isolated
- entry_price_usd number, nullable
- liquidation_price_usd number, nullableNull when the wallet cannot be liquidated at any positive price.
- distance_to_liquidation_pct number, nullableHow far the mark must move against the position, in percent of mark.
- unrealized_pnl_usd number
- margin_used_usd number
- pnl_to_margin number, nullableunrealized_pnl_usd ÷ margin_used_usd. −0.5 means half the margin is lost.
- updated_at stringWhen this row last changed.
GET/v1/wallets/{address}/orders
A wallet's open orders
Resting orders across every market, including trigger orders, with price, size, type and reduce-only flags. Empty when the wallet has nothing resting.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string |
- Parameters
address* · path · string
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/orders"
Live example not available right now (The operation was aborted due to timeout).
› Fields Order[]
- market string
- side string, buy | sell
- type string
- price_usd numberTrigger price for trigger orders, limit price otherwise.
- size_coin number
- reduce_only boolean
- is_trigger boolean
- placed_at string
GET/v1/wallets/{address}/position-history
A wallet's positions hour by hour
One row per market per hourly state snapshot in which the wallet held a position, newest first. Size, entry price and leverage as the chain's state held them. /wallets/{address}/positions?at=<time> gives one moment; this gives the series.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string | |
| at | query | string | A time. Returns the wallet's positions at the newest hourly state snapshot at or before it. |
| market | query | string | Only this market. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
address* · path · string
at · query · string
A time. Returns the wallet's positions at the newest hourly state snapshot at or before it.
market · query · string
Only this market.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/position-history?market=BTC"
Live example not available right now (The operation was aborted due to timeout).
› Fields SnapshotPosition[]
- wallet string
- market string
- side string, long | short
- size_coin number
- entry_price_usd number, nullable
- leverage integer
- margin_mode string, cross | isolated
- snapshot_time string
- block integer
GET/v1/wallets/{address}/fills
A wallet's fill history
Every trade this address made, newest first, with realized PnL and fee on each, plus the fills where it was the liquidated party. Every wallet's history is served from the same index, built from the chain's own records, so it starts on the same date for everyone; history.coverage gives the start of each dataset (fills, funding, ledger, order events, TWAPs, snapshots).
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string | |
| market | query | string | Only this market. |
| liquidations_only | query | boolean, default false | Only the fills where this wallet was liquidated. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| since_block | query | integer | Only fills at or after this L1 block. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
address* · path · string
market · query · string
Only this market.
liquidations_only · query · boolean, default false
Only the fills where this wallet was liquidated.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.since_block · query · integer
Only fills at or after this L1 block.
limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/fills?from=2026-09-23"
Live example not available right now (The operation was aborted due to timeout).
› Fields Fill[]
- block integer
- time string
- market string
- wallet string
- side string, buy | sell
- price_usd number
- size_coin number
- position_before_coin numberSigned position before this fill.
- position_after_coin number
- direction string
- realized_pnl_usd number, nullable
- fee_usd number, nullableNegative is a rebate.
- taker boolean, nullableTrue when this side crossed the book.
- tx_hash string, nullable
- trade_id integer, nullable
- twap_id integer, nullableThe TWAP order this fill is a slice of, when it is one; see /twaps/{id}. Stamped by the chain since 2 August 2025; TWAP slices from 22 March to 25 May 2025 carry it under /twaps.
- liquidation object, nullable
- liquidated_wallet string
- mark_price_usd number
- method string
GET/v1/wallets/{address}/order-events
Every order event of a wallet
One row per order status transition the chain recorded for this address: open, filled, canceled, triggered, and the rejection codes (badAloPxRejected, perpMarginRejected, ...), newest first, from the fill index. Kept for thirty days. This is the placement and cancel history that fills alone cannot show.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string | |
| market | query | string | Only this market. |
| status | query | string | One status, e.g. filled or canceled. |
| order_id | query | integer | Follow one order through its transitions. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
address* · path · string
market · query · string
Only this market.
status · query · string
One status, e.g.
filledorcanceled.order_id · query · integer
Follow one order through its transitions.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/order-events"
Live example not available right now (The operation was aborted due to timeout).
› Fields OrderEvent[]
- time string
- block integer
- wallet string
- market string
- status stringopen, filled, canceled, triggered, marginCanceled, reduceOnlyCanceled, or a rejection code such as badAloPxRejected.
- order_id integer
- client_order_id string, nullable
- side string, buy | sell
- price_usd number
- size_coin numberRemaining size at this event.
- original_size_coin number
- type stringLimit, Market, Stop Market, Stop Limit, Take Profit Market, Take Profit Limit.
- time_in_force string, nullableGtc, Ioc, Alo (post-only), FrontendMarket.
- is_trigger boolean
- trigger_price_usd number, nullable
- trigger_condition string, nullable
- reduce_only boolean
- position_tpsl boolean
- placed_at string
- tx_hash string, nullable
- builder string, nullable
GET/v1/wallets/{address}/twaps
A wallet's TWAP orders, with their execution
Every TWAP order this wallet ran, newest last fill first, summed from its slices, on every market: 22 March to 25 May 2025 and 2 August 2025 on (the chain did not mark TWAP slices in between). Orders placed since 2026-09-23 also carry their status from our node's TWAP stream. from and to select orders with a fill in the window.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string | |
| market | query | string | Only this market. |
| side | query | string, buy | sell | |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
address* · path · string
market · query · string
Only this market.
side · query · string, buy | sell
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/twaps"
Live example not available right now (The operation was aborted due to timeout).
› Fields Twap[]
- twap_id integer
- wallet string
- market string
- side string, buy | sell
- order object, nullable
- status stringwaitingForTrigger, activated (running), finished, terminated, stopped, or error.
- size_coin numberThe size the order was placed for.
- executed_size_coin numberExecuted size as the chain reported it at this status.
- executed_notional_usd number
- minutes integerThe duration the order was placed for.
- reduce_only boolean
- randomize booleanTrue when slice timing was randomized.
- started_at stringWhen the order was placed.
- ends_at stringWhen its minutes run out.
- updated_at stringWhen this status was recorded.
- block integer
- error string, nullableThe chain's reason when status is error.
- execution object, nullable
- fills integerNumber of fills that belong to the order.
- executed_size_coin number
- executed_notional_usd number
- average_price_usd number, nullableNotional over size.
- fee_usd number, nullableNegative is a rebate. Null when any fill came from the March to May 2025 trades archive, which has no fees.
- realized_pnl_usd number, nullableNull for the same reason as fee_usd.
- first_fill string
- last_fill string
- first_block integer, nullableNull for fills from the March to May 2025 trades archive
- last_block integer, nullable
- completion_pct number, nullableExecuted size over the order's size, 0 to 100. Null when the order's size is not known (placed before 2026-09-23).
GET/v1/wallets/{address}/ledger
Deposits, withdrawals, transfers and vault flows of a wallet
Every ledger entry where this address was either party, newest first: deposit, withdraw, send, spotTransfer, internalTransfer, accountClassTransfer, subAccountTransfer, vaultDeposit, vaultWithdraw, vaultLeaderCommission, borrowLend, rewardsClaim, cStakingTransfer, Delegation, CDeposit, CWithdrawal, and the rest as the chain names them. Funding payments have their own route, /wallets/{address}/funding. detail carries the raw event for fields a kind has that the columns do not.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string | |
| kind | query | string | One kind, e.g. deposit or withdraw. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
address* · path · string
kind · query · string
One kind, e.g.
depositorwithdraw.from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/ledger"
Live example not available right now (The operation was aborted due to timeout).
› Fields LedgerEntry[]
- time string
- block integer
- kind stringdeposit, withdraw, send, spotTransfer, internalTransfer, accountClassTransfer, subAccountTransfer, vaultDeposit, vaultWithdraw, and others as the chain names them.
- wallet stringThe initiating address.
- counterparty string, nullableThe other party, vault, or destination when there is one.
- token string, nullable
- amount numberIn the token's units.
- usdc_value number
- fee_usd number
- source_dex string, nullable
- destination_dex string, nullable
- tx_hash string, nullable
- detail object, nullableThe raw event as written.
GET/v1/markets/{market}/order-events
Order status events in a market
The market's order flow as status transitions, newest first. Filter by status to see only fills, only cancels, or only rejections. Kept for thirty days.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
| status | query | string | One status, e.g. filled, canceled, open, or a rejection code. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).status · query · string
One status, e.g.
filled,canceled,open, or a rejection code.from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/order-events?status=filled"
Live example not available right now (The operation was aborted due to timeout).
› Fields OrderEvent[]
- time string
- block integer
- wallet string
- market string
- status stringopen, filled, canceled, triggered, marginCanceled, reduceOnlyCanceled, or a rejection code such as badAloPxRejected.
- order_id integer
- client_order_id string, nullable
- side string, buy | sell
- price_usd number
- size_coin numberRemaining size at this event.
- original_size_coin number
- type stringLimit, Market, Stop Market, Stop Limit, Take Profit Market, Take Profit Limit.
- time_in_force string, nullableGtc, Ioc, Alo (post-only), FrontendMarket.
- is_trigger boolean
- trigger_price_usd number, nullable
- trigger_condition string, nullable
- reduce_only boolean
- position_tpsl boolean
- placed_at string
- tx_hash string, nullable
- builder string, nullable
GET/v1/markets/{market}/twaps
TWAP orders in a market, with their execution
Every TWAP order that filled in this market, newest last fill first, summed from its slices: size executed, notional, average price, fee, first and last fill, on every market, spot included: 22 March to 25 May 2025 (from Hyperliquid's trades archive, without fee or PnL) and 2 August 2025 on, when the chain began stamping every fill with its TWAP order id. Slices between those dates were not marked by the chain. Orders placed since 2026-09-23 also carry their status from our node's TWAP stream. from and to select orders with a fill in the window; the execution always covers the whole order.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
| side | query | string, buy | sell | |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).side · query · string, buy | sell
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/twaps?limit=20"
Live example not available right now (The operation was aborted due to timeout).
› Fields Twap[]
- twap_id integer
- wallet string
- market string
- side string, buy | sell
- order object, nullable
- status stringwaitingForTrigger, activated (running), finished, terminated, stopped, or error.
- size_coin numberThe size the order was placed for.
- executed_size_coin numberExecuted size as the chain reported it at this status.
- executed_notional_usd number
- minutes integerThe duration the order was placed for.
- reduce_only boolean
- randomize booleanTrue when slice timing was randomized.
- started_at stringWhen the order was placed.
- ends_at stringWhen its minutes run out.
- updated_at stringWhen this status was recorded.
- block integer
- error string, nullableThe chain's reason when status is error.
- execution object, nullable
- fills integerNumber of fills that belong to the order.
- executed_size_coin number
- executed_notional_usd number
- average_price_usd number, nullableNotional over size.
- fee_usd number, nullableNegative is a rebate. Null when any fill came from the March to May 2025 trades archive, which has no fees.
- realized_pnl_usd number, nullableNull for the same reason as fee_usd.
- first_fill string
- last_fill string
- first_block integer, nullableNull for fills from the March to May 2025 trades archive
- last_block integer, nullable
- completion_pct number, nullableExecuted size over the order's size, 0 to 100. Null when the order's size is not known (placed before 2026-09-23).
GET/v1/wallets/{address}/funding
Every funding payment of a wallet
One row per market per hourly settlement, newest first, from the index. amount_usd is positive when the wallet received funding and negative when it paid.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| address* | path | string | |
| market | query | string | Only this market. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
address* · path · string
market · query · string
Only this market.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/wallets/0x5b5d51203a0f9079f8aeb098a6523a13f298c060/funding"
Live example not available right now (The operation was aborted due to timeout).
GET/v1/markets/{market}/funding-history
Hourly funding history of a market
One row per hourly settlement, newest first, computed from every settled position in the index. Reaches back to when the funding stream began.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market* | path | string | Market id as listed by /markets, e.g. BTC, a HIP-3 id like xyz:XYZ100, or a spot id like @107 (a spot symbol like HYPE/USDC is accepted too). |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 |
- Parameters
market* · path · string
Market id as listed by
/markets, e.g.BTC, a HIP-3 id likexyz:XYZ100, or a spot id like@107(a spot symbol likeHYPE/USDCis accepted too).from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/markets/BTC/funding-history?limit=24"
Live example not available right now (The operation was aborted due to timeout).
GET/v1/twaps
TWAP orders by status, from the node's TWAP stream
One row per TWAP order at its latest status, newest first, from our node's TWAP status stream (kept since 2026-09-23). status=active lists the orders running right now (activated and with minutes left; TWAPs run up to 10,080 minutes), on every market or one market; status=waiting lists orders waiting for their trigger price; finished, terminated, stopped and error list orders that ended that way. Each row also carries the order's execution summed from its fills and completion_pct. Orders placed before 2026-09-23 have no status; find them by market or wallet under /markets/{market}/twaps and /wallets/{address}/twaps.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| status | query | string, active | waiting | finished | terminated | stopped | error | Latest status. active means running now (Hyperliquid's own name for it is activated); waiting means waiting for its trigger price (waitingForTrigger). |
| market | query | string | Only this market. |
| wallet | query | string | Only this wallet. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
status · query · string, active | waiting | finished | terminated | stopped | error
Latest status.
activemeans running now (Hyperliquid's own name for it isactivated);waitingmeans waiting for its trigger price (waitingForTrigger).market · query · string
Only this market.
wallet · query · string
Only this wallet.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/twaps?status=active"
Live example not available right now (The operation was aborted due to timeout).
› Fields Twap[]
- twap_id integer
- wallet string
- market string
- side string, buy | sell
- order object, nullable
- status stringwaitingForTrigger, activated (running), finished, terminated, stopped, or error.
- size_coin numberThe size the order was placed for.
- executed_size_coin numberExecuted size as the chain reported it at this status.
- executed_notional_usd number
- minutes integerThe duration the order was placed for.
- reduce_only boolean
- randomize booleanTrue when slice timing was randomized.
- started_at stringWhen the order was placed.
- ends_at stringWhen its minutes run out.
- updated_at stringWhen this status was recorded.
- block integer
- error string, nullableThe chain's reason when status is error.
- execution object, nullable
- fills integerNumber of fills that belong to the order.
- executed_size_coin number
- executed_notional_usd number
- average_price_usd number, nullableNotional over size.
- fee_usd number, nullableNegative is a rebate. Null when any fill came from the March to May 2025 trades archive, which has no fees.
- realized_pnl_usd number, nullableNull for the same reason as fee_usd.
- first_fill string
- last_fill string
- first_block integer, nullableNull for fills from the March to May 2025 trades archive
- last_block integer, nullable
- completion_pct number, nullableExecuted size over the order's size, 0 to 100. Null when the order's size is not known (placed before 2026-09-23).
GET/v1/twaps/flow
What running TWAPs still have to buy and sell, per market
Every TWAP running now, summed per market and side: how many, the size they still have to trade (order size less what has filled), its value at the current mark, and the pace at which it reaches the book if every order runs to its end. net_remaining_notional_usd is buy less sell. Sorted by the size of the net, largest first. Live: statuses from our node within about two seconds, fills within about one.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market | query | string | Only this market. |
- Parameters
market · query · string
Only this market.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/twaps/flow"
Live example not available right now (The operation was aborted due to timeout).
GET/v1/twaps/stats
TWAP volume per hour or day, one market or all
TWAP slices per UTC hour or day: fills, distinct orders and wallets, notional bought and sold by TWAPs, and (for one market) size bought and sold. Buckets without TWAP fills are left out. At most 1,000 buckets a call; defaults to the last 48 hours hourly or the last 30 days daily. Covers 22 March to 25 May 2025 and 2 August 2025 on (the chain did not mark TWAP slices in between).
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market | query | string | Only this market; all markets when left out. |
| interval | query | string, 1h | 1d, default 1h | Bucket size. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
- Parameters
market · query · string
Only this market; all markets when left out.
interval · query · string, 1h | 1d, default 1h
Bucket size.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/twaps/stats?market=BTC&interval=1d"
Live example not available right now (The operation was aborted due to timeout).
GET/v1/twaps/{id}
One TWAP order, its status, its execution and every slice
The order by its id (the twap_id on fills): its latest status when our node saw it (since 2026-09-23), its execution summed from its fills, and every fill that belongs to it, oldest first, up to 10,000. Fills from 22 March to 25 May 2025 come from Hyperliquid's trades archive, which has no fee, realized PnL or trade id; those fields are null, never zero.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| id* | path | integer | The TWAP order id. |
- Parameters
id* · path · integer
The TWAP order id.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/twaps/2261178"
Live example not available right now (The operation was aborted due to timeout).
GET/v1/fills
Fills, newest first
Every fill, both wallets, with the position before each fill, the realized PnL and fee, and a liquidation block when it was one. The newest fills are served from memory. A from/to range, a wallet, or a since_block older than memory is served from the fill index, which holds every fill on every market since history.indexed_from. Pass since_block to resume a live feed from where you left off.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market | query | string | One market id, e.g. BTC, xyz:GOLD, or a spot id or symbol. |
| wallet | query | string | Fills where this address was either side, or the liquidated party. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| since_block | query | integer | Only fills at or after this L1 block; the way to resume a feed without missing or repeating anything. |
| liquidations_only | query | boolean, default false | Only fills that were liquidations. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
market · query · string
One market id, e.g. BTC, xyz:GOLD, or a spot id or symbol.
wallet · query · string
Fills where this address was either side, or the liquidated party.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.since_block · query · integer
Only fills at or after this L1 block; the way to resume a feed without missing or repeating anything.
liquidations_only · query · boolean, default false
Only fills that were liquidations.
limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/fills?market=BTC"
Live example not available right now (The operation was aborted due to timeout).
› Fields Fill[]
- block integer
- time string
- market string
- wallet string
- side string, buy | sell
- price_usd number
- size_coin number
- position_before_coin numberSigned position before this fill.
- position_after_coin number
- direction string
- realized_pnl_usd number, nullable
- fee_usd number, nullableNegative is a rebate.
- taker boolean, nullableTrue when this side crossed the book.
- tx_hash string, nullable
- trade_id integer, nullable
- twap_id integer, nullableThe TWAP order this fill is a slice of, when it is one; see /twaps/{id}. Stamped by the chain since 2 August 2025; TWAP slices from 22 March to 25 May 2025 carry it under /twaps.
- liquidation object, nullable
- liquidated_wallet string
- mark_price_usd number
- method string
GET/v1/liquidations
Liquidations, newest first
Same records as /fills filtered to liquidations, every market, with the liquidated wallet and the mark it fired at. With no range, the last day; with from/to, any window back to when the index began.
| Parameter | In | Type | Meaning |
|---|---|---|---|
| market | query | string | One market id. Omit for every market. |
| from | query | string | Start of the time range, inclusive. ISO 8601 (2026-09-26T12:00:00Z, or a date) or epoch milliseconds. |
| to | query | string | End of the time range, exclusive. Same formats as from. |
| since_block | query | integer | Only liquidations at or after this L1 block. |
| limit | query | integer, default 100 | |
| cursor | query | string | The next value from the previous page. Opaque; do not construct one. |
- Parameters
market · query · string
One market id. Omit for every market.
from · query · string
Start of the time range, inclusive. ISO 8601 (
2026-09-26T12:00:00Z, or a date) or epoch milliseconds.to · query · string
End of the time range, exclusive. Same formats as
from.since_block · query · integer
Only liquidations at or after this L1 block.
limit · query · integer, default 100
cursor · query · string
The
nextvalue from the previous page. Opaque; do not construct one.
curl -H "Authorization: Bearer $TILT_KEY" \ "https://api.tilt.markets/v1/liquidations?market=BTC"
Live example not available right now (The operation was aborted due to timeout).
› Fields Fill[]
- block integer
- time string
- market string
- wallet string
- side string, buy | sell
- price_usd number
- size_coin number
- position_before_coin numberSigned position before this fill.
- position_after_coin number
- direction string
- realized_pnl_usd number, nullable
- fee_usd number, nullableNegative is a rebate.
- taker boolean, nullableTrue when this side crossed the book.
- tx_hash string, nullable
- trade_id integer, nullable
- twap_id integer, nullableThe TWAP order this fill is a slice of, when it is one; see /twaps/{id}. Stamped by the chain since 2 August 2025; TWAP slices from 22 March to 25 May 2025 carry it under /twaps.
- liquidation object, nullable
- liquidated_wallet string
- mark_price_usd number
- method string
GET/v1/stream
WebSocket stream of fills, liquidations, positions, orders, TWAPs, ledger, funding and books · no key needed
Connect with a WebSocket client to wss://api.tilt.markets/v1/stream?key=<key> (or send the key as Authorization: Bearer). Then send subscriptions as JSON:
- {"op":"subscribe","channel":"fills","market":"BTC"} — every fill in a market as it lands. - {"op":"subscribe","channel":"fills","wallet":"0x..."} — a wallet's fills. - {"op":"subscribe","channel":"fills","market":"BTC","since_block":1162000000} — replay the tape from that block (messages carry "replay": true, then {"op":"replay_done"}), then live. - {"op":"subscribe","channel":"liquidations"} — every liquidation on every market. - {"op":"subscribe","channel":"positions","market":"BTC"} — every position change the node reads: opens, resizes, closes ("closed": true). Also by wallet. - {"op":"subscribe","channel":"orders","wallet":"0x..."} — order status events. Also by market. - {"op":"subscribe","channel":"ledger","wallet":"0x..."} — deposits, withdrawals, transfers. - {"op":"subscribe","channel":"twaps","market":"BTC"} — TWAP order status changes: placed, finished, terminated, error. Also by wallet. Each message carries twap_id, wallet, market, side and order. - {"op":"subscribe","channel":"funding","market":"BTC"} — hourly settlements. Also by wallet. - {"op":"subscribe","channel":"book","market":"BTC"} — each book snapshot as it arrives, largest markets only. - {"op":"unsubscribe", ...} and {"op":"ping"}.
Each message is {"channel", "market"|"wallet", "data", "as_of"} where data has exactly the shape the REST route for that object returns. The server pings every 20 seconds; a client that falls more than 32 MB behind is disconnected with code 1008. The free tier allows 3 connections per key, 100 subscriptions per connection and 1,000,000 messages a day; POST /v1/limits/request for more. The key goes in the URL or the Authorization header. A plain HTTP GET on this path returns 426.
wscat -c "wss://api.tilt.markets/v1/stream?key=$TILT_KEY"
# with wscat (npm i -g wscat)
wscat -c "wss://api.tilt.markets/v1/stream?key=$TILT_KEY"
> {"op":"subscribe","channel":"fills","market":"BTC"}
< {"op":"subscribed","channel":"fills","market":"BTC"}
< {"channel":"fills","market":"BTC","data":{"time":"…","wallet":"0x…","side":"buy","price_usd":84289,"size_coin":0.5,…},"as_of":{…}}GET/v1/status
Is the data complete and current right now? · no key needed
Coverage against the exchange's open interest, node lag, last spot check against the public API, and whether the node is streaming. No key needed.
curl https://api.tilt.markets/v1/status
Live example not available right now (The operation was aborted due to timeout).
› Fields
- ok booleanTrue when every check is within bounds.
- reasons arrayWhy `ok` is false, in plain words. Empty when ok.
- node_lag_s number, nullableAge of the newest block our node has applied.
- coverage objectOur tracked notional against the open interest Hyperliquid publishes, per side, in percent, for the thirty largest markets by open interest.
- coverage_summary objectThe same measure across every market with open interest, weighted by open interest.
- markets integer
- weighted_long_pct number
- weighted_short_pct number
- markets_below_98_pct integer
- markets integerPerp markets known across every dex, delisted ones included.
- last_spot_check object, nullable
- pass_rate numberFraction 0–1 of sampled wallets that matched the public API.
- checked integer
- fill_chain_gaps_1h integer, nullableFills in the last hour whose before-position did not chain from the previous fill. Zero is the bound.
- positions integerOpen positions tracked right now.
- holders integerWallets with at least one tracked position.
- fills_in_memory integer
- as_of AsOf
Limits
Every key starts on the free tier. It is meant to be enough to build and test anything; steady production use will reach it.
| Requests | 300 a minute, 20,000 a day |
| Stream | 3 connections, 100 subscriptions each, 1,000,000 messages a day |
| Headers | RateLimit-Limit, -Remaining, -Reset and X-Daily-Limit, -Remaining, -Reset on every response |
| When you hit one | 429 with code rate_limited or daily_limit, Retry-After, and this link |
Need more? One request. A person reads it, it reaches them within a minute, and they reply to your email, usually within a day, with the limits raised on the same key. No form, no account, no card.
curl -X POST https://api.tilt.markets/v1/limits/request \
-H 'Content-Type: application/json' \
-d '{"key": "tilt_live_...", "email": "you@example.com", "use_case": "What you are building", "requested": "5,000/min and 2M/day"}'Terms
- The data is read from the public Hyperliquid chain and reshaped by us. It is provided as is, with no warranty, for any lawful use.
- Keys are free and rate limited. Abuse gets a key turned off; nothing more.
- We keep the identifier you give us and per-minute request counts per key. No other tracking.
- Nothing here is financial advice. The API carries data and definitions, not opinions.