Skip to main content
POST
/
eth_getFilterChanges
curl --request POST \
  --url https://tempo-mainnet.core.chainstack.com/c3ce2925b51f1ed18719fe8a23bbdccf/ \
  --header 'Content-Type: application/json' \
  --data '
{
  "jsonrpc": "2.0",
  "method": "eth_getFilterChanges",
  "params": [
    "0x..."
  ],
  "id": 1
}
'
import requests

url = "https://tempo-mainnet.core.chainstack.com/c3ce2925b51f1ed18719fe8a23bbdccf/"

payload = {
"jsonrpc": "2.0",
"method": "eth_getFilterChanges",
"params": ["0x..."],
"id": 1
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({jsonrpc: '2.0', method: 'eth_getFilterChanges', params: ['0x...'], id: 1})
};

fetch('https://tempo-mainnet.core.chainstack.com/c3ce2925b51f1ed18719fe8a23bbdccf/', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://tempo-mainnet.core.chainstack.com/c3ce2925b51f1ed18719fe8a23bbdccf/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'jsonrpc' => '2.0',
'method' => 'eth_getFilterChanges',
'params' => [
'0x...'
],
'id' => 1
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://tempo-mainnet.core.chainstack.com/c3ce2925b51f1ed18719fe8a23bbdccf/"

payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0x...\"\n ],\n \"id\": 1\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://tempo-mainnet.core.chainstack.com/c3ce2925b51f1ed18719fe8a23bbdccf/")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0x...\"\n ],\n \"id\": 1\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://tempo-mainnet.core.chainstack.com/c3ce2925b51f1ed18719fe8a23bbdccf/")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getFilterChanges\",\n \"params\": [\n \"0x...\"\n ],\n \"id\": 1\n}"

response = http.request(request)
puts response.read_body
{
  "jsonrpc": "<string>",
  "id": 123,
  "result": [
    "<unknown>"
  ]
}
Tempo API method that returns an array of logs or block/transaction hashes that occurred since the last poll. Used with filters created by eth_newFilter, eth_newBlockFilter, or eth_newPendingTransactionFilter.
Get your own node endpoint todayStart for free and get your app to production levels immediately. No credit card required.You can sign up with your GitHub, X, Google, or Microsoft account.

Parameters

  • filterId — the filter ID returned from a filter creation method

Response

  • result — array of changes since last poll:
    • For log filters: array of log objects
    • For block filters: array of block hashes
    • For pending transaction filters: array of transaction hashes

eth_getFilterChanges code examples

const ethers = require('ethers');
const NODE_URL = "CHAINSTACK_NODE_URL";
const provider = new ethers.JsonRpcProvider(NODE_URL);

// pathUSD token address
const PATHUSD = "0x20c0000000000000000000000000000000000000";
const TRANSFER_TOPIC = ethers.id("Transfer(address,address,uint256)");

const pollFilter = async () => {
    // Create a log filter for Transfer events
    const filterId = await provider.send("eth_newFilter", [{
      address: PATHUSD,
      topics: [TRANSFER_TOPIC]
    }]);
    console.log(`Created filter: ${filterId}`);

    // Poll for changes every 2 seconds
    const interval = setInterval(async () => {
      const changes = await provider.send("eth_getFilterChanges", [filterId]);

      if (changes.length > 0) {
        console.log(`\nFound ${changes.length} new Transfer events:`);
        for (const log of changes) {
          console.log(`  Block ${parseInt(log.blockNumber, 16)}: ${log.transactionHash}`);
        }
      } else {
        console.log("No new changes...");
      }
    }, 2000);

    // Stop after 20 seconds
    setTimeout(async () => {
      clearInterval(interval);
      await provider.send("eth_uninstallFilter", [filterId]);
      console.log("\nFilter uninstalled");
    }, 20000);
  };

pollFilter();
from web3 import Web3
import time

node_url = "CHAINSTACK_NODE_URL"
web3 = Web3(Web3.HTTPProvider(node_url))

# pathUSD token address
PATHUSD = "0x20c0000000000000000000000000000000000000"
TRANSFER_TOPIC = web3.keccak(text="Transfer(address,address,uint256)").hex()

# Create a log filter
filter_result = web3.provider.make_request("eth_newFilter", [{
    "address": PATHUSD,
    "topics": [TRANSFER_TOPIC]
}])
filter_id = filter_result['result']
print(f"Created filter: {filter_id}")

# Poll for changes
try:
    for _ in range(10):
        changes_result = web3.provider.make_request("eth_getFilterChanges", [filter_id])
        changes = changes_result['result']

        if changes:
            print(f"\nFound {len(changes)} new Transfer events:")
            for log in changes:
                print(f"  Block {int(log['blockNumber'], 16)}: {log['transactionHash']}")
        else:
            print("No new changes...")

        time.sleep(2)
finally:
    web3.provider.make_request("eth_uninstallFilter", [filter_id])
    print("\nFilter uninstalled")
# First create a filter
curl -X POST "CHAINSTACK_NODE_URL" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "eth_newFilter",
    "params": [{"address": "0x20c0000000000000000000000000000000000000"}],
    "id": 1
  }'

# Then poll for changes using the returned filter ID
curl -X POST "CHAINSTACK_NODE_URL" \
  -H "Content-Type: application/json" \
  -d '{
    "jsonrpc": "2.0",
    "method": "eth_getFilterChanges",
    "params": ["0x1"],
    "id": 1
  }'

Body

application/json
jsonrpc
string
default:2.0
method
string
default:eth_getFilterChanges
params
any[]

Filter ID

id
integer
default:1

Response

200 - application/json

Filter changes

jsonrpc
string
id
integer
result
any[]

Array of log objects or block hashes depending on filter type

Last modified on June 22, 2026