# Rate Limits

> Understand NoLimitNodes rate limits and plan-based quotas.

Canonical: https://nolimitnodes.com/docs/rate-limits

Limits apply by plan and product.

## Plan limits

| Feature | Free | Pro | Ultra | Enterprise |
|---|---:|---:|---:|---:|
| RPC requests | 3/sec | 200/sec | 500/sec | Custom |
| WebSocket subscriptions | None | 5 | 20 | Custom |
| Yellowstone streams | None | 2 | 10 | Custom |
| Enhanced or Program Streams | None | 2 | 20 | Custom |
| `blockSubscribe` | None | No | Yes | Custom |
| Infrastructure | Shared | Private | Private | Dedicated |
| Support | Community | Priority | Priority | Named |
| SLA | None | Plan terms | Plan terms | Contract |

Check the [pricing page](https://nolimitnodes.com/pricing) and your dashboard for current commercial terms.

## HTTP rate limits

The RPC endpoint returns HTTP `429` after your request rate exceeds its limit.

Retry with exponential backoff and jitter.

```javascript
const wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms))

async function callRpc(body, attempt = 0) {
  const response = await fetch("https://rpc.nln.clr3.org", {
    method: "POST",
    headers: {
      "content-type": "application/json",
      "x-api-key": process.env.NLN_API_KEY,
    },
    body: JSON.stringify(body),
  })

  if (response.status === 429 && attempt < 4) {
    const delay = 250 * 2 ** attempt + Math.floor(Math.random() * 150)
    await wait(delay)
    return callRpc(body, attempt + 1)
  }

  return response.json()
}
```

## Connection limits

Close subscriptions after use. A disconnected client still needs server cleanup time.

Use one filtered Yellowstone subscription instead of many broad subscriptions where possible.

## Reduce usage

- Batch independent RPC reads.
- Use `getMultipleAccounts` for grouped account reads.
- Subscribe instead of polling.
- Cache epoch and cluster metadata.
- Share one backend subscription across browser users.
- Remove stale filters before opening new streams.
