eth_getProof
curl --request POST \
--url https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09 \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"method": "eth_getProof",
"id": 1,
"params": [
"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
[],
"latest"
]
}
'import requests
url = "https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09"
payload = {
"jsonrpc": "2.0",
"method": "eth_getProof",
"id": 1,
"params": ["0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", [], "latest"]
}
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_getProof',
id: 1,
params: ['0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270', [], 'latest']
})
};
fetch('https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09', 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://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09",
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_getProof',
'id' => 1,
'params' => [
'0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
[
],
'latest'
]
]),
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://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"id\": 1,\n \"params\": [\n \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\",\n [],\n \"latest\"\n ]\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://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"id\": 1,\n \"params\": [\n \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\",\n [],\n \"latest\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09")
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_getProof\",\n \"id\": 1,\n \"params\": [\n \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\",\n [],\n \"latest\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "<string>",
"id": 123,
"result": {
"address": "<string>",
"accountProof": [
"<string>"
],
"balance": "<string>",
"codeHash": "<string>",
"nonce": "<string>",
"storageHash": "<string>",
"storageProof": [
{
"key": "<string>",
"value": "<string>",
"proof": [
"<string>"
]
}
]
}
}Polygon node API
eth_getProof | Polygon
Polygon API method eth_getProof returns the account and storage Merkle proof for an address, letting clients verify state without the full chain. On Polygon via Chainstack.
POST
/
0615fdf3c9eaf0681469e61a4308ea09
eth_getProof
curl --request POST \
--url https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09 \
--header 'Content-Type: application/json' \
--data '
{
"jsonrpc": "2.0",
"method": "eth_getProof",
"id": 1,
"params": [
"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
[],
"latest"
]
}
'import requests
url = "https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09"
payload = {
"jsonrpc": "2.0",
"method": "eth_getProof",
"id": 1,
"params": ["0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270", [], "latest"]
}
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_getProof',
id: 1,
params: ['0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270', [], 'latest']
})
};
fetch('https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09', 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://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09",
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_getProof',
'id' => 1,
'params' => [
'0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',
[
],
'latest'
]
]),
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://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09"
payload := strings.NewReader("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"id\": 1,\n \"params\": [\n \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\",\n [],\n \"latest\"\n ]\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://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09")
.header("Content-Type", "application/json")
.body("{\n \"jsonrpc\": \"2.0\",\n \"method\": \"eth_getProof\",\n \"id\": 1,\n \"params\": [\n \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\",\n [],\n \"latest\"\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09")
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_getProof\",\n \"id\": 1,\n \"params\": [\n \"0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270\",\n [],\n \"latest\"\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "<string>",
"id": 123,
"result": {
"address": "<string>",
"accountProof": [
"<string>"
],
"balance": "<string>",
"codeHash": "<string>",
"nonce": "<string>",
"storageHash": "<string>",
"storageProof": [
{
"key": "<string>",
"value": "<string>",
"proof": [
"<string>"
]
}
]
}
}Polygon API method
eth_getProof returns the Merkle proof for an account and, optionally, for specific storage slots. Clients use it to verify account balances, nonces, contract code hashes, and storage values against a block’s state root without holding the entire state.
Polygon runs on the Bor client. On Bor archive nodes (Bor with the path-based storage scheme),
eth_getProof returns proofs only for roughly the latest 128 blocks — historical proof queries are not available.When called against a block older than the latest ~128 blocks, this method is billed as an archive request (2 RUs instead of 1 RU). See request units.
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
address— the address of the account to prove.storageKeys— an array of 32-byte storage slot keys to prove. Pass an empty array to prove the account only.block— the block number in hexadecimal, or one ofearliest,latest, orpending. Defaults tolatest.
Response
result— an object with the account proof and state values:address— the account address.accountProof— an array of RLP-encoded Merkle-trie nodes proving the account against the block state root.balance— the account balance, in hexadecimal wei.codeHash— the hash of the account’s contract code; for a non-contract (EOA) account this is the Keccak-256 hash of empty code.nonce— the account nonce, in hexadecimal.storageHash— the root hash of the account storage trie.storageProof— an array of objects, one per requestedstorageKeysentry, each with thekey, itsvalue, and theproof(RLP-encoded trie nodes).
Use case
eth_getProof is used by light clients, cross-chain bridges, and auditing tools that need cryptographic proof of an account or storage value at a specific block without syncing the full Polygon state.Last modified on July 24, 2026
Was this page helpful?