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

> Cantumkan akun SPL Token dan Token-2022 yang dimiliki dompet Solana pada slot sebelumnya atau tepat setelah transaksi tertentu, dengan filter mint dan paginasi.

> [!NOTE]
>
> `getHistoricalTokenAccountsByOwner` masih dalam versi Beta. Parameter, harga, format respons, dan cakupan data dapat berubah.

## Ikhtisar

`getHistoricalTokenAccountsByOwner` mengembalikan akun SPL Token dan Token-2022 yang dimiliki dompet pada slot sebelumnya, atau tepat setelah transaksi tertentu dalam slot tersebut. Ini adalah metode RPC eksklusif Helius. `getTokenAccountsByOwner` standar hanya mengembalikan status saat ini.

Dengan pengodean `jsonParsed`, jumlah token menggunakan nilai desimal setiap mint pada posisi yang diminta sehingga saldo mencerminkan jumlah yang dimiliki dompet pada saat tersebut.

Riwayat tersedia mulai slot 444,959,999 (7 September 2026), yaitu status pada awal epoch 1030.

`getHistoricalTokenAccountsByOwner` tersedia di mainnet untuk paket Business dan yang lebih tinggi, serta dikenai biaya 0 kredit per panggilan selama periode beta. Harga dapat berubah.

## Perbedaannya dari getTokenAccountsByOwner

* **Filter mint atau program bersifat opsional.** Tanpa filter, Anda mendapatkan setiap akun token yang dimiliki dompet. Untuk mempersempit hasil, tetapkan `mint` atau `programId` dalam objek konfigurasi (parameter ketiga), bukan keduanya.
* **Parameter kedua adalah objek kueri** yang memilih posisi dalam riwayat, bukan filter mint atau program.
* **`result.value` adalah objek** dengan `accounts` dan `paginationKey`, bukan array.

## Pilih posisi dalam riwayat

Parameter kedua adalah objek kueri:

* **Dihilangkan atau `{}`**: slot terindeks terbaru, dibatasi pada tingkat komitmen yang diminta.
* **`{ "slot": 445000000 }`**: akhir slot 445,000,000.
* **`{ "slot": 445000000, "transactionIndex": 10 }`**: tepat setelah transaksi pada indeks 10 dalam slot tersebut dieksekusi.

Lihat [Panduan Akun Historis](https://www.helius.dev/docs/id/rpc/historical-accounts.md) untuk mengetahui cara kerja posisi.

## Contoh permintaan

Permintaan ini mengembalikan akun token USDC milik dompet pada akhir 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" }
    ]
  }'
```

## Lakukan paginasi pada semua akun token

Hasil diurutkan berdasarkan mint, lalu berdasarkan alamat akun token. Setiap respons mengembalikan `value.accounts` dan `value.paginationKey`, yaitu kursor dalam format `<mint>:<tokenAccount>`. Teruskan kembali dalam permintaan berikutnya hingga nilainya menjadi `null`.

> [!WARNING]
>
> Sebuah halaman dapat berisi sedikit data, atau bahkan kosong, tetapi tetap menyertakan `paginationKey`. Hanya `paginationKey` dengan nilai `null` yang berarti Anda telah mencapai akhir.

Selalu teruskan `slot` secara eksplisit saat Anda melakukan paginasi. Jika Anda menghilangkannya, setiap halaman membaca slot terindeks terbaru sehingga halaman dapat berasal dari waktu yang berbeda.

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

## Baca respons

Setiap entri dalam `value.accounts` memiliki `pubkey` milik akun token dan objek `account`. Objek akun memiliki bidang yang sama seperti `getAccountInfo`, ditambah `lastUpdatedAt`:

* **`lastUpdatedAt.slot`** dan **`lastUpdatedAt.transactionIndex`** mengidentifikasi penulisan yang menghasilkan status ini.
* **`lastUpdatedAt.slot` sebesar 444,959,999 dengan `transactionIndex` bernilai `null`** berarti akun token belum berubah sejak cakupan riwayat dimulai.
* **`context.slot`** adalah slot terbaru yang telah diindeks Helius saat melayani permintaan, bukan slot yang Anda kueri.

## Kesalahan

| Kode | Arti |
| - | - |
| `-32018` | Slot berada sebelum cakupan riwayat dimulai (slot 444,959,999) |
| `-32004` | Slot lebih baru daripada yang diizinkan oleh tingkat komitmen yang diminta. Gunakan `confirmed` atau kueri slot yang lebih lama |
| `-32602` | Parameter tidak valid, seperti menggunakan `mint` dan `programId` sekaligus, `programId` yang bukan program token, atau `paginationKey` dengan mint yang tidak cocok dengan `mint` |
| `-32601` | Metode tidak ditemukan. Panggil endpoint mainnet Helius atau Gatekeeper Anda; metode ini tidak tersedia di devnet |

## Metode terkait

> [card] [Historical Accounts Guide](https://www.helius.dev/docs/id/rpc/historical-accounts.md)
>
> Cara kerja posisi, cakupan, dan lastUpdatedAt untuk metode akun historis

> [card] [getHistoricalAccountInfo](https://www.helius.dev/docs/id/api-reference/rpc/http/gethistoricalaccountinfo.md)
>
> Baca satu akun pada slot sebelumnya

> [card] [getTransactionsForAddress](https://www.helius.dev/docs/id/rpc/gettransactionsforaddress.md)
>
> Temukan slot dan transactionIndex dari transaksi yang ingin Anda periksa

> [card] [getTokenAccountsByOwnerV2](https://www.helius.dev/docs/id/api-reference/rpc/http/gettokenaccountsbyownerv2.md)
>
> Lakukan paginasi pada akun token dompet saat ini

## Parameter Permintaan

**owner** `string` *required*

Alamat dompet yang memiliki akun token, dengan pengodean Base-58. Teruskan dompet pemilik, bukan akun token.

**slot** `number`

Slot tempat status akan dibaca. Mengembalikan akun sebagaimana keadaannya pada akhir slot ini. Slot paling awal yang didukung adalah 444959999, yaitu status pada awal epoch 1030. Jika dihilangkan, membaca slot terindeks terbaru yang dibatasi pada tingkat komitmen yang diminta.

**transactionIndex** `number`

Posisi transaksi dalam slot. Mengembalikan status akun tepat setelah transaksi tersebut dieksekusi, bukan pada akhir slot. Memerlukan slot.

**mint** `string`

Hanya kembalikan akun token untuk mint ini. Tidak dapat digabungkan dengan programId.

**programId** `string`

Hanya kembalikan akun token yang dimiliki oleh program token ini. Tidak dapat digabungkan dengan mint.

* `TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA`
* `TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb`

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

Format pengodean untuk data akun. Dengan jsonParsed, jumlah token menggunakan nilai desimal mint pada posisi yang diminta. base58 dan biner tidak didukung.

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

**dataSlice** `object`

Hanya kembalikan sebagian data setiap akun. Berlaku untuk pengodean base64 dan base64+zstd.

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

Offset byte tempat pembacaan dimulai.

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

Jumlah byte yang akan dikembalikan.

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

Jumlah maksimum akun token yang akan dikembalikan (1-5,000).

**paginationKey** `string`

Kursor dari paginationKey respons sebelumnya, dalam format `&lt;mint&gt;:&lt;tokenAccount&gt;`. Jika Anda juga menetapkan mint, mint kursor harus cocok dengannya.

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

Tingkat komitmen. processed tidak didukung.

* `finalized`
* `confirmed`

**minContextSlot** `number`

Slot minimum tempat permintaan dapat dievaluasi.


## OpenAPI

````yaml id/openapi/rpc-http/getHistoricalTokenAccountsByOwner.yaml POST /
openapi: 3.1.0
info:
  title: API RPC Solana
  version: 1.0.0
  description: >-
    API historis untuk akun token Solana guna mencantumkan akun SPL Token dan
    Token-2022 yang dimiliki dompet pada slot sebelumnya, dengan filter mint
    atau program token opsional dan paginasi berbasis kursor.
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
servers:
  - url: https://mainnet.helius-rpc.com
    description: Titik akhir RPC Mainnet
security: []
paths:
  /:
    post:
      tags:
        - RPC
      summary: getHistoricalTokenAccountsByOwner
      description: >
        **Beta.** Parameter, format respons, dan cakupan data dapat berubah.


        Mengembalikan akun SPL Token dan Token-2022 yang dimiliki dompet pada
        slot sebelumnya, atau

        tepat setelah transaksi tertentu di dalam slot tersebut. Metode RPC
        Helius ini

        secara default mengembalikan setiap akun token. Persempit hasil dengan
        mint atau

        programId token dalam objek konfigurasi.


        Hasil diurutkan berdasarkan mint, lalu berdasarkan alamat akun token.
        Suatu halaman dapat berisi sedikit data atau

        kosong dan tetap mengembalikan paginationKey;

        lanjutkan paginasi hingga paginationKey bernilai 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: Versi protokol JSON-RPC.
                  default: '2.0'
                id:
                  type: string
                  example: '1'
                  description: Pengidentifikasi unik untuk permintaan.
                  default: '1'
                method:
                  type: string
                  enum:
                    - getHistoricalTokenAccountsByOwner
                  example: getHistoricalTokenAccountsByOwner
                  description: Nama metode RPC yang akan dipanggil.
                  default: getHistoricalTokenAccountsByOwner
                params:
                  type: array
                  description: >-
                    Larik yang berisi alamat dompet pemilik, objek kueri
                    opsional yang memilih posisi dalam riwayat, dan objek
                    konfigurasi opsional.
                  minItems: 1
                  maxItems: 3
                  default:
                    - 86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY
                    - slot: 445000000
                    - encoding: jsonParsed
                      limit: 2
                  items:
                    oneOf:
                      - type: string
                        title: Pemilik
                        description: >-
                          Alamat dompet dengan pengodean base-58 yang memiliki
                          akun token. Masukkan dompet pemilik, bukan akun token.
                        example: 86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY
                      - $ref: '#/components/schemas/HistoricalAccountQuery'
                        title: Kueri
                      - type: object
                        title: Konfigurasi
                        description: >-
                          Objek konfigurasi opsional. Tetapkan paling banyak
                          salah satu dari mint atau programId.
                        properties:
                          mint:
                            type: string
                            description: >-
                              Hanya kembalikan akun token untuk mint ini. Tidak
                              dapat digabungkan dengan programId.
                            example: EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v
                          programId:
                            type: string
                            description: >-
                              Hanya kembalikan akun token yang dimiliki program
                              token ini. Tidak dapat digabungkan dengan mint.
                            enum:
                              - TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                              - TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb
                            example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                          encoding:
                            type: string
                            description: >-
                              Format pengodean untuk data akun. Dengan
                              jsonParsed, jumlah token menggunakan desimal mint
                              pada posisi yang diminta. base58 dan binary tidak
                              didukung.
                            enum:
                              - base64
                              - base64+zstd
                              - jsonParsed
                            default: base64
                            example: jsonParsed
                          dataSlice:
                            $ref: '#/components/schemas/DataSliceConfig'
                          limit:
                            type: integer
                            description: >-
                              Jumlah maksimum akun token yang akan dikembalikan
                              (1-5.000).
                            minimum: 1
                            maximum: 5000
                            default: 5000
                            example: 1000
                          paginationKey:
                            type: string
                            description: >-
                              Kursor dari paginationKey respons sebelumnya,
                              dalam format `<mint>:<tokenAccount>`. Jika Anda
                              juga menetapkan mint, mint kursor harus cocok
                              dengannya.
                            example: >-
                              11112zAgXhc6hGfdfr5anSY91mq7Cs4HHpSVEQc4ASG:EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
                          commitment:
                            type: string
                            description: Tingkat komitmen. processed tidak didukung.
                            enum:
                              - finalized
                              - confirmed
                            default: finalized
                            example: finalized
                          minContextSlot:
                            type: integer
                            description: Slot minimum tempat permintaan dapat dievaluasi.
                            example: 445000000
                        additionalProperties: false
      responses:
        '200':
          description: Berhasil mengambil halaman akun token historis.
          content:
            application/json:
              schema:
                type: object
                properties:
                  jsonrpc:
                    type: string
                    description: Versi protokol JSON-RPC.
                    enum:
                      - '2.0'
                    example: '2.0'
                  id:
                    type: string
                    description: Pengidentifikasi yang cocok dengan permintaan.
                    example: '1'
                  result:
                    type: object
                    properties:
                      context:
                        $ref: '#/components/schemas/HistoricalContext'
                      value:
                        type: object
                        properties:
                          accounts:
                            type: array
                            description: >-
                              Akun token di halaman ini, diurutkan berdasarkan
                              mint lalu berdasarkan alamat akun token.
                            items:
                              $ref: '#/components/schemas/HistoricalKeyedAccount'
                          paginationKey:
                            oneOf:
                              - type: string
                              - type: 'null'
                            description: >-
                              Kursor untuk halaman berikutnya, dalam format
                              `<mint>:<tokenAccount>`, atau null setelah setiap
                              akun dikembalikan. Halaman yang berisi sedikit
                              data atau kosong dengan paginationKey berarti
                              pemindaian berhenti lebih awal, bukan berarti Anda
                              telah mencapai akhir.
                            example: >-
                              11112zAgXhc6hGfdfr5anSY91mq7Cs4HHpSVEQc4ASG:EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
        '400':
          description: >-
            Permintaan Buruk - Parameter permintaan tidak valid atau permintaan
            tidak terbentuk dengan benar.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32602
                  message: Parameter tidak valid
                id: '1'
        '401':
          description: Tidak Sah - Kunci API tidak valid atau tidak ada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32001
                  message: Tidak sah
                id: '1'
        '429':
          description: Terlalu Banyak Permintaan - Batas laju terlampaui.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32005
                  message: Terlalu banyak permintaan
                id: '1'
        '500':
          description: Kesalahan Server Internal - Terjadi kesalahan pada server.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32603
                  message: Kesalahan internal
                id: '1'
        '503':
          description: Layanan Tidak Tersedia - Layanan tidak tersedia untuk sementara.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32002
                  message: Layanan tidak tersedia
                id: '1'
        '504':
          description: Waktu Tunggu Gateway Habis - Waktu permintaan habis.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32003
                  message: Waktu tunggu gateway habis
                id: '1'
      security:
        - ApiKeyQuery: []
components:
  schemas:
    HistoricalAccountQuery:
      type: object
      description: >-
        Posisi dalam riwayat yang akan dibaca. Abaikan atau kirim objek kosong
        untuk membaca slot terindeks terbaru.
      properties:
        slot:
          type: integer
          description: >-
            Slot tempat status dibaca. Mengembalikan akun sesuai status pada
            akhir slot ini. Slot paling awal yang didukung adalah 444959999,
            yaitu status pada awal epoch 1030. Jika diabaikan, slot terindeks
            terbaru akan dibaca, dibatasi pada komitmen yang diminta.
          minimum: 444959999
          example: 445000000
        transactionIndex:
          type: integer
          description: >-
            Posisi transaksi di dalam slot. Mengembalikan status akun tepat
            setelah transaksi tersebut dijalankan, bukan pada akhir slot.
            Memerlukan slot.
          minimum: 0
          maximum: 16777214
          example: 10
      additionalProperties: false
    DataSliceConfig:
      type: object
      description: >-
        Hanya kembalikan potongan data setiap akun. Berlaku untuk pengodean
        base64 dan base64+zstd.
      properties:
        offset:
          type: integer
          description: Offset byte untuk mulai membaca.
          example: 0
        length:
          type: integer
          description: Jumlah byte yang akan dikembalikan.
          example: 8
      required:
        - offset
        - length
    HistoricalContext:
      type: object
      description: Metadata respons.
      properties:
        slot:
          type: integer
          description: >-
            Slot terbaru yang telah diindeks oleh penyimpanan riwayat saat
            melayani permintaan. Ini bukan slot yang Anda kueri.
          example: 468129571
    HistoricalKeyedAccount:
      type: object
      properties:
        pubkey:
          type: string
          description: Alamat akun token dengan pengodean base-58.
          example: EKyGnXReqmmXyqBHmMjV2CKCLafJS47xyhXXZ5WuFMxD
        account:
          $ref: '#/components/schemas/HistoricalAccount'
      required:
        - pubkey
        - account
    ErrorResponse:
      type: object
      properties:
        jsonrpc:
          type: string
          description: Versi protokol JSON-RPC.
          enum:
            - '2.0'
          example: '2.0'
        error:
          type: object
          properties:
            code:
              type: integer
              description: Kode kesalahan.
              example: -32602
            message:
              type: string
              description: Pesan kesalahan.
            data:
              type: object
              description: Data tambahan tentang kesalahan.
        id:
          type: string
          description: Pengidentifikasi yang cocok dengan permintaan.
          example: '1'
    HistoricalAccount:
      type: object
      description: >-
        Akun sebagaimana statusnya pada posisi yang diminta, beserta lokasi
        terakhir status tersebut ditulis.
      properties:
        lamports:
          type: integer
          description: Jumlah lamport yang ditetapkan ke akun ini.
          example: 531589475273
        owner:
          type: string
          description: >-
            Pubkey dengan pengodean base-58 dari program yang menerima penetapan
            akun ini.
          example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
        data:
          description: >-
            Data akun. Dengan base64 atau base64+zstd, berupa larik dua elemen
            yang berisi data terenkode dan pengodeannya. Dengan jsonParsed,
            berupa objek dengan program, parsed, dan space. Akun yang tidak
            dapat diurai akan kembali menggunakan larik base64.
          oneOf:
            - type: array
              items:
                type: string
            - type: object
              properties:
                program:
                  type: string
                  description: Nama program yang memiliki akun.
                  example: spl-token
                parsed:
                  type: object
                  description: Status akun terurai yang khusus untuk program.
                space:
                  type: integer
                  description: Ukuran data akun.
                  example: 82
        executable:
          type: boolean
          description: Apakah akun berisi program.
          example: false
        rentEpoch:
          type: integer
          description: >-
            Epoch saat akun ini selanjutnya harus membayar sewa. Akun bebas sewa
            melaporkan nilai maksimum u64.
        space:
          type: integer
          description: Ukuran data akun dalam byte.
          example: 82
        lastUpdatedAt:
          $ref: '#/components/schemas/AccountWritePosition'
      required:
        - lamports
        - owner
        - data
        - executable
        - rentEpoch
        - space
        - lastUpdatedAt
    AccountWritePosition:
      type: object
      description: >-
        Lokasi terakhir status yang dikembalikan ditulis, pada atau sebelum
        posisi yang diminta.
      properties:
        slot:
          type: integer
          description: >-
            Slot penulisan terakhir. Nilai 444959999 dengan transactionIndex
            null berarti akun belum berubah sejak cakupan riwayat dimulai.
          example: 444999837
        transactionIndex:
          oneOf:
            - type: integer
            - type: 'null'
          description: >-
            Posisi transaksi yang melakukan penulisan terakhir. Null jika
            penulisan terjadi di luar transaksi (misalnya, imbalan epoch), atau
            jika akun belum berubah sejak cakupan riwayat dimulai.
          example: 700
      required:
        - slot
        - transactionIndex
  securitySchemes:
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api-key
      description: >-
        Kunci API Helius Anda. Anda bisa mendapatkannya secara gratis di
        [dasbor](https://dashboard.helius.dev/api-keys).

````

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