/v1/balance
signed
Read settlement wallet balances
Live ERC-20 balanceOf reads across your configured tokens. Signed like any other request: the canonical string uses GET, the path, and the hash of an empty body.
Request
curl -X GET "$BASE_URL/v1/balance" \
-H "X-Api-Key: $API_KEY_ID" \
-H "X-Timestamp: $TS" \
-H "X-Nonce: $NONCE" \
-H "X-Signature: $SIG"res, err := client.Call(ctx, "GET", "/v1/balance", "")$res = $client->call('GET', '/v1/balance');const res = await client.call("GET", "/v1/balance");res = client.call("GET", "/v1/balance")const res = await client.call("GET", "/v1/balance");The client is the one on Signing requests: it signs, sends, and turns an error into an exception carrying its code.
Response 200
Live balances. A token whose read failed carries error instead of amount.
{
"wallet": "0x2222222222222222222222222222222222222222",
"balances": [
{
"network": "eth",
"token": "USDT",
"address": "0xdAC1…",
"decimals": 6,
"amount": "1250.5",
"raw": "1250500000"
},
{
"network": "eth",
"token": "USDC",
"address": "0xA0b8…",
"decimals": 6,
"amount": "0",
"raw": "0"
}
]
}
Errors
401
unauthorized
The signature, key, timestamp or nonce did not check out: a missing header, an unknown key id, a timestamp more than 5 minutes from ours, a signature that does not match, or a nonce already used inside the window. Do not retry without rebuilding the request — a retry needs a new timestamp, a new nonce and a new signature.
{
"error": {
"code": "unauthorized",
"message": "invalid signature"
}
}
403
forbidden
The credential is valid but the caller's IP is not in the allowlist configured for your merchant. Not retryable.
{
"error": {
"code": "forbidden",
"message": "client IP not allowed for this merchant"
}
}
503
unavailable
No RPC endpoint is configured for the network, so no balance can be read at all. Unlike a single token failing — which shows up as a per-entry error inside a 200 — this fails the whole request.
{
"error": {
"code": "unavailable",
"message": "no RPC for network \"eth\""
}
}