> ## 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 — это расширенная версия getProgramAccounts с пагинацией на основе курсора и обновлениями changedSinceSlot для запросов к большим наборам учетных записей Solana.

## Обзор

`getProgramAccountsV2` — это расширенная версия стандартного метода `getProgramAccounts`, предназначенная для приложений, которым необходимо эффективно запрашивать большие наборы учетных записей, принадлежащих определенным программам Solana. Этот метод поддерживает пагинацию на основе курсора и инкрементальные обновления.

<Info>
  **Новые возможности V2:**

  * **Пагинация на основе курсора**: задайте лимит от 1 до 10 000 учетных записей на запрос
  * **Инкрементальные обновления**: используйте `changedSinceSlot`, чтобы получать только недавно измененные учетные записи
  * **Повышенная производительность**: предотвращает тайм-ауты и сокращает использование памяти при работе с большими наборами данных
  * **Обратная совместимость**: поддерживает все существующие параметры `getProgramAccounts`
  * **Необязательный `withContext`**: значение `true` добавляет `slot` и `apiVersion` в `result.context`; если параметр не указан или равен `false`, эти поля не включаются
</Info>

## Основные преимущества

<CardGroup cols={2}>
  <Card title="Scalable Queries" icon="chart-line">
    Эффективно обрабатывайте программы с миллионами учетных записей, разбивая результаты на страницы
  </Card>

  <Card title="Real-time Sync" icon="arrows-rotate">
    Используйте `changedSinceSlot` для инкрементальных обновлений и синхронизации данных в реальном времени
  </Card>

  <Card title="Prevent Timeouts" icon="clock">
    Благодаря пагинации большие запросы, которые раньше завершались по тайм-ауту, теперь выполняются надежно
  </Card>

  <Card title="Memory Efficient" icon="microchip">
    Обрабатывайте данные частями вместо одновременной загрузки всего набора в память
  </Card>
</CardGroup>

## Рекомендации по пагинации

<Warning>
  **Важное поведение пагинации**: на завершение пагинации указывает только отсутствие возвращенных учетных записей. Из-за фильтрации API может вернуть меньше учетных записей, чем задано вашим лимитом. Всегда продолжайте пагинацию, пока `paginationKey` не станет равен `null`.
</Warning>

### Базовая схема пагинации

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

### Инкрементальные обновления

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

## Советы по производительности

<Tip>
  **Оптимальный размер лимита**: в большинстве случаев лимит от 1 000 до 5 000 учетных записей на запрос обеспечивает оптимальный баланс производительности и надежности.
</Tip>

* **Начните с меньших лимитов** (1000) и увеличивайте их с учетом производительности вашей сети
* **Используйте подходящую кодировку**: `jsonParsed` для удобства, `base64` для производительности
* **Применяйте фильтры**, чтобы уменьшить размер набора данных перед пагинацией
* **Сохраняйте `paginationKey`**, чтобы возобновить запросы после прерывания
* **Отслеживайте время ответа** и соответствующим образом корректируйте лимиты

## `withContext` (необязательно)

Логическое значение в объекте конфигурации программы (`params[1]`). Изменяется только структура `result`, а не фильтры, лимиты или пагинация.

```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 }
}}
```

## Миграция с getProgramAccounts

Перейти с исходного метода просто: замените имя метода и добавьте параметры пагинации.

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

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

<CardGroup cols={2}>
  <Card title="getProgramAccounts" icon="code" href="/docs/ru/api-reference/rpc/http/getprogramaccounts">
    Исходный метод без пагинации
  </Card>

  <Card title="getTokenAccountsByOwnerV2" icon="wallet" href="/docs/ru/api-reference/rpc/http/gettokenaccountsbyownerv2">
    Метод V2 для запросов учетных записей токенов
  </Card>
</CardGroup>

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

<ParamField body="address" type="string" required>
  Публичный ключ (адрес) программы Solana, учетные записи которой необходимо запросить, в виде строки с кодировкой base-58.
</ParamField>

<ParamField body="commitment" type="string">
  Уровень подтверждения для запроса.

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

<ParamField body="minContextSlot" type="number">
  Минимальный слот, в котором может быть обработан запрос.
</ParamField>

<ParamField body="withContext" type="boolean">
  Если задано значение `true`, возвращает `result.context` (метаданные снимка: `slot`, `apiVersion`) и помещает
  `accounts` и `paginationKey` внутрь `result.value`. Если задано значение `false` или параметр не указан,
  эти поля находятся непосредственно в `result` (например, `result.accounts`). Применяются те же фильтры и лимиты.
</ParamField>

<ParamField body="encoding" type="string">
  Формат кодировки возвращаемых данных учетной записи.

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

<ParamField body="dataSlice" type="object">
  Запросить срез данных учетной записи.
</ParamField>

<ParamField body="dataSlice.length" type="number">
  Количество возвращаемых байтов.
</ParamField>

<ParamField body="dataSlice.offset" type="number">
  Смещение в байтах, с которого начинается чтение.
</ParamField>

<ParamField body="limit" type="number">
  Максимальное количество учетных записей, возвращаемых на один запрос (1–10 000).
</ParamField>

<ParamField body="paginationKey" type="string">
  Курсор пагинации в кодировке base-58 для получения последующих страниц. Используйте paginationKey из предыдущего ответа.
</ParamField>

<ParamField body="changedSinceSlot" type="number">
  Возвращать только учетные записи, измененные в этом слоте или после него. Полезно для инкрементальных обновлений.
</ParamField>

<ParamField body="filters" type="array">
  Мощная система фильтрации для эффективного поиска определенных шаблонов данных учетных записей Solana.
</ParamField>


## OpenAPI

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

        больших наборов аккаунтов, принадлежащих определённым программам Solana.
        Позволяет получать данные инкрементально 

        с настраиваемым размером страницы до 10 000 аккаунтов на запрос.
        Параметр changedSinceSlot позволяет получать 

        только аккаунты, изменённые с момента указанного слота блокчейна, что
        идеально подходит для индексирования в реальном времени и рабочих
        процессов 

        синхронизации данных. Необходим для приложений, работающих с
        крупномасштабным поиском программных аккаунтов, 

        таких как протоколы DeFi, маркетплейсы NFT и платформы
        блокчейн-аналитики.


        Примечание. Конец пагинации определяется только отсутствием возвращённых
        аккаунтов. Из-за фильтрации API может вернуть меньше аккаунтов, 

        чем задано в лимите. Продолжайте пагинацию, пока paginationKey не примет
        значение null.


        **withContext**: необязательное логическое значение в объекте
        конфигурации (наряду с encoding, limit и другими параметрами). Если 

        `withContext` имеет значение `true`, RPC возвращает стандартную
        обёрнутую структуру Solana: `result.context` (метаданные 

        снимка, включая `slot` и обычно `apiVersion`) и `result.value`,
        содержащий `accounts`, `paginationKey`. 

        Если `withContext` имеет значение `false` или не указан, эти поля
        возвращаются непосредственно в `result`

        (например, `result.accounts`). Фильтры, лимиты и поведение пагинации не
        меняются; отличается только JSON-структура 

        `result`.
      operationId: getProgramAccountsV2
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - jsonrpc
                - id
                - method
                - params
              properties:
                jsonrpc:
                  type: string
                  description: Версия протокола JSON-RPC.
                  enum:
                    - '2.0'
                  example: '2.0'
                  default: '2.0'
                id:
                  type: string
                  description: Уникальный идентификатор запроса.
                  example: '1'
                  default: '1'
                method:
                  type: string
                  description: Имя вызываемого метода RPC.
                  enum:
                    - getProgramAccountsV2
                  example: getProgramAccountsV2
                  default: getProgramAccountsV2
                params:
                  type: array
                  description: Параметры расширенного метода с пагинацией.
                  default:
                    - TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                    - encoding: base64
                      limit: 1000
                  items:
                    oneOf:
                      - type: string
                        description: >-
                          Открытый ключ (адрес) программы Solana, для которой
                          запрашиваются аккаунты, в виде строки, закодированной
                          в base-58.
                        example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
                      - type: object
                        description: >-
                          Расширенные параметры конфигурации с поддержкой
                          пагинации для оптимизации запросов программных
                          аккаунтов.
                        properties:
                          commitment:
                            type: string
                            description: Уровень подтверждения для запроса.
                            enum:
                              - confirmed
                              - finalized
                              - processed
                            example: finalized
                          minContextSlot:
                            type: integer
                            description: >-
                              Минимальный слот, на котором может быть обработан
                              запрос.
                            example: 1000
                          withContext:
                            type: boolean
                            description: >
                              Если указано `true`, возвращает `result.context`
                              (метаданные снимка: `slot`, `apiVersion`) и
                              помещает

                              `accounts` и `paginationKey` в `result.value`.
                              Если указано `false` или значение не задано,

                              эти поля находятся непосредственно в `result`
                              (например, `result.accounts`). Применяются те же
                              фильтры и лимиты.
                            example: true
                          encoding:
                            type: string
                            description: Формат кодирования возвращаемых данных аккаунта.
                            enum:
                              - jsonParsed
                              - base58
                              - base64
                              - base64+zstd
                            example: base64
                          dataSlice:
                            type: object
                            description: Запрашивает срез данных аккаунта.
                            properties:
                              length:
                                type: integer
                                description: Количество возвращаемых байтов.
                                example: 50
                              offset:
                                type: integer
                                description: >-
                                  Смещение в байтах, с которого начинается
                                  чтение.
                                example: 0
                          limit:
                            type: integer
                            description: >-
                              Максимальное количество аккаунтов, возвращаемых за
                              один запрос (1–10 000).
                            minimum: 1
                            maximum: 10000
                            example: 1000
                          paginationKey:
                            type: string
                            description: >-
                              Курсор пагинации в кодировке base-58 для получения
                              последующих страниц. Используйте paginationKey из
                              предыдущего ответа.
                            example: 9WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
                          changedSinceSlot:
                            type: integer
                            description: >-
                              Возвращает только аккаунты, изменённые в этом
                              слоте или после него. Полезно для инкрементальных
                              обновлений.
                            example: 12345678
                          filters:
                            type: array
                            description: >-
                              Мощная система фильтрации для эффективного запроса
                              определённых шаблонов данных аккаунтов Solana.
                            items:
                              oneOf:
                                - type: object
                                  description: >-
                                    Фильтрует аккаунты Solana по точному размеру
                                    их данных в байтах.
                                  properties:
                                    dataSize:
                                      type: integer
                                      description: >-
                                        Точный размер данных аккаунта в байтах
                                        для фильтрации.
                                      example: 165
                                - type: object
                                  description: >-
                                    Фильтрует аккаунты Solana путём сравнения
                                    данных по указанным смещениям в памяти
                                    (самый мощный фильтр).
                                  properties:
                                    memcmp:
                                      type: object
                                      description: >-
                                        Фильтр сравнения памяти для поиска
                                        аккаунтов с определёнными шаблонами
                                        данных.
                                      properties:
                                        offset:
                                          type: integer
                                          description: >-
                                            Смещение в байтах в данных аккаунта, по
                                            которому выполняется сравнение.
                                          example: 4
                                        bytes:
                                          type: string
                                          description: >-
                                            Данные в кодировке base-58 для сравнения
                                            по указанному смещению.
                                          example: 3Mc6vR
      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:
                    oneOf:
                      - $ref: '#/components/schemas/ProgramAccountsV2Page'
                        title: без withContext
                      - type: object
                        title: с withContext
                        description: >-
                          Обёрнутый результат, когда параметр `withContext` в
                          настройках запроса имеет значение `true`.
                        required:
                          - context
                          - value
                        properties:
                          context:
                            type: object
                            description: >-
                              Метаданные снимка для ответа узла (согласованность
                              слота, отладка).
                            properties:
                              slot:
                                type: integer
                                description: Слот, на котором узел сформировал этот ответ.
                                example: 411895550
                              apiVersion:
                                type: string
                                description: Версия RPC API, если доступна.
                                example: 3.1.9
                          value:
                            $ref: '#/components/schemas/ProgramAccountsV2Page'
        '400':
          description: >-
            Неверный запрос — недопустимые параметры или неправильный формат
            запроса.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32602
                  message: Недопустимые параметры
                  data: {}
                id: '1'
        '401':
          description: Не авторизовано — ключ API недействителен или отсутствует.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32001
                  message: Не авторизовано
                  data: {}
                id: '1'
        '429':
          description: Слишком много запросов — превышен лимит частоты запросов.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32005
                  message: Слишком много запросов
                  data: {}
                id: '1'
        '500':
          description: Внутренняя ошибка сервера — на сервере произошла ошибка.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32603
                  message: Внутренняя ошибка
                  data: {}
                id: '1'
        '503':
          description: Сервис недоступен — сервис временно недоступен.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32002
                  message: Сервис недоступен
                  data: {}
                id: '1'
        '504':
          description: Время ожидания шлюза истекло — время ожидания запроса истекло.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                jsonrpc: '2.0'
                error:
                  code: -32003
                  message: Время ожидания шлюза истекло
                  data: {}
                id: '1'
      security:
        - ApiKeyQuery: []
components:
  schemas:
    ProgramAccountsV2Page:
      type: object
      description: >-
        Программные аккаунты с пагинацией. Если withContext имеет значение false
        или не указан, эти поля находятся непосредственно в result; если
        withContext имеет значение true — в result.value.
      properties:
        accounts:
          type: array
          description: Список программных аккаунтов на текущей странице.
          items:
            $ref: '#/components/schemas/ProgramAccountV2Entry'
        paginationKey:
          type: string
          description: >-
            Курсор пагинации для следующей страницы. Имеет значение null, только
            если аккаунты не возвращены (конец пагинации). Из-за фильтрации
            может быть возвращено меньше аккаунтов, чем задано в лимите, но это
            не означает конец пагинации.
          example: 8WzDXwBbmkg8ZTbNMqUxvQRAyrZzDsGYdLVL9zYtAWWM
          nullable: true
    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'
    ProgramAccountV2Entry:
      type: object
      properties:
        pubkey:
          type: string
          description: Открытый ключ аккаунта в виде строки, закодированной в base-58.
          example: CxELquR1gPP8wHe33gZ4QxqGB3sZ9RSwsJ2KshVewkFY
        account:
          type: object
          description: Сведения об аккаунте.
          properties:
            lamports:
              type: integer
              description: Количество лампортов, назначенных этому аккаунту.
              example: 15298080
            owner:
              type: string
              description: >-
                Открытый ключ программы, которой назначен этот аккаунт, в
                кодировке base-58.
              example: TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
            data:
              type: array
              description: >-
                Данные аккаунта в виде закодированных двоичных данных или в
                формате JSON.
              items:
                type: string
              example:
                - 2R9jLfiAQ9bgdcw6h8s44439
                - base64
            executable:
              type: boolean
              description: Указывает, содержит ли аккаунт программу.
              example: false
            rentEpoch:
              type: integer
              description: >-
                Эпоха, в которой с этого аккаунта в следующий раз будет
                взиматься арендная плата.
              example: 28
            space:
              type: integer
              description: Размер данных аккаунта.
              example: 165
  securitySchemes:
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api-key
      description: >-
        Ваш ключ Helius API. Его можно бесплатно получить на [панели
        управления](https://dashboard.helius.dev/api-keys).

````

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