> ## 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トランザクションを購読します。名前付き引数とアカウントを持つ完全なトランザクションを受信します。

サブスクリプションを開始します。フィルターに一致するすべての確認済みトランザクションは、すでにデコードされたインラインコードとして届きます：名前付き引数と名前付きアカウントを持つ各インストラクション、手数料、完全なアカウントキーリスト、トランザクションレベルのインラインコード、およびSOLとトークンの転送。

## エンドポイント

Parsed Streamsはクローズベータ中です。HeliusチームがあなたのプロジェクトIDをホワイトリストに登録し、接続エンドポイントを共有します：

* `wss://<ENDPOINT>/?api-key=<API_KEY>`

## 認証

<ParamField query="api-key" type="string" required>
  Helius APIキーを、インラインコードクエリパラメータまたはインラインコードヘッダーとして渡します。不足、無効、またはホワイトリストに登録されていないキーはHTTP 401で拒否されます。
</ParamField>

## 本体

<ParamField body="params" type="array" required>
  <Expandable title="フィルター" defaultOpen>
    INLIN\_CODE\_PLACEHOLDER\_f6304fa949df5a7e\_ENDまたはINLIN\_CODE\_PLACEHOLDER\_a0b21cd3f93ef393\_ENDのいずれかが必要です。設定したフィールドは**AND**で組み合わされます：インストラクションはすべて満たす必要があります。

    <ParamField body="programs" type="string[]">
      マッチするプログラムID (base58アドレス、名前ではありません)。インストラクションがこのリストの中にあるプログラムの場合、マッチします。リスト内でORです。
    </ParamField>

    <ParamField body="instructionNames" type="string[]">
      デコードされたインストラクション名、例えば`route`。最初に正確にマッチし、その後ケースやセパレーターに依存しないフォールバックでマッチします。したがって`sharedAccountsRoute`もワイヤー名`shared_accounts_route`にマッチします。リスト内でORです。名前を特定できたインストラクションのみがマッチできるので、[describeProgram](/docs/ja/api-reference/parsed-streams/describeprogram)から名前を取ってください。
    </ParamField>

    <ParamField body="accounts.include" type="string[]">
      アカウントアドレス。インストラクションがそのアカウントリストに任意のこれらを含む場合、マッチします。リスト内でORです。デコードされていないものを含むすべてのインストラクションに適用します。プログラムID自体はここではアカウントとしてカウントされません。
    </ParamField>

    <ParamField body="accounts.roles" type="object">
      デコードされたアカウント役割名をアドレスにマッピングしたオブジェクト、例えば`{ "user_transfer_authority": "<pubkey>" }`です。すべてのエントリを保持 (エントリ間でAND)し、インストラクションがデコードされている必要があります。役割名は正確に一致し、ケースフォールディングはありませんので、推測せずに[describeProgram](/docs/ja/api-reference/parsed-streams/describeprogram)からコピーしてください。
    </ParamField>

    <ParamField body="includeFailed" type="boolean" default="false">
      失敗したトランザクションからのインストラクションを含めます。
    </ParamField>

    <ParamField body="includeCpi" type="boolean" default="true">
      内部(CPI)インストラクションもマッチ対象です。インラインコードでトップレベルインストラクションのみをマッチさせます。
    </ParamField>
  </Expandable>

  <Expandable title="オプション">
    2番目のパラメータはオプションです。

    <ParamField body="commitment" type="string" default="confirmed">
      サポートされているのはインラインコードのみです。
    </ParamField>

    <ParamField body="details" type="string" default="full">
      各通知が持つ内容。インラインコード：全トランザクション、すべてのインストラクション、フィルターヒットを指すインラインコード。インラインコード：一致したインストラクションのみ、インデックスリストなし。インラインコード：一致したインストラクションのみ、それぞれが位置、インラインコード、およびbase58インラインコードblobに縮小され、デコードされたフィールドとインラインコード配列なし。帯域幅がコンテキストよりも重要な場合はインラインコードを使用し、インストラクションデータを自分でデコードしバイトのみが必要な場合はインラインコードを使用します。
    </ParamField>
  </Expandable>
</ParamField>

フィルターやオプション内の未知のフィールドは、静かに無視されずにインラインコードで拒否されるため、タイプミスは何も一致しない代わりに大声で失敗します。

## レスポンス

<ResponseField name="result" type="integer">
  サブスクリプションID（退会するために必要）
</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://<ENDPOINT>/?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://<ENDPOINT>/?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": [
            {
              "topIndex": 4,
              "innerIndex": 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>

## 通知

サブスクリプションごとに一致するトランザクションごとに1つの通知が届きます。インラインコード内:

* **インラインコード** — 完全なコンテキスト：署名、スロット、手数料（lamports）、完全なインラインコードリスト、インラインコード/インラインコード、トランザクションレベルのインラインコード、抽出されたインラインコードとインラインコード。
* **インラインコード** — 実行順にすべてのインストラクション、インラインコード、インラインコード、インラインコードで位置付け。デコードされたインストラクションは、名前付きインラインコードとインラインコードを持ちます（スネークケース、u64値は文字列として）。デコードされていないものはインラインコードとインラインコードを持ちます。
* **インラインコード** — フィルターが実際にヒットしたインラインコードを指すインデックス。インラインコードの場合、配列にはヒットのみが含まれ、インラインコードは欠如します。インラインコードでは、各一致したインストラクションがその位置、インラインコード、およびbase58インラインコードblobに縮小されます。

通知ペイロードのフィールドごとの読み取りについては、[クイックスタートプロトコルリファレンス](/docs/ja/parsed-streams/quickstart#notifications)を参照してください。

## サブスクリプションの管理

サブスクライブ応答からのインラインコードは、そのサブスクリプションからのすべての通知に表示されるインラインコードと同じ番号です。それを保存してください — [unsubscribe](/docs/ja/api-reference/parsed-streams/parsedtransactionunsubscribe)するために必要です。

プロジェクトは最大で**100の同時接続**を保持できます。APIキーすべてで共有されます。接続ごとに最大**25サブスクリプション**です。すべての制限については、[概要](/docs/ja/api-reference/parsed-streams/overview#limits)を参照してください。
