curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/accounts/balances \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/accounts/balances"
headers = {"X-Monaco-Signature": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Monaco-Signature': '<api-key>'}};
fetch('https://staging.apimonaco.xyz/api/v1/accounts/balances', 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://staging.apimonaco.xyz/api/v1/accounts/balances",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Monaco-Signature: <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://staging.apimonaco.xyz/api/v1/accounts/balances"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Monaco-Signature", "<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://staging.apimonaco.xyz/api/v1/accounts/balances")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/accounts/balances")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Monaco-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"balances": [
{
"token": "0x6a86da986797d59a839d136db490292cd560c131",
"symbol": "USDC",
"decimals": 6,
"availableBalance": "1000.50",
"lockedBalance": "50.25",
"totalBalance": "1050.75",
"availableBalanceRaw": "1000500000",
"lockedBalanceRaw": "50250000",
"assetId": "123e4567-e89b-12d3-a456-426614174000",
"totalBalanceRaw": "1050750000",
"wrappedNative": true,
"version": 918342
}
],
"total": 5,
"pageSize": 20,
"totalPages": 1,
"nextPageToken": "<string>"
}Get user balances
Get user balances.
Get the current user’s token balances with pagination support. Returns available, locked, and total balance for each token.
curl --request GET \
--url https://staging.apimonaco.xyz/api/v1/accounts/balances \
--header 'X-Monaco-Signature: <api-key>'import requests
url = "https://staging.apimonaco.xyz/api/v1/accounts/balances"
headers = {"X-Monaco-Signature": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {'X-Monaco-Signature': '<api-key>'}};
fetch('https://staging.apimonaco.xyz/api/v1/accounts/balances', 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://staging.apimonaco.xyz/api/v1/accounts/balances",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"X-Monaco-Signature: <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://staging.apimonaco.xyz/api/v1/accounts/balances"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("X-Monaco-Signature", "<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://staging.apimonaco.xyz/api/v1/accounts/balances")
.header("X-Monaco-Signature", "<api-key>")
.asString();require 'uri'
require 'net/http'
url = URI("https://staging.apimonaco.xyz/api/v1/accounts/balances")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["X-Monaco-Signature"] = '<api-key>'
response = http.request(request)
puts response.read_body{
"balances": [
{
"token": "0x6a86da986797d59a839d136db490292cd560c131",
"symbol": "USDC",
"decimals": 6,
"availableBalance": "1000.50",
"lockedBalance": "50.25",
"totalBalance": "1050.75",
"availableBalanceRaw": "1000500000",
"lockedBalanceRaw": "50250000",
"assetId": "123e4567-e89b-12d3-a456-426614174000",
"totalBalanceRaw": "1050750000",
"wrappedNative": true,
"version": 918342
}
],
"total": 5,
"pageSize": 20,
"totalPages": 1,
"nextPageToken": "<string>"
}Authorizations
Ed25519 session-key request signing. Every authenticated request carries three headers: X-Monaco-PublicKey (64-char lowercase-hex session public key), X-Monaco-Timestamp (Unix milliseconds, within 30s of server time), and X-Monaco-Signature (hex ed25519 signature). The signature is over METHOD\npath?query\ntimestamp_ms\nSHA256_hex(body), where the body hash is the SHA-256 of the empty byte string when there is no body. Obtain the session keypair from POST /api/v1/auth/challenge followed by POST /api/v1/auth/verify.
Query Parameters
Items per page (max 1000)
1 <= x <= 1000Pagination cursor with two states:
- Omitted or empty string (""): start a cursor walk with no prior position, from the lowest token address.
- Non-empty: an opaque cursor from a previous response's
nextPageToken; results resume immediately after that position.
This listing has no database page to walk: it reads every balance row,
overlays the matching engine's authoritative amounts (which can add rows
the projection has not written yet and drop rows the engine has zeroed),
and pages that in-memory set. The walk therefore seeks by KEY on
(token, asset_id) — immutable, present on every row including a
live-only one — rather than by index, so a balance that appears or
vanishes mid-walk no longer shifts the rows behind it across the resume
point and duplicate or skipped rows. total and totalPages are exact:
the set is bounded by the asset universe, so there is nothing to cap.
Response
OK
Show child attributes
Show child attributes
Total number of balances
5
Items per page
20
Total number of pages
1
Cursor for the next page, minted from the last row of an over-fetched page. The whole set is already in memory, so over-fetching is free and an empty token is the definitive end of the walk.
Was this page helpful?

