Nine Calls That Used to Be Ninety: Enhanced APIs Are Live
A wallet balance screen is never one RPC call. It's eth_getBalance, then balanceOf for every token, then decimals() and symbol() for each one — and if you want the numbers to be consistent, you'd better pin them all to the same block. Understanding one transaction is a fetch, a receipt, and a pile of log decoding. Every EVM app rebuilds these same call-groups, badly, on deadline.
As of this week, on SwiftNodes they're one call each. Nine sn_* methods are live on every paid plan, on the same endpoint and key you already use:
| Method | What it collapses |
|---|---|
sn_getTokenBalances |
native + up to 200 token balances, with symbol/decimals |
sn_getPortfolio |
up to 20 addresses × 100 tokens, one consistent snapshot |
sn_getTransactionBundle |
tx + receipt + honest status + decoded ERC-20/721/1155 logs |
sn_getAllowances |
up to 200 approval checks with token metadata |
sn_getBalancesMulti |
native balances for up to 100 addresses |
sn_getTokenMetadata |
symbol, name, decimals, totalSupply per contract |
sn_getBlockBundle |
full block + every receipt (+ optional decoded logs) |
sn_getFeeSuggestion |
slow/standard/fast EIP-1559 fees from live history |
sn_getLogsDecoded |
getLogs with standard-event decoding attached |
One example, live against mainnet:
curl -X POST "https://rpc.swiftnodes.io/rpc/eth?key=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"sn_getTokenBalances",
"params":["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045",
["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"]]}'
{ "address": "0xd8da…6045", "blockNumber": "0x18a4058",
"nativeBalance": "6642178165221340300",
"tokens": [{ "contract": "0xa0b8…eb48", "balance": "37192124",
"symbol": "USDC", "decimals": 6 }] }
That's vitalik.eth's actual USDC, with metadata, pinned to one block — one round trip.
The design choices worth knowing
Everything is pinned. Multi-value responses carry a blockNumber, and every value in them was read at that block. The balance-reading traps — mixed-block snapshots, assumed decimals — are handled server-side.
It's batching, not magic. Under the hood each call becomes a single JSON-RPC batch to one upstream — a pattern we could commit to because our method-support matrix verifies weekly that every EVM chain we serve handles batching. sn_getBlockBundle even reads the matrix's reality: it uses eth_getBlockReceipts on chains that support it and falls back to per-transaction assembly where they don't. You could build all of this yourself with Multicall3 and patience — that's the point, you shouldn't have to.
Decoding is honest. sn_getTransactionBundle reports status as success, reverted, or pending, because mined and succeeded are different things. Standard events (Transfer, Approval, the ERC-1155 family) come back with named fields; anything non-standard stays raw rather than guessed at. In yesterday's verification run, a single sn_getBlockBundle on a 183-transaction block returned all 183 receipts with 743 decoded events — one request.
One call counts as one request. This is where we differ from how enhanced APIs are usually sold. Competitors meter their equivalent calls at a premium — an enhanced call burns more compute units than a raw one. Ours count as exactly one request against your rate limit no matter how many values come back, because flat-rate means flat-rate.
Why paid-only
Enhanced APIs are included with every paid plan — Starter and up — and return a clear upgrade error on the free tier. The free tier's job is letting you evaluate raw RPC honestly; the enhanced surface is part of what the flat monthly price buys, alongside unlimited volume, archive access, and this week's other launch, MEV-protected sends.
What's next
The current methods take explicit token lists, because "which tokens does this address hold at all" — and full address transaction history — need an index rather than clever live calls. That indexing layer is in the works; the API shape you see today is designed so those answers slot into it naturally.
Full parameter docs and limits: /docs/enhanced-apis. Plans start at $49/mo, flat — no compute units, no surprises, now with fewer round trips.
Related posts
- One Flag, No Sandwich: MEV-Protected Transactions Are Live
Add protect=1 to your SwiftNodes Ethereum endpoint and your transactions skip the public mempool entirely — routed through a private relay that shields them from sandwich bots and rebates backrun value to you.
- Plasma RPC: The Chain Where Sending USDT Costs Nothing
Plasma is a stablecoin-focused EVM L1 (chain ID 9745) with a protocol paymaster that makes basic USDT transfers zero-fee — users don't even need the native token. It's standard EVM (viem/ethers work), with sub-second PlasmaBFT finality and Bitcoin anchoring. Here's the developer map, including how the gasless-stablecoin model changes payment flows.
- Astar RPC: One Chain, Two VMs, Polkadot Security
Astar is a Polkadot parachain that runs both EVM and WebAssembly contracts. Chain ID 592 is its EVM endpoint — standard eth_*, so viem/ethers/foundry just work — but underneath it's Substrate with Polkadot's deterministic GRANDPA finality. Here's the developer map: what the EVM RPC gives you, and what the parachain model changes.