> 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/preconfirmations-grpc/faq.md).

# Preconfirmations FAQ

Preconfirmations gRPC FAQ for Harmonic and BAM: missing transactions, coverage limit, filters, regions, Clip, seq, bundles, execution\_results and slot counts.

For how to get access and what each token error means, see [Access](/solana/real-time-streaming/preconfirmations-grpc.md#access).

## Missing transactions

<details>

<summary>I filter on my accounts and see far fewer transactions than Geyser shows for the same accounts. Why?</summary>

There are two causes, in this order.

First, filters only match static account keys, so accounts a v0 transaction reaches through an address lookup table aren't matched. See [Address lookup tables](/solana/real-time-streaming/preconfirmations-grpc/filters.md#address-lookup-tables).

Second, only slots led by validators on the Harmonic or BAM client exist on the feeds. Other leaders' slots have no preconfirmation anywhere. See [What the feeds cover](/solana/real-time-streaming/preconfirmations-grpc.md#what-the-feeds-cover-and-what-they-do-not).

</details>

<details>

<summary>A validator runs the Harmonic or BAM client but its slots never show up. Why?</summary>

Running the client is not enough. Harmonic preconfirms only the slots its builder builds, and BAM only the slots its node schedules.

</details>

<details>

<summary>A region sends no <code>SlotStart</code> for minutes. Is that a fault?</summary>

Not necessarily. A region carries only the slots of the leaders it serves, so it is quiet between their windows. Check the leader schedule before assuming a fault.

</details>

## Coverage and tokens

<details>

<summary>Can I get the whole feed?</summary>

No. Every filter must select something, by accounts, signers, instructions or signatures, and the coverage share caps what one subscription receives: 33% of a region's feed. This is the condition under which the feeds are offered. See [Coverage](/solana/real-time-streaming/preconfirmations-grpc/coverage-billing-and-limits.md#coverage).

</details>

<details>

<summary>Why was my stream closed with "account exceeded its coverage limit for this region, cooling off"?</summary>

Your filters, usually a whole program, stayed over the 33% share of that region's feed for 30 seconds without recovering. Narrow them with `account_required`, `signer_include`, an instruction filter or `account_exclude`. Then resubscribe after the 60-second cooloff; with reconnect on, the client does this itself. Only that region is affected.

If your use needs a larger share, ask through support. See [Coverage](/solana/real-time-streaming/preconfirmations-grpc/coverage-billing-and-limits.md#coverage).

</details>

<details>

<summary>Does the coverage share apply per region?</summary>

Yes. Each region you subscribe to has its own share, measured against what the feed publishes there, and all your streams on that region share it. Subscribing to four nearby regions gives you four shares, not one split four ways.

</details>

<details>

<summary>Can several servers use one token?</summary>

Yes. On one point of presence, all tokens, connections and streams of a subscription on one region of a feed draw on that region's coverage share.

</details>

## Regions

<details>

<summary>Should I subscribe to all regions?</summary>

No. Subscribe to the regions next to your servers, one stream each. Each region you subscribe to adds the transactions it delivers to your message count. A preconfirmation from a far region reaches you after people located there have acted on it, so it arrives late. To use other regions, place servers there. See [Choosing regions](/solana/real-time-streaming/preconfirmations-grpc/feeds-and-regions.md#choosing-regions).

</details>

<details>

<summary>Where exactly are the builders and nodes?</summary>

In the cities listed under [Feeds and regions](/solana/real-time-streaming/preconfirmations-grpc/feeds-and-regions.md). The data center is the feed operator's. The region you subscribe to decides which slots you get, not where you connect.

</details>

<details>

<summary>Which point of presence am I on?</summary>

`GetVersion` (`Client::version()` in the Rust client) tells you, and it needs your token. Anycast picks the closest; `.dial()` on the connector pins one. See [Which point of presence answered](/solana/real-time-streaming/preconfirmations-grpc/feeds-and-regions.md#which-point-of-presence-answered).

</details>

## Filters

<details>

<summary>How do I use the signature filter if signatures are only known once I send?</summary>

It's for following transactions you already know: the ones you just sent, or a list you track. A stream's filters are fixed for its lifetime, so to follow new signatures, open a stream with the new list and close the old one. Several streams can share one connection.

To see everything a wallet sends without knowing the signatures in advance, filter on the wallet with `signer_include`.

</details>

<details>

<summary>Can I change the filters of an open stream?</summary>

No. Unlike Yellowstone gRPC, you can't send a new request on an open stream: the request that opens the stream sets the filters. Open a stream with the new filters, then close the old one.

The swap doesn't count a slot again on the same point of presence. Transactions delivered on both streams while they overlap are counted twice as messages.

</details>

<details>

<summary>Is there an <code>account_exclude</code> like other providers have?</summary>

Yes, as a further condition on a filter that already selects something: include A, minus B. It doesn't allow subscribing to the whole feed except some accounts. See [Excluding accounts](/solana/real-time-streaming/preconfirmations-grpc/filters.md#excluding-accounts).

</details>

<details>

<summary>Can I filter on an instruction instead of accounts?</summary>

Yes, on top-level instructions. You can match the program, bytes at offsets in the data, and the data's exact size, which is enough to pick out one instruction by its discriminator. Instructions invoked through CPI only exist after execution, so they aren't seen. See [Instructions](/solana/real-time-streaming/preconfirmations-grpc/filters.md#instructions).

</details>

<details>

<summary>Does a filter on a program match a transaction that calls the program through CPI, for example from a router?</summary>

An `account_include` filter on the program matches when the program's address is a static account key of the transaction. A program called through CPI is always among the transaction's accounts, so the transaction matches, unless it is a v0 transaction that loads the program's address through an address lookup table. See [Address lookup tables](/solana/real-time-streaming/preconfirmations-grpc/filters.md#address-lookup-tables).

An instruction filter never matches a CPI call: it sees top-level instructions only. See [Instructions](/solana/real-time-streaming/preconfirmations-grpc/filters.md#instructions).

</details>

<details>

<summary>Can I get only the transactions my wallet signed, not every one that mentions it?</summary>

Yes, with `signer_include`. See [Signers](/solana/real-time-streaming/preconfirmations-grpc/filters.md#signers).

</details>

## Stream and message format

<details>

<summary>What does a <code>Clip</code> tell me?</summary>

Only how many matching transactions were withheld on that stream since the previous notice. It names no filter, signature, account or slot.

On Harmonic every pending `Clip` is sent before the `SlotEnd` of the slot it hit. A slot with no `Clip` between its `SlotStart` and `SlotEnd` is complete for your filters; a slot with one or more is short by the sum of their counts. Withheld transactions aren't replayed; recover them from the landed block. See [Slot framing](/solana/real-time-streaming/preconfirmations-grpc/stream-and-message-format.md#slot-framing) and [Coverage](/solana/real-time-streaming/preconfirmations-grpc/coverage-billing-and-limits.md#coverage).

</details>

<details>

<summary>Is there a signal before <code>SlotEnd</code> that a slot is complete so far?</summary>

No. A Harmonic slot is complete at its `SlotEnd`. BAM has no slot framing and no completion signal. See [Slot framing](/solana/real-time-streaming/preconfirmations-grpc/stream-and-message-format.md#slot-framing).

</details>

<details>

<summary>What is the Harmonic <code>seq</code>?</summary>

A delivery batch: a throughput coalescing window on the way to the validator, numbered from 0 within each slot and delivered in order. It is not a bundle or an entry. See [Transaction fields](/solana/real-time-streaming/preconfirmations-grpc/stream-and-message-format.md#transaction-fields).

</details>

<details>

<summary>Why does the BAM <code>sequence</code> have gaps?</summary>

It follows the scheduler order of the BAM node over the life of the node process, and your filters drop every transaction they don't match. Transactions that share a `sequence` were bundled together.

</details>

<details>

<summary>Can I see bundle boundaries or which strategy the Harmonic builder uses?</summary>

On BAM, for the transactions you receive: transactions that share a `sequence` were bundled together, `bundle_position` is the order inside the bundle, and `is_revert_on_error` says whether the bundle reverts on error. You receive only the transactions your filters match, and a `Clip` can withhold some of those, so a bundle can arrive in part. On Harmonic, no: the stream carries no bundle boundaries. See [Transaction fields](/solana/real-time-streaming/preconfirmations-grpc/stream-and-message-format.md#transaction-fields).

The strategy of each Harmonic leader is on chain: at the start of its window the leader runs a crank (the Jito tip payment program instructions `ChangeTipReceiver` and `ChangeBlockBuilder`) with a memo naming the strategy.

</details>

<details>

<summary>Does BAM tell me whether a transaction succeeded?</summary>

Yes. Each BAM transaction carries the outcome the leader reported: success or execution failure. A transaction that failed to load also shows as an execution failure. A node that doesn't report the outcome leaves it unset, and such transactions never match an `execution_results` filter.

In Rust, read it with `execution_result()`, not `result()`. See [Transaction fields](/solana/real-time-streaming/preconfirmations-grpc/stream-and-message-format.md#transaction-fields).

</details>

<details>

<summary>Does the stream tell me when a preconfirmed transaction did not land?</summary>

No. On the wire, a Harmonic stream carries transactions, `SlotStart`, `SlotEnd`, `Clip` and pings. A BAM stream carries transactions, `Clip` and pings. None of them reports a skipped slot, an abandoned fork or a transaction that did not land.

The one revision is a Harmonic slot restart: a second `SlotStart` for a slot that already ended, after which you rebuild that slot from the new frame. See [Slot framing](/solana/real-time-streaming/preconfirmations-grpc/stream-and-message-format.md#slot-framing).

To check that a preconfirmed transaction landed, look up its signature at `confirmed` or `finalized`.

</details>

<details>

<summary>Can I backrun a preconfirmed transaction through the stream?</summary>

The stream is read-only; it has no call for sending transactions. A preconfirmed transaction already has its place in the block, so anything you send can only land after it, in the same slot or a later one. The slot can still be skipped, so make a backrun safe without the transaction it follows.

</details>

## Billing and access

<details>

<summary>Are slots with no matching transactions counted?</summary>

On Harmonic, yes: every slot whose `SlotEnd` reaches your stream is counted, matched or empty. On BAM, no: BAM has no slot framing, so a slot is counted only when at least one of its transactions is delivered to you. Pay-as-you-go prices are on the [pricing page](https://triton.one/pricing).

On one point of presence, a slot is counted once per subscription, however many of your streams were open for it. Pings and slot markers aren't counted as messages. See [Billing](/solana/real-time-streaming/preconfirmations-grpc/coverage-billing-and-limits.md#billing).

</details>

<details>

<summary>Are transactions removed by the <code>execution_results</code> filter counted?</summary>

No, on either feed. Transactions it filters out are never delivered and never counted as messages. On Harmonic, every slot whose `SlotEnd` reaches your stream is still counted.

</details>

<details>

<summary>Is anything counted while a feed is down?</summary>

No. Your stream stays open and receives nothing, and nothing is counted.

</details>

<details>

<summary>Does a BAM subscription elsewhere give me BAM preconfirmations through Triton?</summary>

No. Access is per Triton subscription: the feed is enabled on your subscription and used with your Triton token. See [Access](/solana/real-time-streaming/preconfirmations-grpc.md#access).

</details>

## Latency and clients

<details>

<summary>How much earlier than shreds or Geyser is a preconfirmation?</summary>

It depends on your host and the region. Measure it on your own servers, against the same clock.

</details>

<details>

<summary>Is there a TypeScript or Python client?</summary>

No TypeScript or Python client is published. Generate one from `preconfs.proto`, which ships with the Rust proto crate. See [Other languages](/solana/real-time-streaming/preconfirmations-grpc/other-languages.md).

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