{"id":3851,"date":"2026-10-08T11:15:23","date_gmt":"2026-10-08T11:15:23","guid":{"rendered":"https:\/\/nownodes.io\/blog\/?p=3851"},"modified":"2026-10-08T11:15:24","modified_gmt":"2026-10-08T11:15:24","slug":"how-to-get-event-logs-and-transaction-history-with-eth_getlogs","status":"publish","type":"post","link":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/","title":{"rendered":"How to Get Event Logs and Transaction History with eth_getLogs"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><code>eth_getLogs<\/code> is the Ethereum JSON-RPC method that returns every event log matching a filter you supply \u2014 a contract address, a block range, and a set of topics. It&#8217;s the standard way to pull historical crypto logs after the fact: the token transfers, swaps, and state changes a contract recorded while it ran. Point it at the right filter and you can rebuild most of an address&#8217;s on-chain activity without replaying a single block of execution.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers what those logs are, why they exist as a separate data type, who pulls them, and how to query them correctly once your filter reaches past a handful of blocks. The mechanics are standard across every provider; the limits around them are not.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"what-is-an-event-log-on-ethereum\">What Is an Event Log on Ethereum?<\/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-44-1024x683.png\" alt=\"\" class=\"wp-image-3852\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-44-1024x683.png 1024w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-44-300x200.png 300w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-44-768x512.png 768w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-44.png 1536w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">An event log is a record a smart contract writes during execution to mark that something happened, stored on the transaction&#8217;s receipt rather than in the contract&#8217;s own storage. When a Solidity contract runs <code>emit Transfer(from, to, amount)<\/code>, the Ethereum Virtual Machine appends a log entry to that transaction \u2014 cheap to write, and permanent, but something the contract itself can never read back.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each log splits its information into two places. Indexed parameters go into an array called <code>topics<\/code>, which the node can filter on directly. Everything else gets packed into a <code>data<\/code> field as raw hex that you decode later using the contract&#8217;s ABI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The split matters because only <code>topics<\/code> is searchable. A log holds up to four topics: the first slot is reserved for the keccak-256 hash of the event&#8217;s signature, which leaves three slots for parameters a contract marks as <code>indexed<\/code>. That ceiling is why filtering is fast but limited \u2014 you can narrow a query to an event type and a few indexed values, and nothing more.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"why-query-logs-instead-of-reading-contract-state\">Why Query Logs Instead of Reading Contract State?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Logs are the only affordable way to see what a contract did over time, rather than only what it holds right now. Contract state answers &#8220;what is this balance&#8221;; logs answer &#8220;every transfer that produced it.&#8221; Re-deriving that history by replaying past transactions would mean re-executing the chain, which no application can do on each request.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Events exist to sidestep that. A decentralized exchange doesn&#8217;t keep a list of every trade in storage \u2014 it emits a <code>Swap<\/code> event per trade and lets anyone reconstruct the record from logs. An ERC-20 token works the same way: the contract tracks balances, but the <code>Transfer<\/code> event is the audit trail, and wallets and explorers collect it themselves.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s also a cost reason the design holds. Writing a value to contract storage is one of the more expensive operations on Ethereum, while a log entry is far cheaper, as the <a href=\"https:\/\/ethereum.org\/en\/developers\/docs\/gas\/\" rel=\"nofollow noopener noreferrer\">ethereum.org gas documentation<\/a> lays out. Logs were built as a write-only, low-cost record \u2014 which is exactly what makes a method like <code>eth_getLogs<\/code> possible.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"who-relies-on-event-log-data\">Who Relies on Event Log Data?<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Different teams pull the same logs for different reasons, and most of them care about history rather than live state:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Wallets and portfolio trackers<\/strong> read <code>Transfer<\/code> logs to detect incoming tokens and rebuild an address&#8217;s history.<\/li>\n\n\n\n<li><strong>Block explorers<\/strong> decode logs into the human-readable activity feed shown under each transaction.<\/li>\n\n\n\n<li><strong>Analytics dashboards<\/strong> aggregate <code>Swap<\/code>, <code>Mint<\/code>, and <code>Burn<\/code> events to compute volume and liquidity over time.<\/li>\n\n\n\n<li><strong>Exchanges and payment processors<\/strong> watch deposit-address transfers to credit accounts without scanning every block by hand.<\/li>\n\n\n\n<li><strong>Security and compliance teams<\/strong> monitor specific events \u2014 a large withdrawal, an ownership change \u2014 to flag unusual activity.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">None of them want to run execution against the whole chain. They want a filtered, decoded slice of the past, and <code>eth_getLogs<\/code> is what delivers it.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"how-to-query-event-logs-parameters-and-a-sample-request\">How to Query Event Logs: Parameters and a Sample Request<\/h2>\n\n\n<p class=\"wp-block-paragraph\">A query is a single filter object passed to the method, and the node returns every log that matches. The fields are all optional, but the useful ones narrow the search enough to return in time.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"the-filter-object-fields\">The Filter Object Fields<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Five fields shape a query, confirmed against the <a href=\"https:\/\/ethereum.org\/en\/developers\/docs\/apis\/json-rpc\/\" rel=\"nofollow noopener noreferrer\">ethereum.org JSON-RPC specification<\/a>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>fromBlock<\/code> and <code>toBlock<\/code> \u2014 the range to search, as hex block numbers or tags like <code>\"latest\"<\/code>. Both default to <code>\"latest\"<\/code>.<\/li>\n\n\n\n<li><code>address<\/code> \u2014 one contract address, or a list, to restrict which emitter&#8217;s logs you get.<\/li>\n\n\n\n<li><code>topics<\/code> \u2014 the ordered filter on indexed values (covered below).<\/li>\n\n\n\n<li><code>blockHash<\/code> \u2014 a single block to search, added by EIP-234. It can&#8217;t be combined with <code>fromBlock<\/code> or <code>toBlock<\/code>; you use one approach or the other.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s a request that pulls every ERC-20 <code>Transfer<\/code> log sent <em>to<\/em> one address over a block range \u2014 the first step in reconstructing what that address received:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">json<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>{\n  \"jsonrpc\": \"2.0\",\n  \"id\": 1,\n  \"method\": \"eth_getLogs\",\n  \"params\": &#91;{\n    \"fromBlock\": \"0x13C6800\",\n    \"toBlock\": \"0x13C6B58\",\n    \"topics\": &#91;\n      \"0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\",\n      null,\n      \"0x000000000000000000000000742d35cc6634c0532925a3b844bc454e4438f44e\"\n    ]\n  }]\n}<\/code><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-topic-filtering-works\">How Topic Filtering Works<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Topics are matched by position, so order is everything. The first entry is the event signature hash \u2014 <code>keccak256(\"Transfer(address,address,uint256)\")<\/code> in the example above. A <code>null<\/code> in any slot means &#8220;match anything here,&#8221; which is why the request leaves the sender position open and pins only the recipient in <code>topics[2]<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two rules make topic filters more flexible than they first look. A nested array acts as an OR: <code>[[A, B]]<\/code> matches a log whose first topic is either A or B. And an indexed address has to be left-padded to a full 32 bytes to line up with the topic slot, which is why the recipient above carries all those leading zeros.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">One trap sits inside this. Marking a dynamic type \u2014 a <code>string<\/code>, <code>bytes<\/code>, or array \u2014 as <code>indexed<\/code> does not store the value in <code>topics<\/code>; it stores the keccak-256 hash of it instead. You can match that hash exactly, but you can never recover the original text from the topic alone.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"reading-the-response\">Reading the Response<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Each log in the result carries the fields you need to trace it: <code>blockNumber<\/code>, <code>transactionHash<\/code>, <code>logIndex<\/code>, the emitting <code>address<\/code>, the <code>topics<\/code> array, and the <code>data<\/code> blob. The indexed values are already readable in <code>topics<\/code>; the rest stays hex until you run it through an ABI decoder such as viem&#8217;s <code>decodeEventLog<\/code> or ethers.js&#8217;s <code>Interface.parseLog<\/code>. An empty result means no log matched your filter in that range \u2014 not that the query failed.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"rebuilding-an-addresss-transaction-history-from-logs\">Rebuilding an Address&#8217;s Transaction History from Logs<\/h2>\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"936\" src=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-45-1024x936.png\" alt=\"\" class=\"wp-image-3853\" srcset=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-45-1024x936.png 1024w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-45-300x274.png 300w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-45-767x701.png 767w, https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/image-45.png 1312w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">To reconstruct what an address has done with tokens, you run two <code>Transfer<\/code> queries over the same range: one with the address in <code>topics[1]<\/code> (tokens it sent) and one with it in <code>topics[2]<\/code> (tokens it received). Merge the two result sets, sort by <code>blockNumber<\/code> and <code>logIndex<\/code>, and you have an ordered token-transfer history for that account across every ERC-20 that follows the standard.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The same pattern extends to NFTs. ERC-721 emits a <code>Transfer<\/code> event with the token ID as a third indexed parameter, so the recipient filter still works \u2014 you just read the ID from <code>topics[3]<\/code> instead of an amount from <code>data<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There&#8217;s a real limit worth stating plainly. A plain ETH transfer \u2014 sending value from one account to another with no contract call \u2014 emits no log at all, so <code>eth_getLogs<\/code> will never show it. The method sees contract events, not raw value movement. For a complete picture that includes native ETH, you need trace methods such as <code>debug_traceTransaction<\/code>, or an indexing service that stitches both sources together. Treat log-based history as &#8220;everything the token contracts recorded,&#8221; not &#8220;every transaction this address ever made.&#8221;<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"provider-limits-youll-hit-and-how-to-work-around-them\">Provider Limits You&#8217;ll Hit (and How to Work Around Them)<\/h2>\n\n\n<p class=\"wp-block-paragraph\">This is where most queries break, because every provider caps <code>eth_getLogs<\/code> differently and none of it is standardized. Leave the filter too wide and the node has to scan an enormous span of blocks for matches. Alchemy&#8217;s own documentation warns that the method has &#8220;extreme vulnerabilities that can have huge consequences if you don&#8217;t use it correctly,&#8221; which is why the caps exist in the first place.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The numbers themselves vary by service:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Provider \/ endpoint<\/th><th>Current limit<\/th><\/tr><\/thead><tbody><tr><td>Alchemy<\/td><td>10,000 logs per response over any range, or a 2,000-block range with a 150 MB response cap<\/td><\/tr><tr><td>Infura (MetaMask Developer)<\/td><td>10,000 results per query, and a 10-second query timeout<\/td><\/tr><tr><td>QuickNode<\/td><td>10,000 blocks per request by default<\/td><\/tr><tr><td>Free public endpoints<\/td><td>Vary widely, often 50\u20131,000 blocks per query<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The Alchemy figures come from its <a href=\"https:\/\/www.alchemy.com\/docs\/deep-dive-into-eth_getlogs\" rel=\"nofollow noopener noreferrer\">deep dive on the method<\/a>; Infura&#8217;s 10,000-result cap and timeout are stated in the <a href=\"https:\/\/docs.metamask.io\/services\/reference\/base\/json-rpc-methods\/eth_getlogs\/\" rel=\"nofollow noopener noreferrer\">MetaMask Developer docs<\/a>, which return error <code>-32005<\/code> when either is exceeded; QuickNode documents its <a href=\"https:\/\/support.quicknode.com\/hc\/en-us\/articles\/10258449939473-Understanding-the-10-000-Block-Range-Limit-for-querying-Logs-and-Events\" rel=\"nofollow noopener noreferrer\">10,000-block range limit<\/a> separately. The lesson is to check your endpoint&#8217;s specific caps before you design a query, not after it starts failing.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"why-pagination-is-nonnegotiable\">Why Pagination Is Non-Negotiable<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Any query reaching across months or years will exceed one of those caps, so wide historical pulls have to be split. Divide the full range into chunks that fit under whichever limit your endpoint enforces, request them in sequence, and stitch the results together.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Two details decide whether this works. First, old data lives only on archive infrastructure \u2014 a pruned node discards historical state, so filters that reach far back need an archive-enabled endpoint. Second, a query that fails because it hit a cap returns an error naming the limit; the fix is a smaller range, never a retry of the same one.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"filters-vs-oneshot-queries\">Filters vs One-Shot Queries<\/h3>\n\n\n<p class=\"wp-block-paragraph\"><code>eth_getLogs<\/code> is a one-shot request: you send a full filter object and get the matching logs back in that single call. Ethereum also offers a stateful alternative \u2014 <code>eth_newFilter<\/code> installs a filter on the node and returns an ID, then <code>eth_getFilterChanges<\/code> returns only the new logs since your last poll, and <code>eth_getFilterLogs<\/code> returns all logs for that filter. It suits repeated polling for the same criteria, but installed filters time out if you stop polling them, as the JSON-RPC spec notes, so they aren&#8217;t reliable for long gaps.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Approach<\/th><th>Best for<\/th><th>Catch<\/th><\/tr><\/thead><tbody><tr><td><code>eth_getLogs<\/code><\/td><td>A known range you query once<\/td><td>You handle pagination yourself<\/td><\/tr><tr><td><code>eth_newFilter<\/code> + <code>eth_getFilterChanges<\/code><\/td><td>Repeated polling for the same filter<\/td><td>The filter expires if left unpolled<\/td><\/tr><tr><td><code>eth_subscribe<\/code> (WebSocket)<\/td><td>Live logs as blocks arrive<\/td><td>No historical backfill on its own<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<h2 class=\"wp-block-heading\" id=\"where-to-run-highvolume-log-queries\">Where to Run High-Volume Log Queries<\/h2>\n\n\n<p class=\"wp-block-paragraph\">Once log queries move from an occasional script into continuous monitoring, the constraint stops being the filter and becomes how much request volume and history your endpoint can sustain. <a href=\"https:\/\/nownodes.io\/nodes\/ethereum-eth\">NOWNodes&#8217; Ethereum endpoint<\/a> exposes <code>eth_getLogs<\/code> alongside archive access on the same network, so a historical backfill and a recent query run against one place instead of two.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For anything that needs logs the moment they land \u2014 a bot reacting to a specific event, a dashboard updating live \u2014 <a href=\"https:\/\/nownodes.io\/wss\">NOWNodes&#8217; WebSocket API<\/a> handles the <code>eth_subscribe<\/code> side that <code>eth_getLogs<\/code> can&#8217;t, pushing matches over one open connection rather than a polling loop. And for workloads that run heavy query volume around the clock, such as an indexer rebuilding a protocol&#8217;s full history, <a href=\"https:\/\/nownodes.io\/dedicated-nodes\">a dedicated endpoint<\/a> removes the shared request quota so throughput depends on allocated hardware instead of a fixed call count. If you&#8217;re only prototyping, the free public endpoints work too, though their 5-requests-per-second ceiling will throttle any serious backfill.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n<p class=\"wp-block-paragraph\"><code>eth_getLogs<\/code> turns Ethereum&#8217;s cheap, write-only event logs into a queryable history \u2014 token transfers, swaps, and contract activity you can filter by address, block range, and topic. The query mechanics are identical everywhere: a filter object, an ordered topics array, and a response you decode with an ABI. What changes between providers is the caps, so the real work is matching your block range and pagination to the endpoint you&#8217;re actually using. Get the filter right and respect the limits, and logs give you exactly what they were designed for \u2014 a complete record of what happened, without ever touching contract state.<\/p>\n\n\n<h2 class=\"wp-block-heading\" id=\"faq\">FAQ<\/h2>\n\n<h3 class=\"wp-block-heading\" id=\"does-ethgetlogs-return-pending-or-unconfirmed-logs\">Does eth_getLogs return pending or unconfirmed logs?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">No. The method reads logs from blocks that have already been mined, so a transaction still sitting in the mempool produces nothing. To catch events the moment they are included, use an <code>eth_subscribe<\/code> WebSocket subscription instead of polling.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"how-do-block-reorganizations-affect-the-logs-i-get-back\">How do block reorganizations affect the logs I get back?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Logs near the chain head can change if those blocks are reorganized out, since the transactions that emitted them may land in a different order or drop entirely. Querying a range that ends a few blocks behind <code>\"latest\"<\/code> avoids reading logs that a reorg might later invalidate.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"why-did-my-query-return-an-empty-array-instead-of-an-error\">Why did my query return an empty array instead of an error?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">An empty array means the request succeeded and simply found no logs matching your filter in that range \u2014 a valid, common result. An error, by contrast, means something was rejected, such as exceeding a result or block-range cap. The two are not interchangeable, so handle them separately in code.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"can-i-filter-logs-by-the-transactions-sender-address\">Can I filter logs by the transaction&#8217;s sender address?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">Not directly. The method filters on a log&#8217;s <code>topics<\/code> and emitting <code>address<\/code>, not on the <code>from<\/code> field of the transaction that produced it. A sender address is only filterable if the event itself marked it as an indexed parameter, in which case it occupies a topic slot you can match.<\/p>\n\n\n<h3 class=\"wp-block-heading\" id=\"is-ethgetlogs-behavior-the-same-across-every-provider\">Is eth_getLogs behavior the same across every provider?<\/h3>\n\n\n<p class=\"wp-block-paragraph\">The request format and response shape are standard, but the enforced limits are not. Result caps, block-range ceilings, query timeouts, and how far back archive data reaches all differ by provider and plan, so a query that runs fine on one endpoint can fail on another without any change to the filter.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>eth_getLogs is the Ethereum JSON-RPC method that returns every event log matching a filter you supply \u2014 a contract address, a block range, and a set of topics. It&#8217;s the standard way to pull historical crypto logs after the fact: the token transfers, swaps, and state changes a contract recorded while it ran. Point it [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":3854,"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-3851","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>Get Event Logs: Query Ethereum Event Logs &amp; History<\/title>\n<meta name=\"description\" content=\"Learn how eth_getLogs pulls Ethereum event logs and rebuilds an address&#039;s transaction history \u2014 filter parameters, topic rules, provider limits, pagination.\" \/>\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-get-event-logs-and-transaction-history-with-eth_getlogs\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Get Event Logs: Query Ethereum Event Logs &amp; History\" \/>\n<meta property=\"og:description\" content=\"Learn how eth_getLogs pulls Ethereum event logs and rebuilds an address&#039;s transaction history \u2014 filter parameters, topic rules, provider limits, pagination.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/\" \/>\n<meta property=\"og:site_name\" content=\"NOWNodes Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-08T11:15:23+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-08T11:15:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/nodes_1-91.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=\"10 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-get-event-logs-and-transaction-history-with-eth_getlogs\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/\"},\"author\":{\"name\":\"\u0410nastasia\",\"@id\":\"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8\"},\"headline\":\"How to Get Event Logs and Transaction History with eth_getLogs\",\"datePublished\":\"2026-10-08T11:15:23+00:00\",\"dateModified\":\"2026-10-08T11:15:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/\"},\"wordCount\":2127,\"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-get-event-logs-and-transaction-history-with-eth_getlogs\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/\",\"url\":\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/\",\"name\":\"Get Event Logs: Query Ethereum Event Logs & History\",\"isPartOf\":{\"@id\":\"https:\/\/nownodes.io\/blog\/#website\"},\"datePublished\":\"2026-10-08T11:15:23+00:00\",\"dateModified\":\"2026-10-08T11:15:24+00:00\",\"description\":\"Learn how eth_getLogs pulls Ethereum event logs and rebuilds an address's transaction history \u2014 filter parameters, topic rules, provider limits, pagination.\",\"breadcrumb\":{\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/#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 Get Event Logs and Transaction History with eth_getLogs\"}]},{\"@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":"Get Event Logs: Query Ethereum Event Logs & History","description":"Learn how eth_getLogs pulls Ethereum event logs and rebuilds an address's transaction history \u2014 filter parameters, topic rules, provider limits, pagination.","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-get-event-logs-and-transaction-history-with-eth_getlogs\/","og_locale":"en_US","og_type":"article","og_title":"Get Event Logs: Query Ethereum Event Logs & History","og_description":"Learn how eth_getLogs pulls Ethereum event logs and rebuilds an address's transaction history \u2014 filter parameters, topic rules, provider limits, pagination.","og_url":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/","og_site_name":"NOWNodes Blog","article_published_time":"2026-10-08T11:15:23+00:00","article_modified_time":"2026-10-08T11:15:24+00:00","og_image":[{"width":2400,"height":1200,"url":"https:\/\/nownodes.io\/blog\/wp-content\/uploads\/2026\/10\/nodes_1-91.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":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/#article","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/"},"author":{"name":"\u0410nastasia","@id":"https:\/\/nownodes.io\/blog\/#\/schema\/person\/0890ec68e813adecb93c18ee00e1e7a8"},"headline":"How to Get Event Logs and Transaction History with eth_getLogs","datePublished":"2026-10-08T11:15:23+00:00","dateModified":"2026-10-08T11:15:24+00:00","mainEntityOfPage":{"@id":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/"},"wordCount":2127,"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-get-event-logs-and-transaction-history-with-eth_getlogs\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/","url":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/","name":"Get Event Logs: Query Ethereum Event Logs & History","isPartOf":{"@id":"https:\/\/nownodes.io\/blog\/#website"},"datePublished":"2026-10-08T11:15:23+00:00","dateModified":"2026-10-08T11:15:24+00:00","description":"Learn how eth_getLogs pulls Ethereum event logs and rebuilds an address's transaction history \u2014 filter parameters, topic rules, provider limits, pagination.","breadcrumb":{"@id":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nownodes.io\/blog\/how-to-get-event-logs-and-transaction-history-with-eth_getlogs\/#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 Get Event Logs and Transaction History with eth_getLogs"}]},{"@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\/3851","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=3851"}],"version-history":[{"count":1,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3851\/revisions"}],"predecessor-version":[{"id":3855,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/posts\/3851\/revisions\/3855"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media\/3854"}],"wp:attachment":[{"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/media?parent=3851"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/categories?post=3851"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nownodes.io\/blog\/wp-json\/wp\/v2\/tags?post=3851"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}