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

> Abonnieren Sie Solana-Transaktionen, die nach Programm, Konto und Anweisungsname dekodiert und gefiltert sind. Empfangen Sie gesamte Transaktionen mit benannten Argumenten und Konten.

Starten Sie ein Abonnement. Jede bestätigte Transaktion, die Ihrem Filter entspricht, erscheint als `parsedTransactionNotification`, bereits dekodiert: jede Anweisung mit benannten Argumenten und benannten Konten, plus die Gebühr, die vollständige Kontoschlüsselliste, ein Transaktionsebene `summary` und die SOL- und Token-Transfers.

## Endpunkte

Parsed Streams befindet sich in der offenen Beta-Phase und ist in bezahlten Plänen verfügbar. Holen Sie sich Ihren Verbindungsendpunkt vom [Helius Dashboard](https://dashboard.helius.dev):

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

## Berechtigungen

<ParamField query="api-key" type="string" required>
  Ihr Helius API-Schlüssel, übergeben als `api-key` Abfrageparameter oder der `x-api-key` Header. Ein fehlender oder ungültiger Schlüssel wird mit HTTP 401 abgelehnt.
</ParamField>

## Body

<ParamField body="params" type="array" required>
  <Expandable title="Filter" defaultOpen>
    Mindestens eines von `programs` oder `accounts.include` ist erforderlich. Die von Ihnen festgelegten Felder kombinieren sich mit **UND**: eine Anweisung muss alle von ihnen erfüllen, um übereinzustimmen.

    <ParamField body="programs" type="string[]">
      Programm-IDs zum Abgleichen (base58-Adressen, keine Namen). Eine Anweisung stimmt überein, wenn ihr Programm in dieser Liste enthalten ist. ODER innerhalb der Liste.
    </ParamField>

    <ParamField body="instructionNames" type="string[]">
      Dekodierte Anweisungsnamen, wie `route`. Zuerst exakt abgeglichen, dann mit einer fallunabhängigen und trennzeichenunabhängigen Rückfalloption, sodass `sharedAccountsRoute` auch den Drahtnamen `shared_accounts_route` abgleicht. ODER innerhalb der Liste. Nur Anweisungen, deren Namen der Katalog identifizieren konnte, können übereinstimmen, also nehmen Sie Namen von [describeProgram](/docs/de/api-reference/parsed-streams/describeprogram).
    </ParamField>

    <ParamField body="accounts.include" type="string[]">
      Konto-Adressen. Eine Anweisung stimmt überein, wenn eines dieser Adressen in ihrer Kontoliste erscheint. ODER innerhalb der Liste. Funktioniert für jede Anweisung, dekodiert oder nicht. Die Programm-ID selbst zählt hier nicht als Konto.
    </ParamField>

    <ParamField body="accounts.roles" type="object">
      Eine Zuordnung von dekodiertem Kontorollenname zu Adresse, wie `{ "user_transfer_authority": "<pubkey>" }`. Jeder Eintrag muss bestehen (UND über Einträge hinweg), und die Anweisung muss dekodiert werden, damit dies gilt. Rollennamen stimmen **genau** überein, ohne Fallanpassung, kopieren Sie sie also von [describeProgram](/docs/de/api-reference/parsed-streams/describeprogram) anstatt sie zu erraten.
    </ParamField>

    <ParamField body="includeFailed" type="boolean" default="false">
      Anweisungen von fehlgeschlagenen Transaktionen einschließen.
    </ParamField>

    <ParamField body="includeCpi" type="boolean" default="true">
      Innere (CPI) Anweisungen sind berechtigt, übereinzustimmen. Setzen Sie `false`, um nur Top-Level-Anweisungen abzugleichen.
    </ParamField>
  </Expandable>

  <Expandable title="Optionen">
    Der zweite Parameter ist optional.

    <ParamField body="commitment" type="string" default="confirmed">
      Nur `confirmed` wird unterstützt.
    </ParamField>

    <ParamField body="details" type="string" default="full">
      Was jede Benachrichtigung trägt. `full`: die gesamte Transaktion, jede Anweisung, plus `matchedIndexes`, die auf die Filtertreffer hinweist. `matched`: nur die Anweisungen, die übereinstimmen, keine Indexliste. `raw`: nur übereinstimmende Anweisungen, jede auf ihre Position reduziert, `programId`, und base58 `data` Blob, ohne dekodierte Felder und ohne `accountKeys` Array. Verwenden Sie `matched`, wenn Bandbreite wichtiger als Kontext ist (vollständige Nutzlasten sind im Durchschnitt etwa dreimal so groß), und `raw`, wenn Sie Anwendungsdaten selbst dekodieren und nur die Bytes benötigen.
    </ParamField>
  </Expandable>
</ParamField>

Unbekannte Felder irgendwo im Filter oder in den Optionen werden mit `-32602` abgelehnt, anstatt still ignoriert zu werden, sodass Tippfehler lautstark scheitern, anstatt nichts zu entsprechen.

## Antwort

<ResponseField name="result" type="integer">
  Abonnement-ID (erforderlich zum Abmelden)
</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>

## Benachrichtigungen

Eine Benachrichtigung pro übereinstimmender Transaktion pro Abonnement. Innerhalb von `params.result.value`:

* **`transaction`** — der volle Kontext: Signatur, Slot, Gebühr (Lamports), die vollständige `accountKeys` Liste, `status`/`error`, ein Transaktionsebene `summary` und die extrahierten `nativeTransfers` und `tokenTransfers`.
* **`instructions`** — jede Anweisung in Ausführungsreihenfolge, positioniert durch `topIndex`, `innerIndex`, und `stackHeight`. Dekodierte Anweisungen tragen benannte `decoded.args` und `decoded.accounts` (snake\_case, u64 Werte als Strings); nicht dekodierte tragen `rawData` und `rawAccounts` stattdessen.
* **`matchedIndexes`** — Indizes in `instructions`, die Ihnen sagen, welche Ihr Filter tatsächlich getroffen hat. Bei `details: "matched"` enthält das Array nur die Treffer und `matchedIndexes` fehlt; bei `details: "raw"` schrumpft jede übereinstimmende Anweisung auf ihre Position, `programId` und base58 `data` Blob.

Für eine feldweise Lesung der Benachrichtigungsnutzlast siehe die [Schnellstart-Protokollreferenz](/docs/de/parsed-streams/quickstart#benachrichtigungen).

## Verwaltung von Abonnements

Das `result` aus der Abonnementantwort ist die gleiche Nummer, die in `params.subscription` bei jeder Benachrichtigung aus diesem Abonnement erscheint. Speichern Sie sie — Sie benötigen sie, um sich [abzumelden](/docs/de/api-reference/parsed-streams/parsedtransactionunsubscribe).

Ein Projekt kann bis zu **100 gleichzeitige Verbindungen** halten, die über alle seine API-Schlüssel geteilt werden, mit bis zu **25 Abonnements pro Verbindung**. Siehe die [Übersicht](/docs/de/api-reference/parsed-streams/overview#limits) für alle Limits.
