Aurelia

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

NameInTypeDefaultAllowed values
chainquerystringrequiredevm:56 (BSC), solana, evm:8453 (Base), evm:4663 (Robinhood Chain) or evm:1 (Ethereum)
tokenquerystringone scopeExactly one of token, pool, wallet, tx: a token's trades, rows from its side
poolquerystringone scopeA pool's trades, rows from its base's side
walletquerystringone scopeA wallet's trades, rows from each swap's base
txquerystringone scopeEvery swap of a transaction (the last 7 days): each leg of a route
sidequerystringbothbuy or sell, from the row's side
minUsdquerynumberanyA lower bound on amountUsd, included; an unpriced trade never matches
maxUsdquerynumberanyAn upper bound on amountUsd, included
traderquerystringanyOne wallet's trades within the scope (not with wallet)
labelquerystringanyTrades by wallets with this label: sniper, insider…
limitqueryinteger501–200
cursorquerystringfirst pageThe previous page's next, as it came

Response

FieldTypeMeaning
chain, token | pool | wallet | txstringThe request's chain and scope, echoed.
indexedSincenumber | nullUnix ms from which trades are indexed: the chain's first indexed block, or for tx 7 days back (transactions are kept that long).
trades[].timenumberBlock time, unix ms.
trades[].block, txIndex, eventIndexnumberPosition in the chain: block (Solana: slot), transaction, event.
trades[].tx, pool, protocolstringTransaction 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 }, stringThe 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 }, stringThe other token and its amount.
trades[].priceUsdnumber | nulltoken's USD price in this swap, whether it was the base or the quote. null when the swap could not be priced.
trades[].amountUsdnumber | nullUSD value of the swap. null when unpriced.
trades[].pricedbooleanWhether the swap has a USD price.
trades[].trader, labelsstring, string[]The wallet that traded (see Wallets and PnL), "" when the swap belongs to no wallet, and its labels.
nextstring | nullCursor 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, sharing tx, block and txIndex: 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, next continues right after it. Follow next until it is null. 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).
  • 400 without exactly one scope, for a bad side, limit, cursor or bound, minUsd above maxUsd, trader with wallet, or a malformed label. 404 for an unknown token or pool. An unknown wallet or transaction answers 200 with no trades.
  • The trades channel pushes the same rows as each block is indexed.

Try it in the interactive docsCreate a free account