Skip to main content

Rate Limits Quick Reference

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

Share
Last updated on August 19, 2026

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

Horizontal Scaling (Multiple Keys)​

StrategySetupTotal RPSCost
1 FREE keySimple1Free
3 FREE keysKey rotation3Free
1 BASIC keySimple10$
3 BASIC keysKey rotation30$$$
1 ENTERPRISE_50Simple50$$$

Note: Using multiple keys requires key rotation logic in your application.

⚑ 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. πŸ”§ Use multiple access keys with load balancing β†’ 2 days
  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)​

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);
}

Production Rate Limiter (TypeScript)​

typescript
// Sliding window limiter with queue
class ProductionLimiter {
  private queue: Array<{ timestamp: number; resolve: () => void }> = [];
  private processing = false;
 
  constructor(
    private rps: number,
    private windowMs: number = 1000,
  ) {}
 
  async acquire(): Promise<void> {
    return new Promise((resolve) => {
      this.queue.push({ timestamp: Date.now(), resolve });
      this.processQueue();
    });
  }
 
  private processQueue() {
    if (this.processing) return;
    this.processing = true;
 
    const process = () => {
      if (this.queue.length === 0) {
        this.processing = false;
        return;
      }
 
      const now = Date.now();
      const windowStart = now - this.windowMs;
 
      // Remove old entries
      this.queue = this.queue.filter((item) => item.timestamp > windowStart);
 
      // Check if we can process the next request
      if (this.queue.length <= this.rps) {
        const item = this.queue.shift()!;
        item.resolve();
        setTimeout(process, this.windowMs / this.rps);
      } else {
        setTimeout(process, 100); // Check again soon
      }
    };
 
    process();
  }
}
 
// Usage
const limiter = new ProductionLimiter(50); // ENTERPRISE_50
 
async function makeRequest(url: string) {
  await limiter.acquire();
  return fetch(url);
}

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:

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