> ## 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.

# getHistoricalTokenAccountsByOwner

> Enumera las cuentas de SPL Token y Token-2022 que una cartera de Solana poseía en un slot anterior o justo después de una transacción específica, con filtros de mint y paginación.

> [!NOTE]
>
> `getHistoricalTokenAccountsByOwner` está en fase beta. Los parámetros, precios, formatos de respuesta y la cobertura de datos pueden cambiar.

## Descripción general

`getHistoricalTokenAccountsByOwner` devuelve las cuentas de SPL Token y Token-2022 que una cartera poseía en un slot anterior o inmediatamente después de una transacción específica de ese slot. Es un método RPC exclusivo de Helius. El método estándar `getTokenAccountsByOwner` solo devuelve el estado actual.

Con la codificación `jsonParsed`, las cantidades de tokens usan los decimales de cada mint correspondientes a la posición solicitada. De esta forma, los saldos reflejan lo que la cartera tenía en ese momento.

El historial está disponible a partir del slot 444,959,999 (7 de septiembre de 2026), que corresponde al estado al inicio de la época 1030.

`getHistoricalTokenAccountsByOwner` está disponible en mainnet para los planes Business y superiores. Durante el periodo beta, cuesta 0 créditos por llamada. Los precios están sujetos a cambios.

## Diferencias con getTokenAccountsByOwner

* **El filtro de mint o programa es opcional.** Si no aplicas ningún filtro, obtienes todas las cuentas de tokens que poseía la cartera. Para limitar los resultados, establece `mint` o `programId` en el objeto de configuración (el tercer parámetro), pero no ambos.
* **El segundo parámetro es el objeto de consulta** que selecciona la posición en el historial, no un filtro de mint o programa.
* **`result.value` es un objeto** con `accounts` y `paginationKey`, no un arreglo.

## Elige una posición en el historial

El segundo parámetro es un objeto de consulta:

* **Omitido o `{}`**: el último slot indexado, limitado por el nivel de compromiso solicitado.
* **`{ "slot": 445000000 }`**: el final del slot 445,000,000.
* **`{ "slot": 445000000, "transactionIndex": 10 }`**: inmediatamente después de que se ejecutara la transacción con índice 10 en ese slot.

Consulta la [guía de cuentas históricas](https://www.helius.dev/docs/es/rpc/historical-accounts.md) para saber cómo funcionan las posiciones.

## Solicitud de ejemplo

Esta solicitud devuelve las cuentas de tokens USDC de la cartera al final del slot 445,000,000:

```bash theme={"system"}
curl https://mainnet.helius-rpc.com/?api-key=YOUR_API_KEY \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "id": "1",
    "method": "getHistoricalTokenAccountsByOwner",
    "params": [
      "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
      { "slot": 445000000 },
      { "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", "encoding": "jsonParsed" }
    ]
  }'
```

## Pagina por todas las cuentas de tokens

Los resultados se ordenan primero por mint y después por la dirección de la cuenta de tokens. Cada respuesta devuelve `value.accounts` e `value.paginationKey`, un cursor con el formato `<mint>:<tokenAccount>`. Pásalo en la siguiente solicitud hasta que sea `null`.

> [!WARNING]
>
> Una página puede contener pocos resultados, o incluso estar vacía, y aun así incluir un `paginationKey`. Solo un `paginationKey` con valor `null` indica que llegaste al final.

Incluye siempre un `slot` explícito cuando pagines. Si lo omites, cada página lee el último slot indexado, por lo que las páginas pueden provenir de distintos momentos.

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

async function getTokenAccountsAt(owner: string, slot: number) {
  const accounts = [];
  let paginationKey: string | null = null;

  do {
    const response = await fetch(url, {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({
        jsonrpc: "2.0",
        id: "1",
        method: "getHistoricalTokenAccountsByOwner",
        params: [
          owner,
          { slot },
          { encoding: "jsonParsed", limit: 1000, ...(paginationKey && { paginationKey }) },
        ],
      }),
    });
    const { result, error } = await response.json();
    if (error) throw new Error(`${error.code}: ${error.message}`);

    accounts.push(...result.value.accounts);
    paginationKey = result.value.paginationKey;
  } while (paginationKey);

  return accounts;
}

const tokenAccounts = await getTokenAccountsAt("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY", 445000000);
```

## Interpreta la respuesta

Cada entrada de `value.accounts` contiene el `pubkey` de la cuenta de tokens y un objeto `account`. El objeto de cuenta tiene los mismos campos que `getAccountInfo`, además de `lastUpdatedAt`:

* **`lastUpdatedAt.slot`** e **`lastUpdatedAt.transactionIndex`** identifican la escritura que produjo este estado.
* **Un `lastUpdatedAt.slot` de 444,959,999 con un `transactionIndex` cuyo valor sea `null`** significa que la cuenta de tokens no cambió desde que comenzó la cobertura del historial.
* **`context.slot`** es el último slot que Helius había indexado cuando procesó la solicitud, no el slot que consultaste.

## Errores

| Código | Significado |
| - | - |
| `-32018` | El slot es anterior al inicio de la cobertura del historial (slot 444,959,999) |
| `-32004` | El slot es más reciente de lo que permite el nivel de compromiso solicitado. Usa `confirmed` o consulta un slot anterior |
| `-32602` | Parámetros no válidos, como especificar tanto `mint` como `programId`, un `programId` que no sea un programa de tokens o un `paginationKey` cuyo mint no coincida con `mint` |
| `-32601` | No se encontró el método. Llama a tu endpoint de Helius en mainnet o de Gatekeeper; el método no está disponible en devnet |

## Métodos relacionados

> [card] [Historical Accounts Guide](https://www.helius.dev/docs/es/rpc/historical-accounts.md)
>
> Cómo funcionan las posiciones, la cobertura y lastUpdatedAt para los métodos de cuentas históricas

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

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

> [card] [getTokenAccountsByOwnerV2](https://www.helius.dev/docs/es/api-reference/rpc/http/gettokenaccountsbyownerv2.md)
>
> Pagina por las cuentas de tokens actuales de una cartera

## Parámetros de la solicitud

**owner** `string` *required*

Dirección codificada en Base-58 de la cartera que poseía las cuentas de tokens. Pasa la cartera propietaria, no una cuenta de tokens.

**slot** `number`

Slot en el que se leerá el estado. Devuelve la cuenta tal como estaba al final de este slot. El primer slot compatible es 444959999, que corresponde al estado al inicio de la época 1030. Si se omite, lee el último slot indexado, limitado por el nivel de compromiso solicitado.

**transactionIndex** `number`

Posición de una transacción dentro del slot. Devuelve el estado de la cuenta inmediatamente después de que se ejecutara esa transacción, en lugar del estado al final del slot. Requiere slot.

**mint** `string`

Devuelve solo las cuentas de tokens de este mint. No se puede combinar con programId.

**programId** `string`

Devuelve solo las cuentas de tokens que pertenecen a este programa de tokens. No se puede combinar con mint.

* `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`
* `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`

**encoding** `string` (default: base64)

Formato de codificación de los datos de la cuenta. Con jsonParsed, las cantidades de tokens usan los decimales del mint correspondientes a la posición solicitada. base58 y binary no son compatibles.

* `base64`
* `base64+zstd`
* `jsonParsed`

**dataSlice** `object`

Devuelve solo una sección de los datos de cada cuenta. Se aplica a las codificaciones base64 y base64+zstd.

**dataSlice.offset** `number` *required*

Desplazamiento en bytes desde el que se comenzará a leer.

**dataSlice.length** `number` *required*

Cantidad de bytes que se devolverán.

**limit** `number` (default: 5000)

Cantidad máxima de cuentas de tokens que se devolverán (1-5,000).

**paginationKey** `string`

Cursor de paginationKey de la respuesta anterior, con el formato `&lt;mint&gt;:&lt;tokenAccount&gt;`. Si también estableces mint, el mint del cursor debe coincidir con él.

**commitment** `string` (default: finalized)

Nivel de compromiso. processed no es compatible.

* `finalized`
* `confirmed`

**minContextSlot** `number`

Slot mínimo en el que se puede evaluar la solicitud.


## OpenAPI

````yaml es/openapi/rpc-http/getHistoricalTokenAccountsByOwner.yaml POST /
openapi: 3.1.0
info:
  title: API RPC de Solana
  version: 1.0.0
  description: >-
    API histórica de cuentas de tokens de Solana para enumerar las cuentas de
    SPL Token y Token-2022 que pertenecían a una billetera en un slot anterior,
    con filtros opcionales por mint o programa de tokens y paginación basada en
    cursor.
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://mainnet.helius-rpc.com
    description: Endpoint RPC de Mainnet
security: []
paths:
  /:
    post:
      tags:
        - RPC
      summary: getHistoricalTokenAccountsByOwner
      description: >
        **Beta.** Los parámetros, los formatos de respuesta y la cobertura de
        datos pueden cambiar.


        Devuelve las cuentas de SPL Token y Token-2022 que pertenecían a una
        billetera en un slot anterior, o

        inmediatamente después de una transacción específica dentro de ese slot.
        Este método RPC de Helius

        devuelve todas las cuentas de tokens de forma predeterminada. Limita los
        resultados con un mint o un

        programId de tokens en el objeto de configuración.


        Los resultados se ordenan primero por mint y luego por dirección de la
        cuenta de tokens. Una página puede ser corta o

        estar vacía y aun así devolver una paginationKey;

        continúa paginando hasta que paginationKey sea nulo.
      operationId: getHistoricalTokenAccountsByOwner
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - jsonrpc
                - id
                - method
                - params
              properties:
                jsonrpc:
                  type: string
                  enum:
                    - '2.0'
                  example: '2.0'
                  description: La versión del protocolo JSON-RPC.
                  default: '2.0'
                id:
                  type: string
                  example: '1'
                  description: Un identificador único para la solicitud.
                  default: '1'
                method:
                  type: string
                  enum:
                    - getHistoricalTokenAccountsByOwner
                  example: getHistoricalTokenAccountsByOwner
                  description: El nombre del método RPC que se invocará.
                  default: getHistoricalTokenAccountsByOwner
                params:
                  type: array
                  description: >-
                    Arreglo que contiene la dirección de la billetera
                    propietaria, un objeto de consulta opcional que selecciona
                    la posición en el historial y un objeto de configuración
                    opcional.
                  minItems: 1
                  maxItems: 3
                  default:
                    - 86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY
                    - slot: 445000000
                    - encoding: jsonParsed
                      limit: 2
                  items:
                    oneOf:
                      - type: string
                        title: Propietario
                        description: >-
                          Dirección codificada en base 58 de la billetera a la
                          que pertenecían las cuentas de tokens. Proporciona la
                          billetera propietaria, no una cuenta de tokens.
                        example: 86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY
                      - $ref: '#/components/schemas/HistoricalAccountQuery'
                        title: Consulta
                      - type: object
                        title: Configuración
                        description: >-
                          Objeto de configuración opcional. Configura como
                          máximo uno de mint o programId.
                        properties:
                          mint:
                            type: string
                            description: >-
                              Devuelve solo las cuentas de tokens de este mint.
                              No se puede combinar con programId.
                            example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                          programId:
                            type: string
                            description: >-
                              Devuelve solo las cuentas de tokens que pertenecen
                              a este programa de tokens. No se puede combinar
                              con mint.
                            enum:
                              - TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                              - TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
                            example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                          encoding:
                            type: string
                            description: >-
                              Formato de codificación de los datos de la cuenta.
                              Con jsonParsed, las cantidades de tokens usan los
                              decimales del mint en la posición solicitada.
                              base58 y binary no son compatibles.
                            enum:
                              - base64
                              - base64+zstd
                              - jsonParsed
                            default: base64
                            example: jsonParsed
                          dataSlice:
                            $ref: '#/components/schemas/DataSliceConfig'
                          limit:
                            type: integer
                            description: >-
                              Cantidad máxima de cuentas de tokens que se
                              devolverán (1-5,000).
                            minimum: 1
                            maximum: 5000
                            default: 5000
                            example: 1000
                          paginationKey:
                            type: string
                            description: >-
                              Cursor de paginationKey de la respuesta anterior,
                              con el formato `<mint>:<tokenAccount>`. Si también
                              configuras mint, el mint del cursor debe coincidir
                              con él.
                            example: >-
                              11112zAgXhc6hGfdfr5anSY91mq7Cs4HHpSVEQc4ASG:EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
                          commitment:
                            type: string
                            description: Nivel de compromiso. processed no es compatible.
                            enum:
                              - finalized
                              - confirmed
                            default: finalized
                            example: finalized
                          minContextSlot:
                            type: integer
                            description: >-
                              El slot mínimo en el que se puede evaluar la
                              solicitud.
                            example: 445000000
                        additionalProperties: false
      responses:
        '200':
          description: >-
            Se recuperó correctamente una página de cuentas históricas de
            tokens.
          content:
            application/json:
              schema:
                type: object
                properties:
                  jsonrpc:
                    type: string
                    description: La versión del protocolo JSON-RPC.
                    enum:
                      - '2.0'
                    example: '2.0'
                  id:
                    type: string
                    description: Identificador que coincide con la solicitud.
                    example: '1'
                  result:
                    type: object
                    properties:
                      context:
                        $ref: '#/components/schemas/HistoricalContext'
                      value:
                        type: object
                        properties:
                          accounts:
                            type: array
                            description: >-
                              Cuentas de tokens de esta página, ordenadas
                              primero por mint y luego por dirección de la
                              cuenta de tokens.
                            items:
                              $ref: '#/components/schemas/HistoricalKeyedAccount'
                          paginationKey:
                            oneOf:
                              - type: string
                              - type: 'null'
                            description: >-
                              Cursor para la página siguiente, con el formato
                              `<mint>:<tokenAccount>`, o nulo cuando se hayan
                              devuelto todas las cuentas. Una página corta o
                              vacía con una paginationKey significa que el
                              análisis se detuvo antes de tiempo, no que hayas
                              llegado al final.
                            example: >-
                              11112zAgXhc6hGfdfr5anSY91mq7Cs4HHpSVEQc4ASG:EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
        '400':
          description: >-
            Solicitud incorrecta: parámetros de solicitud no válidos o solicitud
            con formato incorrecto.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32602
                  message: Parámetros no válidos
                id: '1'
        '401':
          description: 'No autorizado: la clave de API no es válida o no está presente.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32001
                  message: No autorizado
                id: '1'
        '429':
          description: 'Demasiadas solicitudes: se superó el límite de solicitudes.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32005
                  message: Demasiadas solicitudes
                id: '1'
        '500':
          description: 'Error interno del servidor: ocurrió un error en el servidor.'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32603
                  message: Error interno
                id: '1'
        '503':
          description: >-
            Servicio no disponible: el servicio no está disponible
            temporalmente.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32002
                  message: Servicio no disponible
                id: '1'
        '504':
          description: >-
            Tiempo de espera de la puerta de enlace agotado: se agotó el tiempo
            de espera de la solicitud.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32003
                  message: Tiempo de espera de la puerta de enlace agotado
                id: '1'
      security:
        - ApiKeyQuery: []
components:
  schemas:
    HistoricalAccountQuery:
      type: object
      description: >-
        La posición del historial que se leerá. Omítela o envía un objeto vacío
        para leer el último slot indexado.
      properties:
        slot:
          type: integer
          description: >-
            Slot en el que se leerá el estado. Devuelve la cuenta tal como
            estaba al final de este slot. El primer slot compatible es
            444959999, que corresponde al estado al inicio de la época 1030. Si
            se omite, lee el último slot indexado, limitado al nivel de
            compromiso solicitado.
          minimum: 444959999
          example: 445000000
        transactionIndex:
          type: integer
          description: >-
            Posición de una transacción dentro del slot. Devuelve el estado de
            la cuenta inmediatamente después de ejecutar esa transacción, en
            lugar del estado al final del slot. Requiere slot.
          minimum: 0
          maximum: 16777214
          example: 10
      additionalProperties: false
    DataSliceConfig:
      type: object
      description: >-
        Devuelve solo una porción de los datos de cada cuenta. Se aplica a las
        codificaciones base64 y base64+zstd.
      properties:
        offset:
          type: integer
          description: Desplazamiento en bytes desde el que se empezará a leer.
          example: 0
        length:
          type: integer
          description: Cantidad de bytes que se devolverán.
          example: 8
      required:
        - offset
        - length
    HistoricalContext:
      type: object
      description: Metadatos de la respuesta.
      properties:
        slot:
          type: integer
          description: >-
            El último slot que el almacén histórico había indexado cuando
            procesó la solicitud. Este no es el slot que consultaste.
          example: 468129571
    HistoricalKeyedAccount:
      type: object
      properties:
        pubkey:
          type: string
          description: Dirección codificada en base 58 de la cuenta de tokens.
          example: EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
        account:
          $ref: '#/components/schemas/HistoricalAccount'
      required:
        - pubkey
        - account
    ErrorResponse:
      type: object
      properties:
        jsonrpc:
          type: string
          description: La versión del protocolo JSON-RPC.
          enum:
            - '2.0'
          example: '2.0'
        error:
          type: object
          properties:
            code:
              type: integer
              description: El código de error.
              example: -32602
            message:
              type: string
              description: El mensaje de error.
            data:
              type: object
              description: Datos adicionales sobre el error.
        id:
          type: string
          description: Identificador que coincide con la solicitud.
          example: '1'
    HistoricalAccount:
      type: object
      description: >-
        La cuenta tal como estaba en la posición solicitada, junto con el lugar
        donde se escribió ese estado por última vez.
      properties:
        lamports:
          type: integer
          description: Cantidad de lamports asignados a esta cuenta.
          example: 531589475273
        owner:
          type: string
          description: >-
            Clave pública codificada en base 58 del programa al que se asignó
            esta cuenta.
          example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
        data:
          description: >-
            Datos de la cuenta. Con base64 o base64+zstd, es un arreglo de dos
            elementos con los datos codificados y la codificación. Con
            jsonParsed, es un objeto con program, parsed y space. Las cuentas
            que no se puedan analizar usan como alternativa el arreglo base64.
          oneOf:
            - type: array
              items:
                type: string
            - type: object
              properties:
                program:
                  type: string
                  description: Nombre del programa propietario de la cuenta.
                  example: spl-token
                parsed:
                  type: object
                  description: Estado analizado de la cuenta específico del programa.
                space:
                  type: integer
                  description: Tamaño de los datos de la cuenta.
                  example: 82
        executable:
          type: boolean
          description: Indica si la cuenta contiene un programa.
          example: false
        rentEpoch:
          type: integer
          description: >-
            Época en la que esta cuenta deberá pagar alquiler nuevamente. Las
            cuentas exentas de alquiler informan el valor máximo de u64.
        space:
          type: integer
          description: Tamaño de los datos de la cuenta en bytes.
          example: 82
        lastUpdatedAt:
          $ref: '#/components/schemas/AccountWritePosition'
      required:
        - lamports
        - owner
        - data
        - executable
        - rentEpoch
        - space
        - lastUpdatedAt
    AccountWritePosition:
      type: object
      description: >-
        Lugar donde se escribió por última vez el estado devuelto, en la
        posición solicitada o antes de ella.
      properties:
        slot:
          type: integer
          description: >-
            Slot de la última escritura. Un valor de 444959999 con un
            transactionIndex nulo significa que la cuenta no ha cambiado desde
            que comenzó la cobertura histórica.
          example: 444999837
        transactionIndex:
          oneOf:
            - type: integer
            - type: 'null'
          description: >-
            Posición de la transacción que realizó la última escritura. Es nulo
            cuando la escritura ocurrió fuera de una transacción (por ejemplo,
            recompensas de época) o cuando la cuenta no ha cambiado desde que
            comenzó la cobertura histórica.
          example: 700
      required:
        - slot
        - transactionIndex
  securitySchemes:
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api-key
      description: >-
        Tu clave de API de Helius. Puedes obtener una gratis en el
        [panel](https://dashboard.helius.dev/api-keys).

````

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