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

# parsedTransactionSubscribe

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

Создайте подписку. Каждая подтвержденная транзакция, соответствующая фильтру, поступает как `parsedTransactionNotification` уже в декодированном виде: каждая инструкция содержит именованные аргументы и аккаунты, а транзакция — комиссию, полный список ключей аккаунтов, `summary` уровня транзакции, а также переводы SOL и токенов.

## Конечные точки

Parsed Streams доступен на всех тарифах и обслуживается через конечную точку [Gatekeeper](/docs/ru/gatekeeper/overview) — тот же хост, который используется для трафика Helius RPC и WebSocket:

* `wss://beta.helius-rpc.com/?api-key=<API_KEY>`

## Авторизация

<ParamField query="api-key" type="string" required>
  Ваш ключ API Helius, переданный в параметре запроса `api-key` или заголовке `x-api-key`. Если ключ отсутствует или недействителен, запрос отклоняется с HTTP 401.
</ParamField>

## Тело запроса

<ParamField body="params" type="array" required>
  <Expandable title="Filter" defaultOpen>
    Необходимо указать хотя бы одно из полей `programs` или `accounts.include`. Заданные поля объединяются оператором **AND**: для совпадения инструкция должна соответствовать всем полям.

    <ParamField body="programs" type="string[]">
      Идентификаторы программ для сопоставления (адреса base58, а не имена). Инструкция совпадает, если ее программа входит в этот список. Внутри списка применяется OR.
    </ParamField>

    <ParamField body="instructionNames" type="string[]">
      Имена декодированных инструкций, например `route`. Сначала выполняется точное сопоставление, затем — сопоставление без учета регистра и разделителей, поэтому `sharedAccountsRoute` также совпадает с именем `shared_accounts_route` в протоколе. Внутри списка применяется OR. Совпадать могут только инструкции, имя которых удалось определить по каталогу, поэтому используйте имена из [describeProgram](/docs/ru/api-reference/parsed-streams/describeprogram).
    </ParamField>

    <ParamField body="accounts.include" type="string[]">
      Адреса аккаунтов. Инструкция совпадает, если любой из этих адресов присутствует в списке ее аккаунтов. Внутри списка применяется OR. Работает для всех инструкций, как декодированных, так и недекодированных. Сам идентификатор программы здесь не считается аккаунтом.
    </ParamField>

    <ParamField body="accounts.roles" type="object">
      Сопоставление имени роли декодированного аккаунта с адресом, например `{ "user_transfer_authority": "<pubkey>" }`. Должно выполняться каждое условие (между элементами применяется AND), а инструкция должна быть декодирована. Имена ролей сопоставляются **точно**, без приведения регистра, поэтому копируйте их из [describeProgram](/docs/ru/api-reference/parsed-streams/describeprogram), а не подбирайте самостоятельно.
    </ParamField>

    <ParamField body="includeFailed" type="boolean" default="false">
      Включать инструкции из неуспешных транзакций.
    </ParamField>

    <ParamField body="includeCpi" type="boolean" default="true">
      Внутренние инструкции (CPI) могут учитываться при сопоставлении. Установите `false`, чтобы сопоставлять только инструкции верхнего уровня.
    </ParamField>
  </Expandable>

  <Expandable title="Options">
    Второй параметр необязателен.

    <ParamField body="commitment" type="string" default="confirmed">
      Поддерживается только `confirmed`.
    </ParamField>

    <ParamField body="details" type="string" default="full">
      Содержимое каждого уведомления. `full`: транзакция целиком, все инструкции и `matchedIndexes`, указывающий на совпадения с фильтром. `matched`: только совпавшие инструкции, без списка индексов. `raw`: только совпавшие инструкции, каждая из которых сокращена до своей позиции, `programId` и блока `data` в формате base58, без декодированных полей и массива `accountKeys`. Используйте `matched`, если пропускная способность важнее контекста (полные полезные данные в среднем примерно втрое больше), и `raw`, если вы самостоятельно декодируете данные инструкций и вам нужны только байты.
    </ParamField>
  </Expandable>
</ParamField>

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

## Ответ

<ResponseField name="result" type="integer">
  Идентификатор подписки (необходим для отмены подписки)
</ResponseField>

<RequestExample>
  ```json Request theme={"system"}
  {
    "jsonrpc": "2.0",
    "id": 1,
    "method": "parsedTransactionSubscribe",
    "params": [
      {
        "programs": ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"],
        "instructionNames": ["route", "shared_accounts_route"],
        "accounts": {
          "include": ["So11111111111111111111111111111111111111112"],
          "roles": { "user_transfer_authority": "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" }
        },
        "includeFailed": false,
        "includeCpi": true
      },
      { "commitment": "confirmed", "details": "full" }
    ]
  }
  ```

  ```typescript TypeScript theme={"system"}
  import WebSocket from "ws";

  const ws = new WebSocket("wss://beta.helius-rpc.com/?api-key=<API_KEY>");

  ws.on("open", () => {
    ws.send(JSON.stringify({
      jsonrpc: "2.0",
      id: 1,
      method: "parsedTransactionSubscribe",
      params: [{ programs: ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"] }],
    }));
  });

  ws.on("message", (data) => {
    const msg = JSON.parse(data.toString());
    if (msg.method === "parsedTransactionNotification") {
      const { transaction, instructions, matchedIndexes } = msg.params.result.value;
      for (const i of matchedIndexes ?? instructions.keys()) {
        const ix = instructions[i];
        console.log(transaction.signature, ix.programName, ix.instructionName, ix.decoded?.args);
      }
    }
  });
  ```

  ```python Python theme={"system"}
  import asyncio, json, websockets

  URL = "wss://beta.helius-rpc.com/?api-key=<API_KEY>"

  async def main():
      async with websockets.connect(URL) as ws:
          await ws.send(json.dumps({
              "jsonrpc": "2.0", "id": 1, "method": "parsedTransactionSubscribe",
              "params": [{"programs": ["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"]}],
          }))
          async for raw in ws:
              msg = json.loads(raw)
              if msg.get("method") == "parsedTransactionNotification":
                  value = msg["params"]["result"]["value"]
                  for i in value.get("matchedIndexes") or range(len(value["instructions"])):
                      ix = value["instructions"][i]
                      print(ix.get("programName"), ix.get("instructionName"), (ix.get("decoded") or {}).get("args"))

  asyncio.run(main())
  ```
</RequestExample>

<ResponseExample>
  ```json Response theme={"system"}
  { "jsonrpc": "2.0", "id": 1, "result": 23 }
  ```

  ```json Notification theme={"system"}
  {
    "jsonrpc": "2.0",
    "method": "parsedTransactionNotification",
    "params": {
      "subscription": 23,
      "result": {
        "context": { "slot": 430172053 },
        "value": {
          "transaction": {
            "signature": "3riSYL4HTRxgQjLayt6L2JPaDR3oaEQg1H4v3fnjUxNU...",
            "slot": 430172053,
            "blockTime": null,
            "feePayer": "6jduWNCTQzG91JGBchfGGxd55Vi5FxJCCJEV18RkXzJX",
            "fee": 5000,
            "accountKeys": ["6jduWNCT...", "..."],
            "status": "ok",
            "error": null,
            "summary": {
              "type": "swap",
              "description": "6jduWNCTQzG91JGBchfGGxd55Vi5FxJCCJEV18RkXzJX swapped 0.001 SOL for 0.183985 EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v via Jupiter",
              "parsedData": {
                "type": "swap",
                "protocol": "jupiter",
                "kind": "swap",
                "in_amount": "1000000",
                "actual_out_amount": "183985",
                "input_mint": "So11111111111111111111111111111111111111112",
                "output_mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
              }
            },
            "nativeTransfers": [
              { "fromUserAccount": "6jduWNCT...", "toUserAccount": "DfXygSm4...", "amount": 1000000 }
            ],
            "tokenTransfers": [
              {
                "fromUserAccount": "6jduWNCT...",
                "toUserAccount": "AeUfFU6L...",
                "fromTokenAccount": "HLaEoW1s...",
                "toTokenAccount": "G13P9kSY...",
                "rawTokenAmount": 183985,
                "decimals": 6,
                "tokenStandard": "Fungible",
                "mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
              }
            ]
          },
          "instructions": [
            {
              "instructionIndex": 4,
              "innerInstructionIndex": null,
              "stackHeight": 1,
              "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
              "programName": "jupiter",
              "instructionName": "route",
              "summary": {
                "type": "swap",
                "description": "6jduWNCTQzG91JGBchfGGxd55Vi5FxJCCJEV18RkXzJX swapped 0.001 SOL for 0.183985 EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v via Jupiter",
                "parsedData": {
                  "type": "swap",
                  "protocol": "jupiter",
                  "kind": "swap",
                  "in_amount": "1000000",
                  "actual_out_amount": "183985",
                  "input_mint": "So11111111111111111111111111111111111111112",
                  "output_mint": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
                }
              },
              "decoded": {
                "args": { "in_amount": "1000000", "slippage_bps": 50 },
                "accounts": [
                  { "name": "user_transfer_authority", "pubkey": "9xQe...", "isSigner": true, "isWritable": false }
                ]
              }
            }
          ],
          "matchedIndexes": [8, 13]
        }
      }
    }
  }
  ```
</ResponseExample>

## Уведомления

Для каждой соответствующей транзакции отправляется одно уведомление на подписку. Внутри `params.result.value`:

* **`transaction`** — полный контекст: подпись, слот, комиссия (в лампортах), полный список `accountKeys`, `status`/`error`, `summary` уровня транзакции, а также извлеченные `nativeTransfers` и `tokenTransfers`.
* **`instructions`** — все инструкции в порядке выполнения, позиции которых определяются полями `instructionIndex`, `innerInstructionIndex` и `stackHeight`. Декодированные инструкции содержат именованные `decoded.args` и `decoded.accounts` (snake\_case, значения u64 в виде строк); недекодированные вместо них содержат `rawData` и `rawAccounts`.
* **`matchedIndexes`** — индексы в `instructions`, указывающие, какие инструкции соответствуют фильтру. При `details: "matched"` массив содержит только совпадения, а `matchedIndexes` отсутствует; при `details: "raw"` каждая совпавшая инструкция сокращается до своей позиции, `programId` и блока `data` в формате base58.

Подробное описание каждого поля полезных данных уведомления см. в [справочнике по протоколу в кратком руководстве](/docs/ru/parsed-streams/quickstart#уведомления).

## Управление подписками

Значение `result` из ответа на запрос подписки совпадает с числом в `params.subscription` каждого уведомления этой подписки. Сохраните его — оно потребуется, чтобы [отменить подписку](/docs/ru/api-reference/parsed-streams/parsedtransactionunsubscribe).

Проект может поддерживать до **5 одновременных подключений** на тарифе Free, до **10** на Developer и до **50** на Business и Professional. Этот лимит распределяется между всеми ключами API проекта. Для каждого подключения доступно до **25 подписок**. Все ограничения приведены в [обзоре](/docs/ru/api-reference/parsed-streams/overview#ограничения).


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