gRPC limits
How Supanode gRPC limits work: plan quotas for simultaneous subscriptions, addresses and owner programs, the node's fixed caps of 2000 addresses per filter and 10 filters per subscription, and how to lay your address budget out across them.
// updated 2026-08-26
Two different things limit a gRPC stream, and they fail in different ways. Knowing which one you hit tells you whether to reshape your request or buy a bigger plan.
| Set by | Changes with your plan? | Error code | |
|---|---|---|---|
| Plan quotas | your subscription | yes | ResourceExhausted |
| Node caps | Yellowstone itself | no, identical on every plan | InvalidArgument |
The short version. One filter holds at most 2 000 addresses. One subscription holds at most 10 filters, so at most 20 000 addresses. Your plan then caps how many subscriptions you can hold at once and how many addresses you can watch in total. Spread your addresses accordingly.
How a stream is structured
TCP connection
└─ subscription (one Subscribe call) ← your plan caps how many
└─ filter (a named rule) ← max 10 per subscription
└─ addresses / owners ← max 2 000 per filter
One TCP connection can carry as many subscriptions as your plan allows - there is no separate limit on connections, and no benefit to opening several. What is counted is subscriptions.
Node caps: the same on every plan
These come from Yellowstone and do not change with your tier.
| Cap | Value | Error you get |
|---|---|---|
| Addresses in one filter | 2 000 | failed to create filter: Max amount of Pubkeys reached, only 2000 allowed |
| Filters in one subscription | 10 | failed to create filter: Max amount of filters/data_slices reached, only 10 allowed |
| Addresses in one subscription | 20 000 | (10 filters × 2 000) |
This is the trap. If your plan includes 24 000 addresses and you send all 24 000 in a single filter, you get only 2000 allowed - a message that says nothing about splitting them up. Nothing is wrong with your plan: you just have to lay the addresses out across filters and subscriptions.
Plan quotas
| Plan | Concurrent subscriptions | Addresses watched, total | Owner programs, total |
|---|---|---|---|
| STARTER | not included | — | — |
| FOCUS | 1 | 100 | — |
| BUILD | 10 | 5 000 | 5 |
| GROW | 20 | 24 000 | 20 |
| PROFESSIONAL | 50 | 100 000 | 50 |
| Dedicated | unlimited | unlimited | unlimited |
Addresses and owner programs are counted across everything you have open at once - every filter, in every subscription, in every connection. Opening a second connection does not give you a second budget.
Going over returns, for example:
accounts.account: too many values across filters and active streams (26000 > 24000)
accounts.owner: too many values across filters and active streams (21 > 20)
The budget is "at once", not "per month". Close a subscription and its addresses are immediately free again. You can rotate through far more addresses over a day than your plan number - you just cannot watch more than that number simultaneously.
How to lay out your address budget
Fill filters to 2 000, pack 10 filters per subscription, then open as many subscriptions as you need.
| Plan | Addresses | Minimum layout | Subscriptions used, of your quota |
|---|---|---|---|
| FOCUS | 100 | 1 filter × 100 | 1 of 1 |
| BUILD | 5 000 | 3 filters (2 000 + 2 000 + 1 000) | 1 of 10 |
| GROW | 24 000 | 12 filters: one subscription of 10, one of 2 | 2 of 20 |
| PROFESSIONAL | 100 000 | 50 filters, 10 per subscription | 5 of 50 |
On every plan the layout leaves most of your subscription quota free for other streams - transactions, slots, block metadata.
Filter names are yours. Each filter is a named rule inside the request, and the name comes back on every update so you know which rule matched. Split by whatever grouping is useful to you - by market, by strategy, by customer - the limit only cares about the counts.
Reading the error you get
| Error | Source | What to do |
|---|---|---|
InvalidArgument · failed to create filter: ... | the node | reshape the request - fewer addresses per filter, fewer filters per subscription |
ResourceExhausted · too many values across filters and active streams | your plan | close a stream you no longer need, or move up a tier |
ResourceExhausted · too many simultaneous connections (limit: N) | your plan | you are at your subscription count - close one first |
The subscription-count error says "connections", but it counts subscriptions. You will see too many simultaneous connections (limit: 20) even when every one of those subscriptions is inside a single TCP connection.
Request size
A SubscribeRequest must stay under 4 MiB (4 194 304 bytes) - the standard gRPC message limit. Above it the request is dropped before it reaches the node, and you get no error at all: the stream opens, sends you a ping, and then stays silent forever.
An address costs about 46 bytes on the wire, so the ceiling is roughly 91 000 addresses in one request. You cannot reach it while respecting the node caps - 10 filters × 2 000 addresses is about 0.9 MB - so this only bites if you try to send a whole plan's worth of addresses in one filter.
Do not treat silence as success, and do not treat a slow answer as failure. A rejection arrives after the first ping, and a multi-megabyte request spends most of its time uploading - on a slow uplink that is seconds. Wait for an actual error or an actual data message before deciding your subscription is live.
Filter update rate
You can re-send a SubscribeRequest to swap filters up to 30 times per minute, the same on every tier. A new request fully replaces the old one on that subscription.
| Plan | Filter updates |
|---|---|
| FOCUS | 30 / min |
| BUILD | 30 / min |
| GROW | 30 / min |
| PROFESSIONAL | 30 / min |
| Dedicated | unlimited |
Streams without addresses
slots, blocks_meta and entry carry no addresses, so they draw on nothing but your subscription count.
They are also not deduplicated: open the same slots subscription four times and you receive the same stream four times over. Measured on a live plan, one slots subscription delivered 38 messages in five seconds and four identical subscriptions delivered 144. Subscribe once and fan the data out inside your own application.
Throughput
Throughput is unlimited and unmetered on every gRPC tier. Supanode bills by plan tier, so the data your streams deliver carries no per-MB, per-GB, or per-credit charge. The only volume gate is unfiltered block streaming, which is included in the PROFESSIONAL tier.
Per-tier reference
{
"concurrent_subscriptions": 1,
"addresses_total": 100,
"owner_programs_total": null,
"filter_updates_per_min": 30,
"node_caps": { "addresses_per_filter": 2000, "filters_per_subscription": 10 },
"throughput": "unlimited"
}
Other per-stream caps
| Field | FOCUS | BUILD | GROW | PROFESSIONAL | Dedicated |
|---|---|---|---|---|---|
accounts.data_slice_max | 10 | 10 | 10 | 10 | unlimited |
slots.max | 10 | 25 | 50 | 100 | unlimited |
blocks_meta.max | 10 | 10 | 10 | 10 | unlimited |
entry.max | 10 | 10 | 10 | 10 | unlimited |
External references
See also
- Restrictions - programs you cannot put in a filter, and how to get one unblocked
- What's available
- All limits at a glance
- Plans