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

# Seguir transferencias de wallets y tokens en Solana

> Consulta el historial de transferencias de SOL y SPL de una wallet con filtros y valores históricos en USD, y recibe nuevas transferencias por wallet o token en Datastream.

Carga el historial de transferencias de una wallet con una sola llamada REST y únete a una sala de transferencias para recibir las nuevas en cuanto ocurren. Ambos cubren SOL nativo, tokens SPL y tokens Token-2022.

> [card] [Consultar el historial](#consultar-el-historial-de-transferencias)
>
> Filtra por token, contraparte, tiempo, cantidad o valor en USD.

> [card] [Recibir transferencias en vivo](#recibir-transferencias-en-vivo)
>
> Sigue una wallet, un token, o un token para una wallet.

## Consultar el historial de transferencias

`GET /account/{address}/transfers` devuelve las transferencias entrantes y salientes de una wallet, de más reciente a más antigua. Las transferencias SPL se buscan a través de las token accounts de la wallet, y cada lado muestra tanto la token account (`address`) como la wallet propietaria (`owner`).

Por defecto, el historial excluye las transacciones con actividad DEX, como swaps, depósitos y retiros de liquidez y cobros de comisiones de pools, así que obtienes las transferencias simples de la wallet. Usa `dex=include` para conservarlas o `dex=only` para obtener solo esas.

```bash USDC recibido theme={null}
curl --get "https://data.solanatracker.io/account/GachaNgyXTU3zFogQ8Z5jR2BLXs8215X2AtEH18VxJq3/transfers" \
  --header "x-api-key: YOUR_API_KEY" \
  --data-urlencode "mint=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" \
  --data-urlencode "direction=in" \
  --data-urlencode "historicPrices=true" \
  --data-urlencode "limit=50"
```

```javascript Paginar el historial theme={null}
const address = "GachaNgyXTU3zFogQ8Z5jR2BLXs8215X2AtEH18VxJq3";
let cursor;

do {
  const url = new URL(`https://data.solanatracker.io/account/${address}/transfers`);
  url.search = new URLSearchParams({ limit: "100", historicPrices: "true", ...(cursor && { cursor }) });

  const response = await fetch(url, { headers: { "x-api-key": "YOUR_API_KEY" } });
  if (!response.ok) throw new Error((await response.json()).error);
  const page = await response.json();

  for (const t of page.transfers) {
    console.log(t.direction, t.uiAmount, t.token.symbol, t.value.usd, t.from?.owner, "->", t.to?.owner);
  }
  cursor = page.pagination.next;
} while (cursor);
```

Cada transferencia tiene este aspecto:

```json theme={null}
{
  "signature": "2VxcHt8HKSt2T2EuUZLyWPsEKz4H4BPreWV28aZDEzoaHG4Fsu232oKKeQqpVqsSYaf3vv8KN7UoZ4MPJA8vw9EF",
  "status": "success",
  "type": "spl",
  "direction": "in",
  "from": { "address": "C2RjaMN2NeYAErS6KiBjPQhHCt95J8mCmmLiQqZXPisR", "owner": "BfG7WYmravgBhNdWpGoiFmF8L1duw2vdqdDHiZid2hoJ" },
  "to": { "address": "D9CEogjHA6CpS12F8St9zpSco7pQKJB5uR1RqDsuzQZk", "owner": "GachaNgyXTU3zFogQ8Z5jR2BLXs8215X2AtEH18VxJq3" },
  "token": { "name": "USD Coin", "symbol": "USDC", "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "image": "https://image.solanatracker.io/proxy?url=…", "decimals": 6 },
  "amount": "25000000",
  "uiAmount": "25",
  "decimals": 6,
  "price": { "usd": 1 },
  "value": { "usd": 25 },
  "timestamp": 1792483949,
  "slot": 459159504
}
```

* **`amount`** es la cantidad entera en bruto y **`uiAmount`** la cantidad decimal exacta, ambas como cadenas.
* **`timestamp`** es la hora del bloque en **segundos** Unix.
* **`type`** es `sol` para SOL nativo y `spl` para transferencias de tokens. SOL usa el mint de wrapped SOL `So11111111111111111111111111111111111111112`.
* **`status`** es el resultado de la transacción, `success` o `failed`. Las transacciones fallidas se excluyen salvo que pidas `status=failed` o `status=any`.
* **`price`** y **`value`** solo aparecen con `historicPrices=true` o un filtro de valor.
* **`identity`** aparece en `from` o `to` cuando la wallet es conocida: un KOL, un exchange, un pool, un desarrollador o un nombre SNS.

### Filtrar el historial

| Filtro | Parámetros |
| - | - |
| Token | `mint`, `type=sol\|spl` |
| Dirección | `direction=in\|out\|all` |
| Remitente, destinatario | `from`, `to`, `counterparty` (cualquiera de los dos lados), `excludeFrom`, `excludeTo` (hasta 5 direcciones separadas por comas en cada uno, wallet o token account) |
| Tiempo | `start`, `end` (inclusivos), en segundos Unix |
| Slot | `startSlot`, `endSlot` (inclusivos) |
| Cantidad | `minAmount`, `maxAmount` en unidades del token, `excludeZero=true` |
| Valor en USD | `minValue`, `maxValue` (activan `historicPrices`; `limit` como máximo 100) |
| Actividad DEX | `dex=exclude\|include\|only` (por defecto `exclude`) |
| Resultado | `status=success\|failed\|any` (por defecto `success`) |
| Orden | `sortOrder=desc\|asc` |

Cada parámetro tiene un solo nombre. Un nombre que el endpoint no conoce devuelve un 400 que te indica el correcto, por ejemplo `unknown parameter timeStart; use start`, así que una errata nunca devuelve una página sin filtrar.

`historicPrices=true` añade `price.usd` y `value.usd` con el precio en USD del token en el momento de la transferencia, según la última vela de 1 minuto como máximo una hora antes. Sin precio, ambos son `null`.

### Qué cuenta como actividad DEX

Una transacción tiene actividad DEX cuando una de sus transferencias va hacia o viene de un pool: una cuenta propiedad de un programa DEX o launchpad, como una bonding curve de pump.fun o un pool DLMM de Meteora, o una vault authority de Raydium o Meteora. Eso incluye swaps, depósitos y retiros de liquidez, y cobros de comisiones y recompensas. También cuenta una transacción en la que la wallet envió un token y recibió otro. `dex=exclude` y `dex=only` actúan sobre transacciones completas: todas las transferencias de la transacción se descartan o se conservan juntas. Solo se tienen en cuenta las transferencias que coinciden con `direction` y `mint`, así que, con esos filtros, una transacción cuyo tramo del pool queda filtrado cuenta como una transferencia simple.

### Agrupar por transacción

Añade `grouped=true` para obtener además `transactions`, las transferencias de la página agrupadas por firma. Cada transacción incluye sus `transfers`, el número de ellas en `legs`, `totals.in`, `totals.out` y `totals.tokens`, y `dex`. `type` es `swap` cuando `dex` es true, y `swap` indica el token entrante y el saliente cuando la wallet envió un token y recibió otro. Con `historicPrices=true`, los totales también incluyen USD: `totals.value`, `totals.net` y `usd` en cada lado.

### Paginar los resultados

Envía `pagination.next` como `cursor` con los mismos filtros y detente cuando `hasMore` sea `false`. Una página nunca divide una transacción, así que puede tener algunas transferencias más o menos que `limit`; con `grouped=true`, `limit` normalmente cuenta transacciones. Con filtros, cada solicitud recorre un número limitado de transferencias, así que una página puede tener menos de `limit` filas, o ninguna, aunque `hasMore` siga siendo `true`. Sigue paginando.

Con `minValue` o `maxValue`, cada página valora las siguientes `limit` transferencias y devuelve las que coinciden. Si los precios no se pueden leer a tiempo, la solicitud devuelve un 503; vuelve a enviarla.

### Usar el SDK de TypeScript

Instala `@solana-tracker/data-api` **0.6.0 o posterior**. `getAccountTransfers` acepta los mismos filtros que el endpoint, y los filtros de direcciones admiten un array o una cadena separada por comas. El SDK los comprueba con las reglas de la API y lanza un `ValidationError` antes de enviar una solicitud que la API rechazaría. `iterateAccountTransfers` sigue `pagination.next` por ti y continúa aunque una página filtrada llegue vacía.

```typescript theme={null}
import { Client } from '@solana-tracker/data-api';

const client = new Client({ apiKey: 'YOUR_API_KEY' });
const wallet = 'GachaNgyXTU3zFogQ8Z5jR2BLXs8215X2AtEH18VxJq3';

// Todas las páginas de USDC recibido, con el valor en USD del momento.
for await (const page of client.iterateAccountTransfers(wallet, {
  mint: 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v',
  direction: 'in',
  historicPrices: true,
  limit: 100,
})) {
  for (const t of page.transfers) {
    console.log(t.signature, t.uiAmount, t.token.symbol, t.value?.usd, t.from?.identity?.name ?? t.from?.owner);
  }
}

// Una entrada por transacción, swaps incluidos.
const grouped = await client.getAccountTransfers(wallet, {
  grouped: true,
  dex: 'include',
  historicPrices: true,
  limit: 50,
});
for (const tx of grouped.transactions) {
  console.log(tx.signature, tx.type, tx.totals.net?.usd, tx.swap?.out.token.symbol, '->', tx.swap?.in.token.symbol);
}
```

Con `{ grouped: true }`, TypeScript sabe que la respuesta incluye `transactions`.

## Recibir transferencias en vivo

Conecta a `wss://datastream.solanatracker.io/{apiKey}` con tu clave de Data API. Datastream está disponible en los planes Premium, Business y Enterprise.

### Elegir una sala

* **[`transfer:wallet:{wallet}`](https://docs.solanatracker.io/es/datastream/websockets/transferwallet)**: todas las transferencias hacia o desde una wallet, en todos los tokens.
* **[`transfer:{mint}`](https://docs.solanatracker.io/es/datastream/websockets/transfertoken)**: todas las transferencias de un token. No disponible para SOL.
* **[`transfer:{mint}:{wallet}`](https://docs.solanatracker.io/es/datastream/websockets/transfertokenwallet)**: un token hacia o desde una wallet. Funciona para SOL con el mint de wrapped SOL.

Añade **`:enriched`** a cualquier sala para incluir `token` (nombre, símbolo, imagen, decimales), `price.usd`, `value.usd` y `marketCap.usd` en cada transferencia y cambio de saldo, e `identity` en el `from` y el `to` de cada transferencia y en cada cambio de saldo: las etiquetas de perfil KOL, bot, plataforma, desarrollador, pool o SNS de la wallet, como en las salas de trades, o `null` si la wallet no tiene. El `marketCap.usd` de SOL es su precio por el suministro circulante; USDC, USDT y USD1 no tienen. El mensaje enriquecido puede llegar hasta 250 ms después del normal; si una consulta tardó más, lleva `enrichmentStatus: "partial"` y `null` en lo que falte.

```javascript theme={null}
const wallet = "GachaNgyXTU3zFogQ8Z5jR2BLXs8215X2AtEH18VxJq3";
const ws = new WebSocket("wss://datastream.solanatracker.io/YOUR_API_KEY");

ws.addEventListener("open", () => {
  ws.send(JSON.stringify({ type: "join", room: `transfer:wallet:${wallet}:enriched` }));
});

ws.addEventListener("message", (event) => {
  const msg = JSON.parse(event.data);
  if (msg.type === "ping") return ws.send(JSON.stringify({ type: "pong" }));
  if (msg.type !== "message") return;

  for (const t of msg.data.transfers) {
    console.log(t.direction, t.uiAmount, t.token.symbol, t.value.usd, msg.data.signature);
  }
});
```

### Suscribirse con el SDK

El SDK gestiona los heartbeats y las reconexiones. `transfers.wallet`, `transfers.token` y `transfers.tokenWallet` se unen a las tres salas; usa `{ enriched: true }` para la sala `:enriched`. `transfers.token` lanza un error para SOL: usa `transfers.wallet`, o `transfers.tokenWallet` con el mint de wrapped SOL.

```typescript theme={null}
import { Datastream } from '@solana-tracker/data-api';

const stream = new Datastream({
  wsUrl: 'wss://datastream.solanatracker.io/YOUR_API_KEY',
});
stream.on('error', console.error);
await stream.connect();

const sub = stream.subscribe.transfers
  .wallet('GachaNgyXTU3zFogQ8Z5jR2BLXs8215X2AtEH18VxJq3', { enriched: true })
  .on((update) => {
    for (const t of update.transfers) {
      console.log(t.direction, t.uiAmount, t.token.symbol, t.value.usd, t.from.identity?.name ?? t.from.owner);
    }
    // Algunos precios o identidades no llegaron a tiempo y son null.
    if (update.enrichmentStatus === 'partial') console.log(update.signature);
  });

// sub.unsubscribe();
// stream.disconnect();
```

### Leer un mensaje

Cada mensaje es una transacción:

```json theme={null}
{
  "type": "message",
  "room": "transfer:wallet:5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
  "data": {
    "signature": "3sGWwELDWpxMaTWkadG95XK3mYiY2TZw8X6VVG7eZopJ8hGvWt4s2A6KK7ZZMVN7Qujg4WtJcm8dXmwvfnyhZ4NS",
    "slot": 462944056,
    "timestamp": 1793290384,
    "commitment": "processed",
    "swapTx": false,
    "transfers": [
      {
        "id": "3sGWwELDWpxMaTWkadG95XK3mYiY2TZw8X6VVG7eZopJ8hGvWt4s2A6KK7ZZMVN7Qujg4WtJcm8dXmwvfnyhZ4NS:3:-1",
        "signature": "3sGWwELDWpxMaTWkadG95XK3mYiY2TZw8X6VVG7eZopJ8hGvWt4s2A6KK7ZZMVN7Qujg4WtJcm8dXmwvfnyhZ4NS",
        "slot": 462944056,
        "timestamp": 1793290384,
        "commitment": "processed",
        "instruction": 3,
        "inner": -1,
        "type": "spl",
        "program": "token-2022",
        "mint": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn",
        "decimals": 6,
        "amount": "18404223000000",
        "uiAmount": "18404223",
        "from": {
          "address": "CEbJzsx15hLQkHD6Tsp5vk58rcnMtvbgLReGLzjiy4uH",
          "owner": "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
          "postBalance": "1151345685569531"
        },
        "to": {
          "address": "F5zXibinJCcNKY8BJhYC6iX5sKCKkaaSFV3MJgbVz25M",
          "owner": "G56HkiSheuhfjnTPGjGC1nNddu7NBtTqedueYKCrEHW2",
          "postBalance": "18404223000000"
        },
        "swapTx": false,
        "direction": "out"
      }
    ],
    "balances": [
      {
        "owner": "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
        "account": "CEbJzsx15hLQkHD6Tsp5vk58rcnMtvbgLReGLzjiy4uH",
        "mint": "pumpCmXqMfrsAkQ5r49WcJnRayYRqmXz6ae8H7H9Dfn",
        "program": "token-2022",
        "decimals": 6,
        "pre": "1169749908569531",
        "post": "1151345685569531",
        "change": "-18404223000000",
        "cause": "transfer"
      },
      {
        "owner": "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
        "account": "5tzFkiKscXHK5ZXCGbXZxdw7gTjjD1mBwuoFbhUvuAi9",
        "mint": "So11111111111111111111111111111111111111112",
        "program": "system",
        "decimals": 9,
        "pre": "1029258892726041",
        "post": "1029258892711041",
        "change": "-15000",
        "cause": "other",
        "fee": "15000"
      }
    ]
  }
}
```

* **`transfers`** son las transferencias de la sala en orden de instrucción. `id` es `signature:instruction:inner` y es único por transferencia. `direction` aparece en las salas de wallet. Las transferencias de Token-2022 con comisión de transferencia incluyen `fee`, y `amount` es la cantidad antes de la comisión.
* **`balances`** son los cambios de saldo de la sala en esa transacción: los de la wallet, los del token, o los de la wallet para ese token. `cause` es `transfer`, `swap` (los tokens negociados por el trader) u `other`. La entrada de SOL del pagador de la comisión tiene `fee`, que está incluida en `change`.
* **Los swaps se quedan en las salas de trades.** Una transferencia que forma parte de un swap ya emitido no se vuelve a enviar. Lo que queda de un swap, como comisiones de plataforma, propinas o pagos a otras wallets, llega con `swapTx: true`.
* **No son transferencias:** wraps, unwraps y movimientos entre cuentas de la misma wallet. Las transacciones fallidas no se emiten.

En una sala `:enriched`, el mismo mensaje también incluye `token`, `price`, `value`, `marketCap` e `identity`. En este, un KOL vendió un token por SOL; la comisión en SOL pagada a otra wallet es lo que queda del swap, así que llega con `swapTx: true`.

> [accordion] Ejemplo de mensaje enriquecido
>
> ```json theme={null}
> {
>   "type": "message",
>   "room": "transfer:wallet:ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph:enriched",
>   "data": {
>     "signature": "3og3m2Rtw2L6P9Zv98J1ZhwGtrKVfmyTzJBSWKf1mCLGDzNddSyceNqHvTvP5oAZ42FpoAkqmEEStT42XMBmXuJp",
>     "slot": 463404942,
>     "timestamp": 1793388931,
>     "commitment": "processed",
>     "swapTx": true,
>     "transfers": [
>       {
>         "id": "3og3m2Rtw2L6P9Zv98J1ZhwGtrKVfmyTzJBSWKf1mCLGDzNddSyceNqHvTvP5oAZ42FpoAkqmEEStT42XMBmXuJp:1:-1",
>         "signature": "3og3m2Rtw2L6P9Zv98J1ZhwGtrKVfmyTzJBSWKf1mCLGDzNddSyceNqHvTvP5oAZ42FpoAkqmEEStT42XMBmXuJp",
>         "slot": 463404942,
>         "timestamp": 1793388931,
>         "commitment": "processed",
>         "instruction": 1,
>         "inner": -1,
>         "type": "sol",
>         "program": "system",
>         "mint": "So11111111111111111111111111111111111111112",
>         "decimals": 9,
>         "amount": "1984300",
>         "uiAmount": "0.0019843",
>         "from": {
>           "address": "ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>           "owner": "ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>           "postBalance": "89633841158",
>           "identity": {
>             "name": "Ducky",
>             "twitter": "@zXDuckyXz",
>             "avatar": "https://kol-avatar.solanatracker.io/ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>             "platforms": [
>               "axiom"
>             ],
>             "type": "kol",
>             "tags": [
>               "kol",
>               "axiom"
>             ]
>           }
>         },
>         "to": {
>           "address": "8GV86MhDQST6rh56oTMU9v5TdHwRtXnFQ3zdGD3WT3mG",
>           "owner": "8GV86MhDQST6rh56oTMU9v5TdHwRtXnFQ3zdGD3WT3mG",
>           "postBalance": "43378482944",
>           "identity": null
>         },
>         "swapTx": true,
>         "token": {
>           "mint": "So11111111111111111111111111111111111111112",
>           "name": "Solana",
>           "symbol": "SOL",
>           "image": "https://image.solanatracker.io/proxy?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolana-labs%2Ftoken-list%2Fmain%2Fassets%2Fmainnet%2FSo11111111111111111111111111111111111111112%2Flogo.png",
>           "decimals": 9
>         },
>         "price": {
>           "usd": 94.23572271990248
>         },
>         "value": {
>           "usd": 0.19
>         },
>         "marketCap": {
>           "usd": 55602827082.74623
>         },
>         "direction": "out"
>       }
>     ],
>     "balances": [
>       {
>         "owner": "ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>         "account": "CMkGUwGS7a7qxNKVUv2UwMoy92Awj9DbUNXcLy1ZbXxZ",
>         "mint": "6AyZsNDJctD1T1hmqPsZWGGSuWM7feNEUbph5SeLpump",
>         "program": "token-2022",
>         "decimals": 6,
>         "pre": "26109484455083",
>         "post": "0",
>         "change": "-26109484455083",
>         "cause": "swap",
>         "identity": {
>           "name": "Ducky",
>           "twitter": "@zXDuckyXz",
>           "avatar": "https://kol-avatar.solanatracker.io/ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>           "platforms": [
>             "axiom"
>           ],
>           "type": "kol",
>           "tags": [
>             "kol",
>             "axiom"
>           ]
>         },
>         "token": {
>           "mint": "6AyZsNDJctD1T1hmqPsZWGGSuWM7feNEUbph5SeLpump",
>           "name": "The Chill Penguin",
>           "symbol": "Penguin",
>           "image": "https://image.solanatracker.io/proxy?url=https%3A%2F%2Faxiomtrading-v2.axiom-cdn.io%2FCKUym5DFePEDCGA8VTVxZcNEpveHgb71JzhXGRqypump.webp",
>           "decimals": 6
>         },
>         "price": {
>           "usd": 0.000003898241016375787
>         },
>         "value": {
>           "usd": -101.78
>         },
>         "marketCap": {
>           "usd": 3898.241016375787
>         }
>       },
>       {
>         "owner": "ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>         "account": "ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>         "mint": "So11111111111111111111111111111111111111112",
>         "program": "system",
>         "decimals": 9,
>         "pre": "88473075092",
>         "post": "89633841158",
>         "change": "1160766066",
>         "cause": "swap",
>         "fee": "20700",
>         "identity": {
>           "name": "Ducky",
>           "twitter": "@zXDuckyXz",
>           "avatar": "https://kol-avatar.solanatracker.io/ADC1QV9raLnGGDbnWdnsxazeZ4Tsiho4vrWadYswA2ph",
>           "platforms": [
>             "axiom"
>           ],
>           "type": "kol",
>           "tags": [
>             "kol",
>             "axiom"
>           ]
>         },
>         "token": {
>           "mint": "So11111111111111111111111111111111111111112",
>           "name": "Solana",
>           "symbol": "SOL",
>           "image": "https://image.solanatracker.io/proxy?url=https%3A%2F%2Fraw.githubusercontent.com%2Fsolana-labs%2Ftoken-list%2Fmain%2Fassets%2Fmainnet%2FSo11111111111111111111111111111111111111112%2Flogo.png",
>           "decimals": 9
>         },
>         "price": {
>           "usd": 94.23572271990248
>         },
>         "value": {
>           "usd": 109.39
>         },
>         "marketCap": {
>           "usd": 55602827082.74623
>         }
>       }
>     ]
>   }
> }
> ```

Las transferencias en vivo se envían con compromiso processed. Una transacción puede descartarse en un fork y no hay mensaje de rollback, así que reconcilia con el endpoint REST. Si te unes a salas superpuestas, recibirás la misma transferencia una vez por sala.

## Siguientes pasos

> [card] [Referencia de transferencias de cuenta](https://docs.solanatracker.io/es/data-api/transfers/get-account-transfers.md)
>
> Todos los parámetros y campos de respuesta.

> [card] [Protocolo de Datastream](https://docs.solanatracker.io/es/guides/datastream-protocol.md)
>
> Conéctate, únete a salas y gestiona los latidos.


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