arc_getCertificate
curl --request POST \
--url https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/ \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "arc_getCertificate",
"params": [
55000000
]
}
'import requests
url = "https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "arc_getCertificate",
"params": [55000000]
}
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: 'arc_getCertificate', params: [55000000]})
};
fetch('https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/', 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://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/",
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' => 'arc_getCertificate',
'params' => [
55000000
]
]),
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://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/"
payload := strings.NewReader("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"arc_getCertificate\",\n \"params\": [\n 55000000\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://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/")
.header("Content-Type", "application/json")
.body("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"arc_getCertificate\",\n \"params\": [\n 55000000\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/")
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\": \"arc_getCertificate\",\n \"params\": [\n 55000000\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"height": 55000000,
"round": 0,
"block_hash": "0x9a9ecf9348af3c128d63dcb4555b4586b9e9a503c67220029602a93aed14c76e",
"signatures": [
{
"address": "0x2012459eddb529fcd8429ba73006a6340ff05232",
"signature": "P3GaOsv6kJE9IyJtaBBjFvebQtAEttCGKalkwbk9VeVy7GxK1l3S/GhATET24iKbyY8SDmwvVMQjPaDOCz+nAQ=="
},
{
"address": "0x66a99d2834cf369d900de5da88ad2944ccb12e70",
"signature": "+UX4HW+dJaI0nAKB+3Ah3g6iR31jAYx62wFbufrNE7zttMYYaz6NBtXNX8Zc3kDaEWEO2T+IldaD927I865FCw=="
},
{
"address": "0xfeb2b98d614701434ea6a12ccf29e0e40ae56941",
"signature": "6C3dyx4Yoy1tU/sIKEGmcYWw7MGal2mZfFcLbz2qTQ7dfDvSC/Jq4vW3lVWRu7tzWMbmEcezAyw5bHABloKtAA=="
},
{
"address": "0x602930d1ab44f1744f42e842b701c2b149c5da4f",
"signature": "BDWeBNMhNypstuQwLlSbcQhjZVShr6F4K9d8Q4AG2PpRgFC9xoLDS+rrhPpUlZBi8EGZj3bR2dHntcjPv/rDAg=="
},
{
"address": "0x6689a18548c978619d7c11698244eed76ae10856",
"signature": "ZUOgt73xJ0gIBwshzPWguvNdMA8aWLDZS+PAmR4df17SJNsBciXfNCGHiFzlzQnUmPTlpLDHqhDH/51AG6BEBA=="
},
{
"address": "0x2e78053671f707844a631bc907d4855894848fe3",
"signature": "dcICOyPk2uBf+b0V02nVbE7qpy8LlUMo8NJOVKBz8NplXvViiPy8zPDFePloF20aJbiI52MfQ2DTDBZcaoHdAQ=="
},
{
"address": "0x6791e002c8419e8a2fa5266e2951ed1780bc2295",
"signature": "4JiWLZYCMVQkNVpj4E30m5UjOT/U6jTajr5CYrH9DgAxCEMhhBeYWk5Jiztw+A7qHNBH77qmHyybnjkl7MZFDw=="
},
{
"address": "0xa3616c3a52e49facf1a0d59316dc87ce471e8129",
"signature": "Ya45YNsjB9wuTY2RF/uHC+HSShGyXx6MR0SKYbc6crYYPp9hSE9G5RJo2pKADtKuAK3VDf5NnYnHiRFgIDWPAA=="
},
{
"address": "0x6ea7bc8812a8837a861f4ca7acd83bca1684626a",
"signature": "qz2RqUT5ZXN/QZVi0TJFS3qOHizWW9LBo+oCkg3COSo3JryURmVk2u3R1qSw5rxrxnPi81yCGamN0ccjE4IQAg=="
},
{
"address": "0x643ad8ec952efa7d3060dcf94b92e9eba7baab19",
"signature": "POIY1dMaCOP7uMksphmJjdp3XtU6ieKufBkDr/rflJAaOHhr/5RVnH6MZN3Z/UUBwnTtNRDbhmx+X98MU+IzAQ=="
},
{
"address": "0x424ca01b5a849b7ce2e6e4d92a0443ce81f16fd2",
"signature": "rgCm91C5n723hNuqj6oDd4Wf3yS3SsQloUoinWWzw7+7vKeBTbzUc1UbzFkc62rpZdoDjMOuihx+rTA21/OWDA=="
},
{
"address": "0x68960d463d8a51095947a416fdb7973a87f675d0",
"signature": "XNxfZUxxH8Ak6rSwDw9AoA7LVQWtBwnlcv4iWMz4rl3oCFhBPOu8drCi/tGQE3BhDNftJlBRdYZs2kZeeK+lCw=="
},
{
"address": "0xfdc37d533f82159bf6c46da00db4faa379b941de",
"signature": "/X2EWeitrkHQg/ubV36qk2fwaL3JrcCo954J/VEJqPqkdZIOCpnjx9GF9FS6WELApBmjhdkeV2zgJjH+Bd7OBQ=="
},
{
"address": "0x7e4499718f868ff1f89fe5432e11c9f9f3e01fae",
"signature": "82lZYmRk3duR1yUZIHi5QS1/BZEAHS6fg6t7a7EhwjRLf7/lSLH7iLaLZN46SiSNMiVIXS7hf/k/LCv9Grt4BQ=="
}
]
}
}Arc node API
arc_getCertificate | Arc
Arc API method that returns the consensus commit certificate for a block height, including the round, the block hash, and the validator signatures. Use it on Arc via Chainstack.
POST
/
arc_getCertificate
curl --request POST \
--url https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/ \
--header 'Content-Type: application/json' \
--data '
{
"id": 1,
"jsonrpc": "2.0",
"method": "arc_getCertificate",
"params": [
55000000
]
}
'import requests
url = "https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/"
payload = {
"id": 1,
"jsonrpc": "2.0",
"method": "arc_getCertificate",
"params": [55000000]
}
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: 'arc_getCertificate', params: [55000000]})
};
fetch('https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/', 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://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/",
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' => 'arc_getCertificate',
'params' => [
55000000
]
]),
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://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/"
payload := strings.NewReader("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"arc_getCertificate\",\n \"params\": [\n 55000000\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://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/")
.header("Content-Type", "application/json")
.body("{\n \"id\": 1,\n \"jsonrpc\": \"2.0\",\n \"method\": \"arc_getCertificate\",\n \"params\": [\n 55000000\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://arc-testnet.core.chainstack.com/6caa7fd90475ac9214f7521dd460fa7c/")
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\": \"arc_getCertificate\",\n \"params\": [\n 55000000\n ]\n}"
response = http.request(request)
puts response.read_body{
"jsonrpc": "2.0",
"id": 1,
"result": {
"height": 55000000,
"round": 0,
"block_hash": "0x9a9ecf9348af3c128d63dcb4555b4586b9e9a503c67220029602a93aed14c76e",
"signatures": [
{
"address": "0x2012459eddb529fcd8429ba73006a6340ff05232",
"signature": "P3GaOsv6kJE9IyJtaBBjFvebQtAEttCGKalkwbk9VeVy7GxK1l3S/GhATET24iKbyY8SDmwvVMQjPaDOCz+nAQ=="
},
{
"address": "0x66a99d2834cf369d900de5da88ad2944ccb12e70",
"signature": "+UX4HW+dJaI0nAKB+3Ah3g6iR31jAYx62wFbufrNE7zttMYYaz6NBtXNX8Zc3kDaEWEO2T+IldaD927I865FCw=="
},
{
"address": "0xfeb2b98d614701434ea6a12ccf29e0e40ae56941",
"signature": "6C3dyx4Yoy1tU/sIKEGmcYWw7MGal2mZfFcLbz2qTQ7dfDvSC/Jq4vW3lVWRu7tzWMbmEcezAyw5bHABloKtAA=="
},
{
"address": "0x602930d1ab44f1744f42e842b701c2b149c5da4f",
"signature": "BDWeBNMhNypstuQwLlSbcQhjZVShr6F4K9d8Q4AG2PpRgFC9xoLDS+rrhPpUlZBi8EGZj3bR2dHntcjPv/rDAg=="
},
{
"address": "0x6689a18548c978619d7c11698244eed76ae10856",
"signature": "ZUOgt73xJ0gIBwshzPWguvNdMA8aWLDZS+PAmR4df17SJNsBciXfNCGHiFzlzQnUmPTlpLDHqhDH/51AG6BEBA=="
},
{
"address": "0x2e78053671f707844a631bc907d4855894848fe3",
"signature": "dcICOyPk2uBf+b0V02nVbE7qpy8LlUMo8NJOVKBz8NplXvViiPy8zPDFePloF20aJbiI52MfQ2DTDBZcaoHdAQ=="
},
{
"address": "0x6791e002c8419e8a2fa5266e2951ed1780bc2295",
"signature": "4JiWLZYCMVQkNVpj4E30m5UjOT/U6jTajr5CYrH9DgAxCEMhhBeYWk5Jiztw+A7qHNBH77qmHyybnjkl7MZFDw=="
},
{
"address": "0xa3616c3a52e49facf1a0d59316dc87ce471e8129",
"signature": "Ya45YNsjB9wuTY2RF/uHC+HSShGyXx6MR0SKYbc6crYYPp9hSE9G5RJo2pKADtKuAK3VDf5NnYnHiRFgIDWPAA=="
},
{
"address": "0x6ea7bc8812a8837a861f4ca7acd83bca1684626a",
"signature": "qz2RqUT5ZXN/QZVi0TJFS3qOHizWW9LBo+oCkg3COSo3JryURmVk2u3R1qSw5rxrxnPi81yCGamN0ccjE4IQAg=="
},
{
"address": "0x643ad8ec952efa7d3060dcf94b92e9eba7baab19",
"signature": "POIY1dMaCOP7uMksphmJjdp3XtU6ieKufBkDr/rflJAaOHhr/5RVnH6MZN3Z/UUBwnTtNRDbhmx+X98MU+IzAQ=="
},
{
"address": "0x424ca01b5a849b7ce2e6e4d92a0443ce81f16fd2",
"signature": "rgCm91C5n723hNuqj6oDd4Wf3yS3SsQloUoinWWzw7+7vKeBTbzUc1UbzFkc62rpZdoDjMOuihx+rTA21/OWDA=="
},
{
"address": "0x68960d463d8a51095947a416fdb7973a87f675d0",
"signature": "XNxfZUxxH8Ak6rSwDw9AoA7LVQWtBwnlcv4iWMz4rl3oCFhBPOu8drCi/tGQE3BhDNftJlBRdYZs2kZeeK+lCw=="
},
{
"address": "0xfdc37d533f82159bf6c46da00db4faa379b941de",
"signature": "/X2EWeitrkHQg/ubV36qk2fwaL3JrcCo954J/VEJqPqkdZIOCpnjx9GF9FS6WELApBmjhdkeV2zgJjH+Bd7OBQ=="
},
{
"address": "0x7e4499718f868ff1f89fe5432e11c9f9f3e01fae",
"signature": "82lZYmRk3duR1yUZIHi5QS1/BZEAHS6fg6t7a7EhwjRLf7/lSLH7iLaLZN46SiSNMiVIXS7hf/k/LCv9Grt4BQ=="
}
]
}
}Arc API method that returns the consensus commit certificate for a block height. The certificate is the Malachite BFT proof that the validator set committed the block, so it is what you check when you need finality evidence rather than the block contents.
arc_getCertificate belongs to the custom arc_* namespace, which Arc adds on top of the standard Reth surface.
rpc_modules does not list arc in its response, because the namespace is registered outside the standard module registry. The method works regardless — do not use rpc_modules to decide whether it is available.Parameters
height— the block height to get the commit certificate for, as an integer. Must be1or greater.
Response
height— the block height the certificate commits.round— the consensus round in which the block was committed.0means the block was committed in the first round.block_hash— the hash of the committed block.signatures— the validator signatures that form the commit. Each entry has anaddressand a base64-encodedsignature.
Error codes
-32602— invalid params, returned when the height is below1.-32004— no certificate is available for that height.-32005— the upstream consensus source is unreachable.
arc_getCertificate code examples
const { JsonRpcProvider } = require("ethers");
const provider = new JsonRpcProvider("CHAINSTACK_NODE_URL");
async function call() {
const result = await provider.send("arc_getCertificate", [55000000]);
console.log(result);
}
call();
from web3 import Web3
node_url = "CHAINSTACK_NODE_URL"
web3 = Web3(Web3.HTTPProvider(node_url))
result = web3.provider.make_request("arc_getCertificate", [55000000])
print(result)
curl -X POST "CHAINSTACK_NODE_URL" \
-H "Content-Type: application/json" \
--data '{
"jsonrpc": "2.0",
"method": "arc_getCertificate",
"params": [55000000],
"id": 1
}'
Use case
A cross-chain bridge or an exchange crediting deposits needs to know that a block is final, not merely present. On a BFT chain the commit certificate is that evidence: it names the validators that signed the block and the round they agreed in, so a relayer can verify the quorum itself instead of waiting out a confirmation count.Last modified on August 3, 2026
Was this page helpful?