ApeChain RPC: A Developer's Guide (Chain ID 33139)
ApeChain is an Arbitrum Orbit chain for the ApeCoin ecosystem. It settles to Arbitrum One, which makes it a layer 3, and it pays gas in APE instead of ETH. It runs Arbitrum's Nitro software, so anything you know about Arbitrum One mostly carries over. The differences are in the units: fee numbers that look alarming in gwei, a chain that idles between transactions, and log queries that are cheap to filter and expensive not to.
This guide is measured against the live chain on October 8, 2026, through the same endpoint SwiftNodes customers use.
The endpoint
https://rpc.swiftnodes.io/rpc/apechain?key=YOUR_API_KEY
wss://rpc.swiftnodes.io/ws/apechain?key=YOUR_API_KEY
viem ships the chain as apeChain:
import { createPublicClient, http } from "viem";
import { apeChain } from "viem/chains";
const client = createPublicClient({
chain: apeChain,
transport: http("https://rpc.swiftnodes.io/rpc/apechain?key=YOUR_API_KEY"),
});
What we measured
| Property | Value |
|---|---|
| Chain ID | 33139 (0x8173) |
| Client | Nitro |
| Block time | 0.91 s average over 10,000 blocks (0.98 s over 100,000) |
| Gas limit | 1,125,899,906,842,624 (2^50) per block |
Base fee / eth_gasPrice |
101.68 gwei, paid in APE |
eth_maxPriorityFeePerGas |
0 |
APE transfer, eth_estimateGas |
21,169 |
| Cost of that transfer | ~0.00215 APE |
safe behind head |
~14 minutes |
finalized behind head |
~24 minutes |
| Historical state | full archive |
| Tracing | debug_* yes, trace_* and arbtrace_* no |
Gas is priced in APE
The base fee reads 101.68 gwei, about 5,000 times Arbitrum One's 0.02 gwei the same day. That is not a congested chain. The number is denominated in APE, so a transfer costs 21,169 × 101.68 gwei ≈ 0.00215 APE. Any code that assumes the native token is ETH will show the wrong currency, so read the symbol from the chain config (nativeCurrency.symbol is APE in viem) rather than hardcoding it.
The fee was flat across every block we sampled: eth_feeHistory returned the same base fee for five consecutive blocks with gasUsedRatio around 1 to 2%. Like other Nitro chains there is no priority-fee auction: eth_maxPriorityFeePerGas returns 0 and transactions are ordered first come, first served.
The 169 gas above 21,000 is the parent-chain data charge. Nitro folds the cost of posting your transaction's bytes into the gas units instead of charging it separately, so it shows up as a slightly higher gasUsed. You can read the components from the ArbGasInfo precompile at 0x…6c:
const [perL2Tx, perL1CalldataByte, perStorageAlloc, perArbGasBase, perArbGasCongestion, perArbGasTotal] =
await client.readContract({
address: "0x000000000000000000000000000000000000006C",
abi: [{ name: "getPricesInWei", type: "function", stateMutability: "view", inputs: [],
outputs: Array(6).fill({ type: "uint256" }) }],
functionName: "getPricesInWei",
});
On October 8 the congestion component was 0 and the total gas price equalled the base price, 101.68 gwei.
Blocks come with transactions
Nitro chains only make a block when there is something to put in it. In our 300-block sample the gap between blocks was 0, 1 or 2 seconds, and every block but one held exactly two transactions: Nitro's internal start-of-block transaction (type 0x6a) and one user transaction. Of the 20 user transactions in a closer sample, 12 came from a single address, so a steady stream of activity is what keeps blocks near one a second.
Two things follow:
- Don't use block counts as a clock. "Wait 60 blocks" is about a minute today, and would be far longer on a quiet day. Use block timestamps.
- A pause in blocks isn't necessarily an outage. On a quiet chain, minutes without a block can just mean nobody transacted. In our halt survey across 110 chains, ApeChain had no gap of 10 minutes or more between August 25 and October 6.
Blocks also carry Arbitrum's extra fields: l1BlockNumber (an Ethereum mainnet block number: 26,145,501 when Ethereum's head was 26,145,519, so it tracks Ethereum, not Arbitrum One), sendCount and sendRoot. difficulty is always 0x1, and mixHash and nonce encode Nitro bookkeeping, not proof of work.
Logs: filter by address
eth_getLogs accepted an unfiltered 10,000-block range (about 2.5 hours of chain, 20,164 logs). Wider unfiltered ranges work but get heavy fast: 30,000 blocks returned 54,957 logs and 37 MB in 6.4 seconds at our proxy, and 50,000 blocks returned 92,615 logs and 63 MB in 11.4 seconds. Around 120,000 blocks the upstream nodes need more than our time budget, and the endpoint answers with a JSON-RPC error asking for a narrower range. With an address filter, a 50,000-block range on WAPE returned all 1,660 logs quickly.
(When this post first went up, 30,000-block unfiltered queries failed on our route with a 502 because of a flat 12-second upstream timeout. We raised the budget for log and trace queries the same day.)
So page unfiltered scans at 10,000 to 20,000 blocks to keep responses small, and filter by contract whenever you can. Details are on eth_getLogs on ApeChain, and our survey of getLogs range caps compares other chains.
History and tracing
State reads work at any depth. WAPE's totalSupply() read through eth_call 40 million blocks back returned 12.07 million WAPE, against 5.41 million today. debug_traceBlockByNumber with the callTracer returned full traces, including Nitro's beforeEVMTransfers and afterEVMTransfers fields, which record balance changes outside normal EVM execution. eth_getBlockReceipts works. trace_block and arbtrace_block are not available.
Finality
safe trailed the head by about 14 minutes and finalized by about 24 minutes. On an L3 this depends on two layers: ApeChain posts its batches to Arbitrum One, and those count as final only once Arbitrum One's own batches are final on Ethereum. Use latest for UX and finalized before acting on deposits or withdrawals; see soft vs hard finality on L2s and our Arbitrum One guide for the layer underneath.
Summary
- Arbitrum Orbit L3 on Arbitrum One, chain ID 33139, APE for gas, Nitro client.
- 101.68 gwei base fee in APE; a transfer is 21,169 gas, about 0.00215 APE.
- Blocks come only with transactions: use timestamps, not block counts.
- Unfiltered
eth_getLogsworks to 50,000 blocks but returns tens of megabytes; page at 10,000 to 20,000 or filter by address. - Full archive and
debug_*tracing;safe~14 min,finalized~24 min.
ApeChain endpoints, live gas and method support are on our ApeChain RPC page and ApeChain gas tracker, alongside the rest of the 128 chains on one key. SwiftNodes has a free tier to try it.
John Sullivan covers RPC infrastructure, node operations, and multi-chain development at SwiftNodes — what it actually takes to keep endpoints fast, fresh, and reliable across EVM and non-EVM networks.
Related posts
- Abstract RPC: A Developer's Guide (Chain ID 2741)
Abstract is a ZK Stack rollup where most transactions come from smart accounts. Measured: 0.58 s blocks, a flat 0.045 gwei gas price, transfers using ~95k gas, a 10,000-log result cap, ~3.8 h to finalized, and full history from block 1.
- MegaETH RPC: A Developer's Guide (Chain ID 4326)
MegaETH runs 1 s EVM blocks over ~10 ms mini-blocks. Measured: a 10-billion gas limit, transfers estimating 63,349 gas, a bogus eth_feeHistory oldestBlock, ~32 min to finalized, and what works over standard RPC.
- Ronin RPC After the Move to Ethereum L2: A Developer's Guide (Chain ID 2020)
Ronin became an OP Stack layer 2 in May 2026. Measured: 2 s blocks, a fixed 20 gwei base fee, a 200-block getLogs cap, ~23 min to finalized, and no pre-migration history.