Skip to main content

Rate Limits Quick Reference

Quick reference guide for bex.co rate limits and pricing tiers

Share
Last updated on October 5, 2026
On this page

Quick lookup tables and decision trees for choosing the right bex router tier and staying within limits.

πŸ“Š Tier Comparison at a Glance​

TierRPSIP LimitBest ForMonthly Price*
FREE1 1 req/sDevelopment, testingFree
BASIC10 NoneSmall apps$
PRO10 NoneProduction apps$$
ENTERPRISE_5050 NoneHigh-traffic apps$$$
ENTERPRISE_500500 NoneMission-criticalContact us

Note: RPS is enforced per user (shared across all access keys), not per access key.

*See pricing page for current rates

🎯 Which Tier Do I Need?​

Decision Tree​

text
How many requests per second do you need?
β”‚
β”œβ”€ Less than 1 req/s
β”‚  └─ Do you need to bypass IP restrictions?
β”‚     β”œβ”€ No β†’ <ion-icon name="checkmark-circle" style={{verticalAlign: "middle", fontSize: "1.2em", color: "#10b981"}}></ion-icon> FREE tier
β”‚     └─ Yes β†’ <ion-icon name="checkmark-circle" style={{verticalAlign: "middle", fontSize: "1.2em", color: "#10b981"}}></ion-icon> BASIC tier
β”‚
β”œβ”€ Between 1-10 req/s
β”‚  └─ Do you need priority support?
β”‚     β”œβ”€ No β†’ <ion-icon name="checkmark-circle" style={{verticalAlign: "middle", fontSize: "1.2em", color: "#10b981"}}></ion-icon> BASIC tier
β”‚     └─ Yes β†’ <ion-icon name="checkmark-circle" style={{verticalAlign: "middle", fontSize: "1.2em", color: "#10b981"}}></ion-icon> PRO tier
β”‚
β”œβ”€ Between 10-50 req/s
β”‚  └─ <ion-icon name="checkmark-circle" style={{verticalAlign: "middle", fontSize: "1.2em", color: "#10b981"}}></ion-icon> ENTERPRISE_50 tier
β”‚
└─ More than 50 req/s
   └─ <ion-icon name="checkmark-circle" style={{verticalAlign: "middle", fontSize: "1.2em", color: "#10b981"}}></ion-icon> ENTERPRISE_500 tier or custom

By Use Case​

Use CaseRecommended TierWhy
Local developmentFREECost-effective, sufficient for testing
Hobby projectFREE or BASICLow traffic, minimal cost
Startup MVPBASIC or PRORoom to grow, professional support
Production DAppPRO or ENTERPRISE_50Reliable, scalable
DEX / High-frequencyENTERPRISE_500Maximum throughput
Analytics platformENTERPRISE_50/500Sustained high RPS
Wallet applicationPRO or ENTERPRISE_50Depends on user base
NFT marketplaceENTERPRISE_50Burst traffic handling

🚦 Rate Limit Behavior​

FREE Tier: Dual Limits (AND Logic)​

text
Request arrives
    ↓
Check User RPS (1 req/s) ──── FAIL β†’ 429 Too Many Requests
    ↓ PASS
    ↓
Check IP RPS (1 req/s) ──── FAIL β†’ 429 Too Many Requests
    ↓ PASS
    ↓
Process Request β†’ 200 OK

Key Point: Both limits must pass for FREE tier.

text
Request arrives
    ↓
Check User RPS (tier-specific) ──── FAIL β†’ 429 Too Many Requests
    ↓ PASS
    ↓
Process Request β†’ 200 OK

Key Point: No IP-based restrictions on paid tiers.

πŸ“ˆ Scaling Strategies​

Vertical Scaling (Upgrade Tier)​

Current TierNext TierRPS IncreaseIP Restriction Removed
FREE β†’ BASIC+9 req/s1 β†’ 10
BASIC β†’ PRO0 req/s10 β†’ 10Already removed
PRO β†’ ENTERPRISE_50+40 req/s10 β†’ 50Already removed
ENTERPRISE_50 β†’ ENTERPRISE_500+450 req/s50 β†’ 500Already removed

Multiple access keys​

Do not assume that issuing more access keys increases the account's throughput. Confirm the gateway's quota scope before sizing your application. Use key rotation to replace credentials; use throttling, caching, or an agreed limit change to handle higher request volume.

⚑ Request Budget Calculator​

FREE Tier​

ScenarioMathDaily Requests
Constant rate at limit1 req/s Γ— 86,400s86,400
Constant rate at 50%0.5 req/s Γ— 86,400s43,200
Bursts (1 req every 1s)Averages to 1 req/s86,400

BASIC/PRO Tier​

ScenarioMathDaily Requests
Constant rate at limit10 req/s Γ— 86,400s864,000
Constant rate at 50%5 req/s Γ— 86,400s432,000

ENTERPRISE_50 Tier​

ScenarioMathDaily Requests
Constant rate at limit50 req/s Γ— 86,400s4,320,000
Constant rate at 50%25 req/s Γ— 86,400s2,160,000

ENTERPRISE_500 Tier​

ScenarioMathDaily Requests
Constant rate at limit500 req/s Γ— 86,400s43,200,000
Constant rate at 50%250 req/s Γ— 86,400s21,600,000

Important: These are RPS limits. Your daily quota (compute units) may be lower. Check both limits in your dashboard.

πŸ”§ Common Optimization Scenarios​

Scenario 1: Getting 429 on FREE Tier​

Symptoms:

text
Response: 429 Too Many Requests
Current RPS: ~2 requests/second
Tier: FREE

Diagnosis: Exceeding 1 req/s user limit

Solutions (ranked by effort):

  1. ⚑ Add client-side throttling β†’ Immediate
  2. ⚑ Implement request queuing β†’ 1-2 hours
  3. πŸ’° Upgrade to BASIC tier β†’ Instant (10x RPS)
  4. πŸ”§ Batch requests β†’ 2-4 hours of refactoring

Scenario 3: Need to Handle Spikes​

Symptoms:

text
Normal traffic: 30 req/s
Peak traffic: 200 req/s (during NFT drops, events)
Current tier: ENTERPRISE_50 (50 req/s)

Solutions:

  1. πŸ’° Upgrade to ENTERPRISE_500 β†’ Instant
  2. πŸ”§ Implement request queue + retry logic β†’ 1 day
  3. πŸ”§ Cache repeatable reads and limit concurrent work
  4. πŸ’° Contact sales for burst pricing β†’ Custom

Scenario 4: Multi-Region Application​

Symptoms:

text
Users: Global (US, EU, Asia)
Requirements: Low latency, high availability
Current setup: Single key, single region

Solutions:

  1. πŸ”§ Use multiple regional keys β†’ 1 day
  2. πŸ’° Enterprise plan with multi-region β†’ Contact sales
  3. πŸ”§ Implement geo-based key selection β†’ 2 days

πŸ“‹ Error Response Cheat Sheet​

StatusErrorCauseImmediate FixLong-term Fix
401UnauthorizedMissing/invalid keyCheck URL formatRegenerate key in dashboard
403ForbiddenIP blockedContact supportReview traffic patterns
429Too Many RequestsRPS limit exceededWait 1 secondAdd rate limiting
429Too Many RequestsQuota exceededWait until tomorrowUpgrade plan or optimize

πŸŽ“ Implementation Cheat Sheet​

Minimal Rate Limiter (JavaScript)​

This first example assumes sequential calls. Use the queue below when callers can request a slot concurrently.

javascript
// Simple delay-based limiter
class SimpleLimiter {
  constructor(rps) {
    this.delay = 1000 / rps;
    this.lastCall = 0;
  }
 
  async wait() {
    const now = Date.now();
    const timeSinceLastCall = now - this.lastCall;
 
    if (timeSinceLastCall < this.delay) {
      await new Promise((r) => setTimeout(r, this.delay - timeSinceLastCall));
    }
 
    this.lastCall = Date.now();
  }
}
 
// Usage (BASIC tier = 10 RPS)
const limiter = new SimpleLimiter(10);
 
async function makeRequest(url) {
  await limiter.wait();
  return fetch(url);
}

Queueing requests in one process (TypeScript)​

This example spaces request starts in a single process. Set requestsPerSecond to a limit you have verified for your account. Separate processes need a shared budget; this local queue does not enforce a distributed or monthly quota.

typescript
class RequestLimiter {
  private tail: Promise<void> = Promise.resolve();
  private nextStart = 0;
  private readonly intervalMs: number;
 
  constructor(requestsPerSecond: number) {
    if (!Number.isFinite(requestsPerSecond) || requestsPerSecond <= 0) {
      throw new Error("requestsPerSecond must be a positive finite number");
    }
    this.intervalMs = 1000 / requestsPerSecond;
  }
 
  acquire(): Promise<void> {
    const turn = this.tail.then(async () => {
      const waitMs = Math.max(0, this.nextStart - performance.now());
      if (waitMs > 0) {
        await new Promise<void>((resolve) => setTimeout(resolve, waitMs));
      }
      this.nextStart = performance.now() + this.intervalMs;
    });
    this.tail = turn.catch(() => {});
    return turn;
  }
}
 
// Example pacing only; replace with your verified account limit.
const limiter = new RequestLimiter(10);
 
async function makeRequest(url: string) {
  await limiter.acquire();
  return fetch(url);
}

Bound the amount of work you enqueue and handle HTTP/RPC errors separately. The queue spaces starts; it does not retry requests or limit how long they run.

Batch Request Helper​

javascript
// Automatically batches JSON-RPC requests
class BatchHelper {
  constructor(url, maxBatchSize = 10, flushIntervalMs = 100) {
    this.url = url;
    this.maxBatchSize = maxBatchSize;
    this.flushIntervalMs = flushIntervalMs;
    this.pendingRequests = [];
    this.timer = null;
  }
 
  request(method, params) {
    return new Promise((resolve, reject) => {
      this.pendingRequests.push({
        method,
        params,
        resolve,
        reject,
        id: Date.now() + Math.random(),
      });
 
      if (this.pendingRequests.length >= this.maxBatchSize) {
        this.flush();
      } else if (!this.timer) {
        this.timer = setTimeout(() => this.flush(), this.flushIntervalMs);
      }
    });
  }
 
  async flush() {
    if (this.timer) {
      clearTimeout(this.timer);
      this.timer = null;
    }
 
    if (this.pendingRequests.length === 0) return;
 
    const batch = this.pendingRequests.splice(0, this.maxBatchSize);
 
    const payload = batch.map((req) => ({
      jsonrpc: "2.0",
      id: req.id,
      method: req.method,
      params: req.params,
    }));
 
    try {
      const response = await fetch(this.url, {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify(payload),
      });
 
      const results = await response.json();
 
      results.forEach((result) => {
        const req = batch.find((r) => r.id === result.id);
        if (req) {
          if (result.error) {
            req.reject(result.error);
          } else {
            req.resolve(result.result);
          }
        }
      });
    } catch (error) {
      batch.forEach((req) => req.reject(error));
    }
  }
}
 
// Usage
const batcher = new BatchHelper("https://api.bex.co/eth/YOUR_KEY");
 
// These 3 calls will be batched into 1 HTTP request
const [block1, block2, block3] = await Promise.all([
  batcher.request("eth_getBlockByNumber", ["0x1", false]),
  batcher.request("eth_getBlockByNumber", ["0x2", false]),
  batcher.request("eth_getBlockByNumber", ["0x3", false]),
]);

πŸ“ž Quick Support Matrix​

IssueSeverityFREEBASICPROENTERPRISE_50ENTERPRISE_500
Rate limit questionsLowCommunity/DocsEmail 48hEmail 24hEmail 12hPhone/Slack
Account issuesMediumEmail 72hEmail 48hEmail 24hEmail 12hPhone 2h
Service outageHighStatus pageEmail 24hEmail 12hEmail 4hPhone 1h
Custom integration-Not availableEmail quotePriority queueDedicated engineerWhite-glove

Contact:


See also:

Was this page helpful?

One API key for 30+ chains

bex router is a single multi-chain gateway β€” one key, one bill, metered in compute units instead of an account per network.

Explore bex router