Wallet Transfers

GET/gateway/v1/wallet/transfers

Returns ERC-20/SPL token transfers with token identity, USD value, and flow direction (in/out). Unlike `wallet-history` which shows all tx types in native value, this focuses on token-level transfer activity.

Pass the wallet address in `address` — returns all ERC-20/SPL token transfers where this wallet is the sender or receiver.

Included fields: token contract, token symbol, amount USD, counterparty, flow direction.

Filter by specific token or flow direction (in/out).

Lookup: `address` (wallet, raw 0x hex or base58 — ENS not supported). Filter by `chain` — supports `ethereum`, `base`, `bsc`, `arbitrum`, `tron`, `solana`.

Data refresh: ~24 hours · Chains: Ethereum, Base, BSC, Arbitrum, Tron (Solana uses a different source with no delay)

Query Parameters

addressstringrequired

Wallet address — must be a raw address (0x-prefixed hex for EVM, base58 for Solana). ENS names like `vitalik.eth` are not supported; resolve to a 0x address first.

Example: 0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045
chainenum<string>

Chain. Can be `ethereum`, `base`, `solana`, `tron`, `bsc`, or `arbitrum`.

Available options:ethereumbasesolanatronbscarbitrum
Example: ethereum
flowenum<string>

Filter by transfer direction relative to the queried wallet. `in` for incoming, `out` for outgoing. Omit for both directions.

Available options:inout
Example: in
tokenstring

Filter by token contract address. Use `0x0000000000000000000000000000000000000000` for native token transfers. Omit for all tokens.

Example: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
limitinteger

Results per page. Default 20, max 100. NOTE: Solana (`chain=solana`) is hard-capped at 40 per call by the upstream Solscan API — values above 40 return at most 40 items. Check `meta.has_more` and paginate with `offset` to fetch beyond the first page.

Example: 20
offsetinteger

Pagination offset. For Solana, this maps to Solscan's 1-indexed `page` parameter (page = offset/page_size + 1).

Example: 0
includestring

Comma-separated enrichments to attach to each transfer. Currently valid: `labels` — adds `from_label` and `to_label` fields with entity information for each counterparty address.

Example: labels
Wallet Transfers
const options = {method: 'GET'};

fetch('https://api.asksurf.ai/gateway/v1/wallet/transfers?address=0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045&chain=ethereum&flow=in&token=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48&limit=20&offset=0&include=labels', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
OK
{
  "$schema": "https://example.com/schemas/DataResponseWalletTransferItem.json",
  "data": [
    {
      "activity_type": "<string>",
      "amount": "<string>",
      "amount_usd": 123,
      "flow": "<string>",
      "from_address": "<string>",
      "from_label": {
        "address": "<string>",
        "entity_name": "<string>",
        "entity_type": "<string>",
        "labels": [
          {
            "confidence": 123,
            "label": "<string>"
          }
        ]
      },
      "timestamp": 123,
      "to_address": "<string>",
      "to_label": {
        "address": "<string>",
        "entity_name": "<string>",
        "entity_type": "<string>",
        "labels": [
          {
            "confidence": 123,
            "label": "<string>"
          }
        ]
      },
      "token_address": "<string>",
      "token_symbol": "<string>",
      "tx_hash": "<string>"
    }
  ],
  "meta": {
    "cached": true,
    "credits_used": 123,
    "empty_reason": "<string>",
    "has_more": true,
    "limit": 123,
    "offset": 123,
    "total": 123,
    "watermark": 123
  }
}