web3_clientVersion
curl --request POST \
--url https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09 \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion"
}
'import requests
url = "https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion"
}
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({id: 1, jsonrpc: '2.0', method: 'web3_clientVersion'})
};
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([
'id' => 1,
'jsonrpc' => '2.0',
'method' => 'web3_clientVersion'
]),
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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\"\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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\"\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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\"\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "<string>",
"id": 123,
"result": "<string>"
}Polygon node API
web3_clientVersion | Polygon
Polygon API method that returns the client type and version running on the Polygon node. web3_clientVersion on Polygon via Chainstack.
POST
/
0615fdf3c9eaf0681469e61a4308ea09
web3_clientVersion
curl --request POST \
--url https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09 \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion"
}
'import requests
url = "https://polygon-mainnet.core.chainstack.com/0615fdf3c9eaf0681469e61a4308ea09"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "web3_clientVersion"
}
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({id: 1, jsonrpc: '2.0', method: 'web3_clientVersion'})
};
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([
'id' => 1,
'jsonrpc' => '2.0',
'method' => 'web3_clientVersion'
]),
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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\"\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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\"\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 \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"web3_clientVersion\"\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "<string>",
"id": 123,
"result": "<string>"
}Polygon API method that returns the client type and version running on the Polygon node. This information can be useful to developers to verify that a node they are connecting to is compatible with their needs.
The
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
none
Response
string— a string identifying the type of client, version, operating system, and language version running on the node
web3_clientVersion code examples
const ethers = require('ethers');
const NODE_URL = "CHAINSTACK_NODE_URL";
const provider = new ethers.JsonRpcProvider(NODE_URL);
const clientVersion = async () => {
const version = await provider.send("web3_clientVersion");
console.log(`Client version: ${version}`);
};
clientVersion();
from web3 import Web3
node_url = "CHAINSTACK_NODE_URL"
web3 = Web3.HTTPProvider(node_url)
client_version = web3.provider.make_request('web3_clientVersion', [])
print(client_version)
Use case
A use case for theweb3_clientVersion method can be to verify which client is running to then decide which method to run.
Let’s say you have a DApp that needs to retrieve all of the transactions receipts in a block; the Erigon and Bor clients both have a method for this, but the eth_getBlockReceipts method from Erigon will not work on Bor, and the eth_getTransactionReceiptsByBlock method from Bor will not work on Erigon. You can use the web3_clientVersion method in your logic to first identify which method must be used.
Here is an implementation of this use case using ethers.js:
index.js
const ethers = require('ethers');
const NODE_URL = "CHAINSTACK_NODE_URL";
const provider = new ethers.JsonRpcProvider(NODE_URL);
// getBlockReceipts Erigon method
async function getBlockReceipts(blockId) {
const receipts = await provider.send("eth_getBlockReceipts", [blockId]);
return receipts
}
// getTransactionReceiptsByBlock Bor method
async function getTransactionReceiptsByBlock(blockId) {
const receipts = await provider.send("eth_getTransactionReceiptsByBlock", [blockId]);
return receipts
}
// Get client version
async function getClientVersion() {
const clientVersion = await provider.send("web3_clientVersion", []);
return clientVersion
}
// Extract the client's name
async function getClientName() {
const clientVersion = await getClientVersion();
const clientName = clientVersion.split('/')[0];
return clientName
}
// Get the receipts based on the client
async function getAllReceipts(blockId) {
const clientName = await getClientName()
if (clientName === 'bor') {
console.log('Client is Bor');
const receipts = getTransactionReceiptsByBlock(blockId)
return receipts
} else if (clientName === 'erigon') {
console.log('Client is Erigon');
const receipts = getBlockReceipts(blockId)
return receipts
} else {
// Do something else if version is neither Bor nor Erigon
console.log('Client version is not Bor or Erigon');
}
}
async function main() {
try {
const receipts = await getAllReceipts('latest');
console.log(receipts);
} catch (error) {
console.error(error);
}
}
main();
getBlockReceipts function uses provider.send to call the eth_getBlockReceipts JSON-RPC method directly with a single parameter blockId and returns the resulting receipts.
The getTransactionReceiptsByBlock function similarly uses provider.send to call the eth_getTransactionReceiptsByBlock JSON-RPC method with a single parameter blockId and returns the resulting receipts.
The getClientVersion function uses provider.send to call the web3_clientVersion JSON-RPC method with no parameters and returns the resulting client version.
The getClientName function calls getClientVersion to get the client version and extracts the name of the client by splitting the version string at the first / character.
The getAllReceipts function calls getClientName to get the name of the client and then selects the appropriate method to use for retrieving the receipts. If the client is Bor, it calls getTransactionReceiptsByBlock, and if the client is Erigon, it calls getBlockReceipts. If the client is neither Bor nor Erigon, the function logs a message and returns null.Last modified on July 24, 2026
Was this page helpful?