{"id":3836,"date":"2026-10-08T10:42:17","date_gmt":"2026-10-08T10:42:17","guid":{"rendered":"https:\/\/nownodes.io\/blog\/?p=3836"},"modified":"2026-10-08T10:42:18","modified_gmt":"2026-10-08T10:42:18","slug":"how-to-make-batch-requests-on-ethereum","status":"publish","type":"post","link":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/","title":{"rendered":"How To Make Batch Requests on Ethereum"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">A batch request packs several blockchain queries into one HTTP call instead of sending them one at a time. On Ethereum that means fewer round trips, lower latency, and code that finishes a wall of reads in a single network hop. This guide shows how to do it three ways: with plain JSON, with ethers.js, and with viem, plus the on-chain Multicall approach and the limits that trip people up.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-is-a-batch-request\">What Is a Batch Request?<\/h2>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-38-683x1024.png\" alt=\"\" class=\"wp-image-3837\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-38-683x1024.png 683w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-38-200x300.png 200w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-38-768x1152.png 768w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-38.png 1024w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A batch request is a single message that carries an array of JSON-RPC calls. The <a href=\"https:\/\/ethereum.org\/en\/developers\/docs\/apis\/json-rpc\/\">Ethereum JSON-RPC API<\/a> is the standard interface every Ethereum client exposes, and it accepts either one request object or a list of them in the same POST.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each item in the batch is an ordinary JSON-RPC 2.0 object with four fields: <code>jsonrpc<\/code> (always <code>\"2.0\"<\/code>), <code>method<\/code> (the call you want, like <code>eth_getBalance<\/code>), <code>params<\/code> (its arguments), and <code>id<\/code> (a label you choose). The server processes every item and returns an array of responses, each carrying the <code>id<\/code> of the request it answers.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"what-does-a-batch-look-like\">What does a batch look like?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Here is a batch that asks for the current block number and an account balance at once:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\n  { \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"eth_blockNumber\", \"params\": &#91;] },\n  { \"jsonrpc\": \"2.0\", \"id\": 2, \"method\": \"eth_getBalance\",\n    \"params\": &#91;\"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\", \"latest\"] }\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The reply is also an array, and it may come back in a different order than you sent:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&#91;\n  { \"jsonrpc\": \"2.0\", \"id\": 2, \"result\": \"0x1a3f8e2c9d...\" },\n  { \"jsonrpc\": \"2.0\", \"id\": 1, \"result\": \"0x12a05f200\" }\n]<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">That reordering is the whole reason the <code>id<\/code> field exists. The <a href=\"https:\/\/www.jsonrpc.org\/specification\">JSON-RPC 2.0 specification<\/a> does not promise responses in request order, so you match each answer to its question by <code>id<\/code>, never by position.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"why-bundle-multiple-calls\">Why Bundle Multiple Calls?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">The cost of a query is rarely the computation. It is the network trip: opening the connection, sending the request, waiting for the server, reading the response. Fire fifty single calls and you pay that overhead fifty times.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bundling collapses that overhead into one exchange. The gains show up as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Lower latency.<\/strong> One request and one response replace dozens of sequential round trips.<\/li>\n\n\n\n<li><strong>Better throughput.<\/strong> Fewer connections mean less time spent waiting and less load on both ends.<\/li>\n\n\n\n<li><strong>Simpler fan-out.<\/strong> Pulling the same field across many blocks or accounts becomes one readable block of code.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">One myth is worth killing early. A JSON-RPC batch is <strong>not atomic<\/strong>. The server runs each item independently, so item three can fail while items one, two, and four succeed. Batching saves time; it does not wrap your calls in a transaction. If you need all-or-nothing behavior, that lives on-chain, which we cover below.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"who-uses-batching-and-when\">Who Uses Batching, and When?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Batching earns its keep whenever an application reads a lot of independent data. Typical users include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Dashboards and analytics tools<\/strong> pulling balances, prices, or token metadata for long lists of addresses.<\/li>\n\n\n\n<li><strong>Indexers and data pipelines<\/strong> scanning a range of blocks and their receipts.<\/li>\n\n\n\n<li><strong>Wallets and portfolio trackers<\/strong> refreshing many holdings in one screen load.<\/li>\n\n\n\n<li><strong>Block explorers<\/strong> hydrating a page with headers, transactions, and logs together.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The common thread is volume plus independence. If your calls do not depend on each other&#8217;s results, they are candidates for the same batch. When one call&#8217;s output feeds the next, you either chain two batches or reach for an on-chain aggregator.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-make-a-batch-request-with-raw-json\">How To Make a Batch Request With Raw JSON<\/h2>\n\n\n<p class=\"wp-block-paragraph\">You do not need a library at all. Any HTTP client can POST an array of calls, which makes this the most portable method and a good way to see what the higher-level tools do under the hood.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Node.js 18 and later ship a built-in <code>fetch<\/code>, so this runs with zero dependencies:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const ENDPOINT = \"YOUR_ETHEREUM_ENDPOINT\";\n\nconst body = JSON.stringify(&#91;\n  { jsonrpc: \"2.0\", id: 1, method: \"eth_blockNumber\", params: &#91;] },\n  { jsonrpc: \"2.0\", id: 2, method: \"eth_gasPrice\", params: &#91;] },\n]);\n\nconst res = await fetch(ENDPOINT, {\n  method: \"POST\",\n  headers: { \"Content-Type\": \"application\/json\" },\n  body,\n});\n\nconst data = await res.json(); \/\/ an array of responses \u2014 match each by id\nconsole.log(data);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Build the array, send one POST, and read back one array. To fetch a block range, generate the request objects in a loop and give each a unique <code>id<\/code>. Because a batch can mix methods freely, you can combine <code>eth_getBalance<\/code>, <code>eth_getBlockByNumber<\/code>, and <code>eth_call<\/code> in the same list.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Watch for partial failures in the response. A batch usually returns HTTP 200 even when individual items error, so inspect each object for an <code>error<\/code> field rather than trusting the status code alone.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"batching-with-ethersjs\">Batching With ethers.js<\/h2>\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/docs.ethers.org\/v6\/api\/providers\/jsonrpc\/\">ethers.js<\/a> handles batching for you, and v6 does it by default. When you queue several calls in the same tick, the <code>JsonRpcProvider<\/code> collects them and sends one combined request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { JsonRpcProvider } from \"ethers\";\n\nconst provider = new JsonRpcProvider(ENDPOINT);\n\nconst &#91;balance, blockNumber, code] = await Promise.all(&#91;\n  provider.getBalance(\"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\"),\n  provider.getBlockNumber(),\n  provider.getCode(\"0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2\"),\n]);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Those three reads leave as a single batch, no extra setup required. The behavior is tunable through a third constructor argument, with defaults of 100 requests per batch (<code>batchMaxCount<\/code>), a 10-millisecond aggregation window (<code>batchStallTime<\/code>), and a 1 MB size ceiling (<code>batchMaxSize<\/code>) per the ethers v6 source:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">js<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const provider = new JsonRpcProvider(ENDPOINT, undefined, {\n  batchMaxCount: 50,   \/\/ lower it if your provider caps batch size\n  batchStallTime: 20,  \/\/ wait a touch longer to gather more calls\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Two practical notes. Set <code>batchMaxCount: 1<\/code> to switch batching off entirely, which some setups need. And if you are on the older v5 line, batching worked differently and could return responses out of order; v6 resolves that ordering issue, so upgrading is the cleaner fix.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"batching-with-viem\">Batching With viem<\/h2>\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/viem.sh\/docs\/clients\/public\">viem<\/a> gives you two distinct batching mechanisms, and knowing which is which saves confusion.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first bundles raw JSON-RPC calls at the transport level. Pass <code>batch: true<\/code> to the HTTP transport and viem packs queued calls into one request, much like ethers:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import { createPublicClient, http } from \"viem\";\nimport { mainnet } from \"viem\/chains\";\n\nconst client = createPublicClient({\n  chain: mainnet,\n  transport: http(ENDPOINT, { batch: true }),\n});\n\nconst &#91;blockNumber, balance] = await Promise.all(&#91;\n  client.getBlockNumber(),\n  client.getBalance({ address: \"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\" }),\n]);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The second is aggregation through Multicall, and it is specific to contract reads. Enable <code>batch: { multicall: true }<\/code> on the client and viem rolls multiple <code>eth_call<\/code> reads into a single on-chain <code>aggregate3<\/code> call:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const client = createPublicClient({\n  chain: mainnet,\n  transport: http(ENDPOINT),\n  batch: { multicall: true }, \/\/ many eth_call reads become one request\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">When you want to build the batch explicitly, call the <code>multicall<\/code> action directly:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ts<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>const results = await client.multicall({\n  contracts: &#91;\n    { address: token, abi, functionName: \"balanceOf\", args: &#91;user] },\n    { address: token, abi, functionName: \"decimals\" },\n  ],\n});<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"which-library-should-you-reach-for\">Which library should you reach for?<\/h3>\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Approach<\/th><th>Batching style<\/th><th>Status (Oct 2026)<\/th><th>Best for<\/th><\/tr><\/thead><tbody><tr><td>Raw JSON array + <code>fetch<\/code><\/td><td>Manual list of calls<\/td><td>Protocol-level, always available<\/td><td>Full control, no dependencies<\/td><\/tr><tr><td>ethers.js v6<\/td><td>Automatic (queues calls)<\/td><td>Actively maintained<\/td><td>Most JS\/TS applications<\/td><\/tr><tr><td>viem<\/td><td>HTTP batch <strong>and<\/strong> Multicall aggregation<\/td><td>Actively maintained<\/td><td>Modern TypeScript, heavy contract reads<\/td><\/tr><tr><td>web3.js<\/td><td><code>BatchRequest<\/code> object<\/td><td>Archived March 2025<\/td><td>Legacy projects only<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">One word on web3.js: ChainSafe <a href=\"https:\/\/blog.chainsafe.io\/web3-js-sunset\/\">sunset the library on March 4, 2025<\/a> and archived the repository the next day. It still runs, and its <code>BatchRequest<\/code> object still works, but it no longer receives updates. For new code, ethers or viem is the safer foundation.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"jsonrpc-batching-vs-onchain-multicall\">JSON-RPC Batching vs. On-Chain Multicall<\/h2>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"683\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-39-1024x683.png\" alt=\"\" class=\"wp-image-3838\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-39-1024x683.png 1024w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-39-300x200.png 300w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-39-768x512.png 768w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-39.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">These two techniques look similar and solve different problems. A JSON-RPC batch is a transport trick: many calls, one HTTP message. Multicall is a smart contract trick: many contract reads, one <code>eth_call<\/code>, executed against a single block.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That block consistency is the key difference. Across a JSON-RPC batch, items can land on slightly different blocks if a new block arrives mid-flight. A Multicall runs every read inside one contract call, so every value reflects the same block height, which matters when you are reading, say, a pool&#8217;s reserves and its total supply together.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.multicall3.com\/\">Multicall3<\/a> is the de facto standard here. It sits at the same precomputed address, <code>0xcA11bde05977b3631167028862bE2a173976CA11<\/code>, on more than 100 chains, and its <code>aggregate3<\/code> method batches calls with per-call failure handling.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><\/th><th>JSON-RPC batch (off-chain)<\/th><th>Multicall3 (on-chain)<\/th><\/tr><\/thead><tbody><tr><td>What it bundles<\/td><td>Any JSON-RPC methods<\/td><td>Contract reads (<code>eth_call<\/code>)<\/td><\/tr><tr><td>The trip<\/td><td>One HTTP request<\/td><td>One <code>eth_call<\/code><\/td><\/tr><tr><td>Same block for all?<\/td><td>Not guaranteed<\/td><td>Yes, single block<\/td><\/tr><tr><td>Atomic?<\/td><td>No \u2014 each item is independent<\/td><td>Optional (the aggregate can revert on failure)<\/td><\/tr><tr><td>Needs a contract?<\/td><td>No<\/td><td>Yes (Multicall3)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Rule of thumb: reach for a JSON-RPC batch when you are collecting mixed, independent data and do not care about exact block alignment. Reach for Multicall when you are reading many contract values that must agree on a single moment in time.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"limits-and-tradeoffs-to-watch\">Limits and Trade-Offs To Watch<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Batching is not free of edges. Keep these in mind before you ship.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Batch size caps.<\/strong> Endpoints limit how many items a batch may hold. Overshoot and you get a JSON-RPC error such as <code>-32600<\/code> (&#8220;batch too large&#8221;) or <code>-32005<\/code> for exceeding the item count. Start conservative and raise the count only once you know your endpoint&#8217;s ceiling.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Response ordering.<\/strong> As covered above, order is never guaranteed. Always key off the <code>id<\/code> field.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Bigger is not always faster.<\/strong> A single enormous batch can take longer to assemble and process than several smaller ones, and it is more likely to time out. Chunking a thousand calls into batches of fifty is often the sweet spot.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Provider behavior varies.<\/strong> Not every managed endpoint treats batching the same way. Some are tuned for parallel individual requests and may cap batches or disable them over WebSocket connections. Test against your actual endpoint rather than assuming.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is where reliable access matters. <a href=\"https:\/\/nownodes.io\">NOWNodes<\/a> provides managed Ethereum endpoints across 120+ networks, so you can point any of the methods above at a stable connection instead of maintaining your own infrastructure. For heavy batching and Multicall workloads, you can measure how a given plan and <a href=\"https:\/\/nownodes.io\">Ethereum endpoint<\/a> respond and tune <code>batchMaxCount<\/code> accordingly.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"putting-batch-requests-to-work\">Putting Batch Requests To Work<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Batching is one of the cheapest performance wins in Ethereum development. Start with raw JSON to understand the shape, then let ethers or viem handle the plumbing in real code. When your reads need to agree on a single block, step up to Multicall3. And whatever you build, match responses by <code>id<\/code>, expect partial failures, and size your batches to your endpoint rather than to a round number.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"how-many-requests-can-i-include-in-one-batch\">How many requests can I include in one batch?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">There is no universal number. It depends on your endpoint&#8217;s limits. As a reference point, ethers.js v6 defaults to 100 requests per batch, which is a reasonable starting ceiling. If you hit a <code>-32600<\/code> or <code>-32005<\/code> error, lower the count and consider splitting large jobs into smaller batches.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"can-i-batch-different-method-types-together\">Can I batch different method types together?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Yes. A single batch can mix any JSON-RPC methods: <code>eth_getBalance<\/code>, <code>eth_getBlockByNumber<\/code>, <code>eth_call<\/code>, and others can all travel in the same array. Each item is independent, so the methods and their parameters do not need to match.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"does-batching-reduce-gas-costs\">Does batching reduce gas costs?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">For off-chain JSON-RPC batches, no. Read methods consume no gas, so batching them saves network time, not fees. Gas savings come from the on-chain side: an on-chain Multicall that bundles state-changing calls can cut the per-transaction overhead of sending them separately.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"is-web3js-still-a-good-option-for-batching\">Is web3.js still a good option for batching?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Only for existing projects. ChainSafe archived web3.js in March 2025, so it receives no further updates. Its batching still functions, but new code is better served by ethers.js or viem, both of which are actively maintained and batch by default.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A batch request packs several blockchain queries into one HTTP call instead of sending them one at a time. On Ethereum that means fewer round trips, lower latency, and code that finishes a wall of reads in a single network hop. This guide shows how to do it three ways: with plain JSON, with ethers.js, [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":3839,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_eb_attr":"","_lmt_disableupdate":"","_lmt_disable":"","_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[102],"tags":[],"class_list":["post-3836","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev-report"],"blocksy_meta":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.0 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Ethereum Batch Requests: JSON-RPC, ethers &amp; viem<\/title>\n<meta name=\"description\" content=\"Learn how to make batch requests on Ethereum using raw JSON-RPC arrays, ethers.js and viem batching, Multicall3 aggregation, and the limits to watch.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ethereum Batch Requests: JSON-RPC, ethers &amp; viem\" \/>\n<meta property=\"og:description\" content=\"Learn how to make batch requests on Ethereum using raw JSON-RPC arrays, ethers.js and viem batching, Multicall3 aggregation, and the limits to watch.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/\" \/>\n<meta property=\"og:site_name\" content=\"NOWNodes Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-08T10:42:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-08T10:42:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/nodes_1-88.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2400\" \/>\n\t<meta property=\"og:image:height\" content=\"1200\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"\u0410nastasia\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nownodes\" \/>\n<meta name=\"twitter:site\" content=\"@nownodes\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u0410nastasia\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/\"},\"author\":{\"name\":\"\u0410nastasia\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\"},\"headline\":\"How To Make Batch Requests on Ethereum\",\"datePublished\":\"2026-10-08T10:42:17+00:00\",\"dateModified\":\"2026-10-08T10:42:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/\"},\"wordCount\":1637,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"articleSection\":[\"Dev Report\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/\",\"url\":\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/\",\"name\":\"Ethereum Batch Requests: JSON-RPC, ethers & viem\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#website\"},\"datePublished\":\"2026-10-08T10:42:17+00:00\",\"dateModified\":\"2026-10-08T10:42:18+00:00\",\"description\":\"Learn how to make batch requests on Ethereum using raw JSON-RPC arrays, ethers.js and viem batching, Multicall3 aggregation, and the limits to watch.\",\"breadcrumb\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Blog\",\"item\":\"https:\/\/nownodes.io\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dev Report\",\"item\":\"https:\/\/nownodes.io\/blog\/category\/dev-report\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"How To Make Batch Requests on Ethereum\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/nownodes.io\/blog\/#website\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"name\":\"NOWNodes Blog\",\"description\":\"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes\",\"publisher\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/nownodes.io\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/nownodes.io\/blog\/#organization\",\"name\":\"NOWNodes Blog\",\"url\":\"https:\/\/nownodes.io\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"contentUrl\":\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png\",\"width\":1164,\"height\":1164,\"caption\":\"NOWNodes Blog\"},\"image\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/twitter.com\/nownodes\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\",\"name\":\"\u0410nastasia\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g\",\"caption\":\"\u0410nastasia\"},\"url\":\"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ethereum Batch Requests: JSON-RPC, ethers & viem","description":"Learn how to make batch requests on Ethereum using raw JSON-RPC arrays, ethers.js and viem batching, Multicall3 aggregation, and the limits to watch.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/","og_locale":"en_US","og_type":"article","og_title":"Ethereum Batch Requests: JSON-RPC, ethers & viem","og_description":"Learn how to make batch requests on Ethereum using raw JSON-RPC arrays, ethers.js and viem batching, Multicall3 aggregation, and the limits to watch.","og_url":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/","og_site_name":"NOWNodes Blog","article_published_time":"2026-10-08T10:42:17+00:00","article_modified_time":"2026-10-08T10:42:18+00:00","og_image":[{"width":2400,"height":1200,"url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/nodes_1-88.jpg","type":"image\/jpeg"}],"author":"\u0410nastasia","twitter_card":"summary_large_image","twitter_creator":"@nownodes","twitter_site":"@nownodes","twitter_misc":{"Written by":"\u0410nastasia","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#article","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/"},"author":{"name":"\u0410nastasia","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8"},"headline":"How To Make Batch Requests on Ethereum","datePublished":"2026-10-08T10:42:17+00:00","dateModified":"2026-10-08T10:42:18+00:00","mainEntityOfPage":{"@id":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/"},"wordCount":1637,"commentCount":0,"publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"articleSection":["Dev Report"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/","url":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/","name":"Ethereum Batch Requests: JSON-RPC, ethers & viem","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/#website"},"datePublished":"2026-10-08T10:42:17+00:00","dateModified":"2026-10-08T10:42:18+00:00","description":"Learn how to make batch requests on Ethereum using raw JSON-RPC arrays, ethers.js and viem batching, Multicall3 aggregation, and the limits to watch.","breadcrumb":{"@id":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nownodes.io\/blog\/how-to-make-batch-requests-on-ethereum\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Blog","item":"https:\/\/nownodes.io\/blog"},{"@type":"ListItem","position":2,"name":"Dev Report","item":"https:\/\/nownodes.io\/blog\/category\/dev-report"},{"@type":"ListItem","position":3,"name":"How To Make Batch Requests on Ethereum"}]},{"@type":"WebSite","@id":"https:\/\/nownodes.io\/blog\/#website","url":"https:\/\/nownodes.io\/blog\/","name":"NOWNodes Blog","description":"Your first-to-go source of development guides, web3 analytics and most recent news about NOWNodes","publisher":{"@id":"https:\/\/nownodes.io\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nownodes.io\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/nownodes.io\/blog\/#organization","name":"NOWNodes Blog","url":"https:\/\/nownodes.io\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","contentUrl":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2024\/02\/cropped-New-Logo-NN.png","width":1164,"height":1164,"caption":"NOWNodes Blog"},"image":{"@id":"https:\/\/nownodes.io\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/twitter.com\/nownodes"]},{"@type":"Person","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8","name":"\u0410nastasia","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1de24ab8dcdd7ec30f6adaf78b56bc1eda421f87575b7e103c8fc3fc4420e833?s=96&d=mm&r=g","caption":"\u0410nastasia"},"url":"https:\/\/nownodes.io\/blog\/author\/nasty-nownodes"}]}},"modified_by":"\u0410nastasia","_links":{"self":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/comments?post=3836"}],"version-history":[{"count":1,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3836\/revisions"}],"predecessor-version":[{"id":3840,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3836\/revisions\/3840"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media\/3839"}],"wp:attachment":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media?parent=3836"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/categories?post=3836"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/tags?post=3836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}