curl --request GET \
--url https://api.chainstack.com/v2/reporting/node-usage/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.chainstack.com/v2/reporting/node-usage/"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.chainstack.com/v2/reporting/node-usage/', 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://api.chainstack.com/v2/reporting/node-usage/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.chainstack.com/v2/reporting/node-usage/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.chainstack.com/v2/reporting/node-usage/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.chainstack.com/v2/reporting/node-usage/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"node_id": "ND-123-456-789",
"node_name": "My Ethereum node",
"datetime": "2026-07-16T00:00:00Z",
"node_type": "dedicated",
"protocol": "ethereum",
"network": "ethereum-mainnet",
"compute_hours": 24,
"gb_hour": 2064,
"request_units": null,
"bloxroute_requests": null
},
{
"node_id": "ND-987-654-321",
"node_name": "My Solana node",
"datetime": "2026-07-16T00:00:00Z",
"node_type": "elastic",
"protocol": "solana",
"network": "solana-mainnet",
"compute_hours": null,
"gb_hour": null,
"request_units": 184023,
"bloxroute_requests": 0
}
],
"totals": {
"compute_hours": 24,
"gb_hour": 2064,
"request_units": 184023,
"bloxroute_requests": 0
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}List node usage with the Chainstack Platform API v2
Retrieve per-node usage metrics — compute hours, GB-hours, request units, and bloXroute requests — using the Platform API v2. Send a GET request to /v2/reporting/node-usage/ for the paginated usage report.
curl --request GET \
--url https://api.chainstack.com/v2/reporting/node-usage/ \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.chainstack.com/v2/reporting/node-usage/"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.chainstack.com/v2/reporting/node-usage/', 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://api.chainstack.com/v2/reporting/node-usage/",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.chainstack.com/v2/reporting/node-usage/"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.chainstack.com/v2/reporting/node-usage/")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.chainstack.com/v2/reporting/node-usage/")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"count": 2,
"next": null,
"previous": null,
"results": [
{
"node_id": "ND-123-456-789",
"node_name": "My Ethereum node",
"datetime": "2026-07-16T00:00:00Z",
"node_type": "dedicated",
"protocol": "ethereum",
"network": "ethereum-mainnet",
"compute_hours": 24,
"gb_hour": 2064,
"request_units": null,
"bloxroute_requests": null
},
{
"node_id": "ND-987-654-321",
"node_name": "My Solana node",
"datetime": "2026-07-16T00:00:00Z",
"node_type": "elastic",
"protocol": "solana",
"network": "solana-mainnet",
"compute_hours": null,
"gb_hour": null,
"request_units": 184023,
"bloxroute_requests": 0
}
],
"totals": {
"compute_hours": 24,
"gb_hour": 2064,
"request_units": 184023,
"bloxroute_requests": 0
}
}{
"error": {
"code": "<string>",
"message": "<string>",
"fields": {}
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}{
"error": {
"code": "<string>",
"message": "<string>"
}
}Authorizations
Chainstack API uses API keys to authenticate requests. You can view and manage your API keys in the platform UI.
Your API keys carry many privileges, so be sure to keep them secure!
Provide your API key as the Authorization header. The value of the header consists of Bearer prefix and secret key generated through the platform UI.
curl -X GET 'https://api.chainstack.com/v1/organization/' \
--header 'Authorization: Bearer FX7CWlLg.FMpAO8cgCX2N7s41EncRru2nb5CmTZUt'
All API requests must be made over HTTPS.
Query Parameters
Start of the reporting period, inclusive, as an ISO 8601 datetime.
Defaults to the start of your organization's current metered billing period.
Cannot be earlier than the first day of the previous calendar month — usage data is retained for 2 months.
"2026-07-01T00:00:00Z"
End of the reporting period as an ISO 8601 datetime. Must be later than date_from.
Defaults to the end of your organization's current metered billing period.
"2026-07-17T00:00:00Z"
Filter by node ID. Accepts a comma-separated list (ND-123-456-789,ND-987-654-321).
Filter by protocol. Accepts a comma-separated list (ethereum,solana).
Filter by the network's public internal name, prefixed by protocol (ethereum-mainnet, ethereum-sepolia-testnet). Accepts a comma-separated list.
Filter by node type. Omit to include both types.
elastic, dedicated Size of the time bucket the usage is aggregated into.
day, hour Which fields to use when ordering the results — a comma-separated list of datetime and node_id.
Use the - prefix to perform descending ordering (-datetime).
A page number within the paginated result set.
Response
Number of the objects in the paginated results.
123
Link to the next page.
Link to the previous page.
Show child attributes
Show child attributes
Dataset-wide totals across every row matching the filters, not just the current page.
Show child attributes
Show child attributes
Was this page helpful?