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

> Inscreva-se para transações Solana decodificadas que correspondam a um filtro por programa, conta e nome de instrução. Receba transações completas com argumentos e contas nomeadas.

Inicie uma assinatura. Toda transação confirmada que corresponda ao seu filtro chega como um `parsedTransactionNotification`, já decodificada: cada instrução com argumentos nomeados e contas nomeadas, além da taxa, a lista completa de chaves de conta, um `summary` a nível de transação e as transferências de SOL e tokens.

## Endpoints

Parsed Streams está em beta fechado. A equipe Helius lista seu ID de projeto e compartilha o endpoint de conexão com você:

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

## Authorizations

<ParamField query="api-key" type="string" required>
  Sua chave de API Helius, passada como parâmetro de consulta `api-key` ou no cabeçalho `x-api-key`. Uma chave ausente, inválida ou não listada é rejeitada com HTTP 401.
</ParamField>

## Body

<ParamField body="params" type="array" required>
  <Expandable title="Filter" defaultOpen>
    Pelo menos um de `programs` ou `accounts.include` é necessário. Os campos que você define se combinam com **E**: uma instrução deve satisfazer todos para corresponder.

    <ParamField body="programs" type="string[]">
      IDs de programas para corresponder (endereços base58, não nomes). Uma instrução corresponde se seu programa estiver nesta lista. OU dentro da lista.
    </ParamField>

    <ParamField body="instructionNames" type="string[]">
      Nomes de instruções decodificadas, como `route`. Correspondem exatamente primeiro, depois com uma correspondência insensível a maiúsculas e separadores, então `sharedAccountsRoute` também corresponde ao nome `shared_accounts_route`. OU dentro da lista. Somente instruções cujo nome o catálogo pôde identificar podem corresponder, então pegue nomes de [describeProgram](/docs/pt-BR/api-reference/parsed-streams/describeprogram).
    </ParamField>

    <ParamField body="accounts.include" type="string[]">
      Endereços de contas. Uma instrução corresponde se qualquer um destes aparecer em sua lista de contas. OU dentro da lista. Funciona para qualquer instrução, decodificada ou não. O ID do programa em si não conta como uma conta aqui.
    </ParamField>

    <ParamField body="accounts.roles" type="object">
      Um mapa de nome de função da conta decodificada para endereço, como `{ "user_transfer_authority": "<pubkey>" }`. Toda entrada deve ser válida (E entre as entradas), e a instrução deve ser decodificada para que isso se aplique. Os nomes das funções correspondem **exatamente**, sem distinção de maiúsculas, então copie-os de [describeProgram](/docs/pt-BR/api-reference/parsed-streams/describeprogram) em vez de adivinhar.
    </ParamField>

    <ParamField body="includeFailed" type="boolean" default="false">
      Inclua instruções de transações falhas.
    </ParamField>

    <ParamField body="includeCpi" type="boolean" default="true">
      Instruções internas (CPI) são elegíveis para correspondência. Defina `false` para corresponder apenas instruções de nível superior.
    </ParamField>
  </Expandable>

  <Expandable title="Options">
    O segundo parâmetro é opcional.

    <ParamField body="commitment" type="string" default="confirmed">
      Apenas `confirmed` é suportado.
    </ParamField>

    <ParamField body="details" type="string" default="full">
      O que cada notificação carrega. `full`: a transação completa, cada instrução, além de `matchedIndexes` apontando para os acertos do filtro. `matched`: apenas as instruções que corresponderam, sem lista de índice. `raw`: apenas instruções correspondentes, cada uma reduzida à sua posição, `programId`, e blob base58 `data`, sem campos decodificados e sem array `accountKeys`. Use `matched` quando a largura de banda importar mais do que o contexto (cargas úteis completas têm em média cerca de três vezes o tamanho), e `raw` quando você decodifica os dados da instrução por conta própria e só precisa dos bytes.
    </ParamField>
  </Expandable>
</ParamField>

Campos desconhecidos em qualquer lugar no filtro ou opções são rejeitados com `-32602` em vez de serem ignorados silenciosamente, então erros de digitação falham de forma audível em vez de não corresponderem a nada.

## Response

<ResponseField name="result" type="integer">
  ID da assinatura (necessário para cancelar a assinatura)
</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>

## Notifications

Uma notificação por transação correspondente por assinatura. Dentro de `params.result.value`:

* **`transaction`** — o contexto completo: assinatura, slot, taxa (lamports), a lista completa `accountKeys`, `status`/`error`, um nível de transação `summary`, e os extractos `nativeTransfers` e `tokenTransfers`.
* **`instructions`** — cada instrução na ordem de execução, posicionada por `topIndex`, `innerIndex`, e `stackHeight`. Instruções decodificadas carregam named `decoded.args` e `decoded.accounts` (snake\_case, valores u64 como strings); as não decodificadas carregam `rawData` e `rawAccounts` em vez disso.
* **`matchedIndexes`** — índices em `instructions` informando quais delas seu filtro realmente acertou. Com `details: "matched"` o array contém apenas os acertos e `matchedIndexes` está ausente; com `details: "raw"` cada instrução correspondente reduz-se à sua posição, `programId`, e blob base58 `data`.

Para uma leitura campo a campo da carga útil da notificação, veja a [referência de protocolo rápida](/docs/pt-BR/parsed-streams/quickstart#notifications).

## Gerenciando Assinaturas

O `result` da resposta de inscrição é o mesmo número que aparece em `params.subscription` em cada notificação dessa assinatura. Armazene-o — você precisará dele para [cancelar a assinatura](/docs/pt-BR/api-reference/parsed-streams/parsedtransactionunsubscribe).

Um projeto pode manter até **100 conexões simultâneas**, compartilhadas entre todas as suas chaves de API, com até **25 assinaturas por conexão**. Veja a [visão geral](/docs/pt-BR/api-reference/parsed-streams/overview#limits) para todos os limites.
