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

# API de cuentas históricas de Solana (Beta)

> Lee el estado de una cuenta de Solana tal como estaba en cualquier slot o transacción anterior con getHistoricalAccountInfo y getHistoricalTokenAccountsByOwner de Helius (beta).

> [!NOTE]
>
> El estado histórico de las cuentas está en Beta. Los parámetros, precios, formatos de respuesta y la cobertura de datos pueden cambiar.

## ¿Qué es el estado histórico de una cuenta?

Los métodos RPC estándar de Solana, como `getAccountInfo` e `getTokenAccountsByOwner`, solo devuelven el estado actual de una cuenta. Los validadores conservan únicamente la versión más reciente de cada cuenta, por lo que cada escritura reemplaza la anterior. El historial de transacciones no cubre este vacío: `getTransaction` e `getBlock` devuelven instrucciones, registros y cambios de saldo, no los datos de cuenta que escribió un programa.

Los métodos de cuentas históricas de Helius devuelven las cuentas tal como estaban en un slot anterior o inmediatamente después de una transacción específica dentro de ese slot. Como puedes leer el estado entre dos transacciones del mismo slot, puedes ver exactamente qué cambió una transacción, incluso cuando se escribe en una cuenta muchas veces dentro de un solo slot. Úsalos para:

* Consultar los saldos de tokens de una billetera en un momento determinado para auditorías, contabilidad o declaraciones de impuestos
* Depurar una transacción leyendo las cuentas que modificó justo antes y después de su ejecución
* Leer las cuentas de un protocolo, como pools, bóvedas u oráculos, en un slot anterior sin tener que reproducir el libro mayor

Estos métodos RPC son exclusivos de Helius. No forman parte del RPC estándar de Solana.

## ¿Qué método debo usar?

| Lo que necesitas | Usa esto | Devuelve |
| - | - | - |
| Una cuenta en una posición anterior | [`getHistoricalAccountInfo`](https://www.helius.dev/docs/es/api-reference/rpc/http/gethistoricalaccountinfo) | La cuenta, o `null` si no existía |
| Las cuentas de tokens de una billetera en una posición anterior | [`getHistoricalTokenAccountsByOwner`](https://www.helius.dev/docs/es/api-reference/rpc/http/gethistoricaltokenaccountsbyowner) | Una página de cuentas SPL Token y Token-2022, opcionalmente para una sola acuñación |

Ambos aceptan los mismos tres parámetros: una dirección, un objeto de consulta que selecciona la posición en el historial y un objeto de configuración.

## Disponibilidad y precios

* **Planes**: [planes](https://www.helius.dev/docs/es/billing/plans.md) Business y superiores.
* **Costo**: 0 créditos por llamada durante la beta (los precios están sujetos a cambios).
* **Límites de solicitudes**: `getHistoricalAccountInfo` permite 100 solicitudes por segundo, con una ráfaga máxima de 100. `getHistoricalTokenAccountsByOwner` permite 10 solicitudes por segundo, con una ráfaga máxima de 10. Estos límites son independientes del límite de solicitudes RPC de tu plan, y las solicitudes que los superen devuelven HTTP `429`. Consulta [límites de solicitudes](https://www.helius.dev/docs/es/billing/rate-limits.md).
* **Red**: solo Mainnet. Llámalos en el endpoint estándar de mainnet, `https://mainnet.helius-rpc.com`, o en el endpoint de [Gatekeeper](https://www.helius.dev/docs/es/gatekeeper/overview.md), `https://beta.helius-rpc.com`. Devnet devuelve el error `-32601`.

## Cobertura de datos

El historial está disponible a partir del slot 444,959,999 (7 de septiembre de 2026). Ese es el último slot de la época 1029, por lo que contiene el estado al inicio de la época 1030. Las solicitudes de slots anteriores devuelven el error `-32018` ("Historial de la cuenta no disponible").

## Elige una posición en el historial

El segundo parámetro es un objeto de consulta con dos campos opcionales, `slot` e `transactionIndex`:

| Consulta | Devuelve el estado |
| - | - |
| Omitido o `{}` | En el último slot indexado, limitado por el compromiso solicitado |
| `{ "slot": 445000000 }` | Al final del slot 445,000,000, después de todas las transacciones y cualquier escritura ajena a una transacción, como las recompensas de época |
| `{ "slot": 445000000, "transactionIndex": 10 }` | Inmediatamente después de que se ejecutó la transacción en el índice 10 del slot 445,000,000 |

`transactionIndex` requiere `slot`.

Las escrituras ajenas a una transacción, como las recompensas de época, se aplican al final del slot. Una consulta con `transactionIndex` nunca las incluye, ni siquiera para la última transacción del slot. Para incluirlas, consulta `slot` sin `transactionIndex`.

### Lee el estado antes y después de una transacción

Para examinar qué cambió una transacción, lee la cuenta dos veces:

* **Después de la transacción**: consulta sus propios `slot` e `transactionIndex`.
* **Antes de la transacción**: consulta el mismo `slot` con `transactionIndex` menos 1. Si la transacción es la primera de su slot (índice 0), consulta el slot anterior sin `transactionIndex`.

[`getTransactionsForAddress`](https://www.helius.dev/docs/es/rpc/gettransactionsforaddress) devuelve `slot` e `transactionIndex` para cada transacción, por lo que puedes encontrar allí la posición de una transacción y pasarla directamente a estos métodos.

```bash theme={"system"}
# State of the account right after the transaction at index 10 in slot 445000000
curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": "1",
    "method": "getHistoricalAccountInfo",
    "params": [
      "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
      { "slot": 445000000, "transactionIndex": 10 },
      { "encoding": "jsonParsed" }
    ]
  }'
```

## Comprende lastUpdatedAt

Cada cuenta devuelta incluye `lastUpdatedAt`, la posición de la escritura que produjo el estado que recibiste:

```json theme={"system"}
"lastUpdatedAt": { "slot": 444999837, "transactionIndex": 700 }
```

* **`slot` e `transactionIndex`** apuntan a la última escritura en la posición consultada o antes de ella. En el ejemplo anterior, una consulta del slot 445,000,000 devolvió el estado escrito por última vez por la transacción en el índice 700 del slot 444,999,837.
* **`transactionIndex: null`** significa que la escritura ocurrió fuera de una transacción, como en el caso de las recompensas de época.
* **`slot: 444959999` con `transactionIndex: null`** significa que la cuenta no ha cambiado desde que comenzó la cobertura del historial. No significa que la cuenta se haya escrito en ese slot.

## Qué significa un valor null

`value` es `null` cuando la cuenta no existía en la posición consultada. Puede que todavía no se hubiera creado o que ya se hubiera cerrado.

* **Una respuesta `null` no tiene `lastUpdatedAt`**, por lo que no indica cuándo se creó o cerró la cuenta. Para encontrar esas transacciones, usa [`getTransactionsForAddress`](https://www.helius.dev/docs/es/rpc/gettransactionsforaddress).
* **Una dirección que nunca existió** también devuelve `null`, no un error.
* **Un slot anterior a la cobertura del historial** devuelve el error `-32018` para todas las direcciones, sin importar si la cuenta existía.

## Recorre hacia atrás el historial de una cuenta

Usa `lastUpdatedAt` como cursor para enumerar todos los estados que ha tenido una cuenta, comenzando por el más reciente. Después de cada lectura, consulta la posición inmediatamente anterior a la escritura que recibiste:

| `lastUpdatedAt` que recibiste | Siguiente consulta |
| - | - |
| `{ "slot": S, "transactionIndex": N }`, donde N es mayor que 0 | `{ "slot": S, "transactionIndex": N - 1 }` |
| `{ "slot": S, "transactionIndex": 0 }` | `{ "slot": S - 1 }` |
| `{ "slot": S, "transactionIndex": null }` | `{ "slot": S - 1 }` |

Detente cuando `value` sea `null`, lo que significa que la escritura que acabas de dejar atrás creó la cuenta. Detente también cuando `lastUpdatedAt.slot` llegue a 444,959,999, el inicio de la cobertura del historial.

```typescript theme={"system"}
const url = `https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`;
const COVERAGE_START_SLOT = 444959999;

type Position = { slot?: number; transactionIndex?: number };

async function getAccountHistory(address: string, start: Position = {}, maxStates = 100) {
  const states = [];
  let position = start;

  while (states.length < maxStates) {
    const response = await fetch(url, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "1",
        method: "getHistoricalAccountInfo",
        params: [address, position, { encoding: "base64" }],
      }),
    });
    const { result, error } = await response.json();
    if (error) throw new Error(`${error.code}: ${error.message}`);

    const account = result.value;
    if (!account) break; // The account didn't exist before this write

    states.push(account);
    const { slot, transactionIndex } = account.lastUpdatedAt;
    if (slot <= COVERAGE_START_SLOT) break; // Reached the start of history coverage

    // Step to the position just before this write
    position = transactionIndex ? { slot, transactionIndex: transactionIndex - 1 } : { slot: slot - 1 };
  }

  return states; // Newest first
}
```

* **Las cuentas que ahora están cerradas** devuelven `null` en el último slot. Pasa una posición `start` correspondiente a cuando la cuenta todavía existía.
* **Las escrituras ajenas a una transacción** retroceden al slot anterior. Si una transacción también escribió en la misma cuenta anteriormente en ese slot, el recorrido omite ese estado.
* **Para avanzar en el tiempo**, enumera primero las transacciones más antiguas de la cuenta con [`getTransactionsForAddress`](https://www.helius.dev/docs/es/rpc/gettransactionsforaddress) e `sortOrder: "asc"`. Luego, lee el estado en los valores `slot` e `transactionIndex` de cada transacción.

## Contexto de la respuesta

`context.slot` en cada respuesta es el último slot que Helius había indexado cuando procesó la solicitud. No es el slot que consultaste. Usa el `slot` de tu solicitud o `lastUpdatedAt` para interpretar los datos que recibiste.

## Pagina de forma consistente

`getHistoricalTokenAccountsByOwner` devuelve los resultados una página a la vez. Cada respuesta incluye `value.accounts` e `value.paginationKey`.

* **Vuelve a pasar `paginationKey`** en el objeto de configuración para obtener la página siguiente.
* **Detente solo cuando `paginationKey` sea `null`.** Una página puede ser corta o estar vacía y aun así tener más resultados después.
* **Fija `slot` en todas las páginas.** Si omites `slot`, cada página lee el último slot indexado y tus páginas pueden provenir de distintos momentos.
* **Configura `limit`** entre 1 y 5,000. El valor predeterminado es 5,000.

## Codificaciones y datos analizados

* **Las codificaciones compatibles** son `base64` (la predeterminada), `base64+zstd` e `jsonParsed`. `base58` e `binary` no son compatibles.
* **Las cuentas de tokens `jsonParsed`** usan los decimales de la acuñación en la posición consultada, por lo que las cantidades son correctas aunque la acuñación haya cambiado desde entonces. Si la acuñación no puede leerse en esa posición, la cuenta usa base64 como alternativa.
* **`dataSlice`** funciona de la misma manera que en `getAccountInfo`.

## Compromiso

`commitment` acepta `finalized` (el valor predeterminado) e `confirmed`. `processed` no es compatible. Un `slot` más reciente de lo que permite el compromiso solicitado devuelve el error `-32004`.

## Errores

| Código | Significado | Qué hacer |
| - | - | - |
| `-32018` | El slot es anterior al inicio de la cobertura del historial | Consulta el slot 444,959,999 o uno posterior |
| `-32004` | El slot es más reciente de lo que permite el compromiso solicitado | Usa `confirmed` o consulta un slot anterior |
| `-32602` | Parámetros no válidos | Revisa el mensaje de error para identificar el campo específico |
| `-32601` | Método no encontrado | Llama a tu endpoint de mainnet de Helius o Gatekeeper. Los métodos de cuentas históricas no están disponibles en devnet |

## Preguntas frecuentes

### ¿Cómo obtengo el estado de una cuenta de Solana en un slot específico?

Llama a `getHistoricalAccountInfo` con la dirección e `{ "slot": S }`. Devuelve la cuenta tal como estaba al final del slot S, en el mismo formato que `getAccountInfo`.

### ¿Puedo leer una cuenta entre dos transacciones del mismo slot?

Sí. Agrega `transactionIndex` a la consulta para obtener el estado de la cuenta inmediatamente después de que se ejecutara esa transacción. Consulta [Lee el estado antes y después de una transacción](#lee-el-estado-antes-y-después-de-una-transacción).

### ¿Hasta qué momento del pasado puedo consultar?

El historial comienza en el slot 444,959,999, el 7 de septiembre de 2026. Los slots anteriores devuelven el error `-32018`.

### ¿Qué planes incluyen los métodos de cuentas históricas?

Los planes Business y superiores. Las llamadas cuestan 0 créditos durante el período beta; los precios están sujetos a cambios. Los métodos están disponibles solo en mainnet.

### ¿Cuáles son los límites de solicitudes?

`getHistoricalAccountInfo` permite 100 solicitudes por segundo e `getHistoricalTokenAccountsByOwner` permite 10 solicitudes por segundo. Ambos límites son independientes del límite de solicitudes RPC de tu plan. Consulta [Disponibilidad y precios](#disponibilidad-y-precios).

### ¿Cómo obtengo todos los estados anteriores de una cuenta?

Retrocede desde una escritura a la anterior mediante `lastUpdatedAt`. Consulta [Recorre hacia atrás el historial de una cuenta](#recorre-hacia-atrás-el-historial-de-una-cuenta).

### ¿Necesito un SDK nuevo?

No. Estos son métodos JSON-RPC, por lo que cualquier cliente HTTP funciona. Las bibliotecas cliente estándar de Solana no los incluyen, así que envía la solicitud directamente, como en los ejemplos anteriores.

## Siguientes pasos

> [card] [getHistoricalAccountInfo](https://www.helius.dev/docs/es/api-reference/rpc/http/gethistoricalaccountinfo.md)
>
> Lee una sola cuenta en un slot o una transacción anterior

> [card] [getHistoricalTokenAccountsByOwner](https://www.helius.dev/docs/es/api-reference/rpc/http/gethistoricaltokenaccountsbyowner.md)
>
> Enumera las cuentas de tokens de una billetera en un slot anterior

> [card] [getTransactionsForAddress](https://www.helius.dev/docs/es/rpc/gettransactionsforaddress.md)
>
> Encuentra el slot y el transactionIndex de las transacciones que quieres examinar

> [card] [Historical data overview](https://www.helius.dev/docs/es/rpc/historical-data.md)
>
> Historial de transacciones, transferencias y otros métodos de archivo


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