INDIVIDUAL DEX TRADES (swaps) of a TOKEN across all its pools, or of ONE
POOL — a trade feed, one row per swap: time, side, trader,
base / quote amounts, USD size, price, DEX, pool and tx hash. Filters: time
window, side (buy / sell), minimum USD size, trader; newest first, oldest
first or largest first; pages with a cursor. Use for "recent trades of
<token>", "trades of <token> between two dates", "largest buys of <token>
today", "latest swaps in <pool>", "the first trades of <token> / <pool>",
"did address X trade <token>". NOT an aggregate (use token_dex_venues,
token_trade_bars or token_ohlcv).
Covers rare / newly-launched tokens.
SUBJECT: pass `token_address` (every pool in which that token is the traded
side) and/or `pool_address` (one pool); at least one is required. With both,
the token's swaps in that pool. `trader` narrows to one trader address.
WINDOW: `after_time` / `before_time` (UTC — "2026-09-15 08:00:00", a date,
or unix seconds) select [after_time, before_time). Without after_time the
window is the `window_hours` (default 168 = 7 days) before before_time or
now; after_time takes precedence. Trades are kept about 30 days. An EMPTY
result means no swap matched in the window — widen it (after_time up to 30
days back) before concluding the token or pool is inactive.
ORDER & PAGING: `sort` = recent (default, newest first), oldest (oldest
first — the first swaps of the window; with after_time, the first swaps
after that moment) or usd (largest USD size first, within the window). Each
recent- or oldest-sorted row carries a `Cursor`; pass the LAST row's Cursor
as `cursor` with the same sort to get the next page — older swaps for
recent, newer ones for oldest — no swap is skipped or repeated, even when
many share one second. With sort=usd a cursor pages newest-first, and a
usd-sorted page carries an empty Cursor. For a long newest-first walk pass
after_time: without it the window start is recomputed from the current
time on every page. For a token's very first trades pass after_time about
30 days back (the start of the history) with sort=oldest; for the first
trade itself of one token or a list, token_launch_stats is cheaper.
Largest-first ranks every swap in the window, so on the busiest tokens
(WSOL, USDC, WETH) keep that window to hours: 7 days of WSOL take seconds.
Amount_Usd values each swap at the lower of its two priced sides, so a
broken token price cannot inflate it (in USD, rounded to cents; NULL when
neither side is priced);
`min_trade_usd` filters on that value. Price_Usd is the token's USD price in
the swap, Price_Quote the price in the quote token. Swaps recorded twice by
the indexer are returned once (about 1% of Solana rows); two genuinely
identical swaps by the same trader in one transaction and pool also count
once.
`Symbol_NonAscii` = 1 flags a `Token_Symbol` that is not plain ASCII. That
is normal for CJK / emoji token names, but it is also how a scam token
impersonates a major one: Cyrillic or Greek look-alike letters make a fake
`USDT` / `SOL` / `BTC` read identically to a human. Never treat such a
token as the asset it resembles — say the symbol is a look-alike.
Symbols longer than 32 characters are cut and end in `…` (spam tokens carry
symbols of up to 32,000 characters).