TICKSTrade-level records, in slot order.
Tick data is in development and has no release date. What exists today is the swaps index: every decoded trade from 10 venues, with the realised fill, the fee split and the pool reserves left behind, over REST and a live socket. For most of what people want ticks for, that is already the answer.
- Status
- In development
- Available today
- /swaps
- Venues decoded
- 10
- Response, p95
- <50ms
Every trade, as it lands.
This is an open connection to the public swaps socket, rendering the frames it receives. Nothing here is seeded or replayed; if the market is quiet, the tape is quiet.
wss://ws.dexploit.dev/ws/swapsconnectingSolana AMMs have no resting orders, so there is no quote to tick. A record is an executed trade against pool reserves: who traded, which pool, how much SOL moved, what the fill was and what the pool looked like afterwards. Depth is the reserve pair, not a book.
The dedicated tick product is about the shape of the archive around those records: bulk windows and stable ordering. The records themselves are already published.
curl "https://api.dexploit.dev/swaps/range?\
start_slot=443090000&end_slot=443090723&\
min_sol=5000000000&limit=100" \
-H "X-API-Key: YOUR_API_KEY"Six endpoints already return trade-level rows.
- GET
/swapsLatest decoded trades, newest first - GET
/swaps/rangeA slot or timestamp window, paged - GET
/swaps/token/{mint}One mint, across every pool it trades in - GET
/swaps/trader/{wallet}One wallet, with its lifetime stats - GET
/swaps/whaleTrades above a lamport threshold - GET
/swaps/{signature}A single trade, by transaction signature
tokentraderpoolis_buymin_soldexlimitoffsetFiltering happens before the rows leave the server, so a per-mint or per-wallet stream costs you the matches and nothing else.
- 1
pumpfun - 2
pumpswap - 3
raydium_amm - 4
raydium_clmm - 5
raydium_cpmm - 6
orca - 7
meteora_damm_v2 - 8
meteora_dbc - 9
meteora_dlmm - 10
meteora_pools
The keyless /api/v1/protocols endpoint returns this list, and it is the same set of names you pass back as dex= when filtering.
signaturestringBase58 transaction signature. A router can emit several trades under one signature
slotint64The slot the trade landed in. Many trades share a slot, so it is not a total order on its own
timestampint64Epoch milliseconds here. The swaps socket sends epoch seconds, and candles send ISO-8601
token_address / pair_addressstringThe non-SOL mint, and the on-chain pool it traded against
userstringThe trader's wallet
is_buybooltrue is SOL → token. The socket calls the same thing swap_type: "buy" | "sell"
dexint1–10, one per indexed venue. The socket sends the name instead of the id
sol_amountint64Lamports: divide by 1e9 for SOL
token_amountint64Base units: divide by 10^quote_decimals
pool_pricenumberPool mid after the trade, SOL per whole token, already decimal-adjusted
price_per_tokennumberRealised fill, in lamports per atomic unit. Not SOL per token: see below
fee / fee_bpsint64 / intLP fee paid, in lamports and in basis points
creator_fee_bpsintNon-zero on pump.fun and meteora_dbc, which charge a creator fee on top of the LP fee
price_impact_bpsintFill against the pre-swap mid. Null on venues that don't report it
real_sol_reserves / real_token_reservesint64Pool reserves after the trade: what an AMM has instead of a book
transfer_fee_in / transfer_fee_outint64Token-2022 transfer fees, charged on the mint itself
Four things that cost people an afternoon.
price_per_tokenIt is lamports per atomic unit, not SOL per whole token. Read as a price it overstates by 10^(9 − quote_decimals) , a thousand times over on a six-decimal mint. Use pool_price, which is already adjusted.
two encodingsREST and the socket carry the same event in deliberately different shapes: is_buy against swap_type, an integer dex id against the venue name, milliseconds against seconds. Decode once, at the edge.
min_solLamports, and parsed as an integer. min_sol=20000 is 0.00002 SOL, not twenty thousand, and min_sol=20000.5 is a 400. Five SOL is 5000000000.
nulls by venueNot every program reports every number. virtual_sol_reserves is meaningful only on a pump.fun bonding curve, and price_impact_bps comes back null where the venue doesn't emit it. Fall back to the _bps siblings rather than treating a null as a zero.
Not released, and no date.
There is no waitlist gate and nothing to pay for here. If you need trade-level Solana data now, the swaps index and the candles API cover it; if it doesn't, tell us what is missing and that is what decides the shape of this one.
The endpoints above need a key. Create an account to get one.
What already runs, today.
Tick data would be a finer slice of this same path. Every stage below is the shipped swaps pipeline, not a plan.
- 01
Validators
Swap instructions execute on the cluster.
- 02
Yellowstone Geyser
Transaction updates leave the node.
- 03
Dexploit engine
Instructions decoded across 10 protocols.
- 04
Swaps stream
Trade-level records, available over REST and WebSocket now.