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

# getProgramAccountsV2

> getProgramAccountsV2 adalah versi getProgramAccounts yang disempurnakan dengan paginasi berbasis kursor dan pembaruan changedSinceSlot untuk mengueri kumpulan besar akun Solana.

## Ikhtisar

`getProgramAccountsV2` adalah versi yang disempurnakan dari metode standar `getProgramAccounts`, yang dirancang untuk aplikasi yang perlu mengueri kumpulan besar akun milik program Solana tertentu secara efisien. Metode ini menyediakan paginasi berbasis kursor dan kemampuan pembaruan inkremental.

<Info>
  **Fitur Baru di V2:**

  * **Paginasi berbasis kursor**: Konfigurasikan batas dari 1 hingga 10.000 akun per permintaan
  * **Pembaruan inkremental**: Gunakan `changedSinceSlot` untuk mengambil hanya akun yang baru saja dimodifikasi
  * **Performa lebih baik**: Mencegah waktu habis dan mengurangi penggunaan memori untuk kumpulan data besar
  * **Kompatibilitas mundur**: Mendukung semua parameter `getProgramAccounts` yang ada
  * **`withContext` opsional**: `true` menambahkan `slot` dan `apiVersion` di bawah `result.context`; hilangkan atau gunakan `false` agar keduanya tidak disertakan
</Info>

## Manfaat Utama

<CardGroup cols={2}>
  <Card title="Scalable Queries" icon="chart-line">
    Tangani program dengan jutaan akun melalui paginasi hasil yang efisien
  </Card>

  <Card title="Real-time Sync" icon="arrows-rotate">
    Gunakan `changedSinceSlot` untuk pembaruan inkremental dan sinkronisasi data secara real-time
  </Card>

  <Card title="Prevent Timeouts" icon="clock">
    Kueri besar yang sebelumnya mengalami waktu habis kini berfungsi secara andal dengan paginasi
  </Card>

  <Card title="Memory Efficient" icon="microchip">
    Proses data dalam beberapa bagian alih-alih memuat semuanya ke memori sekaligus
  </Card>
</CardGroup>

## Praktik Terbaik Paginasi

<Warning>
  **Perilaku Paginasi Penting**: Akhir paginasi hanya ditunjukkan ketika **tidak ada akun yang dikembalikan**. API dapat mengembalikan lebih sedikit akun daripada batas Anda karena pemfilteran—selalu lanjutkan paginasi hingga `paginationKey` adalah `null`.
</Warning>

### Pola Paginasi Dasar

```typescript theme={"system"}
let allAccounts = [];
let paginationKey = null;

do {
  const response = await fetch(`https://mainnet.helius-rpc.com/?api-key=${API_KEY}`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: '1',
      method: 'getProgramAccountsV2',
      params: [
        "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
        {
          encoding: 'base64',
          filters: [{ dataSize: 165 }],
          limit: 5000,
          ...(paginationKey && { paginationKey })
        }
      ]
    })
  });
  
  const data = await response.json();
  allAccounts.push(...data.result.accounts);
  paginationKey = data.result.paginationKey;
} while (paginationKey);
```

### Pembaruan Inkremental

```typescript theme={"system"}
// Get only accounts modified since slot 150000000
const incrementalUpdate = await fetch(`https://mainnet.helius-rpc.com/?api-key=${API_KEY}`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0',
    id: '1',
    method: 'getProgramAccountsV2',
    params: [
      programId,
      {
        encoding: 'jsonParsed',
        limit: 1000,
        changedSinceSlot: 150000000
      }
    ]
  })
});
```

## Tips Performa

<Tip>
  **Ukuran Batas Optimal**: Untuk sebagian besar kasus penggunaan, batas 1.000–5.000 akun per permintaan memberikan keseimbangan terbaik antara performa dan keandalan.
</Tip>

* **Mulai dengan batas yang lebih kecil** (1000), lalu tingkatkan berdasarkan performa jaringan Anda
* **Gunakan pengodean yang sesuai**: `jsonParsed` untuk kemudahan, `base64` untuk performa
* **Terapkan filter** untuk mengurangi ukuran kumpulan data sebelum paginasi
* **Simpan `paginationKey`** untuk melanjutkan kueri jika terhenti
* **Pantau waktu respons** dan sesuaikan batas sebagaimana diperlukan

## `withContext` (opsional)

Nilai Boolean pada objek konfigurasi program (`params[1]`). Hanya bentuk `result` yang berubah, bukan filter, batas, atau paginasi.

```json theme={"system"}
// Omitted or false
{ "jsonrpc": "2.0", "id": "1", "result": { "accounts": [], "paginationKey": null } }

// true — snapshot metadata plus page under `result.value`
{ "jsonrpc": "2.0", "id": "1", "result": {
  "context": { "slot": 411895550, "apiVersion": "3.1.9" },
  "value": { "accounts": [], "paginationKey": null }
}}
```

## Migrasi dari getProgramAccounts

Migrasi dari metode asli cukup mudah—cukup ganti nama metode dan tambahkan parameter paginasi:

```diff theme={"system"}
{
  "jsonrpc": "2.0",
  "id": "1",
- "method": "getProgramAccounts",
+ "method": "getProgramAccountsV2",
  "params": [
    "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
    {
      "encoding": "base64",
      "filters": [{ "dataSize": 165 }],
+     "limit": 5000
    }
  ]
}
```

## Metode Terkait

<CardGroup cols={2}>
  <Card title="getProgramAccounts" icon="code" href="/docs/id/api-reference/rpc/http/getprogramaccounts">
    Metode asli tanpa paginasi
  </Card>

  <Card title="getTokenAccountsByOwnerV2" icon="wallet" href="/docs/id/api-reference/rpc/http/gettokenaccountsbyownerv2">
    Metode V2 untuk kueri akun token
  </Card>
</CardGroup>

## Parameter Permintaan

<ParamField body="address" type="string" required>
  Kunci publik (alamat) program Solana yang akunnya akan dikueri, dalam bentuk string yang dikodekan dengan base-58.
</ParamField>

<ParamField body="commitment" type="string">
  Tingkat komitmen untuk permintaan.

  * `confirmed`
  * `finalized`
  * `processed`
</ParamField>

<ParamField body="minContextSlot" type="number">
  Slot minimum tempat permintaan dapat dievaluasi.
</ParamField>

<ParamField body="withContext" type="boolean">
  Jika `true`, mengembalikan `result.context` (metadata snapshot: `slot`, `apiVersion`) dan menempatkan
  `accounts` serta `paginationKey` di bawah `result.value`. Jika `false` atau dihilangkan,
  kolom tersebut muncul langsung pada `result` (misalnya `result.accounts`). Filter dan batas yang sama tetap berlaku.
</ParamField>

<ParamField body="encoding" type="string">
  Format pengodean untuk data akun yang dikembalikan.

  * `jsonParsed`
  * `base58`
  * `base64`
  * `base64+zstd`
</ParamField>

<ParamField body="dataSlice" type="object">
  Minta sebagian data akun.
</ParamField>

<ParamField body="dataSlice.length" type="number">
  Jumlah byte yang akan dikembalikan.
</ParamField>

<ParamField body="dataSlice.offset" type="number">
  Offset byte tempat pembacaan dimulai.
</ParamField>

<ParamField body="limit" type="number">
  Jumlah maksimum akun yang akan dikembalikan per permintaan (1–10.000).
</ParamField>

<ParamField body="paginationKey" type="string">
  Kursor paginasi yang dikodekan dengan base-58 untuk mengambil halaman berikutnya. Gunakan paginationKey dari respons sebelumnya.
</ParamField>

<ParamField body="changedSinceSlot" type="number">
  Hanya kembalikan akun yang dimodifikasi pada atau setelah nomor slot ini. Berguna untuk pembaruan inkremental.
</ParamField>

<ParamField body="filters" type="array">
  Sistem pemfilteran canggih untuk mengueri pola data akun Solana tertentu secara efisien.
</ParamField>


## OpenAPI

````yaml id/openapi/rpc-http/getProgramAccountsV2.yaml POST /
openapi: 3.1.0
info:
  title: Solana RPC API
  version: 1.0.0
  description: >-
    API pengindeksan akun program Solana yang ditingkatkan dengan paginasi
    berbasis kursor dan dukungan changedSinceSlot untuk mengkueri kumpulan besar
    akun milik program tertentu secara efisien. Mendukung pembaruan inkremental
    melalui pemfilteran berbasis slot untuk sinkronisasi data waktu nyata.
  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
  - url: https://devnet.helius-rpc.com
    description: Titik akhir RPC Devnet
security: []
paths:
  /:
    post:
      tags:
        - RPC
      summary: getProgramAccountsV2
      description: >
        Versi getProgramAccounts yang ditingkatkan dengan paginasi berbasis
        kursor dan dukungan changedSinceSlot untuk mengkueri 

        kumpulan besar akun milik program Solana tertentu secara efisien.
        Memungkinkan pengambilan data inkremental dengan 

        ukuran halaman yang dapat dikonfigurasi hingga 10.000 akun per
        permintaan. Parameter changedSinceSlot memungkinkan pengambilan 

        hanya akun yang diubah sejak slot blockchain tertentu, ideal untuk alur
        kerja pengindeksan dan sinkronisasi 

        data waktu nyata. Penting untuk aplikasi yang menangani penemuan akun
        program berskala besar, 

        seperti protokol DeFi, lokapasar NFT, dan platform analitik blockchain.


        Catatan: Akhir paginasi hanya ditunjukkan saat tidak ada akun yang
        dikembalikan. API mungkin mengembalikan akun lebih sedikit 

        daripada batas akibat pemfilteran—lanjutkan paginasi hingga
        paginationKey bernilai null.


        **withContext**: Boolean opsional pada objek konfigurasi (bersama
        encoding, limit, dan sebagainya). Saat 

        `withContext` bernilai `true`, RPC mengembalikan struktur terbungkus
        Solana standar: `result.context` (metadata 

        snapshot, termasuk `slot` dan biasanya `apiVersion`) serta
        `result.value` yang memuat `accounts`, `paginationKey`. 

        Saat `withContext` bernilai `false` atau dihilangkan, bidang tersebut
        dikembalikan langsung pada `result`

        (misalnya `result.accounts`). Filter, batas, dan perilaku paginasi tidak
        berubah; hanya struktur JSON 

        `result` yang berbeda.
      operationId: getProgramAccountsV2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - jsonrpc
                - id
                - method
                - params
              properties:
                jsonrpc:
                  type: string
                  description: Versi protokol JSON-RPC.
                  enum:
                    - '2.0'
                  example: '2.0'
                  default: '2.0'
                id:
                  type: string
                  description: Pengidentifikasi unik untuk permintaan.
                  example: '1'
                  default: '1'
                method:
                  type: string
                  description: Nama metode RPC yang akan dipanggil.
                  enum:
                    - getProgramAccountsV2
                  example: getProgramAccountsV2
                  default: getProgramAccountsV2
                params:
                  type: array
                  description: Parameter untuk metode paginasi yang ditingkatkan.
                  default:
                    - TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                    - encoding: base64
                      limit: 1000
                  items:
                    oneOf:
                      - type: string
                        description: >-
                          Kunci publik (alamat) program Solana yang akunnya akan
                          dikueri, sebagai string yang dikodekan dengan base-58.
                        example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                      - type: object
                        description: >-
                          Opsi konfigurasi yang ditingkatkan dengan dukungan
                          paginasi untuk mengoptimalkan kueri akun program.
                        properties:
                          commitment:
                            type: string
                            description: Tingkat komitmen untuk permintaan.
                            enum:
                              - confirmed
                              - finalized
                              - processed
                            example: finalized
                          minContextSlot:
                            type: integer
                            description: Slot minimum tempat permintaan dapat dievaluasi.
                            example: 1000
                          withContext:
                            type: boolean
                            description: >
                              Saat bernilai `true`, mengembalikan
                              `result.context` (metadata snapshot: `slot`,
                              `apiVersion`) dan menempatkan

                              `accounts` serta `paginationKey` di bawah
                              `result.value`. Saat bernilai `false` atau
                              dihilangkan,

                              bidang tersebut muncul langsung pada `result`
                              (misalnya `result.accounts`). Filter dan batas
                              yang sama tetap berlaku.
                            example: true
                          encoding:
                            type: string
                            description: >-
                              Format pengodean untuk data akun yang
                              dikembalikan.
                            enum:
                              - jsonParsed
                              - base58
                              - base64
                              - base64+zstd
                            example: base64
                          dataSlice:
                            type: object
                            description: Meminta potongan data akun.
                            properties:
                              length:
                                type: integer
                                description: Jumlah byte yang akan dikembalikan.
                                example: 50
                              offset:
                                type: integer
                                description: Offset byte tempat pembacaan dimulai.
                                example: 0
                          limit:
                            type: integer
                            description: >-
                              Jumlah maksimum akun yang dikembalikan per
                              permintaan (1–10.000).
                            minimum: 1
                            maximum: 10000
                            example: 1000
                          paginationKey:
                            type: string
                            description: >-
                              Kursor paginasi yang dikodekan dengan base-58
                              untuk mengambil halaman berikutnya. Gunakan
                              paginationKey dari respons sebelumnya.
                            example: 9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
                          changedSinceSlot:
                            type: integer
                            description: >-
                              Hanya mengembalikan akun yang diubah pada atau
                              setelah nomor slot ini. Berguna untuk pembaruan
                              inkremental.
                            example: 12345678
                          filters:
                            type: array
                            description: >-
                              Sistem pemfilteran canggih untuk mengkueri pola
                              data akun Solana tertentu secara efisien.
                            items:
                              oneOf:
                                - type: object
                                  description: >-
                                    Memfilter akun Solana berdasarkan ukuran
                                    data yang tepat dalam byte.
                                  properties:
                                    dataSize:
                                      type: integer
                                      description: >-
                                        Ukuran persis data akun dalam byte untuk
                                        pemfilteran.
                                      example: 165
                                - type: object
                                  description: >-
                                    Memfilter akun Solana dengan membandingkan
                                    data pada offset memori tertentu (filter
                                    paling canggih).
                                  properties:
                                    memcmp:
                                      type: object
                                      description: >-
                                        Filter perbandingan memori untuk
                                        menemukan akun dengan pola data
                                        tertentu.
                                      properties:
                                        offset:
                                          type: integer
                                          description: >-
                                            Offset byte dalam data akun untuk
                                            melakukan perbandingan.
                                          example: 4
                                        bytes:
                                          type: string
                                          description: >-
                                            Data yang dikodekan dengan base-58 untuk
                                            dibandingkan pada posisi offset yang
                                            ditentukan.
                                          example: 3Mc6vR
      responses:
        '200':
          description: Berhasil mengambil akun program yang dipaginasi.
          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:
                    oneOf:
                      - $ref: '#/components/schemas/ProgramAccountsV2Page'
                        title: tanpa withContext
                      - type: object
                        title: dengan withContext
                        description: >-
                          Hasil terbungkus saat `withContext` bernilai `true`
                          dalam opsi permintaan.
                        required:
                          - context
                          - value
                        properties:
                          context:
                            type: object
                            description: >-
                              Metadata snapshot untuk respons node (konsistensi
                              slot, debugging).
                            properties:
                              slot:
                                type: integer
                                description: Slot tempat node membuat respons ini.
                                example: 411895550
                              apiVersion:
                                type: string
                                description: Versi RPC API jika tersedia.
                                example: 3.1.9
                          value:
                            $ref: '#/components/schemas/ProgramAccountsV2Page'
        '400':
          description: >-
            Permintaan Buruk - Parameter permintaan tidak valid atau permintaan
            salah format.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32602
                  message: Parameter tidak valid
                  data: {}
                id: '1'
        '401':
          description: Tidak Diotorisasi - Kunci API tidak valid atau tidak ada.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32001
                  message: Tidak diotorisasi
                  data: {}
                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
                  data: {}
                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
                  data: {}
                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
                  data: {}
                id: '1'
        '504':
          description: Waktu Tunggu Gateway Habis - Waktu tunggu permintaan habis.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32003
                  message: Waktu tunggu gateway habis
                  data: {}
                id: '1'
      security:
        - ApiKeyQuery: []
components:
  schemas:
    ProgramAccountsV2Page:
      type: object
      description: >-
        Akun program yang dipaginasi. Bidang yang sama muncul pada result saat
        withContext bernilai false atau dihilangkan, atau di bawah result.value
        saat withContext bernilai true.
      properties:
        accounts:
          type: array
          description: Daftar akun program untuk halaman saat ini.
          items:
            $ref: '#/components/schemas/ProgramAccountV2Entry'
        paginationKey:
          type: string
          description: >-
            Kursor paginasi untuk halaman berikutnya. Bernilai null hanya saat
            tidak ada akun yang dikembalikan (akhir paginasi). Perhatikan bahwa
            jumlah akun yang dikembalikan mungkin lebih sedikit daripada batas
            akibat pemfilteran, tetapi ini tidak menunjukkan akhir paginasi.
          example: 8WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
          nullable: true
    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'
    ProgramAccountV2Entry:
      type: object
      properties:
        pubkey:
          type: string
          description: Pubkey akun sebagai string yang dikodekan dengan base-58.
          example: CxELquR1gPP8wHe33gZ4QxqGB3sZ9RSwsJ2KshVewkFY
        account:
          type: object
          description: Detail tentang akun.
          properties:
            lamports:
              type: integer
              description: Jumlah lamport yang ditetapkan untuk akun ini.
              example: 15298080
            owner:
              type: string
              description: >-
                Pubkey program yang dikodekan dengan base-58 dan menjadi tujuan
                penetapan akun ini.
              example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
            data:
              type: array
              description: Data akun dalam format biner terenkode atau JSON.
              items:
                type: string
              example:
                - 2R9jLfiAQ9bgdcw6h8s44439
                - base64
            executable:
              type: boolean
              description: Menunjukkan apakah akun berisi program.
              example: false
            rentEpoch:
              type: integer
              description: Epoch saat akun ini selanjutnya harus membayar sewa.
              example: 28
            space:
              type: integer
              description: Ukuran data akun.
              example: 165
  securitySchemes:
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api-key
      description: >-
        Kunci API Helius Anda. Anda dapat memperolehnya secara gratis di
        [dasbor](https://dashboard.helius.dev/api-keys).

````