Skip to content

Migrating from Infura

For EVM chains the migration is a URL swap. Infura embeds the key in the URL path; we accept the key either as a query parameter (drop-in, zero code changes) or — recommended for production — as an apikey header.

The one-line diff

diff
- const RPC_URL = `https://mainnet.infura.io/v3/${INFURA_KEY}`
+ const RPC_URL = `https://rpc.lab.au.ro/eth?apikey=${YOUR_API_KEY}`

That's it for ethers, viem, web3.js, web3.py, foundry's --rpc-url, hardhat networks — anything that takes an RPC URL.

InfuraAU.RO
https://mainnet.infura.io/v3/KEYhttps://rpc.lab.au.ro/eth?apikey=KEY
https://bsc-mainnet.infura.io/v3/KEYhttps://rpc.lab.au.ro/bsc?apikey=KEY
https://polygon-mainnet.infura.io/v3/KEYhttps://rpc.lab.au.ro/polygon?apikey=KEY
https://avalanche-mainnet.infura.io/v3/KEYhttps://rpc.lab.au.ro/avax?apikey=KEY

Header beats query in production

URLs leak into logs, shell history and error reporters. The header form is two extra lines:

js
// ethers v6
const req = new ethers.FetchRequest('https://rpc.lab.au.ro/eth')
req.setHeader('apikey', process.env.YOUR_API_KEY)
const provider = new ethers.JsonRpcProvider(req)

// viem
transport: http('https://rpc.lab.au.ro/eth', {
  fetchOptions: { headers: { apikey: process.env.YOUR_API_KEY } }
})

Semantics to re-check

  • Rate limiting: Infura bills credits/day with burst RPS; we enforce per-minute/hour/day request windows + a CU day-quota (Rate limits). Watch x-ratelimit-remaining-minute.
  • eth_getLogs: Infura caps ~10k results; we rate-limit it to 1/min (75 CU) — batch your ranges accordingly.
  • WebSockets: wss:// subscriptions are not available yet — poll eth_blockNumber (2 s server cache) or see WebSockets.
  • Archive/trace: Infura's trace_* add-on has no equivalent here yet.
  • Non-EVM: Infura's IPFS/Starknet products are out of scope; our Bitcoin-family and other L1s are native protocols, not EVM-wrapped.