Liveness and operational snapshot
curl --request GET \
--url https://testnet.rail402.dev/healthimport requests
url = "https://testnet.rail402.dev/health"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://testnet.rail402.dev/health', 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://testnet.rail402.dev/health",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://testnet.rail402.dev/health"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://testnet.rail402.dev/health")
.asString();require 'uri'
require 'net/http'
url = URI("https://testnet.rail402.dev/health")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "ok",
"version": "0.4.1",
"state": "healthy",
"checkedAt": "2026-09-30T12:00:00.000Z",
"warnings": [],
"networks": {
"stellar:testnet": {
"rpc": {
"ok": true,
"latestLedger": 4941750,
"ledgerAgeSeconds": 3,
"transportErrors1h": 0
},
"sponsor": {
"address": "GBHEGW3KWOY2OFH767EDALFGCUTBOEVBDQMCKU4APMDLQNBW5QV3W3KO",
"balanceStroops": "99875000000",
"committed1hStroops": "1200000",
"wasted1hStroops": "0"
},
"channels": {
"total": 8,
"inUse": 0,
"leaseWaitP95Ms": 4.8,
"leaseTimeouts1h": 0
},
"settlements": {
"last1h": {
"succeeded": 12,
"failed": 0,
"expired": 0,
"pending": 0
},
"unfinished": 0,
"unresolvable": 0,
"repeats1h": 1
},
"sequenceConflicts1h": 0,
"contracts": {
"USDC": {
"id": "CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA",
"instanceTtlLedgers": 2245736
}
}
}
},
"catalog": {
"listings": {
"pending": 0,
"published": 14,
"quarantined": 1
},
"outboxPending": 0,
"outcomes1h": {
"settle": {
"success": 3
},
"origin_check": {
"success": 3
}
}
},
"search": {
"indexRevision": 42,
"indexAgeSeconds": 4,
"lastBuild": "ok",
"embeddingFailures1h": 0,
"p50Ms": 3.1,
"p95Ms": 9.4
}
}Operations
Liveness and operational snapshot
Answers 200 whenever the process is up, whatever its state; the Docker HEALTHCHECK uses it. The
body is the snapshot the background poll rebuilds every 15 seconds, so answering never waits on the
network or the database. state is degraded while any warning is critical. Never rate-limited.
GET
/
health
Liveness and operational snapshot
curl --request GET \
--url https://testnet.rail402.dev/healthimport requests
url = "https://testnet.rail402.dev/health"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://testnet.rail402.dev/health', 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://testnet.rail402.dev/health",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$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://testnet.rail402.dev/health"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://testnet.rail402.dev/health")
.asString();require 'uri'
require 'net/http'
url = URI("https://testnet.rail402.dev/health")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"status": "ok",
"version": "0.4.1",
"state": "healthy",
"checkedAt": "2026-09-30T12:00:00.000Z",
"warnings": [],
"networks": {
"stellar:testnet": {
"rpc": {
"ok": true,
"latestLedger": 4941750,
"ledgerAgeSeconds": 3,
"transportErrors1h": 0
},
"sponsor": {
"address": "GBHEGW3KWOY2OFH767EDALFGCUTBOEVBDQMCKU4APMDLQNBW5QV3W3KO",
"balanceStroops": "99875000000",
"committed1hStroops": "1200000",
"wasted1hStroops": "0"
},
"channels": {
"total": 8,
"inUse": 0,
"leaseWaitP95Ms": 4.8,
"leaseTimeouts1h": 0
},
"settlements": {
"last1h": {
"succeeded": 12,
"failed": 0,
"expired": 0,
"pending": 0
},
"unfinished": 0,
"unresolvable": 0,
"repeats1h": 1
},
"sequenceConflicts1h": 0,
"contracts": {
"USDC": {
"id": "CBIELTK6YBZJU5UP2WWQEUCYKLPU6AUNZ2BQ4WWFEIE3USCIHMXQDAMA",
"instanceTtlLedgers": 2245736
}
}
}
},
"catalog": {
"listings": {
"pending": 0,
"published": 14,
"quarantined": 1
},
"outboxPending": 0,
"outcomes1h": {
"settle": {
"success": 3
},
"origin_check": {
"success": 3
}
}
},
"search": {
"indexRevision": 42,
"indexAgeSeconds": 4,
"lastBuild": "ok",
"embeddingFailures1h": 0,
"p50Ms": 3.1,
"p95Ms": 9.4
}
}Response
200 - application/json
The process is up.
Allowed value:
"ok"The RAIL402_VERSION the image was built with, dev by default.
starting until the first poll finished; degraded while any warning is critical.
Available options:
starting, healthy, degraded Show child attributes
Show child attributes
Show child attributes
Show child attributes
Present when the Bazaar is enabled.
Show child attributes
Show child attributes
Present when the Bazaar is enabled.
Show child attributes
Show child attributes