Skip to main content
GET
Recent Swaps

Path Parameters

string
required
The pool config PDA address.

Query Parameters

integer
default:"50"
Page size — number of swaps to return per request. Maximum 200.
string
Opaque pagination cursor. Omit on the first request; on subsequent requests, pass the next_cursor value from the previous response to fetch the next page. When the server returns next_cursor: null (equivalently has_more: false), you have reached the end of the pool’s history.
string
default:"mainnet-beta"
Solana cluster — mainnet-beta or devnet.
number
Only return swaps whose quote (Y) leg is at least this many raw quote atoms. The quote leg is input_amount on a buy (Y to X) and output_amount on a sell (X to Y). For a USDC-quoted pool, 1000000 means “at least 1 USDC”. Use this to keep dust trades out of a page.
integer
Only return swaps with slot strictly greater than this value. Made for polling: remember the highest slot you have processed and pass it back on the next call to receive just the swaps that landed since. has_more: false in the response means the walk reached the bound and nothing was left out.
integer | string
Only return swaps with timestamp strictly greater than this value, compared in whole seconds (the unit the response uses), so feeding back data[0].timestamp never repeats a swap. Accepts unix seconds (1788659015) or an ISO-8601 date-time (2026-09-06T02:23:35Z); a string without a zone designator is read as UTC. Numbers of 1e12 or more are treated as unix milliseconds. Two swaps landing in the same second as your bound are excluded together; when a gapless feed matters, prefer after_slot, which is exact.
How filtered pages are built. min_quote_amount, after_slot and after_timestamp can be combined. The API walks the pool’s history newest-first in blocks of 200 rows and keeps the rows that pass, until it has limit of them, reaches the after_slot or after_timestamp bound, or has scanned 1,000 rows. If the scan budget runs out, the page is returned with has_more: true and a next_cursor that resumes the walk, and it may hold fewer than limit rows (even none). Cursors from filtered requests look different from unfiltered ones; both are opaque, so always pass back exactly what you received. Following a filtered cursor never repeats or skips a swap, even when new swaps arrive in between.Polling recipe (every minute, ignoring anything under 5 USDC):
Take data[0].slot from a non-empty response as the next LAST_SEEN_SLOT.

Response

array
Array of swap events on this page, ordered by most recent first.
string | null
Cursor to pass as ?cursor=... on the next request to fetch the following page. null when there are no more swaps (end of history).
boolean
true if more swaps are available beyond this page, false if this is the last page.
For a pool whose protocol fee routes through the fee-split sidecar, the fees object includes a populated protocol_fee_split (shares sum to protocol_fee_raw):