Supported Chains
Supported blockchain networks, chain IDs, URL structures, and feature availability. Review endpoints, methods, and dataset coverage per chain.
BlockVectra is a multi-chain blockchain data provider: JSON-RPC on every chain we support, and the Data API where it is available.
One key, all chains
- Universal key: the same API key works on every blockchain network BlockVectra supports — no separate keys per chain.
- Chain in the URL: every request names its chain explicitly through the
{chain}path segment. - Aggregated usage: account balance, Compute Unit (CU) rate-limit buckets, and free-tier per-second request limits are shared across all chains.
- Pricing: see Pricing.
Try without an API key
Choose a free public RPC endpoint for wallet methods without an API key. Public methods and per-IP limits are listed per network; see Quickstart for a call example.
URL templates
Standard URL structures for calling JSON-RPC and the Data API:
| Service | Mode | URL template | Notes |
|---|---|---|---|
| JSON-RPC | Key in the path | POST /v1/{chain}/{api_key} | Simplest form; recommended for curl and HTTP clients |
| JSON-RPC | Key in a header | POST /v1/{chain} | Pass the key in the x-api-key: {api_key} request header |
| Data API | REST endpoints | GET /v1/data/{chain}/… | Pass the key in the x-api-key request header |
| Status | Public status | GET /v1/status | No key required; returns each public chain's status and head |
Note: a request without a chain segment (e.g.
POST /v1orPOST /v1/) returns HTTP 404 with an empty body. See Quickstart for setup details.
Supported chains matrix
The blockchain networks currently available on BlockVectra, with their service capabilities:
Endpoints, methods with an API key, subscriptions, transaction sending, state and log limits, datasets, related testnets and guides are shown per chain. Unknown facts stay unknown. Expand a chain below the matrix for requests supported by that chain.
The state and log limits in this table apply to requests made with an API key. Public endpoints have their own method, history and log limits, which you can read from GET /v1/chains. Before querying logs on a public endpoint, check public.methods, public.history_blocks and public.logs, and use public.logs.max_block_range and public.logs.max_results rather than the top-level max_logs_block_range.
| Chain | {chain} | Chain ID | Tracing | Public Endpoint | WebSocket | Data API | Methods with an API key | Webhook push | Send Transactions | Send Transactions (Keyless Public Endpoint) | State History Window | eth_getLogs Max Block Range | Data API Datasets | Related testnets | Related guides |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Arbitrum One RPC and Data API | arb_mainnet | 42161 | ✓ | https://api.blockvectra.com/v1/arb_mainnet/public | Supported (newHeads, logs) | Open | 43 | Supported · Confirmations 1–120 (default 120) Webhook push guide | Supported | Supported | Historical state for the most recent 5,000 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Unknown |
| Arc RPC | arc_mainnet | 5042 | — | https://api.blockvectra.com/v1/arc_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Unknown | 1,000 blocks | Not supported | Unknown | Unknown |
| Avalanche C-Chain RPC | avax_mainnet | 43114 | ✓ | https://api.blockvectra.com/v1/avax_mainnet/public | Supported (newHeads, logs) | Not available yet | 41 | Not supported | Supported | Supported | Historical state for the most recent 128 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Base RPC and Data API | base_mainnet | 8453 | — | https://api.blockvectra.com/v1/base_mainnet/public | Supported (newHeads, logs) | Open | 39 | Supported · Confirmations 1–519 (default 1) Webhook push guide | Supported | Supported | Historical state for the most recent 10,000 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Base |
| Berachain RPC | berachain_mainnet | 80094 | — | https://api.blockvectra.com/v1/berachain_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 9,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Boba RPC | boba_mainnet | 288 | — | https://api.blockvectra.com/v1/boba_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 80,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| BNB Smart Chain RPC and Data API | bsc_mainnet | 56 | — | https://api.blockvectra.com/v1/bsc_mainnet/public | Supported (newHeads, logs) | Open | 25 | Supported · Confirmations 1–2 (default 1) Webhook push guide | Supported | Supported | Historical state for the most recent 100 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Unknown |
| Celo RPC | celo_mainnet | 42220 | — | https://api.blockvectra.com/v1/celo_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 864,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Ethereum RPC and Data API | eth_mainnet | 1 | ✓ | https://api.blockvectra.com/v1/eth_mainnet/public | Supported (newHeads, logs) | Open | 38 | Supported · Confirmations 1–82 (default 6) Webhook push guide | Supported | Supported | Historical state for the most recent 250,000 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Unknown |
| Ethereum Sepolia RPC and Data API | eth_sepolia | 11155111 | — | https://api.blockvectra.com/v1/eth_sepolia/public | Supported (newHeads, logs) | Open | 29 | Supported · Confirmations 1–67 (default 6) Webhook push guide | Supported | Supported | Unknown | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Unknown |
| Fraxtal RPC | fraxtal_mainnet | 252 | — | https://api.blockvectra.com/v1/fraxtal_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 10,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Gnosis RPC and Data API | gnosis_mainnet | 100 | — | https://api.blockvectra.com/v1/gnosis_mainnet/public | Supported (newHeads, logs) | Open | 39 | Not supported | Supported | Supported | Historical state for the most recent 262,000 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Unknown |
| HyperEVM RPC and Data API | hyperevm_mainnet | 999 | — | https://api.blockvectra.com/v1/hyperevm_mainnet/public | Supported (newHeads, logs) | Open | 25 | Supported · Confirmations 1–1 (default 1) Webhook push guide | Supported | Not supported | Unknown | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | HyperEVM backfill and polling |
| Ink RPC | ink_mainnet | 57073 | — | https://api.blockvectra.com/v1/ink_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 9,000 blocks | 1,000 blocks | Not supported | Unknown | Ink pool discovery |
| Katana RPC | katana_mainnet | 747474 | — | https://api.blockvectra.com/v1/katana_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 86,400 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Linea RPC | linea_mainnet | 59144 | — | https://api.blockvectra.com/v1/linea_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 128 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Metal L2 RPC | metall2_mainnet | 1750 | — | https://api.blockvectra.com/v1/metall2_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 10,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Mode RPC | mode_mainnet | 34443 | — | https://api.blockvectra.com/v1/mode_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 10,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| OP Mainnet RPC and Data API | op_mainnet | 10 | — | https://api.blockvectra.com/v1/op_mainnet/public | Supported (newHeads, logs) | Open | 39 | Not supported | Supported | Supported | Historical state for the most recent 1,296,000 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Unknown |
| Polygon RPC and Data API | polygon_mainnet | 137 | ✓ | https://api.blockvectra.com/v1/polygon_mainnet/public | Supported (newHeads, logs) | Open | 43 | Supported · Confirmations 1–200 (default 200) Webhook push guide | Supported | Supported | Historical state for the most recent 126 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, Data Freshness | Unknown | Unknown |
| Robinhood Chain RPC and Data API | robinhood_mainnet | 4663 | ✓ | https://api.blockvectra.com/v1/robinhood_mainnet/public | Supported (newHeads, logs) | Open | 43 | Supported · Confirmations 1–1 (default 1) Webhook push guide | Supported | Supported | Historical state for the most recent 900 blocks | 1,000 blocks | Blocks, Transactions, Address Transactions, Transfers, Token Metadata, DEX Swaps, Tokenized Stocks, Traces, Data Freshness | Unknown | HoodFi name records Robinhood Chain mainnet Stock token multiplier Tokenized stocks |
| Robinhood Chain Testnet RPC | robinhood_testnet | 46630 | ✓ | https://api.blockvectra.com/v1/robinhood_testnet/public | Supported (newHeads, logs) | Not available yet | 43 | Supported · Confirmations 1–1 (default 1) Webhook push guide | Supported | Supported | Historical state for the most recent 1,023 blocks | 1,000 blocks | Not supported | Unknown | Testnet faucet Robinhood Chain Testnet starter |
| Rootstock RPC | rootstock_mainnet | 30 | — | https://api.blockvectra.com/v1/rootstock_mainnet/public | Supported (newHeads, logs) | Not available yet | 27 | Not supported | Supported | Supported | Historical state for the most recent 6,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Soneium RPC | soneium_mainnet | 1868 | — | https://api.blockvectra.com/v1/soneium_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 9,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Sonic RPC | sonic_mainnet | 146 | ✓ | https://api.blockvectra.com/v1/sonic_mainnet/public | Supported (newHeads, logs) | Not available yet | 43 | Not supported | Supported | Supported | Historical state for the most recent 11,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Unichain RPC | unichain_mainnet | 130 | — | https://api.blockvectra.com/v1/unichain_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 85,500 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| World Chain RPC | world_mainnet | 480 | — | https://api.blockvectra.com/v1/world_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 30,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| X Layer RPC | xlayer_mainnet | 196 | ✓ | https://api.blockvectra.com/v1/xlayer_mainnet/public | Supported (newHeads, logs) | Not available yet | 43 | Not supported | Supported | Supported | Historical state for the most recent 250,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
| Zora RPC | zora_mainnet | 7777777 | — | https://api.blockvectra.com/v1/zora_mainnet/public | Supported (newHeads, logs) | Not available yet | 39 | Not supported | Supported | Supported | Historical state for the most recent 10,000 blocks | 1,000 blocks | Not supported | Unknown | Unknown |
Next steps with an API key
Arbitrum One
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/arb_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/arb_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/arb_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/arb_mainnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Arc
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/arc_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/arc_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/arc_mainnet'WebSocketAvalanche C-Chain
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/avax_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/avax_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/avax_mainnet'WebSocketBase
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/base_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/base_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/base_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/base_mainnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Berachain
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/berachain_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/berachain_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/berachain_mainnet'WebSocketBoba
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/boba_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/boba_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/boba_mainnet'WebSocketBNB Smart Chain
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/bsc_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/bsc_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/bsc_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/bsc_mainnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Celo
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/celo_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/celo_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/celo_mainnet'WebSocketEthereum
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/eth_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/eth_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/eth_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/eth_mainnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Ethereum Sepolia
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/eth_sepolia' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/eth_sepolia' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/eth_sepolia/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/eth_sepolia'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Fraxtal
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/fraxtal_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/fraxtal_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/fraxtal_mainnet'WebSocketGnosis
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/gnosis_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/gnosis_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/gnosis_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/gnosis_mainnet'WebSocketHyperEVM
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/hyperevm_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/hyperevm_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/hyperevm_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/hyperevm_mainnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Ink
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/ink_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/ink_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/ink_mainnet'WebSocketKatana
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/katana_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/katana_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/katana_mainnet'WebSocketLinea
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/linea_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/linea_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/linea_mainnet'WebSocketMetal L2
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/metall2_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/metall2_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/metall2_mainnet'WebSocketMode
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/mode_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/mode_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/mode_mainnet'WebSocketOP Mainnet
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/op_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/op_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/op_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/op_mainnet'WebSocketPolygon
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/polygon_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/polygon_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/polygon_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/polygon_mainnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Robinhood Chain
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/robinhood_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/robinhood_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsData API
curl -fsS 'https://api.blockvectra.com/v1/data/robinhood_mainnet/status/freshness' -H "x-api-key: $BLOCKVECTRA_API_KEY"Data APIWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/robinhood_mainnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Robinhood Chain Testnet
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/robinhood_testnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/robinhood_testnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/robinhood_testnet'WebSocketCreate a Webhook subscription · Create a Webhook subscription · Usage and CU · Top up
Rootstock
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/rootstock_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/rootstock_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/rootstock_mainnet'WebSocketSoneium
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/soneium_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/soneium_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/soneium_mainnet'WebSocketSonic
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/sonic_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/sonic_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/sonic_mainnet'WebSocketUnichain
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/unichain_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/unichain_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/unichain_mainnet'WebSocketWorld Chain
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/world_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/world_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/world_mainnet'WebSocketX Layer
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/xlayer_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/xlayer_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/xlayer_mainnet'WebSocketZora
eth_getLogs
set -eu
: "${BLOCKVECTRA_API_KEY:?BLOCKVECTRA_API_KEY is required}"
validate_response='import json,re,sys
response=json.load(sys.stdin)
if not (type(response) is dict and response.get("jsonrpc")=="2.0" and type(response.get("id")) is int and response["id"]==1 and "error" not in response and "result" in response):
sys.exit("Invalid JSON-RPC response")
result=response["result"]
if sys.argv[1]=="head":
if not (type(result) is str and re.fullmatch(r"0x(?:0|[1-9a-fA-F][0-9a-fA-F]*)",result)):
sys.exit("Invalid block quantity")
print(result)
else:
if not (type(result) is list and all(type(log) is dict for log in result)):
sys.exit("Invalid logs result")
print(json.dumps(response,indent=2))'
head_response=$(curl -fsS 'https://api.blockvectra.com/v1/zora_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}')
head=$(printf '%s' "$head_response" | python3 -c "$validate_response" head)
logs_response=$(curl -fsS 'https://api.blockvectra.com/v1/zora_mainnet' -H "x-api-key: $BLOCKVECTRA_API_KEY" -H 'Content-Type: application/json' \
-d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth_getLogs\",\"params\":[{\"fromBlock\":\"$head\",\"toBlock\":\"$head\"}]}")
printf '%s' "$logs_response" | python3 -c "$validate_response" logseth_getLogsWebSocket
echo '{"jsonrpc":"2.0","id":1,"method":"eth_subscribe","params":["newHeads"]}' | websocat --no-close -H="x-api-key: $BLOCKVECTRA_API_KEY" 'wss://api.blockvectra.com/v1/zora_mainnet'WebSocketHyperEVM
HyperEVM blocks include HyperCore system transactions (from address 0x2222…2222 or 0x20…, gasPrice 0).
Need another chain? Tell us →
Ethereum
- Chain ID:
1 - Chain name (
{chain}in URLs):eth_mainnet, e.g.POST /v1/eth_mainnet/{api_key}orGET /v1/data/eth_mainnet/….
JSON-RPC
- Methods: available methods for each chain are determined by
methods.allow/denyinGET /v1/chains(see Method Policy); methods outside that scope return-32601. - Recent data only: the historical state window is determined by
state_window_blocksinGET /v1/chains. Historical state queries outside the window return-32011(not billed); block, receipt and log queries outside the window return-32000 old data not available due to pruning(not billed); a transaction looked up by hash outside the window returnsresult: null. eth_getLogs: the maximum block span per request ismax_logs_block_rangeinGET /v1/chains.
Data API
- Recent data only: Ethereum data coverage is determined by
coverage.from_blockinGET /v1/data/chains. A block number or window below the start returns422 no_coverage; a transaction hash that has left the window returns404. - When
from_blockisnull: the start is temporarily unknown. Do not treat it as0or as full history, and do not send historical requests (by block number, window or hash) for Ethereum until it is an integer again; they return503 unavailable. 503 gateway_overloaded: retry with backoff (Retry-After: 1).- Datasets: the datasets Ethereum serves are listed in
featuresofGET /v1/data/chains; the others return422 no_coverage(not billed). Address transactions and transfers only cover the window: a response that crosses its start is markedmeta.coverage: "partial".
Discovering chains programmatically
Use these public endpoints to discover supported chains and their status:
1. Service status (GET /v1/status)
A public endpoint that requires no API key (CORS *). It lists only publicly available chains and returns their status and indexed head:
curl -s "https://api.blockvectra.com/v1/status"Example response:
{
"checked_at": "2026-09-28T07:40:00Z",
"gateway": { "status": "ok" },
"chains": [
{
"chain": "robinhood_mainnet",
"name": "Robinhood Chain",
"chain_id": 4663,
"jsonrpc": true,
"data": true,
"status": "ok",
"data_status": "ok",
"sync": { "stage": "synced", "node_block": 74600000, "target_block": null },
"head": {
"block": 74600000,
"time": "2026-09-28T07:39:58Z",
"lag_seconds": 3
}
},
{
"chain": "eth_mainnet",
"name": "Ethereum",
"chain_id": 1,
"jsonrpc": true,
"data": true,
"status": "ok",
"data_status": "ok",
"sync": { "stage": "synced", "node_block": 26010000, "target_block": null },
"head": {
"block": 26010000,
"time": "2026-09-28T07:39:59Z",
"lag_seconds": 1
}
}
]
}Each entry's name is always the chain's English display name. jsonrpc and data report whether that chain is open for JSON-RPC and the Data API respectively; status is "ok" or "unavailable". If a chain is syncing, calls to that chain return -32010. On /v1/status, status reports whether JSON-RPC is healthy and data_status reports whether the Data API is healthy ("ok", "syncing", or "unavailable"); in /v1/data/chains, a coverage.has_data of false means the chain has no indexed data yet.
2. Data API chains (GET /v1/data/chains)
Requires an API key in the x-api-key header (billed). Returns the public chains the Data API serves, each with what it serves (features), the blocks its data covers (coverage), the node's consensus safe/finalized markers and their status (finality) and its per-request caps (limits):
curl -s "https://api.blockvectra.com/v1/data/chains" \
-H "x-api-key: $BLOCKVECTRA_API_KEY"Example response:
{
"data": [
{
"chain": "robinhood_mainnet",
"chain_slug": "ROBINHOOD_MAINNET",
"name": "Robinhood Chain",
"chain_id": 4663,
"chain_external_id": "eip155:4663",
"features": [
"blocks", "transactions", "address_transactions", "transfers", "token_metadata",
"balances", "holders", "nfts", "dex_swaps", "dex_prices", "stocks", "traces", "freshness"
],
"coverage": { "from_block": 0, "traces_from_block": 1000000, "has_data": true },
"finality": { "model": "node_tags", "status": "ok", "safe_block": 74599400, "finalized_block": 74598900 },
"limits": { "max_page_size": 500, "max_window_blocks": 100000, "max_pools_for_token": 200, "max_batch_addresses": 100 }
},
{
"chain": "eth_mainnet",
"chain_slug": "ETH_MAINNET",
"name": "Ethereum",
"chain_id": 1,
"chain_external_id": "eip155:1",
"features": ["blocks", "transactions", "address_transactions", "transfers", "token_metadata", "freshness"],
"coverage": { "from_block": 1000000, "traces_from_block": null, "has_data": true },
"finality": { "model": "node_tags", "status": "stale", "safe_block": 26009950, "finalized_block": 26009900 },
"limits": { "max_page_size": 500, "max_window_blocks": 100000, "max_pools_for_token": 200, "max_batch_addresses": 100 }
}
]
}finality reports the node's consensus markers (model is "node_tags"), marker health (status is "ok", "stale", or "unavailable"), and the current safe_block and finalized_block (safe_block >= finalized_block, and both are null only when status is "unavailable").
coverage.from_block is the lowest indexed block, read live. It is 0 once the chain's history reaches genesis. It can be null only when the chain has no indexed block at all (has_data = false), or while the start cannot be determined: treat null as unknown — not as complete history and not as 0 — and historical requests then return 503 unavailable. Always read it from this endpoint at runtime rather than hard-coding it. coverage.traces_from_block is the first block with trace data; a trace request before it, or inside a gap, returns 422 no_coverage (not billed).
Calling /v1/data/{chain}/… with an unknown or not-public chain returns HTTP 404 with error.code not_found (not billed; the chain name must be the exact lowercase slug).
Last updated:
Quickstart
Use a free blockchain RPC API with no API key: read a block height keyless, then create a key for authenticated calls and webhooks.
JSON-RPC
Supported JSON-RPC methods, CU weights, and error codes. Set up an endpoint, choose a chain, and check method availability, pricing, and billing rules.