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

> Получите список счетов SPL Token и Token-2022, которыми кошелёк Solana владел в прошлом слоте или сразу после определённой транзакции, с фильтрами по минту и пагинацией.

> [!NOTE]
>
> `getHistoricalTokenAccountsByOwner` находится на стадии бета-тестирования. Параметры, цены, форматы ответов и охват данных могут измениться.

## Обзор

`getHistoricalTokenAccountsByOwner` возвращает счета SPL Token и Token-2022, которыми кошелёк владел в прошлом слоте или сразу после определённой транзакции в этом слоте. Этот метод RPC доступен исключительно в Helius. Стандартный метод `getTokenAccountsByOwner` возвращает только текущее состояние.

При кодировке `jsonParsed` суммы токенов используют количество десятичных знаков каждого минта в запрошенной позиции, поэтому балансы отражают средства кошелька на тот момент.

История доступна начиная со слота 444 959 999 (7 сентября 2026 года), соответствующего состоянию в начале эпохи 1030.

`getHistoricalTokenAccountsByOwner` доступен в основной сети для тарифных планов Business и выше. В период бета-тестирования каждый вызов стоит 0 кредитов. Цены могут измениться.

## Отличия от getTokenAccountsByOwner

* **Фильтр по минту или программе необязателен.** Без фильтра вы получите все токен-счета, которыми владел кошелёк. Чтобы сузить результаты, укажите либо `mint`, либо `programId` в объекте конфигурации (третьем параметре), но не оба одновременно.
* **Второй параметр — объект запроса**, который выбирает позицию в истории, а не фильтр по минту или программе.
* **`result.value` — это объект** с `accounts` и `paginationKey`, а не массив.

## Выбор позиции в истории

Второй параметр — это объект запроса:

* **Не указан или `{}`**: последний проиндексированный слот с учётом запрошенного уровня подтверждения.
* **`{ "slot": 445000000 }`**: конец слота 445 000 000.
* **`{ "slot": 445000000, "transactionIndex": 10 }`**: сразу после выполнения транзакции с индексом 10 в этом слоте.

Подробнее о работе позиций см. в [руководстве по историческим счетам](https://www.helius.dev/docs/ru/rpc/historical-accounts.md).

## Пример запроса

Этот запрос возвращает токен-счета USDC кошелька на конец слота 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" }
    ]
  }'
```

## Получение всех токен-счетов с пагинацией

Результаты упорядочены сначала по минту, затем по адресу токен-счёта. Каждый ответ возвращает `value.accounts` и `value.paginationKey` — курсор в формате `<mint>:<tokenAccount>`. Передавайте его в следующем запросе, пока он не станет равен `null`.

> [!WARNING]
>
> Страница может содержать мало записей или быть пустой, но при этом включать `paginationKey`. Только значение `null` для `paginationKey` означает, что вы достигли конца.

При пагинации всегда явно передавайте `slot`. Если его не указать, каждая страница будет считывать последний проиндексированный слот, поэтому страницы могут относиться к разным моментам времени.

```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);
```

## Чтение ответа

Каждая запись в `value.accounts` содержит `pubkey` токен-счёта и объект `account`. Объект счёта содержит те же поля, что и `getAccountInfo`, а также `lastUpdatedAt`:

* **`lastUpdatedAt.slot`** и **`lastUpdatedAt.transactionIndex`** определяют запись, которая создала это состояние.
* **Значение `lastUpdatedAt.slot`, равное 444 959 999, при `null` в `transactionIndex`** означает, что токен-счёт не изменялся с начала охвата истории.
* **`context.slot`** — это последний слот, проиндексированный Helius на момент обработки запроса, а не запрошенный вами слот.

## Ошибки

| Код | Значение |
| - | - |
| `-32018` | Слот предшествует началу охвата истории (слот 444 959 999) |
| `-32004` | Слот новее, чем допускает запрошенный уровень подтверждения. Используйте `confirmed` или запросите более старый слот |
| `-32602` | Недопустимые параметры: например, одновременно указаны `mint` и `programId`; `programId` не является токен-программой; либо минт в `paginationKey` не соответствует `mint` |
| `-32601` | Метод не найден. Вызовите конечную точку Helius в основной сети или конечную точку Gatekeeper; метод недоступен в devnet |

## Связанные методы

> [card] [Historical Accounts Guide](https://www.helius.dev/docs/ru/rpc/historical-accounts.md)
>
> Узнайте, как работают позиции, охват и lastUpdatedAt для методов исторических счетов

> [card] [getHistoricalAccountInfo](https://www.helius.dev/docs/ru/api-reference/rpc/http/gethistoricalaccountinfo.md)
>
> Получите данные одного счёта в прошлом слоте

> [card] [getTransactionsForAddress](https://www.helius.dev/docs/ru/rpc/gettransactionsforaddress.md)
>
> Найдите slot и transactionIndex транзакций, которые хотите проверить

> [card] [getTokenAccountsByOwnerV2](https://www.helius.dev/docs/ru/api-reference/rpc/http/gettokenaccountsbyownerv2.md)
>
> Получите текущие токен-счета кошелька с пагинацией

## Параметры запроса

**owner** `string` *required*

Адрес кошелька в кодировке Base58, который владел токен-счетами. Передайте кошелёк владельца, а не токен-счёт.

**slot** `number`

Слот, для которого нужно прочитать состояние. Возвращает состояние счёта на конец этого слота. Самый ранний поддерживаемый слот — 444959999, соответствующий состоянию в начале эпохи 1030. Если параметр не указан, считывается последний проиндексированный слот с учётом запрошенного уровня подтверждения.

**transactionIndex** `number`

Позиция транзакции в слоте. Возвращает состояние счёта сразу после выполнения этой транзакции, а не в конце слота. Требуется указать slot.

**mint** `string`

Возвращает только токен-счета этого минта. Нельзя использовать вместе с programId.

**programId** `string`

Возвращает только токен-счета, принадлежащие этой токен-программе. Нельзя использовать вместе с mint.

* `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`
* `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`

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

Формат кодирования данных счёта. При использовании jsonParsed суммы токенов учитывают количество десятичных знаков минта в запрошенной позиции. base58 и binary не поддерживаются.

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

**dataSlice** `object`

Возвращает только часть данных каждого счёта. Применяется к кодировкам base64 и base64+zstd.

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

Смещение в байтах, с которого нужно начать чтение.

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

Количество возвращаемых байтов.

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

Максимальное количество возвращаемых токен-счетов (1–5 000).

**paginationKey** `string`

Курсор из paginationKey предыдущего ответа в формате `&lt;mint&gt;:&lt;tokenAccount&gt;`. Если вы также указали mint, минт курсора должен ему соответствовать.

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

Уровень подтверждения. processed не поддерживается.

* `finalized`
* `confirmed`

**minContextSlot** `number`

Минимальный слот, в котором может быть обработан запрос.


## OpenAPI

````yaml ru/openapi/rpc-http/getHistoricalTokenAccountsByOwner.yaml POST /
openapi: 3.1.0
info:
  title: Solana RPC API
  version: 1.0.0
  description: >-
    API исторических аккаунтов токенов Solana для получения списка аккаунтов SPL
    Token и Token-2022, которыми кошелёк владел в прошлом слоте, с
    необязательными фильтрами по минту или программе токенов и пагинацией на
    основе курсора.
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://mainnet.helius-rpc.com
    description: Конечная точка RPC основной сети
security: []
paths:
  /:
    post:
      tags:
        - RPC
      summary: getHistoricalTokenAccountsByOwner
      description: >
        **Бета-версия.** Параметры, форматы ответов и охват данных могут
        измениться.


        Возвращает аккаунты SPL Token и Token-2022, которыми кошелёк владел в
        прошлом слоте или

        сразу после определённой транзакции в этом слоте. По умолчанию этот
        метод Helius RPC

        возвращает все аккаунты токенов. Чтобы сузить результаты, укажите минт
        или

        programId программы токенов в объекте конфигурации.


        Результаты упорядочены сначала по минту, а затем по адресу аккаунта
        токена. Страница может быть короткой или

        пустой и при этом содержать paginationKey;

        продолжайте запрашивать страницы, пока paginationKey не станет null.
      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: Версия протокола JSON-RPC.
                  default: '2.0'
                id:
                  type: string
                  example: '1'
                  description: Уникальный идентификатор запроса.
                  default: '1'
                method:
                  type: string
                  enum:
                    - getHistoricalTokenAccountsByOwner
                  example: getHistoricalTokenAccountsByOwner
                  description: Название вызываемого метода RPC.
                  default: getHistoricalTokenAccountsByOwner
                params:
                  type: array
                  description: >-
                    Массив, содержащий адрес кошелька владельца, необязательный
                    объект запроса для выбора позиции в истории и необязательный
                    объект конфигурации.
                  minItems: 1
                  maxItems: 3
                  default:
                    - 86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY
                    - slot: 445000000
                    - encoding: jsonParsed
                      limit: 2
                  items:
                    oneOf:
                      - type: string
                        title: Владелец
                        description: >-
                          Адрес кошелька, которому принадлежали аккаунты
                          токенов, в кодировке Base58. Передайте кошелёк
                          владельца, а не аккаунт токена.
                        example: 86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY
                      - $ref: '#/components/schemas/HistoricalAccountQuery'
                        title: Запрос
                      - type: object
                        title: Конфигурация
                        description: >-
                          Необязательный объект конфигурации. Укажите не более
                          одного из параметров mint и programId.
                        properties:
                          mint:
                            type: string
                            description: >-
                              Возвращает только аккаунты токенов для этого
                              минта. Нельзя использовать вместе с programId.
                            example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                          programId:
                            type: string
                            description: >-
                              Возвращает только аккаунты токенов, принадлежащие
                              этой программе токенов. Нельзя использовать вместе
                              с mint.
                            enum:
                              - TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                              - TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
                            example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                          encoding:
                            type: string
                            description: >-
                              Формат кодирования данных аккаунта. При
                              использовании jsonParsed для сумм токенов
                              применяется количество десятичных разрядов минта в
                              запрошенной позиции. base58 и binary не
                              поддерживаются.
                            enum:
                              - base64
                              - base64+zstd
                              - jsonParsed
                            default: base64
                            example: jsonParsed
                          dataSlice:
                            $ref: '#/components/schemas/DataSliceConfig'
                          limit:
                            type: integer
                            description: >-
                              Максимальное количество возвращаемых аккаунтов
                              токенов (1–5 000).
                            minimum: 1
                            maximum: 5000
                            default: 5000
                            example: 1000
                          paginationKey:
                            type: string
                            description: >-
                              Курсор из поля paginationKey предыдущего ответа в
                              формате `<mint>:<tokenAccount>`. Если вы также
                              указали mint, минт в курсоре должен совпадать с
                              ним.
                            example: >-
                              11112zAgXhc6hGfdfr5anSY91mq7Cs4HHpSVEQc4ASG:EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
                          commitment:
                            type: string
                            description: >-
                              Уровень подтверждения. processed не
                              поддерживается.
                            enum:
                              - finalized
                              - confirmed
                            default: finalized
                            example: finalized
                          minContextSlot:
                            type: integer
                            description: >-
                              Минимальный слот, в котором может быть обработан
                              запрос.
                            example: 445000000
                        additionalProperties: false
      responses:
        '200':
          description: Страница исторических аккаунтов токенов успешно получена.
          content:
            application/json:
              schema:
                type: object
                properties:
                  jsonrpc:
                    type: string
                    description: Версия протокола JSON-RPC.
                    enum:
                      - '2.0'
                    example: '2.0'
                  id:
                    type: string
                    description: Идентификатор, соответствующий запросу.
                    example: '1'
                  result:
                    type: object
                    properties:
                      context:
                        $ref: '#/components/schemas/HistoricalContext'
                      value:
                        type: object
                        properties:
                          accounts:
                            type: array
                            description: >-
                              Аккаунты токенов на этой странице, упорядоченные
                              сначала по минту, а затем по адресу аккаунта
                              токена.
                            items:
                              $ref: '#/components/schemas/HistoricalKeyedAccount'
                          paginationKey:
                            oneOf:
                              - type: string
                              - type: 'null'
                            description: >-
                              Курсор для следующей страницы в формате
                              `<mint>:<tokenAccount>` или null после возврата
                              всех аккаунтов. Короткая или пустая страница с
                              paginationKey означает, что сканирование
                              остановилось досрочно, а не что вы достигли конца.
                            example: >-
                              11112zAgXhc6hGfdfr5anSY91mq7Cs4HHpSVEQc4ASG:EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
        '400':
          description: >-
            Некорректный запрос — недопустимые параметры или неправильный формат
            запроса.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32602
                  message: Недопустимые параметры
                id: '1'
        '401':
          description: Не авторизовано — ключ API недействителен или отсутствует.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32001
                  message: Не авторизовано
                id: '1'
        '429':
          description: Слишком много запросов — превышен лимит частоты запросов.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32005
                  message: Слишком много запросов
                id: '1'
        '500':
          description: Внутренняя ошибка сервера — на сервере произошла ошибка.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32603
                  message: Внутренняя ошибка
                id: '1'
        '503':
          description: Сервис недоступен — сервис временно недоступен.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32002
                  message: Сервис недоступен
                id: '1'
        '504':
          description: Истекло время ожидания шлюза — время ожидания запроса истекло.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32003
                  message: Истекло время ожидания шлюза
                id: '1'
      security:
        - ApiKeyQuery: []
components:
  schemas:
    HistoricalAccountQuery:
      type: object
      description: >-
        Позиция в истории, из которой нужно прочитать данные. Не указывайте это
        значение или передайте пустой объект, чтобы прочитать последний
        проиндексированный слот.
      properties:
        slot:
          type: integer
          description: >-
            Слот, для которого нужно прочитать состояние. Возвращает состояние
            аккаунта на конец этого слота. Самый ранний поддерживаемый слот —
            444959999, то есть состояние на начало эпохи 1030. Если параметр не
            указан, читается последний проиндексированный слот с учётом
            запрошенного уровня подтверждения.
          minimum: 444959999
          example: 445000000
        transactionIndex:
          type: integer
          description: >-
            Позиция транзакции в слоте. Возвращает состояние аккаунта сразу
            после выполнения этой транзакции, а не в конце слота. Требуется
            параметр slot.
          minimum: 0
          maximum: 16777214
          example: 10
      additionalProperties: false
    DataSliceConfig:
      type: object
      description: >-
        Возвращает только срез данных каждого аккаунта. Применяется к кодировкам
        base64 и base64+zstd.
      properties:
        offset:
          type: integer
          description: Смещение в байтах, с которого начинается чтение.
          example: 0
        length:
          type: integer
          description: Количество возвращаемых байтов.
          example: 8
      required:
        - offset
        - length
    HistoricalContext:
      type: object
      description: Метаданные ответа.
      properties:
        slot:
          type: integer
          description: >-
            Последний слот, проиндексированный хранилищем истории на момент
            обработки запроса. Это не тот слот, который вы запросили.
          example: 468129571
    HistoricalKeyedAccount:
      type: object
      properties:
        pubkey:
          type: string
          description: Адрес аккаунта токена в кодировке Base58.
          example: EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
        account:
          $ref: '#/components/schemas/HistoricalAccount'
      required:
        - pubkey
        - account
    ErrorResponse:
      type: object
      properties:
        jsonrpc:
          type: string
          description: Версия протокола JSON-RPC.
          enum:
            - '2.0'
          example: '2.0'
        error:
          type: object
          properties:
            code:
              type: integer
              description: Код ошибки.
              example: -32602
            message:
              type: string
              description: Сообщение об ошибке.
            data:
              type: object
              description: Дополнительные данные об ошибке.
        id:
          type: string
          description: Идентификатор, соответствующий запросу.
          example: '1'
    HistoricalAccount:
      type: object
      description: >-
        Состояние аккаунта в запрошенной позиции, а также позиция последней
        записи этого состояния.
      properties:
        lamports:
          type: integer
          description: Количество лампортов, назначенных этому аккаунту.
          example: 531589475273
        owner:
          type: string
          description: >-
            Публичный ключ программы, которой назначен этот аккаунт, в кодировке
            Base58.
          example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
        data:
          description: >-
            Данные аккаунта. При использовании base64 или base64+zstd
            возвращается массив из двух элементов: закодированных данных и
            названия кодировки. При использовании jsonParsed возвращается объект
            с полями program, parsed и space. Для аккаунтов, которые невозможно
            разобрать, возвращается массив base64.
          oneOf:
            - type: array
              items:
                type: string
            - type: object
              properties:
                program:
                  type: string
                  description: Название программы, которой принадлежит аккаунт.
                  example: spl-token
                parsed:
                  type: object
                  description: Разобранное состояние аккаунта, специфичное для программы.
                space:
                  type: integer
                  description: Размер данных аккаунта.
                  example: 82
        executable:
          type: boolean
          description: Содержит ли аккаунт программу.
          example: false
        rentEpoch:
          type: integer
          description: >-
            Эпоха, в которой с этого аккаунта в следующий раз потребуется
            арендная плата. Для аккаунтов, освобождённых от арендной платы,
            возвращается максимальное значение u64.
        space:
          type: integer
          description: Размер данных аккаунта в байтах.
          example: 82
        lastUpdatedAt:
          $ref: '#/components/schemas/AccountWritePosition'
      required:
        - lamports
        - owner
        - data
        - executable
        - rentEpoch
        - space
        - lastUpdatedAt
    AccountWritePosition:
      type: object
      description: >-
        Позиция, в которой возвращаемое состояние было записано в последний раз
        — в запрошенной позиции или ранее.
      properties:
        slot:
          type: integer
          description: >-
            Слот последней записи. Значение 444959999 при null в
            transactionIndex означает, что аккаунт не изменялся с начала охвата
            исторических данных.
          example: 444999837
        transactionIndex:
          oneOf:
            - type: integer
            - type: 'null'
          description: >-
            Позиция транзакции, которая выполнила последнюю запись. Имеет
            значение null, если запись произошла вне транзакции (например, при
            начислении наград за эпоху) или если аккаунт не изменялся с начала
            охвата исторических данных.
          example: 700
      required:
        - slot
        - transactionIndex
  securitySchemes:
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api-key
      description: >-
        Ваш ключ API Helius. Его можно получить бесплатно в [панели
        управления](https://dashboard.helius.dev/api-keys).

````

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