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

# Real-time streaming

Choose a Triton Solana stream: Dragon's Mouth gRPC, Riptide, Deshred, Shred Streaming, Preconfirmations, WebSocket, or Fumarole.

Solana produces a new block several times per second. If you poll RPC every 200 ms, your data can be up to 200 ms old when you see it, and you'll easily hit rate limits when hammering the same endpoint.

Streaming inverts the model: you open one connection, say what you need (specific accounts, programs, or transactions), and the node pushes you matching events as they happen.

{% columns %}
{% column %}

```mermaid
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#F2EDF6','primaryBorderColor':'#7A4BA0','primaryTextColor':'#171717','lineColor':'#956FB3','actorBkg':'#F2EDF6','actorBorder':'#7A4BA0','actorTextColor':'#171717','signalColor':'#956FB3','signalTextColor':'#171717','noteBkgColor':'#F2EDF6','noteBorderColor':'#7A4BA0','noteTextColor':'#171717','labelBoxBkgColor':'#E4DBEC','labelBoxBorderColor':'#7A4BA0'}}}%%
sequenceDiagram
    participant C as Your app
    participant S as RPC
    C->>S: getAccountInfo
    S-->>C: stale data
    C->>S: getAccountInfo
    S-->>C: stale data
    C->>S: getAccountInfo
    S-->>C: 429 Too Many Requests
```

{% endcolumn %}

{% column %}

```mermaid
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#F2EDF6','primaryBorderColor':'#7A4BA0','primaryTextColor':'#171717','lineColor':'#956FB3','actorBkg':'#F2EDF6','actorBorder':'#7A4BA0','actorTextColor':'#171717','signalColor':'#956FB3','signalTextColor':'#171717','noteBkgColor':'#F2EDF6','noteBorderColor':'#7A4BA0','noteTextColor':'#171717','labelBoxBkgColor':'#E4DBEC','labelBoxBorderColor':'#7A4BA0'}}}%%
sequenceDiagram
    participant C as Your app
    participant S as Node
    Note over C,S: one handshake
    C->>S: subscribe + filters
    S-->>C: event (intra-slot)
    S-->>C: event
    S-->>C: event
```

{% endcolumn %}
{% endcolumns %}

Dragon's Mouth, Riptide, and the WebSocket `accountSubscribe` and `programSubscribe` methods send intra-slot updates at `processed`, and the gRPC products return structured Protobuf payloads.

For teams with heavy polling codebases, [Account Sync](/solana/reading-account-state/account-sync.md) in the Triton SDK serves account reads from memory: swap in the SDK's `Connection`, add an `accountSync` config, and call `close()` when done.

Streaming needs a high-bandwidth internet connection and a fast client environment. Frequent disconnections are a sign of a weak client setup. See streaming [best practices](/solana/real-time-streaming/best-practices.md).

## Triton streaming stack

Triton built Yellowstone gRPC, the open-source Geyser plugin behind Dragon's Mouth, and also runs Deshred, Riptide, Shred Streaming, Preconfirmations, the Solana WebSocket API, and Fumarole. At production scale, running on Triton gives you:

* **Separate streaming clusters.** Streaming runs on its own host groups, apart from the shared RPC pool.
* **Several shred sources.** Deshred and Shred Streaming ingest shreds from Triton's validators, DoubleZero Edge, partner validators, and Turbine.
* **Anycast across 8 points of presence.** On standard mainnet endpoints, gRPC and WebSocket connections reach the closest of Triton's 8 cities in network terms (Salt Lake City, New York, Pittsburgh, Amsterdam, Frankfurt, London, Singapore, Tokyo), with health checks and failover for new connections. Fumarole connects to regional endpoints, and Shred Streaming runs in five regions; see each product page.
* **Separate services.** Dragon's Mouth, WebSocket, and Fumarole each run as their own service.

## Pick your stream

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><i class="fa-radio">:radio:</i> <strong>Dragon's Mouth gRPC</strong></td><td>Sub-slot account and transaction updates, plus slot and block updates, via gRPC.</td><td><a href="/solana/real-time-streaming/dragon-s-mouth-grpc.md">Dragon's Mouth gRPC</a></td></tr><tr><td><i class="fa-water">:water:</i> <strong>Riptide</strong></td><td>Dragon's Mouth gRPC over a lower-latency path. Same streams, filters, and SDKs on shared subscriptions.</td><td><a href="/solana/real-time-streaming/riptide.md">Riptide</a></td></tr><tr><td><i class="fa-satellite-dish">:satellite-dish:</i> <strong>Shred Streaming</strong></td><td>Deduplicated raw shreds delivered to your servers in five regions before blocks are assembled. Available on request.</td><td><a href="/solana/real-time-streaming/shred-streaming.md">Shred Streaming</a></td></tr><tr><td><i class="fa-fire">:fire:</i> <strong>Deshred Transactions gRPC</strong></td><td>Transactions reconstructed from raw shreds before the node executes them, over gRPC.</td><td><a href="/solana/real-time-streaming/deshred-transactions.md">Deshred Transactions gRPC</a></td></tr><tr><td><i class="fa-stopwatch">:stopwatch:</i> <strong>Preconfirmations gRPC</strong></td><td>Preconfirmed transactions over gRPC from Harmonic and BAM, before any shred exists. Enabled on request.</td><td><a href="/solana/real-time-streaming/preconfirmations-grpc.md">Preconfirmations gRPC</a></td></tr><tr><td><i class="fa-rotate-right">:rotate-right:</i> <strong>WebSocket</strong></td><td>Triton's Solana WebSocket API for browsers and frontends, served from Dragon's Mouth gRPC, with <code>transactionSubscribe</code>.</td><td><a href="/solana/real-time-streaming/whirligig-websockets.md">WebSocket</a></td></tr><tr><td><i class="fa-layer-group">:layer-group:</i> <strong>Fumarole Persistent gRPC</strong></td><td>Redundant streaming layer with 4 days of stored data and built-in cursor resume.</td><td><a href="/solana/real-time-streaming/fumarole-persistent-streams.md">Fumarole Persistent gRPC</a></td></tr></tbody></table>

* **Dragon's Mouth** is the base gRPC stream for live data, with **Deshred**, a separate method on the same gRPC service, giving you pre-execution transactions.
* **Riptide** serves Dragon's Mouth over a lower-latency path on shared subscriptions.
* **Shred Streaming** delivers raw shreds to your own servers before blocks are assembled.
* **Preconfirmations gRPC** streams preconfirmed transactions from the Harmonic and BAM block production systems, before any shred exists.
* **WebSocket** serves Dragon's Mouth data as Solana WebSocket notifications. Use it in browsers, where gRPC is not supported.
* **Fumarole** consumes multiple Dragon's Mouth nodes, deduplicates, and stores your cursor on the server side so you can resume from where you left off after a disconnect.
  * Within a region, consumers see the same data for a given slot. Fumarole does not guarantee the same event order across connections or reconnects.
  * Use the Rust or TypeScript client instead of calling Fumarole's gRPC methods directly.

| Capability                             | Dragon's Mouth |    Riptide    |       Shred Streaming      | Deshred tx | Preconfirmations | WebSocket | Fumarole |
| -------------------------------------- | :------------: | :-----------: | :------------------------: | :--------: | :--------------: | :-------: | :------: |
| Real-time data                         |        ✓       |       ✓       |              ✓             |      ✓     |         ✓        |     ✓     |     ✓    |
| Data before the node replays the block |        ✗       |       ✗       |              ✓             |      ✓     |         ✓        |     ✗     |     ✗    |
| Historical replay                      |  \~1,000 slots | \~1,000 slots |              ✗             |      ✗     |         ✗        |     ✗     |  4 days  |
| Persistent cursor                      |        ✗       |       ✗       |              ✗             |      ✗     |         ✗        |     ✗     |     ✓    |
| Browser-compatible                     |        ✗       |       ✗       |              ✗             |      ✗     |         ✗        |     ✓     |     ✗    |
| Commitment                             |       all      |      all      |              ✗             |      ✗     |         ✗        |    all    |    all   |
| Protocol                               |      gRPC      |      gRPC     | Shreds to your IP and port |    gRPC    |       gRPC       | WebSocket |   gRPC   |

On Dragon's Mouth and Riptide, stream at `processed` and track `confirmed` and `finalized` yourself from slot updates, instead of asking the server to buffer by commitment. A slots subscription sends an update for each of the three statuses by default. Setting `filter_by_commitment` to `true` limits it to the request's commitment level. On Alpenglow clusters, a block's `confirmed` and `finalized` slot updates arrive back to back.

It's normal to combine more than one product in a pipeline. Open one connection per Dragon's Mouth, Riptide, or Deshred stream, for example Dragon's Mouth and Deshred on separate connections. Streams that share one TCP connection are all delayed when a packet is lost (head-of-line blocking). Some setups break behind Triton's load balancer. Common patterns:

| Pattern                               | Use                                                                                                                                                                                                                      |
| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **Trading and MEV**                   | Riptide or Dragon's Mouth gRPC for processed data, Deshred for pre-execution transactions, Shred Streaming or Preconfirmations gRPC for data before the block is complete                                                |
| **DEX or wallet frontend**            | WebSocket for frontend updates, Dragon's Mouth gRPC for backend setups                                                                                                                                                   |
| **Indexer, analytics, or compliance** | Fumarole for reliable, persistent data with automatic backfill of 4 days of data, and Jetstreamer with the public Old Faithful archive for bulk historical backfills (see [Historical data](/solana/historical-data.md)) |

## Limitations

Accounts owned by the Light Protocol program are excluded from all our streams, and `getProgramAccounts` is unavailable for it. At peak load, it accounted for over 50% of all Geyser traffic, making it impractical to include in standard streams.

| Program                         | Address                                       |
| ------------------------------- | --------------------------------------------- |
| Light Protocol / ZK Compression | `compr6CUsB5m2jS4Y3831ztGSTnDpnKJTKS95d64XVq` |

## Pricing

On shared infrastructure, Dragon's Mouth, Riptide, WebSocket, and Fumarole are billed on bandwidth, not per request. See [triton.one/pricing](https://triton.one/pricing) for rates by product, and streaming [best practices](/solana/real-time-streaming/best-practices.md) for filtering, guides, and other ways to reduce bandwidth.

## What's next

<table data-card-size="large" data-view="cards"><thead><tr><th></th><th></th><th data-hidden data-card-target data-type="content-ref"></th></tr></thead><tbody><tr><td><i class="fa-play">:play:</i> <strong>Streaming quickstart</strong></td><td>Connect, subscribe, and verify a live stream with Dragon's Mouth, WebSocket, Fumarole, or Deshred.</td><td><a href="/solana/real-time-streaming/quickstart.md">Real-time streaming quickstart</a></td></tr><tr><td><i class="fa-arrows-rotate">:arrows-rotate:</i> <strong>Account Sync</strong></td><td>Reads of tracked accounts in the TypeScript and Rust SDKs resolve from memory, kept current by a Triton stream.</td><td><a href="/solana/reading-account-state/account-sync.md">Account Sync</a></td></tr></tbody></table>

***

<i class="fa-life-ring">:life-ring:</i> Contact support by clicking the chat icon in your [customer dashboard](https://customers.triton.one)\ <i class="fa-briefcase">:briefcase:</i> Sales questions? [Contact us](https://triton.one/contact)\ <i class="fa-sparkles">:sparkles:</i> AI agent? Read [llms.txt](https://docs.triton.one/llms.txt)\ <i class="fa-rss">:rss:</i> Follow updates: [Blog](https://blog.triton.one) · [X](https://x.com/triton_one) · [YouTube](https://www.youtube.com/@triton_one_ltd) · [Telegram](https://t.me/tritonone) · [GitHub](https://github.com/rpcpool)
