> 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/faq/streaming-data.md).

# Real-time streaming FAQ

Questions about gRPC streaming, WebSocket connections, and the Yellowstone suite

## Project Yellowstone

<details>

<summary>Do you support devnet?</summary>

Yes. Triton offers devnet endpoints alongside mainnet, with Geyser gRPC and WebSocket streaming available on them. Dev/test and mainnet subscriptions are created at sign-up for each chain you pick. If you need another chain later, contact support from your [customer dashboard](https://customers.triton.one) to add it.

</details>

<details>

<summary>How can I install Yellowstone on my server?</summary>

You don't need to install anything. Dragon's Mouth gRPC and the WebSocket run on Triton infrastructure and are enabled automatically for all subscriptions.

</details>

<details>

<summary>What is the maximum number of accounts I can subscribe to using Yellowstone gRPC?</summary>

Shared endpoints don't cap concurrent gRPC connections per IP, but they do limit how fast an IP can open new connections. A single connection can carry many subscriptions. If you need more, contact support or consider a dedicated node. See [Rate and connection limits](/using-your-endpoint/rate-and-connection-limits.md).

For dedicated nodes, there's no set limit. However, opening too many subscriptions for your servers to ingest can cause backpressure from your backend, leading to poor streaming performance. Please check that your server can handle the amount of data you are subscribing to.

</details>

<details>

<summary>What is Cloudbreak, and how does it improve latency?</summary>

Cloudbreak is Triton's account indexing engine that delivers `getProgramAccounts`, `getTokenAccountsByOwner`, and `getTokenAccountsByDelegate` **99%+ faster** by serving them from tailored PostgreSQL indexes instead of full account scans. Indexes are built automatically from your query traffic. Available on every Triton plan at standard RPC rates, no premium for indexed reads. See [Cloudbreak](/solana/reading-account-state/cloudbreak-indexed-accounts.md).

</details>

<details>

<summary>What is Fumarole, and how can I get access?</summary>

Fumarole is a streaming system designed for reliable, scalable streaming of account and transaction data. It aggregates data from multiple Solana nodes for high availability and persistence, with up to 4 days of retained stream history. Available on every Triton subscription, with regional endpoints (`ams.rpcpool.com` for Europe, `nyc.rpcpool.com` for the US). See [Fumarole](/solana/real-time-streaming/fumarole-persistent-streams.md).

</details>

## gRPC and WebSocket

<details>

<summary>Can I use gRPC from a web browser?</summary>

No, gRPC is not supported in web browsers due to HTTP/2 and protobuf limitations. It is designed for backend applications. For frontend use, use the [WebSocket](/solana/real-time-streaming/whirligig-websockets.md) instead.

</details>

<details>

<summary>Do endpoints support WebSocket connections?</summary>

Yes, on both shared and dedicated infrastructure.

* Connect at `wss://<your-endpoint>.mainnet.rpcpool.com/<your-token>`.
* It takes the standard Solana WebSocket methods, plus `transactionSubscribe` and full `blockSubscribe`.
* Account updates arrive within the slot at `processed`, not once per slot.
* Triton's WebSocket servers read from Dragon's Mouth gRPC. On a dedicated endpoint, Triton's shared servers serve these connections by default.

</details>

<details>

<summary>How do I connect to WebSockets?</summary>

Replace `https` with `wss` in your RPC endpoint URL. For example: `wss://<your-endpoint>.mainnet.rpcpool.com/<your-token>`. See [WebSocket](/solana/real-time-streaming/whirligig-websockets.md). For backends, we recommend using gRPC instead, see [Dragon’s Mouth gRPC](/solana/real-time-streaming/dragon-s-mouth-grpc.md) for the lower-latency path.

</details>

<details>

<summary>How can I use Geyser plugins?</summary>

Geyser plugins can be enabled on our dedicated Solana nodes. They provide real-time streams of on-chain data. Triton's own Geyser plugin is Yellowstone gRPC; see [Dragon's Mouth gRPC](/solana/real-time-streaming/dragon-s-mouth-grpc.md). For an unofficial, community-maintained list of other Solana Geyser plugins, see [rpcpool/solana-geyser-park](https://github.com/rpcpool/solana-geyser-park); inclusion there doesn't mean Triton supports a plugin. Contact our support team to discuss your specific needs and we can configure a node for you.

</details>

<details>

<summary>I keep getting errors on my gRPC subscription. How can I check if the issue is with my endpoint or my code?</summary>

Run our prebuilt `client-linux-amd64` test client. It's a small Linux CLI we ship for exactly this purpose, known-good code that hits your endpoint with the same gRPC subscription patterns your app does. If it errors, the issue is on the endpoint and we should look at it. If it streams cleanly, the issue is in your application code.

Full guide: [Verify your gRPC endpoint](/solana/faq/error-handling/verify-your-grpc-endpoint.md).

</details>

<details>

<summary>How do I get the earliest possible view of transactions?</summary>

Use Deshred. It streams transactions reconstructed from shreds before execution, so you see them earlier than a regular gRPC transaction stream. Built for latency-sensitive work like trading and arbitrage. See [Deshred Transactions gRPC](/solana/real-time-streaming/deshred-transactions.md).

</details>

<details>

<summary>How do I get access to Preconfirmations?</summary>

Preconfirmations aren't self-serve: ask in the support chat in your [customer dashboard](https://customers.triton.one), and our team enables them on your subscription.

Before enabling, you accept the terms of service for each feed you want: Jito BAM, Harmonic, or both. Each feed is enabled and billed separately, so enabling one doesn't enable the other.

Preconfirmations are an add-on to an existing Triton subscription. Signing up or topping up your balance doesn't turn them on, and an account without credit stays inactive until it's funded.

Once a feed is enabled, connect to `https://preconfs.rpcpool.com` with your existing token, sent as `x-token` gRPC metadata (not in the URL path). Each stream carries one feed in one region.

For feeds, regions, filters, and limits, see [Preconfirmations gRPC](/solana/real-time-streaming/preconfirmations-grpc.md).

</details>

<details>

<summary>How do I activate Shred Streaming, and why isn't data arriving?</summary>

Shred Streaming is enabled by our team on request: ask in the support chat in your [customer dashboard](https://customers.triton.one). You accept the Triton Shreds terms of service before it's enabled.

Once it's active, a **Shred stream IPs** card appears on your mainnet-shared subscription page in the customer dashboard, under Tokens and above Endpoints. For each destination, click Add shred stream IP, enter its IP address and port, pick a Datacenter, then click Add IP. Each organization starts with one destination; ask support if you need more.

If shreds aren't arriving:

* Check that the destination was saved on the subscription page.
* Make sure the receiving server has a public IP, and that the port is open to inbound traffic from our source IP, listed on the Shred Streaming page. No GRE or WireGuard tunnel is needed.
* Make sure your account is active and has credit.

If all three check out, contact support so we can confirm the activation completed. For regions, shred sources, and setup, see Shred Streaming in the Documentation (Solana → Real-time streaming).

</details>

## Troubleshooting

<details>

<summary>My stream connects but no events are flowing</summary>

The most common cause is a filter that's too narrow. Try widening it (subscribe to all transactions or all token-program account writes) to confirm data is reaching you, then tighten back to what you actually need. Also check your commitment level: `processed` shows everything as soon as the validator sees it, while `confirmed` and `finalized` add buffering.

</details>

<details>

<summary>I'm getting 401 or 403 errors</summary>

Verify your endpoint URL and secret token from the [customer dashboard](https://customers.triton.one). For the WebSocket, the token is part of the URL: `wss://<your-endpoint>.mainnet.rpcpool.com/<your-token>`. For gRPC services, the token is passed as the `x-token` metadata header, not in the URL. If you've recently configured allowed origins, double-check your origin matches what's whitelisted.

</details>

<details>

<summary>Why do I get "x-token not entitled to preconfs" or "x-token not entitled to this feed"?</summary>

The feed you subscribed to isn't enabled for your token yet, or the server doesn't recognise the token. Ask in the support chat to enable it (see "How do I get access to Preconfirmations?" above).

Entitlement is per feed: a token enabled for Jito BAM is still refused on Harmonic, and the reverse. Signing up, depositing, or topping up doesn't grant entitlement on its own.

There are three token errors: `x-token required` means no token was sent; `x-token not entitled to preconfs` means the token has no Preconfirmations feed enabled yet (what new customers usually see), or the token is unknown, for example mistyped; `x-token not entitled to this feed` means the token has the other feed but not this one.

In client logs, the per-feed error looks like one of these:

* `16 UNAUTHENTICATED: x-token not entitled to this feed`
* `code = Unauthenticated desc = x-token not entitled to this feed`

It can appear even when `GetVersion` succeeds: `GetVersion`, like every other call (health checks included), only needs a token entitled to at least one feed, while `Subscribe` also checks the specific feed. It's not a connectivity or client problem, so retrying won't help.

If you still see it after we've confirmed the feed is enabled, check that you're sending the token's value from the customer dashboard (not its name) as `x-token` metadata. A stream that is already open when the feed is removed from your subscription ends with a different error: `PermissionDenied: subscription disabled for this feed`. New subscribes then get one of the errors above.

See [Preconfirmations gRPC](/solana/real-time-streaming/preconfirmations-grpc.md).

</details>

<details>

<summary>My stream keeps disconnecting</summary>

Networks drop. Production clients should implement reconnect-and-resubscribe logic with exponential backoff. For Dragon's Mouth, you can resume from your last-seen slot using the `from_slot` field on `SubscribeRequest`. For Fumarole, reconnect with the same persistent-subscriber name and the cursor server-side picks up where you left off.

</details>

<details>

<summary>Events feel slower than expected</summary>

Three things to check. First, your commitment level: `processed` is fastest, `confirmed` and `finalized` add latency. Second, geographic distance: connect from a backend close to our streaming clusters. Third, your processing speed: if your event handler can't keep up, the server-side queue backs up and you fall behind.

</details>

<details>

<summary>Memory grows over time</summary>

Your handler is processing events slower than they arrive. Filter more aggressively to reduce volume, parallelise your handler across workers, or move heavy processing to a background queue and keep the stream loop minimal.

</details>

<details>

<summary>Do I need to send keepalive pings?</summary>

Sometimes. Some cloud providers (e.g. Cloudflare) close idle streams. If you see disconnections after periods of low traffic, send a periodic ping. Dragon's Mouth gRPC accepts a `ping` field on the subscribe request. For the WebSocket, yes: connections inactive for over 60 seconds get closed, so send `{"jsonrpc":"2.0","method":"ping"}` more often than that. The gRPC server also sends a `ping` update every 10 seconds, which you can use to confirm liveness. It replies with a `pong` only when you send a `ping`.

</details>

***

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