List portfolio assets
curl --request GET \
--url https://sandbox.groundtech.co/v2/wallets/assets \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox.groundtech.co/v2/wallets/assets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox.groundtech.co/v2/wallets/assets', 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://sandbox.groundtech.co/v2/wallets/assets",
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: Bearer <token>"
],
]);
$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://sandbox.groundtech.co/v2/wallets/assets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox.groundtech.co/v2/wallets/assets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.groundtech.co/v2/wallets/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "qqqon",
"kind": "stock",
"name": "Invesco QQQ",
"mode": "active",
"chain": "ethereum",
"assetSymbol": "QQQon",
"tokenDecimals": 18,
"priceUsd": "727.55",
"priceAsOf": "2026-10-27T15:00:00.000Z",
"priceFreshness": "fresh",
"purchaseAvailability": {
"enabled": true,
"reason": null
},
"buyAssets": [
{
"kind": "cash",
"chain": "ethereum",
"token": "usdc"
}
],
"sellAssets": [
{
"kind": "cash",
"chain": "ethereum",
"token": "usdc"
}
],
"maxAllocationUsd": "100.000000"
}
],
"nextCursor": null
}{
"error": "Unauthenticated request",
"message": "Missing or invalid bearer token"
}{
"error": "Rate limit exceeded",
"code": "rate_limited"
}{
"error": "Internal server error",
"code": "internal_error"
}Portfolio Assets
List portfolio assets
Lists yield sources and Ondo stocks together, with kind, purchase availability, routes, and applicable reference prices.
GET
/
v2
/
wallets
/
assets
List portfolio assets
curl --request GET \
--url https://sandbox.groundtech.co/v2/wallets/assets \
--header 'Authorization: Bearer <token>'import requests
url = "https://sandbox.groundtech.co/v2/wallets/assets"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://sandbox.groundtech.co/v2/wallets/assets', 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://sandbox.groundtech.co/v2/wallets/assets",
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: Bearer <token>"
],
]);
$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://sandbox.groundtech.co/v2/wallets/assets"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://sandbox.groundtech.co/v2/wallets/assets")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://sandbox.groundtech.co/v2/wallets/assets")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"data": [
{
"id": "qqqon",
"kind": "stock",
"name": "Invesco QQQ",
"mode": "active",
"chain": "ethereum",
"assetSymbol": "QQQon",
"tokenDecimals": 18,
"priceUsd": "727.55",
"priceAsOf": "2026-10-27T15:00:00.000Z",
"priceFreshness": "fresh",
"purchaseAvailability": {
"enabled": true,
"reason": null
},
"buyAssets": [
{
"kind": "cash",
"chain": "ethereum",
"token": "usdc"
}
],
"sellAssets": [
{
"kind": "cash",
"chain": "ethereum",
"token": "usdc"
}
],
"maxAllocationUsd": "100.000000"
}
],
"nextCursor": null
}{
"error": "Unauthenticated request",
"message": "Missing or invalid bearer token"
}{
"error": "Rate limit exceeded",
"code": "rate_limited"
}{
"error": "Internal server error",
"code": "internal_error"
}Returns yield sources and Ondo stocks visible to your organization. Use
kind to distinguish them, and check purchase availability and supported routes before allocating.
Ondo stocks and Etherfuse CETES are available only to eligible non-US users. Visibility does not grant purchase access; check purchaseAvailability.enabled for your organization.