Trades API
GET/trades
One trade feed, newest first: a token's trades in all its pools, a pool's, a wallet's, or a transaction's, filtered by side, USD size, trader or label. One row shape everywhere, with the trader's labels.
One trade feed, GET /trades, for a token, a pool, a wallet or a transaction, with one row shape and the trader's labels; a token's traders ranked with their positions. The same rows stream over the trades channel.
Parameters
| Name | In | Type | Default | Allowed values |
|---|---|---|---|---|
chain | query | string | required | evm:56 (BSC), solana, evm:8453 (Base), evm:4663 (Robinhood Chain) or evm:1 (Ethereum) |
token | query | string | one scope | Exactly one of token, pool, wallet, tx: a token's trades, rows from its side |
pool | query | string | one scope | A pool's trades, rows from its base's side |
wallet | query | string | one scope | A wallet's trades, rows from each swap's base |
tx | query | string | one scope | Every swap of a transaction (the last 7 days): each leg of a route |
side | query | string | both | buy or sell, from the row's side |
minUsd | query | number | any | A lower bound on amountUsd, included; an unpriced trade never matches |
maxUsd | query | number | any | An upper bound on amountUsd, included |
trader | query | string | any | One wallet's trades within the scope (not with wallet) |
label | query | string | any | Trades by wallets with this label: sniper, insider… |
limit | query | integer | 50 | 1–200 |
cursor | query | string | first page | The previous page's next, as it came |
Response
| Field | Type | Meaning |
|---|---|---|
chain, token | pool | wallet | tx | string | The request's chain and scope, echoed. |
indexedSince | number | null | Unix ms from which trades are indexed: the chain's first indexed block, or for tx 7 days back (transactions are kept that long). |
trades[].time | number | Block time, unix ms. |
trades[].block, txIndex, eventIndex | number | Position in the chain: block (Solana: slot), transaction, event. |
trades[].tx, pool, protocol | string | Transaction hash or signature, pool, and DEX (pancakeswap-v2, pumpswap…). |
trades[].side | "buy" | "sell" | buy when the trader received token, sell when they paid it. |
trades[].token, amount | { address, symbol, name, decimals }, string | The token the row is told from (see the notes), and its amount, positive, decimals applied. Native BNB, ETH or SOL has address "native". |
trades[].counter, counterAmount | { address, symbol, name, decimals }, string | The other token and its amount. |
trades[].priceUsd | number | null | token's USD price in this swap, whether it was the base or the quote. null when the swap could not be priced. |
trades[].amountUsd | number | null | USD value of the swap. null when unpriced. |
trades[].priced | boolean | Whether the swap has a USD price. |
trades[].trader, labels | string, string[] | The wallet that traded (see Wallets and PnL), "" when the swap belongs to no wallet, and its labels. |
next | string | null | Cursor for the next older page, or for the part of the scope after the one a filtered page examined. null at the end. |
Example
Captured 2026-09-28 18:03 UTC on a test instance, trimmed to 2 trades.
curl -s -H 'Authorization: Bearer <key>' 'https://app.aurelia.build/api/trades?chain=evm:56&token=0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777&limit=2'
{
"chain": "evm:56",
"token": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
"indexedSince": 1790546261920,
"trades": [
{
"time": 1790618578665,
"block": 1000750,
"txIndex": 0,
"eventIndex": 4,
"tx": "0x2b170741f16da7ea4287bbd163e3365f89c73c4face2b6ed032487c0dd9b0cb4",
"pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
"protocol": "pancakeswap-v2",
"side": "buy",
"token": {
"address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
"symbol": "TAX",
"name": "Tax Token",
"decimals": 18
},
"amount": "50000",
"counter": {
"address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
"symbol": "WBNB",
"name": "Wrapped BNB",
"decimals": 18
},
"counterAmount": "0.5",
"priceUsd": 0.006,
"amountUsd": 300,
"priced": true,
"trader": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
"labels": [
"sniper",
"fresh"
]
},
{
"time": 1790618554904,
"block": 1000749,
"txIndex": 0,
"eventIndex": 4,
"tx": "0xcd32103a902cba28b871741adf595a6b209ce0b66d6849cc8a603842adb07729",
"pool": "0x702e6533e0182381606adbe3ccbb77f682ccc58b",
"protocol": "pancakeswap-v2",
"side": "buy",
"token": {
"address": "0xa9fcda9bd321adeb7cbbbd30ef2dd0ed1d657777",
"symbol": "TAX",
"name": "Tax Token",
"decimals": 18
},
"amount": "50000",
"counter": {
"address": "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c",
"symbol": "WBNB",
"name": "Wrapped BNB",
"decimals": 18
},
"counterAmount": "0.5",
"priceUsd": 0.006,
"amountUsd": 300,
"priced": true,
"trader": "0x3304e22ddaa22bcdc5fca2269b418046ae7b566a",
"labels": [
"sniper",
"fresh"
]
}
],
"next": "1790618554904.1000749.0.4"
}
Notes
- One swap in one pool is one row. It is told from the side of the token in scope (
token=), else from the swap's base token (see Basics): buying a memecoin with SOL is a buy of the memecoin. A multi-hop route is one row per pool it crossed, sharingtx,blockandtxIndex:tx=returns every leg, a token's feed the legs that moved it. - A filter never widens a read: a filtered page examines a bounded part of its scope (a pool's or a wallet's newest 50,000 swaps before the cursor; a token's last hour, day, then 7 days), and when that part ends before the page fills,
nextcontinues right after it. Follownextuntil it isnull.label=reads 500 rows a page and keeps those whose trader has the label. - A token's first page comes from its 100 newest swaps, kept in memory: current to the last indexed block. A first page is cached 2 s, a later one 30 s (older trades change only in a reorg).
400without exactly one scope, for a badside,limit,cursoror bound,minUsdabovemaxUsd,traderwithwallet, or a malformedlabel.404for an unknown token or pool. An unknown wallet or transaction answers200with no trades.- The trades channel pushes the same rows as each block is indexed.