Detailed answer
Top RPC providers in 2025: Alchemy (best NFT APIs, enhanced APIs), Infura (Ethereum foundation relationships), QuickNode (widest chain coverage, 60+ chains). Free tiers: Alchemy 300M CU/month, Infura 100K req/day, QuickNode 10M req/month. Production configuration: use fallback transport with multiple providers for resilience. Optimize costs with caching, Multicall3 batching, and webhooks instead of polling.
Provider Comparison
| Factor | Alchemy | Infura | QuickNode |
|---|---|---|---|
| Free tier | 300M CU/month | 100K req/day | 10M req/month |
| Chains (EVM) | 30+ | 20+ | 60+ |
| Solana support | Yes | Limited | Yes |
| Enhanced APIs | Best (NFT, Token, Trace) | Limited | Good |
| Webhooks | Yes (Notify) | Yes | Yes |
| Uptime SLA | 99.9% (Growth+) | 99.9% (Growth+) | 99.9% (Build+) |
| Pricing (Growth) | $49/month | $50/month | $49/month |
Production Configuration
// Multi-provider failover for production resilience
import { createPublicClient, http, fallback } from 'viem';
import { arbitrum } from 'viem/chains';
const alchemyUrl = `https://arb-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`;
const infuraUrl = `https://arbitrum-mainnet.infura.io/v3/${process.env.INFURA_KEY}`;
const quicknodeUrl = `https://your-endpoint.arbitrum-mainnet.quiknode.pro/${process.env.QN_KEY}`;
const client = createPublicClient({
chain: arbitrum,
transport: fallback([
http(alchemyUrl), // Primary
http(infuraUrl), // Fallback 1
http(quicknodeUrl), // Fallback 2
])
});Cost Optimization Tips
Cache aggressively: Token balances, contract ABIs, token metadata, ENS resolutions.
Batch with Multicall3: Replace 10 individual `balanceOf` calls with one Multicall3 request.
Use webhooks instead of polling: Set up Alchemy Notify to webhook your server on relevant events.
Right-size your plan: Check your actual CU/request usage before upgrading.