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

# Parsed Streams クイックスタート

> Parsed Streams に接続し、最初のフィルターを送信し、デコードされた通知を読みます。さらに、完全な JSON-RPC 2.0 プロトコル参照があります。

<Tip>
  Parsed Streams が初めてですか？まず[メンタルモデル](/docs/ja/parsed-streams#the-mental-model)を読んでください。フィルターがなぜそのように見えるのかを説明しています。
</Tip>

## クイックスタート

<Steps>
  <Step title="アクセスの取得">
    Parsed Streamsはクローズドベータです。HeliusチームがプロジェクトIDをホワイトリストに追加し、接続エンドポイントを共有します。クローズドベータへの参加は[こちらから申し込み](https://form.typeform.com/to/BlFWKbC9)。

    認証は、あなたのプロジェクトの API キーを `api-key` クエリパラメータ（または `x-api-key` ヘッダー）として渡します。
  </Step>

  <Step title="接続">
    ```bash wscat theme={"system"}
    wscat -c "wss://<ENDPOINT>/?api-key=YOUR_API_KEY"
    ```

    キーが欠落しているか、無効であるか、ホワイトリストに登録されていない場合は、HTTP 401 で拒否されます。プロジェクトが接続上限に達している場合は HTTP 429 になります。
  </Step>

  <Step title="フィルターでサブスクライブ">
    フィルターとオプションを使用して `parsedTransactionSubscribe` を送信します。

    ```json theme={"system"}
    {"jsonrpc":"2.0","id":1,"method":"parsedTransactionSubscribe","params":[{"programs":["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"]}]}
    ```

    応答 `result` は整数の**サブスクリプション ID** です。

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

  <Step title="通知を読む">
    マッチするトランザクションはすべて、すでにデコードされた `parsedTransactionNotification` として到着し、フィルターがヒットした命令を指す `matchedIndexes` が含まれています。完全な形式は[通知](#notifications)を参照してください。
  </Step>

  <Step title="サブスクライブ解除">
    ```json theme={"system"}
    { "jsonrpc": "2.0", "id": 2, "method": "parsedTransactionUnsubscribe", "params": [23] }
    ```

    または接続を閉じるだけで、すべてのサブスクリプションが削除されます。
  </Step>
</Steps>

## ガイド

<CardGroup cols={2}>
  <Card title="Jupiter Swaps を追跡" icon="arrow-right-arrow-left" href="/docs/ja/parsed-streams/guides/track-jupiter-swaps">
    信頼できるフィルターを構築するために `describeProgram` を使用します。
  </Card>

  <Card title="Pump.fun Mints を追跡" icon="rocket" href="/docs/ja/parsed-streams/guides/track-pumpfun-mints">
    各新しい Pump.fun トークンを記録する再接続対応のリスナーです。
  </Card>

  <Card title="再接続処理" icon="rotate" href="/docs/ja/parsed-streams/guides/handling-reconnects">
    アイドルタイムアウトやデプロイを乗り越え、見逃したものを正確に補完します。
  </Card>
</CardGroup>

## プロトコルリファレンス

Parsed Streams は、単一の WebSocket 接続を通じて **JSON-RPC 2.0** を使用します。各リクエストは同じ `id` に応じて応答します。サブスクリプションは、サブスクライブ解除または切断があるまで `parsedTransactionNotification` メッセージをプッシュします。

| メソッド                           | 用途                            |
| ------------------------------ | ----------------------------- |
| `parsedTransactionSubscribe`   | フィルターでサブスクリプションを開始            |
| `parsedTransactionUnsubscribe` | サブスクリプションを停止                  |
| `ping`                         | 生存チェック; 現在のスロットを返す            |
| `describeProgram`              | プログラムの命令、イベント、およびアカウントロールをリスト |

### サブスクライブ

フィルターとオプションを使用して `parsedTransactionSubscribe` を送信します。応答 `result` は整数の**サブスクリプション ID** です。

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

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

#### フィルターフィールド

`programs` または `accounts.include` のいずれかが必要です。設定したフィールドは **AND** で結合されます：命令はすべてを満たす必要があります。

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

<ParamField body="instructionNames" type="string[]">
  デコードされたインストラクション名。最初に完全一致し、その後大文字と小文字を区別しないフォールバックが行われます。カタログが識別できる名前のインストラクションのみ一致しますので、名前は`describeProgram`から取ってください。
</ParamField>

<ParamField body="accounts.include" type="string[]">
  アカウントアドレス。これらのいずれかがアカウントリストに登場すればインストラクションが一致します。リスト内のOR。デコードされていないインストラクションにも機能します。プログラムID自体はここではアカウントとみなされません。
</ParamField>

<ParamField body="accounts.roles" type="object">
  デコードされたアカウントロール名からアドレスへのマップ。各エントリが保持される必要があります（エントリ間でAND）。インストラクションがデコードされている必要があります。ロール名は正確に一致する必要があるので、`describeProgram`からコピーしてください。
</ParamField>

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

<ParamField body="includeCpi" type="boolean" default="true">
  内部（CPI）インストラクションが一致対象です。トップレベルのインストラクションのみを一致させるには`false`を設定します。
</ParamField>

フィルターまたはオプション内の不明なフィールドは `-32602` で拒否され、無視される代わりに何もマッチしません。

#### オプション

2番目のパラメータはオプションです。

<ParamField body="commitment" type="string" default="confirmed">
  `confirmed` のみがサポートされています。
</ParamField>

<ParamField body="details" type="string" default="full">
  各通知に含まれる内容。`full`：トランザクション全体、すべての命令、フィルターヒットを指す `matchedIndexes` を含みます。`matched`：一致した命令のみ、インデックスリストなし。`raw`：一致した命令のみ、その位置に還元されて、それぞれの `programId`、base58 の `data` バイト、デコードされたフィールドなし、`accountKeys` 配列なし。帯域幅がコンテキストよりも重要な場合は `matched`、命令データを自分でデコードし、バイトのみを必要とする場合は `raw` を使用します。
</ParamField>

プロジェクトは最大 **100 同時接続** を保持することができ、これはすべての API キー間で共有されます。

### 通知

サブスクリプションごとに一致するトランザクションごとの通知。デフォルトの `details: "full"` とともに：

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

これを読む：

* **`transaction`** は完全なコンテキストです。`fee`はlamportsです。`accountKeys`はキーリスト全体です。`feePayer`は常に`accountKeys[0]`です。`error`はJSON形式のトランザクションエラーを保持します。
* **`summary`** は一意の形状を持ち、人間が読みやすい形式と構造化されたペイロードを含みます。各認識されたインストラクションには同じ形状の`summary`があります。
* **`nativeTransfers`** と\*\*`tokenTransfers`\*\*はトランザクション全体から抽出されたSOLとトークンの動きをリストします。
* **`instructions`** は、トランザクションの全てのインストラクションです。各エントリは位置を持ちます。これらを使用し、配列位置を使用しないでください。
* **`matchedIndexes`** はフィルタが実際にヒットしたインデックスです。
* **`decoded` 名はsnake\_case** です（例：`in_amount`）。u64値はJavaScriptに収まりません。
* **`blockTime`** は現在常に`null`です。
* 一つのトランザクション内には**デコードされたインストラクションとされていないインストラクションの混在**が期待されます。

`details: "raw"`を使用すると`value`はトランザクションメタとブロブに縮小されます。

```json theme={"system"}
"value": {
  "transaction": {
    "signature": "3riSYL4HTRxgQjLayt6L2JPaDR3oaEQg1H4v3fnjUxNU...",
    "slot": 430172053,
    "blockTime": null,
    "feePayer": "6jduWNCTQzG91JGBchfGGxd55Vi5FxJCCJEV18RkXzJX",
    "fee": 5000,
    "status": "ok",
    "error": null
  },
  "instructions": [
    { "topIndex": 4, "innerIndex": null, "stackHeight": 1, "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", "data": "3Bxs4h24hBtQy9rw" }
  ]
}
```

### サブスクライブ解除

```json theme={"system"}
{ "jsonrpc": "2.0", "id": 2, "method": "parsedTransactionUnsubscribe", "params": [23] }
```

サブスクリプションが存在し、自分のものであれば `true` を返します。通知は即座に停止します。接続を閉じるとすべてのサブスクリプションが削除されます。

### 発見

この種の API で最も一般的な失敗は、有効だが何も一致しないフィルターです。通常、推測された命令やロール名です。`describeProgram` は、マッチャーが比較する正確な名前を返すことでそれを防ぎます：

```json Request theme={"system"}
{ "jsonrpc": "2.0", "id": 1, "method": "describeProgram", "params": [{ "program": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" }] }
```

```json Response theme={"system"}
{
  "jsonrpc": "2.0", "id": 1,
  "result": {
    "id": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",
    "name": "jupiter",
    "instructions": ["route", "shared_accounts_route", "exact_out_route"],
    "events": ["SwapEvent"],
    "roles": ["user_transfer_authority", "destination_token_account"]
  }
}
```

プログラムアドレスまたはカタログ名を渡すことができますが、**住所を優先してください**：名前はプログラムバージョン間で曖昧になる可能性があります（複数のカタログエントリが同じ `jupiter` という名前を持ちます、名前検索は古いものを解決することがあります）。名前で検索する場合は、`result.id` がサブスクライブしようとしているプログラムであることを確認してください。

推奨フロー：`describeProgram` を使用して正確な命令名とロール名を取得し、それらの名前を使用してフィルターを構築し、次にサブスクライブします。[Track Jupiter Swaps](/docs/ja/parsed-streams/guides/track-jupiter-swaps) ガイドはこれを端から端まで説明します。

### 制限

| 制限                          | 値                  |
| --------------------------- | ------------------ |
| プロジェクトごとの同時接続               | 100                |
| 接続ごとのサブスクリプション              | 25                 |
| クライアントメッセージ                 | 10 秒ごとに、20 のバースト   |
| クライアントメッセージサイズ              | 64 KiB             |
| フィルターごとの `programs`         | 10                 |
| フィルターごとの `instructionNames` | 50、各64文字まで         |
| フィルターごとの `accounts.include` | 100                |
| フィルターごとの `accounts.roles`   | 20、各名前64文字まで       |
| 接続ごとのアウトバウンドバッファ            | 2048 件の通知、接続が閉じられる |

### エラー

エラーは JSON-RPC 2.0 に従います：`{ "error": { "code": <int>, "message": "<text>" }, "id": <id> }`。メッセージは何が間違っていたか、どこで間違っていたかを正確に言います。

| コード      | 意味                                               |
| -------- | ------------------------------------------------ |
| `-32700` | 解析エラー（無効な JSON）                                  |
| `-32600` | 無効なリクエスト                                         |
| `-32601` | メソッドが見つかりません                                     |
| `-32602` | 無効なパラメータ：不正な公開鍵、不明なフィールド、サポートされていないコミットメントまたは詳細値 |
| `-32000` | フィルター制限を超過しました                                   |
| `-32001` | サーバーが準備できていません；バックオフで再試行してください                   |
| `-32002` | レート制限されています（10 メッセージ毎秒）                          |
| `-32006` | サブスクリプションが多すぎます（接続ごとに 25）                        |

接続はまた WebSocket クローズコードによって閉じられることがあります—それぞれが何を意味し、どのように回復するかについては[再接続の処理](/docs/ja/parsed-streams/guides/handling-reconnects)を参照してください。

## クライアント例

<CodeGroup>
  ```bash wscat theme={"system"}
  wscat -c "wss://<ENDPOINT>/?api-key=<API_KEY>"
  # then send:
  {"jsonrpc":"2.0","id":1,"method":"parsedTransactionSubscribe","params":[{"programs":["JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"]}]}
  ```

  ```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())
  ```
</CodeGroup>
