> For the complete documentation index, see [llms.txt](https://docs.shyft.to/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shyft.to/solana-yellowstone-grpc/docs/transaction-streaming.md).

# Streaming Transactions

A subscribe request defines the type of updates you want using filters. Filters allow you to set specific conditions—like monitoring a particular wallet, account, or transaction type—ensuring that you only receive updates relevant to your needs. We can subscribe to transactions using the <mark style="color:yellow;">transactions filter.</mark> The transactions filter has the following structure. The most important field here is the `accountInclude` **field which streams all transactions related to the account addresses specified there**. Its an array so you can specify multiple addresses in it.

```json
{
  "slots": {
    "slots": {}
  },
  "accounts": {},
  "transactions": {
    "transactionLabel": 
      {
          "vote": boolean | undefined, //optional
	  "failed": boolean | undefined, //optional
	  "signature": string | undefined, //optional
	  "accountInclude": string[], //updates streamed for these accounts
	  "accountExclude": string[], //updates for this will be excluded
          "accountRequired": string[] 
      }
  },
  "blocks": {},
  "blocksMeta": {},
  "accountsDataSlice": [],
  "commitment": CommitmentLevel.CONFIRMED //finalized or processed also available
}
```

### Subscribing to all transactions of an address

This request subscribes to all transactions of a Raydium. It can be any Solana address, a program, wallet, token etc.

{% code overflow="wrap" %}

```json
{
  "slots": {
    "slots": {}
  },
  "accounts": {},
  "transactions": {
    "raydiumPoolv4": {
      "vote": false,
      "failed": false,
      "accountInclude": [
        "675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8" //You can enter any Solana address, wallet, token, program etc.
      ]
    }
  },
  "blocks": {},
  "blocksMeta": {},
  "accountsDataSlice": [],
  "commitment": CommitmentLevel.CONFIRMED
}
```

{% endcode %}

The transactions filter helps you focus on transactions from a specific Solana address. The first field in the filter (e.g., `raydiumPoolv4`in the above case) is a <mark style="color:yellow;">**client-assigned label**</mark>, allowing you to easily identify updates, especially when using multiple filters. The `vote` and `failed` fields are simple <mark style="color:yellow;">true/false options</mark>: set them to true to include vote or failed transactions, or false to exclude them. Lastly, **the** `accountInclude` **field specifies the&#x20;**<mark style="color:yellow;">**program's address**</mark>**, ensuring you only stream transactions related to that program**.

{% hint style="info" %}
For transactions, if all fields are empty, then all transactions are broadcasted. Otherwise, fields work as logical `AND`, and values in arrays as logical `OR`.
{% endhint %}

### Subscribing to all transactions of a Liquidity Pool

```json
{
  "slots": {
    "slots": {}
  },
  "accounts": {},
  "transactions": {
    "raydiumPoolv4": {
      "vote": false,
      "failed": false,
      "accountInclude": [
        "9xQeWvG816bUx9EPjHmaT23yvVM2ZWbrrpZb9PusVFin" //liquidity pool address
      ]
    }
  },
  "blocks": {},
  "blocksMeta": {},
  "accountsDataSlice": [],
  "commitment": CommitmentLevel.CONFIRMED
}
```

To receive transactions of a liquidity Pool, we have to specify the liquidity <mark style="color:yellow;">pool address</mark> in the `accountInclude` field.

### Subscribing to all transactions of multiple addresses

```json
{
  "slots": {
    "slots": {}
  },
  "accounts": {},
  "transactions": {
    "raydiumPoolv4": {
      "vote": false,
      "failed": false,
      "accountInclude": [
        "HgQy5bqJd3GcjqakukhfMpqAfP62nTxGiqAqh4QtTuHF",
        "8pQYy5peKKqKk34BvJBuuBAfakukTLsmT2MVSzijUgt1" //the list of wallet addresses
        //You can add more wallet addresses here
      ]
    }
  },
  "blocks": {},
  "blocksMeta": {},
  "accountsDataSlice": [],
  "commitment": CommitmentLevel.CONFIRMED
}
```

The `accountInclude` field is an <mark style="color:yellow;">array</mark> and can take <mark style="color:yellow;">multiple wallet addresses</mark>, and will subscribe to all transactions from them.

### Subscribing to all transactions of a token on Raydium

So far we were streaming all transaction of a Solana address. Now imagine, if you want all transactions of a token, but only on <mark style="color:yellow;">Raydium V4.</mark> You don't want transactions of that token on Orca or any other dex. In this case we will use a new field <mark style="color:yellow;">**accountRequired.**</mark>

```json
{
  "slots": {
    "slots": {}
  },
  "accounts": {},
  "transactions": {
    "raydiumPoolv4": {
      "vote": false,
      "failed": false,
      "accountInclude": [
        "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
      ],
      "accountRequired": ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"]
    }
  },
  "blocks": {},
  "blocksMeta": {},
  "accountsDataSlice": [],
  "commitment": CommitmentLevel.CONFIRMED
}
```

This  lets you add another layer of filter, now gRPC will stream you transactions of that token only if it has <mark style="color:yellow;">Raydium V4</mark> address in it.
