> ## Documentation Index
> Fetch the complete documentation index at: https://docs.serialized.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Wallet Swaps

> Swap history of a wallet, newest first - one row per transaction. `sent` is what the swap took from the wallet and `received` what it delivered, netted across every leg of the transaction, so a routed swap reads from end to end: a USELESS to USDC sale routed through SOL reads as USELESS sent, USDC received. The assets a route only passes through and the fees taken between its hops do not appear, and the native coin and its wrapped form count as one asset. Every asset carries its `symbol`, `name` and `decimals`. `route` lists every leg with its pool and venue type, ordered from the sent asset to the received asset. On Solana each swap and each leg carries `router`, the program that routed it (Jupiter, OKX DEX, DFlow, Titan...), with its name when known and `null` for a direct swap, so a feed can render "Jupiter via BisonFi". Built for wallet activity feeds; for a per-token trade tape use `GET /v1/wallet/trades`. Same opaque `cursor` pagination on EVM and Solana: it never skips or repeats a transaction. Batch twin: `POST /v1/wallet/swaps`, up to 20 wallets per call.

`GET /v1/wallet/swaps` · **1 credit**

Swap history of a wallet, newest first - one row per transaction. `sent` is what the swap took from the wallet and `received` what it delivered, netted across every leg of the transaction, so a routed swap reads from end to end: a USELESS to USDC sale routed through SOL reads as USELESS sent, USDC received. The assets a route only passes through and the fees taken between its hops do not appear, and the native coin and its wrapped form count as one asset. Every asset carries its `symbol`, `name` and `decimals`. `route` lists every leg with its pool and venue type, ordered from the sent asset to the received asset. On Solana each swap and each leg carries `router`, the program that routed it (Jupiter, OKX DEX, DFlow, Titan...), with its name when known and `null` for a direct swap, so a feed can render "Jupiter via BisonFi". Built for wallet activity feeds; for a per-token trade tape use `GET /v1/wallet/trades`. Same opaque `cursor` pagination on EVM and Solana: it never skips or repeats a transaction. Batch twin: `POST /v1/wallet/swaps`, up to 20 wallets per call.

<Note>**Reading a row.** `sent` and `received` are the net flows of the swap across every leg of the transaction, largest first. Each asset carries `tokenAddress`, `symbol`, `name`, `decimals` (`null` when the token is not known) and `amount`. A routed swap reads from end to end: the assets the route only passes through do not appear, nor do the fees taken between its hops. The native coin and its wrapped form are one asset (on EVM, Uniswap v4 pays native ETH where other venues pay WETH): it is served under the form the route used, and each leg of `route` keeps the exact asset it exchanged. A transaction that holds two independent swaps lists both on each side. `route` lists each leg with its `poolAddress`, its venue `poolType`, and what that leg `sent` and `received`. `volumeNative` and `volumeUsd` are the value of the swap; `volumeUsd` is at the current native price on EVM, and valued at the SOL price at the time of the swap on Solana, where `meta.usdBasis` reports `trade`. `feesNative` is the total fee paid for the transaction in the chain's native unit (`null` when it is not available for that row). On Solana, `router` is the program that routed the swap: `programId` always, `name` when the program is a known router (Jupiter, OKX DEX, DFlow, Titan...), and `router: null` for a direct swap. The swap-level `router` is the one of its largest routed leg; each leg of `route` carries its own. The field is present on swaps from 2026-09-21 onward.</Note>

<Note>**Pagination.** Each page is bounded by `limit` and by a scan window over the wallet's history: a page can hold fewer than `limit` rows while `meta.hasMore` is `true`. Keep passing `meta.nextCursor` until `hasMore` is `false`; cursors never skip or repeat a transaction, and `hasMore: false` means the wallet's history is fully served.</Note>

<Note>**Time window.** `from` and `to` bound the history in unix milliseconds, both inclusive, and combine with `cursor`. `fromAt` (the same lower bound) and `beforeAt` (strictly older) remain supported; pass one name per bound.</Note>

<Note>**Several wallets.** [`POST /v1/wallet/swaps`](/endpoints/wallet-swaps-batch) takes up to 20 wallets per call, EVM and Solana mixed, each with its own `cursor`, billed per wallet.</Note>

<RequestExample>
  ```bash cURL (EVM) theme={null}
  curl 'https://api.serialized.xyz/v1/wallet/swaps?chain=evm:8453&wallet=0x41f26df3bebc317cc07b43cfd6950e9e1d5bc4d4&limit=1&to=1791057737000' \
    -H 'Authorization: YOUR_API_KEY'
  ```

  ```bash cURL (Solana) theme={null}
  curl 'https://api.serialized.xyz/v1/wallet/swaps?chain=solana&wallet=4YFpz3g8AJ11fxxi8w4EUmGDa83scByRaMoM3hqNMPBr&limit=1&to=1791056268000' \
    -H 'Authorization: YOUR_API_KEY'
  ```
</RequestExample>

<ResponseExample>
  ```json Response (EVM) theme={null}
  {
    "data": [
      {
        "id": "0x389b7d278813e8a3544af9388dfcfaa1feca04d0dd26634cbeb46ec723381f14",
        "at": 1791057737000,
        "chain": "evm:8453",
        "txHash": "0x389b7d278813e8a3544af9388dfcfaa1feca04d0dd26634cbeb46ec723381f14",
        "block": 52134195,
        "sent": [
          {
            "tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
            "symbol": "USDC",
            "name": "USD Coin",
            "decimals": 6,
            "amount": 125.139974
          }
        ],
        "received": [
          {
            "tokenAddress": "0x0000000000000000000000000000000000000000",
            "symbol": "ETH",
            "name": "Native Token",
            "decimals": 18,
            "amount": 0.04658273783960646
          }
        ],
        "volumeNative": 0.04658273783960646,
        "volumeUsd": 125.12006926873696,
        "feesNative": null,
        "route": [
          {
            "poolAddress": "0xaf15cd1f9c3874bbcfddfc2b544544612c9de8c8bae28ba21c129c6b286c1e19",
            "poolType": "UNISWAP_V4",
            "sent": {
              "tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
              "amount": 73.292855
            },
            "received": {
              "tokenAddress": "0x0000000000000000000000000000000000000000",
              "amount": 0.027281798642902547
            }
          },
          {
            "poolAddress": "0x2f9175276740364e50932fc6932e329f014fce73ee03d2c5780cc491e3ac939d",
            "poolType": "UNISWAP_V4",
            "sent": {
              "tokenAddress": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
              "amount": 51.847119
            },
            "received": {
              "tokenAddress": "0x4200000000000000000000000000000000000006",
              "amount": 0.019300939196703913
            }
          }
        ]
      }
    ],
    "meta": {
      "asOf": 1791064127969,
      "hasMore": true,
      "nextCursor": "MTc5MTA1NzczN3w1MjEzNDE5NXw0MTB8MHgzODliN2QyNzg4MTNlOGEzNTQ0YWY5Mzg4ZGZjZmFhMWZlY2EwNGQwZGQyNjYzNGNiZWI0NmVjNzIzMzgxZjE0",
      "oldestAt": 1791057737000
    }
  }
  ```

  ```json Response (Solana) theme={null}
  {
    "data": [
      {
        "id": "3Ju3RNke89G1TAHs2YnxjqqvPXdgdWX1mruVsoYge7vcavPS84icJ1hdSpRsvdCbrD9Vwpo9X4y3FRUzNKhpdjeu",
        "at": 1791056268000,
        "chain": "solana",
        "txHash": "3Ju3RNke89G1TAHs2YnxjqqvPXdgdWX1mruVsoYge7vcavPS84icJ1hdSpRsvdCbrD9Vwpo9X4y3FRUzNKhpdjeu",
        "block": 453029751,
        "sent": [
          {
            "tokenAddress": "Dz9mQ9NzkBcCsuGPFJ3r1bS4wgqKMHBPiVuniW8Mbonk",
            "symbol": "USELESS",
            "name": "USELESS COIN",
            "decimals": 6,
            "amount": 14.550249
          }
        ],
        "received": [
          {
            "tokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
            "symbol": "USDC",
            "name": "USD Coin",
            "decimals": 6,
            "amount": 3.422499
          }
        ],
        "volumeNative": 0.02859042,
        "volumeUsd": 3.422363300972725,
        "feesNative": 0.000382217,
        "route": [
          {
            "poolAddress": "Q2sPHPdUWFMg7M7wwrQKLrn619cAucfRsmhVJffodSp",
            "poolType": "RAYDIUM_CPMM",
            "sent": {
              "tokenAddress": "Dz9mQ9NzkBcCsuGPFJ3r1bS4wgqKMHBPiVuniW8Mbonk",
              "amount": 14.550249
            },
            "received": {
              "tokenAddress": "So11111111111111111111111111111111111111112",
              "amount": 0.02859042
            },
            "router": {
              "programId": "DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH",
              "name": "DFlow"
            }
          },
          {
            "poolAddress": "2Y7HATmn9aJBcxCskE5V2U2epmjvkZmB51zTJBbhj4cU",
            "poolType": "BISONFI",
            "sent": {
              "tokenAddress": "So11111111111111111111111111111111111111112",
              "amount": 0.02859042
            },
            "received": {
              "tokenAddress": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
              "amount": 3.422499
            },
            "router": {
              "programId": "DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH",
              "name": "DFlow"
            }
          }
        ],
        "router": {
          "programId": "DF1ow4tspfHX9JwWJsAb9epbkA8hmpSEAtxXy1V27QBH",
          "name": "DFlow"
        }
      }
    ],
    "meta": {
      "asOf": 1791064128322,
      "hasMore": true,
      "usdBasis": "trade",
      "nextCursor": "MTc5MTA1NjI2OHwzSnUzUk5rZTg5RzFUQUhzMllueGpxcXZQWGRnZFdYMW1ydVZzb1lnZTd2Y2F2UFM4NGljSjFoZFNwUnN2ZENickQ5VndwbzlYNHkzRlJVek5LaHBkamV1",
      "oldestAt": 1791056268000
    }
  }
  ```
</ResponseExample>


## OpenAPI

````yaml openapi.json GET /v1/wallet/swaps
openapi: 3.1.0
info:
  title: Serialized Data API
  description: >-
    On-chain data for trading apps - tokens, candles, token filters. Built on
    our own indexers. 18 EVM chains + Solana, live.
  version: 0.1.0
servers:
  - url: https://demo.serialized.xyz
    description: 'Demo: no key needed, read endpoints, rate-limited per IP'
  - url: https://api.serialized.xyz
    description: 'Production: your API key in the Authorization header'
security:
  - apiKey: []
  - {}
paths:
  /v1/wallet/swaps:
    get:
      summary: Wallet Swaps
      description: >-
        Swap history of a wallet, newest first - one row per transaction. `sent`
        is what the swap took from the wallet and `received` what it delivered,
        netted across every leg of the transaction, so a routed swap reads from
        end to end: a USELESS to USDC sale routed through SOL reads as USELESS
        sent, USDC received. The assets a route only passes through and the fees
        taken between its hops do not appear, and the native coin and its
        wrapped form count as one asset. Every asset carries its `symbol`,
        `name` and `decimals`. `route` lists every leg with its pool and venue
        type, ordered from the sent asset to the received asset. On Solana each
        swap and each leg carries `router`, the program that routed it (Jupiter,
        OKX DEX, DFlow, Titan...), with its name when known and `null` for a
        direct swap, so a feed can render "Jupiter via BisonFi". Built for
        wallet activity feeds; for a per-token trade tape use `GET
        /v1/wallet/trades`. Same opaque `cursor` pagination on EVM and Solana:
        it never skips or repeats a transaction. Batch twin: `POST
        /v1/wallet/swaps`, up to 20 wallets per call.
      operationId: wallet-swaps
      parameters:
        - schema:
            type: string
            x-default: solana
          in: query
          name: chain
          required: true
          description: Public chain id - `evm:<id>` or `solana`.
          example: solana
        - schema:
            type: string
          in: query
          name: wallet
          required: true
          description: Wallet address (EVM hex, case-insensitive; Solana base58).
        - schema:
            type: string
          in: query
          name: cursor
          required: false
          description: >-
            Opaque resume token from `meta.nextCursor` - exact keyset pagination
            on both EVM and Solana, no skip or duplicate.
        - schema:
            minimum: 1
            maximum: 100
            default: 50
            type: integer
            x-default: 50
          in: query
          name: limit
          required: true
          description: 1-100. Default 50.
          example: 50
        - schema:
            minimum: 0
            type: integer
          in: query
          name: from
          required: false
          description: >-
            Inclusive lower time bound, unix MILLISECONDS. A value in seconds is
            rejected (400).
        - schema:
            minimum: 0
            type: integer
          in: query
          name: to
          required: false
          description: >-
            Inclusive upper time bound, unix MILLISECONDS. A value in seconds is
            rejected (400).
        - schema:
            minimum: 0
            type: integer
          in: query
          name: beforeAt
          required: false
          description: >-
            Upper bound, unix MILLISECONDS: swaps strictly older. A value in
            seconds is rejected (400). Prefer `cursor` for exact pagination.
        - schema:
            minimum: 0
            type: integer
          in: query
          name: fromAt
          required: false
          description: Inclusive lower time bound (ms).
      responses:
        '200':
          description: Standard `{ data, meta }` envelope.
components:
  securitySchemes:
    apiKey:
      type: apiKey
      name: Authorization
      in: header
      description: Your raw API key (not needed on the demo server).

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.