Get Nanopayments Gateway status
curl --request GET \
--url https://api.mrdn.finance/v1/batched-sample \
--header 'Authorization: <api-key>'import requests
url = "https://api.mrdn.finance/v1/batched-sample"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.mrdn.finance/v1/batched-sample', 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.mrdn.finance/v1/batched-sample",
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: <api-key>"
],
]);
$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.mrdn.finance/v1/batched-sample"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
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.mrdn.finance/v1/batched-sample")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mrdn.finance/v1/batched-sample")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"message": "Circle Gateway batched nanopayments integration",
"organization": "<string>",
"organizationId": "<string>",
"gatewayMainnetEnabled": true,
"networkStatus": {
"base-sepolia": true,
"optimism-sepolia": true,
"base": true,
"optimism": true,
"polygon": true,
"unichain": true,
"ink": true,
"hyperevm": true,
"megaeth": true
},
"gatewaySupported": {},
"endpoints": {
"batchedVerify": "POST /v1/batched-verify",
"batchedSettle": "POST /v1/batched-settle",
"batchedSample": "GET /v1/batched-sample"
},
"usage": {
"description": "<string>",
"note": "<string>"
},
"timestamp": "2023-11-07T05:31:56Z"
}
}Nanopayments Gateway
Get Gateway Status
Returns Circle Gateway client status, the per-network enablement map, and the upstream getSupported() payload from Circle. Useful to confirm Gateway connectivity from your environment.
GET
/
v1
/
batched-sample
Get Nanopayments Gateway status
curl --request GET \
--url https://api.mrdn.finance/v1/batched-sample \
--header 'Authorization: <api-key>'import requests
url = "https://api.mrdn.finance/v1/batched-sample"
headers = {"Authorization": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: '<api-key>'}};
fetch('https://api.mrdn.finance/v1/batched-sample', 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.mrdn.finance/v1/batched-sample",
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: <api-key>"
],
]);
$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.mrdn.finance/v1/batched-sample"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "<api-key>")
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.mrdn.finance/v1/batched-sample")
.header("Authorization", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.mrdn.finance/v1/batched-sample")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"message": "Circle Gateway batched nanopayments integration",
"organization": "<string>",
"organizationId": "<string>",
"gatewayMainnetEnabled": true,
"networkStatus": {
"base-sepolia": true,
"optimism-sepolia": true,
"base": true,
"optimism": true,
"polygon": true,
"unichain": true,
"ink": true,
"hyperevm": true,
"megaeth": true
},
"gatewaySupported": {},
"endpoints": {
"batchedVerify": "POST /v1/batched-verify",
"batchedSettle": "POST /v1/batched-settle",
"batchedSample": "GET /v1/batched-sample"
},
"usage": {
"description": "<string>",
"note": "<string>"
},
"timestamp": "2023-11-07T05:31:56Z"
}
}Diagnostic endpoint that reports the facilitator’s Circle Gateway client status, the per-network enablement map, and the upstream
getSupported() payload from Circle’s Gateway API. Use it to confirm Gateway connectivity and check which networks are currently routable through the batched path before integrating.
Authentication
RequiresAuthorization: Bearer <api-key>. The endpoint requires req.auth.organization.id to be present after the apiSession middleware runs; otherwise it returns HTTP 401.
Response
The literal response body returned by the facilitator:{
"success": true,
"data": {
"message": "Circle Gateway batched nanopayments integration",
"organization": "Acme",
"organizationId": "org_123",
"gatewayMainnetEnabled": true,
"networkStatus": {
"arc-testnet": true,
"base-sepolia": true,
"optimism-sepolia": true,
"fluent-testnet": true,
"base": true,
"optimism": true,
"polygon": true,
"unichain": true,
"ink": true,
"hyperevm": true,
"megaeth": true
},
"gatewaySupported": {
"...": "Pass-through of Circle Gateway's /supported response, or null if the upstream call failed"
},
"endpoints": {
"batchedVerify": "POST /v1/batched-verify",
"batchedSettle": "POST /v1/batched-settle",
"batchedSample": "GET /v1/batched-sample"
},
"usage": {
"description": "Use /v1/batched-settle and /v1/batched-verify as opt-in alternatives to /v1/settle and /v1/verify. The batched endpoints route payments through Circle Gateway for gas-free batched settlement. The default /v1/settle and /v1/verify endpoints continue to settle directly on-chain.",
"note": "Circle recommends using settle() directly rather than verify() + settle() for production batched flows."
},
"timestamp": "2026-04-30T18:24:11.502Z"
}
}
The
endpoints.batchedVerify and endpoints.batchedSettle strings (POST /v1/batched-verify / POST /v1/batched-settle) and the usage.description
text are returned verbatim by the facilitator but are misleading: those URLs
do not exist as distinct routes. Batched payments are routed through the
regular POST /v1/verify and POST /v1/settle endpoints, with detection
driven by paymentRequirements.extra.name === "GatewayWalletBatched".Field reference
| Field | Description |
|---|---|
message | Constant "Circle Gateway batched nanopayments integration". |
organization | Organization name resolved from the API key, or "Unknown" if not set. |
organizationId | Organization ID resolved from the API key. |
gatewayMainnetEnabled | Mirrors the GATEWAY_MAINNET_ENABLED constant in apps/facilitator/src/gateway/index.ts. When false, only testnets route through Circle. |
networkStatus | Boolean per network: result of isGatewayEnabledForNetwork(name). Only the ten networks shown above are reported. |
gatewaySupported | Pass-through of Circle Gateway’s upstream getSupported() response, or null if the call to Circle threw. Internally uses the mainnet Circle client (no network arg). |
endpoints | Static map of names → strings as returned by the facilitator (see warning above for accuracy). |
usage.description | Static descriptive string returned by the facilitator (see warning above). |
usage.note | Constant: Circle recommends calling settle() directly for production batched flows. |
timestamp | ISO timestamp generated when the response is built. |
Errors
401 Unauthorized
Returned when the request has no organization context afterapiSession:
{
"error": "No organization found for this request"
}
500 Internal Server Error
Returned when the route handler throws (Circle unreachable for reasons other than the wrappedgetSupported() call, etc.):
{
"error": "Internal server error",
"message": "<error.message or 'Unknown error'>"
}
⌘I