curl --request GET \
--url https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances \
--header 'api-key: <api-key>' \
--header 'api-nonce: <api-key>' \
--header 'api-sign: <api-key>'import requests
url = "https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances"
headers = {
"api-key": "<api-key>",
"api-sign": "<api-key>",
"api-nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'api-key': '<api-key>', 'api-sign': '<api-key>', 'api-nonce': '<api-key>'}
};
fetch('https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api-key", "<api-key>")
req.Header.Add("api-sign", "<api-key>")
req.Header.Add("api-nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"result": [
{
"asset": "BTC",
"asset_class": "currency",
"name": "Bitcoin",
"name_full": "Bitcoin",
"symbol": "BTC",
"decimals": 8,
"display_decimals": 8,
"rate_decimals": 8,
"funding_decimals": 8,
"min_lot": "0.00010000",
"reserve": false,
"virtual": true,
"metadata": {
"color_code": "#F7931A"
},
"balance": "1.50000000",
"quote_value_change_24h": "1.25",
"spot_balance": "1.50000000",
"hold_balance": "0.00000000",
"available_balance": "1.50000000",
"staked_balance": "0.00000000",
"pledged_balance": "0.00000000",
"quote_value": "97500.00",
"quote_spot_value": "97500.00",
"quote_available_value": "97500.00",
"quote_price": "65000.00"
},
{
"asset": "USD",
"asset_class": "currency",
"name": "US Dollar",
"name_full": "US Dollar",
"symbol": "USD",
"decimals": 4,
"display_decimals": 2,
"rate_decimals": 4,
"funding_decimals": 4,
"min_lot": "0.0100",
"reserve": false,
"virtual": false,
"metadata": {
"color_code": "#85BB65"
},
"balance": "10000.0000",
"spot_balance": "10000.0000",
"hold_balance": "0.0000",
"available_balance": "10000.0000",
"staked_balance": "0.0000",
"quote_value": "10000.00",
"quote_spot_value": "10000.00",
"quote_available_value": "10000.00",
"quote_price": "1.0000"
}
],
"quote_asset": "USD"
}{
"type": "tag:kraken.com,2025:BadRequest",
"status": 400,
"title": "Bad Request",
"data": {
"message": "Invalid quote parameter."
},
"detail": "Invalid quote parameter.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:PermissionDenied",
"status": 403,
"title": "Forbidden",
"data": {
"message": "Permission denied."
},
"detail": "The caller is not authorized to perform this action.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/ReadUpstream",
"status": 500,
"title": "Internal Server Error",
"data": "<unknown>",
"detail": "Failed to read response from upstream custody service.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/Connect",
"status": 503,
"title": "Service Unavailable",
"data": {},
"detail": "Downstream custody service is temporarily unreachable; retry with backoff.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}List vault asset balances
Returns per-asset balances for a vault, including spot, hold, available, staked, and pledged components for each asset. Each row includes asset metadata and optional quote-currency valuations. Use quote_asset to select the valuation currency (defaults to USD). Numeric strings are always returned at full upstream precision.
This is the endpoint to use whenever you need asset codes and quantities. The quote_value on GET /v0/insto/custody/vaults and GET /v0/insto/custody/vaults/{vault_id}/balances is a single aggregate valuation and cannot be decomposed into holdings.
Rate limit: 200 requests per 30 seconds per IP.
curl --request GET \
--url https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances \
--header 'api-key: <api-key>' \
--header 'api-nonce: <api-key>' \
--header 'api-sign: <api-key>'import requests
url = "https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances"
headers = {
"api-key": "<api-key>",
"api-sign": "<api-key>",
"api-nonce": "<api-key>"
}
response = requests.get(url, headers=headers)
print(response.text)const options = {
method: 'GET',
headers: {'api-key': '<api-key>', 'api-sign': '<api-key>', 'api-nonce': '<api-key>'}
};
fetch('https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.kraken.com/v0/insto/custody/vaults/{vault_id}/assets/balances"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("api-key", "<api-key>")
req.Header.Add("api-sign", "<api-key>")
req.Header.Add("api-nonce", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"result": [
{
"asset": "BTC",
"asset_class": "currency",
"name": "Bitcoin",
"name_full": "Bitcoin",
"symbol": "BTC",
"decimals": 8,
"display_decimals": 8,
"rate_decimals": 8,
"funding_decimals": 8,
"min_lot": "0.00010000",
"reserve": false,
"virtual": true,
"metadata": {
"color_code": "#F7931A"
},
"balance": "1.50000000",
"quote_value_change_24h": "1.25",
"spot_balance": "1.50000000",
"hold_balance": "0.00000000",
"available_balance": "1.50000000",
"staked_balance": "0.00000000",
"pledged_balance": "0.00000000",
"quote_value": "97500.00",
"quote_spot_value": "97500.00",
"quote_available_value": "97500.00",
"quote_price": "65000.00"
},
{
"asset": "USD",
"asset_class": "currency",
"name": "US Dollar",
"name_full": "US Dollar",
"symbol": "USD",
"decimals": 4,
"display_decimals": 2,
"rate_decimals": 4,
"funding_decimals": 4,
"min_lot": "0.0100",
"reserve": false,
"virtual": false,
"metadata": {
"color_code": "#85BB65"
},
"balance": "10000.0000",
"spot_balance": "10000.0000",
"hold_balance": "0.0000",
"available_balance": "10000.0000",
"staked_balance": "0.0000",
"quote_value": "10000.00",
"quote_spot_value": "10000.00",
"quote_available_value": "10000.00",
"quote_price": "1.0000"
}
],
"quote_asset": "USD"
}{
"type": "tag:kraken.com,2025:BadRequest",
"status": 400,
"title": "Bad Request",
"data": {
"message": "Invalid quote parameter."
},
"detail": "Invalid quote parameter.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:PermissionDenied",
"status": 403,
"title": "Forbidden",
"data": {
"message": "Permission denied."
},
"detail": "The caller is not authorized to perform this action.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/ReadUpstream",
"status": 500,
"title": "Internal Server Error",
"data": "<unknown>",
"detail": "Failed to read response from upstream custody service.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}{
"type": "tag:kraken.com,2025:gateway/Connect",
"status": 503,
"title": "Service Unavailable",
"data": {},
"detail": "Downstream custody service is temporarily unreachable; retry with backoff.",
"instance": "https://debug.kraken.com/req/01HXYZABCDEF"
}Authorizations
Path Parameters
Vault identifier, a V-prefixed 14-char base32 string with a final check character.
"VABCDEF234567A"
Query Parameters
Currency code used to value quote fields on each row. Defaults to USD when omitted; only USD is currently accepted.
Response
OK. Returns per-asset balances for the vault as an envelope. The result field is the array of balance rows; quote_asset carries the quote currency once for the whole response.
Was this page helpful?