Skip to main content

Rate Limits, Concurrency & Backoff

This page explains the limits that govern how fast you can query and stream, how to tell the different throttles apart, and how to build a client that backs off correctly.

Limits vary by plan

The pricing page is the source of truth for current per-plan limits.

Request rate limit

The GraphQL API enforces a per-account requests-per-minute limit by plan:

PlanRate limit
Personal30 / min
Pro90 / min
Scale240 / min
EnterpriseCustom

Exceeding it returns a 429. Heavy analytical queries also compete for shared compute (see below), so throughput in practice depends on query cost, not just request count.

Three different throttles — and how to tell them apart

A 4xx/5xx under load can come from three distinct sources. Diagnosing which one you hit determines the fix:

  1. Account rate limit — you're sending requests faster than your plan's per-minute allowance. Fix: slow down / add client-side rate limiting.
  2. Shared compute pressure — a message like temporarily blocked due to a high number of long-running queries means the shared query engine is busy, not that you exceeded an account limit. Fix: retry with backoff; make queries cheaper (narrower time windows, indexed filters).
  3. Plan entitlement block — the request targets a chain/cube/interface not in your plan. Fix: this is billing, not throttling — see How Billing Works.
  • Run heavy queries sequentially, not in large parallel bursts.
  • On 429 or a shared-compute block, use exponential backoff (start around 5s, double, cap at ~1 min).
  • Keep queries cheap: narrow Block.Time/date ranges, and filter on indexed fields so the engine scans less.
  • Prefer one batched query (many addresses/tokens in a single where) over many small ones.

WebSocket concurrency

  • Each plan allows a maximum number of concurrent subscriptions (Personal: none; Pro: 100; Scale: 1,000; Enterprise: unlimited).
  • Exceeding the cap fails silently: the socket connects but delivers no data, rather than returning a clear error. If a subscription "connects but nothing arrives," check your running-subscription count first at Account → Subscriptions.
  • Revoking a token does not kill open sockets. Terminate running subscriptions explicitly from the account panel. See WebSocket subscriptions.

gRPC (Solana CoreCast)

  • A gRPC subscription requires at least one filter — an unfiltered stream is rejected.
  • Multiple tokens per stream. You can subscribe to many token/account filters in a single gRPC stream — you don't need one stream per token.

Frequently Asked Questions

How many requests per minute does Bitquery allow?

It depends on your plan: Personal 30/min, Pro 90/min, Scale 240/min, Enterprise custom. Exceeding it returns a 429, and heavy queries also compete for shared compute.

Why am I getting 429 errors?

Either you exceeded your account's per-minute rate, or the shared query engine is under load ('temporarily blocked due to a high number of long-running queries'). The first needs client-side rate limiting; the second needs retry with backoff and cheaper queries.

Why is my WebSocket connected but receiving no data?

You've likely exceeded your plan's concurrent-subscription cap, which fails silently. Check and terminate running subscriptions in the account panel; note that revoking a token does not stop already-open sockets.

Next steps

Build with Bitquery

Ready to run this in production?

Get an API key and run these queries in minutes, or talk to us about plans and enterprise delivery.