Wallet Tracking
Learn how to track wallet activity, balances, and transactions using the Stellar Classic endpoints. This guide shows you how to build wallet monitoring tools and transaction tracking systems.
Overview
This page covers:
- Retrieving wallet account information and balances
- Fetching recent transactions and operations
- Tracking claimable balances
- Building wallet monitoring dashboards
All endpoints in this section work with Stellar Classic blockchain data, not Soroban contracts.
Account Information
Get Wallet Account Details
- Python
- JavaScript
- TypeScript
- cURL
- Go
- Rust
- Java
- Shell
import requests
def get_account_info(account_id):
"""Fetch account information and balances"""
url = f"https://api.hoops.finance/classic/accounts/{account_id}"
response = requests.get(url)
response.raise_for_status()
return response.json()
# Usage
account_id = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
account_info = get_account_info(account_id)
print(f"Account: {account_info['account_id']}")
print(f"Sequence: {account_info['sequence']}")
print(f"Subentry Count: {account_info['subentry_count']}")
# Print balances
for balance in account_info['balances']:
asset = balance['asset_type']
if asset == 'native':
print(f"XLM Balance: {balance['balance']}")
else:
print(f"{asset} Balance: {balance['balance']} (Issuer: {balance['asset_issuer']})")
async function getAccountInfo(accountId) {
try {
const response = await fetch(`https://api.hoops.finance/classic/accounts/${accountId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
} catch (error) {
console.error('Error fetching account info:', error.message);
throw error;
}
}
// Usage
const accountId = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
getAccountInfo(accountId).then(accountInfo => {
console.log(`Account: ${accountInfo.account_id}`);
console.log(`Sequence: ${accountInfo.sequence}`);
console.log(`Subentry Count: ${accountInfo.subentry_count}`);
// Print balances
accountInfo.balances.forEach(balance => {
if (balance.asset_type === 'native') {
console.log(`XLM Balance: ${balance.balance}`);
} else {
console.log(`${balance.asset_type} Balance: ${balance.balance} (Issuer: ${balance.asset_issuer})`);
}
});
});
interface Balance {
asset_type: string;
balance: string;
asset_issuer?: string;
}
interface AccountInfo {
account_id: string;
sequence: string;
subentry_count: number;
balances: Balance[];
}
async function getAccountInfo(accountId: string): Promise<AccountInfo> {
try {
const response = await fetch(`https://api.hoops.finance/classic/accounts/${accountId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
} catch (error) {
console.error('Error fetching account info:', error);
throw error;
}
}
// Usage
const accountId = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
getAccountInfo(accountId).then(accountInfo => {
console.log(`Account: ${accountInfo.account_id}`);
console.log(`Sequence: ${accountInfo.sequence}`);
console.log(`Subentry Count: ${accountInfo.subentry_count}`);
accountInfo.balances.forEach(balance => {
if (balance.asset_type === 'native') {
console.log(`XLM Balance: ${balance.balance}`);
} else {
console.log(`${balance.asset_type} Balance: ${balance.balance} (Issuer: ${balance.asset_issuer})`);
}
});
});
# Get account information
ACCOUNT_ID="GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
curl -s "https://api.hoops.finance/classic/accounts/${ACCOUNT_ID}" | jq '.'
# Extract specific values
ACCOUNT=$(curl -s "https://api.hoops.finance/classic/accounts/${ACCOUNT_ID}" | jq -r '.account_id')
SEQUENCE=$(curl -s "https://api.hoops.finance/classic/accounts/${ACCOUNT_ID}" | jq -r '.sequence')
SUBENTRY=$(curl -s "https://api.hoops.finance/classic/accounts/${ACCOUNT_ID}" | jq -r '.subentry_count')
echo "Account: ${ACCOUNT}"
echo "Sequence: ${SEQUENCE}"
echo "Subentry Count: ${SUBENTRY}"
# Get balances
curl -s "https://api.hoops.finance/classic/accounts/${ACCOUNT_ID}" | jq '.balances[]'
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
)
type Balance struct {
AssetType string `json:"asset_type"`
Balance string `json:"balance"`
AssetIssuer string `json:"asset_issuer,omitempty"`
}
type AccountInfo struct {
AccountID string `json:"account_id"`
Sequence string `json:"sequence"`
SubentryCount int `json:"subentry_count"`
Balances []Balance `json:"balances"`
}
func getAccountInfo(accountID string) (*AccountInfo, error) {
url := fmt.Sprintf("https://api.hoops.finance/classic/accounts/%s", accountID)
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
var accountInfo AccountInfo
err = json.Unmarshal(body, &accountInfo)
return &accountInfo, err
}
func main() {
accountID := "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
accountInfo, err := getAccountInfo(accountID)
if err != nil {
panic(err)
}
fmt.Printf("Account: %s\n", accountInfo.AccountID)
fmt.Printf("Sequence: %s\n", accountInfo.Sequence)
fmt.Printf("Subentry Count: %d\n", accountInfo.SubentryCount)
for _, balance := range accountInfo.Balances {
if balance.AssetType == "native" {
fmt.Printf("XLM Balance: %s\n", balance.Balance)
} else {
fmt.Printf("%s Balance: %s (Issuer: %s)\n",
balance.AssetType, balance.Balance, balance.AssetIssuer)
}
}
}
use reqwest;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
struct Balance {
asset_type: String,
balance: String,
asset_issuer: Option<String>,
}
#[derive(Debug, Serialize, Deserialize)]
struct AccountInfo {
account_id: String,
sequence: String,
subentry_count: i32,
balances: Vec<Balance>,
}
async fn get_account_info(account_id: &str) -> Result<AccountInfo, Box<dyn std::error::Error>> {
let url = format!("https://api.hoops.finance/classic/accounts/{}", account_id);
let response = reqwest::get(&url).await?;
let account_info: AccountInfo = response.json().await?;
Ok(account_info)
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let account_id = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
let account_info = get_account_info(account_id).await?;
println!("Account: {}", account_info.account_id);
println!("Sequence: {}", account_info.sequence);
println!("Subentry Count: {}", account_info.subentry_count);
for balance in account_info.balances {
if balance.asset_type == "native" {
println!("XLM Balance: {}", balance.balance);
} else {
println!("{} Balance: {} (Issuer: {})",
balance.asset_type, balance.balance,
balance.asset_issuer.unwrap_or_default());
}
}
Ok(())
}
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.URI;
import java.util.List;
public class Balance {
@JsonProperty("asset_type")
private String assetType;
private String balance;
@JsonProperty("asset_issuer")
private String assetIssuer;
// Getters and setters
public String getAssetType() { return assetType; }
public void setAssetType(String assetType) { this.assetType = assetType; }
public String getBalance() { return balance; }
public void setBalance(String balance) { this.balance = balance; }
public String getAssetIssuer() { return assetIssuer; }
public void setAssetIssuer(String assetIssuer) { this.assetIssuer = assetIssuer; }
}
public class AccountInfo {
@JsonProperty("account_id")
private String accountId;
private String sequence;
@JsonProperty("subentry_count")
private int subentryCount;
private List<Balance> balances;
// Getters and setters
public String getAccountId() { return accountId; }
public void setAccountId(String accountId) { this.accountId = accountId; }
public String getSequence() { return sequence; }
public void setSequence(String sequence) { this.sequence = sequence; }
public int getSubentryCount() { return subentryCount; }
public void setSubentryCount(int subentryCount) { this.subentryCount = subentryCount; }
public List<Balance> getBalances() { return balances; }
public void setBalances(List<Balance> balances) { this.balances = balances; }
}
public class HoopsApiClient {
private static final String BASE_URL = "https://api.hoops.finance";
private final HttpClient client = HttpClient.newHttpClient();
private final ObjectMapper mapper = new ObjectMapper();
public AccountInfo getAccountInfo(String accountId) throws Exception {
String url = String.format("%s/classic/accounts/%s", BASE_URL, accountId);
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.GET()
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
return mapper.readValue(response.body(), AccountInfo.class);
}
public static void main(String[] args) throws Exception {
HoopsApiClient client = new HoopsApiClient();
String accountId = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
AccountInfo accountInfo = client.getAccountInfo(accountId);
System.out.printf("Account: %s%n", accountInfo.getAccountId());
System.out.printf("Sequence: %s%n", accountInfo.getSequence());
System.out.printf("Subentry Count: %d%n", accountInfo.getSubentryCount());
for (Balance balance : accountInfo.getBalances()) {
if ("native".equals(balance.getAssetType())) {
System.out.printf("XLM Balance: %s%n", balance.getBalance());
} else {
System.out.printf("%s Balance: %s (Issuer: %s)%n",
balance.getAssetType(), balance.getBalance(),
balance.getAssetIssuer());
}
}
}
}
#!/bin/bash
BASE_URL="https://api.hoops.finance"
get_account_info() {
local account_id=$1
curl -s "${BASE_URL}/classic/accounts/${account_id}" | jq '.'
}
# Usage
ACCOUNT_ID="GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
account_info=$(get_account_info "$ACCOUNT_ID")
# Extract values
account=$(echo "$account_info" | jq -r '.account_id')
sequence=$(echo "$account_info" | jq -r '.sequence')
subentry=$(echo "$account_info" | jq -r '.subentry_count')
echo "Account: ${account}"
echo "Sequence: ${sequence}"
echo "Subentry Count: ${subentry}"
# Print balances
echo "$account_info" | jq -r '.balances[] | "\(.asset_type): \(.balance)"'
Great for: Wallet balance displays, account verification, and balance monitoring
Response Fields Explained
Field | Description | Example |
---|---|---|
account_id | Stellar account address | GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ |
sequence | Current sequence number | 123456789 |
balances | Array of asset balances | [{"asset_type": "native", "balance": "100.0000000"}] |
subentry_count | Number of subentries | 5 |
Transaction History
Get Recent Transactions
def get_account_transactions(account_id, limit=10, order='desc'):
"""Fetch recent transactions for an account"""
url = f"https://api.hoops.finance/classic/accounts/{account_id}/transactions"
params = {
'limit': limit,
'order': order
}
response = requests.get(url, params=params)
response.raise_for_status()
return response.json()
def get_account_operations(account_id, limit=10, order='desc'):
"""Fetch recent operations for an account"""
url = f"https://api.hoops.finance/classic/accounts/{account_id}/operations"
params = {
'limit': limit,
'order': order
}
response = requests.get(url, params=params)
response.raise_for_status()
return response.json()
# Usage
account_id = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
# Get recent transactions
transactions = get_account_transactions(account_id, limit=5)
print("=== RECENT TRANSACTIONS ===")
for tx in transactions['_embedded']['records']:
print(f"Hash: {tx['hash']}")
print(f"Ledger: {tx['ledger']}")
print(f"Operation Count: {tx['operation_count']}")
print(f"Fee Paid: {tx['fee_paid']} XLM")
print("---")
# Get recent operations
operations = get_account_operations(account_id, limit=5)
print("=== RECENT OPERATIONS ===")
for op in operations['_embedded']['records']:
print(f"Type: {op['type']}")
print(f"Transaction Hash: {op['transaction_hash']}")
print(f"Created At: {op['created_at']}")
print("---")
async function getAccountTransactions(accountId, limit = 10, order = 'desc') {
try {
const url = new URL(`https://api.hoops.finance/classic/accounts/${accountId}/transactions`);
url.searchParams.append('limit', limit);
url.searchParams.append('order', order);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
} catch (error) {
console.error('Error fetching transactions:', error.message);
throw error;
}
}
async function getAccountOperations(accountId, limit = 10, order = 'desc') {
try {
const url = new URL(`https://api.hoops.finance/classic/accounts/${accountId}/operations`);
url.searchParams.append('limit', limit);
url.searchParams.append('order', order);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
} catch (error) {
console.error('Error fetching operations:', error.message);
throw error;
}
}
// Usage
const accountId = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
// Get recent transactions
getAccountTransactions(accountId, 5).then(transactions => {
console.log("=== RECENT TRANSACTIONS ===");
transactions._embedded.records.forEach(tx => {
console.log(`Hash: ${tx.hash}`);
console.log(`Ledger: ${tx.ledger}`);
console.log(`Operation Count: ${tx.operation_count}`);
console.log(`Fee Paid: ${tx.fee_paid} XLM`);
console.log("---");
});
});
// Get recent operations
getAccountOperations(accountId, 5).then(operations => {
console.log("=== RECENT OPERATIONS ===");
operations._embedded.records.forEach(op => {
console.log(`Type: ${op.type}`);
console.log(`Transaction Hash: ${op.transaction_hash}`);
console.log(`Created At: ${op.created_at}`);
console.log("---");
});
});
Great for: Transaction history displays, activity feeds, and audit trails
Claimable Balances
Track Claimable Balances
def get_account_claimable_balances(account_id):
"""Fetch claimable balances for an account"""
url = f"https://api.hoops.finance/classic/accounts/{account_id}/claimable_balances"
response = requests.get(url)
response.raise_for_status()
return response.json()
def get_claimable_balance_details(balance_id):
"""Fetch details for a specific claimable balance"""
url = f"https://api.hoops.finance/classic/claimable_balances/{balance_id}"
response = requests.get(url)
response.raise_for_status()
return response.json()
# Usage
account_id = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
# Get claimable balances
claimable_balances = get_account_claimable_balances(account_id)
print("=== CLAIMABLE BALANCES ===")
for balance in claimable_balances['_embedded']['records']:
print(f"Balance ID: {balance['id']}")
print(f"Asset: {balance['asset']}")
print(f"Amount: {balance['amount']}")
print(f"Claimants: {len(balance['claimants'])}")
print("---")
async function getAccountClaimableBalances(accountId) {
try {
const response = await fetch(`https://api.hoops.finance/classic/accounts/${accountId}/claimable_balances`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
} catch (error) {
console.error('Error fetching claimable balances:', error.message);
throw error;
}
}
async function getClaimableBalanceDetails(balanceId) {
try {
const response = await fetch(`https://api.hoops.finance/classic/claimable_balances/${balanceId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
} catch (error) {
console.error('Error fetching claimable balance details:', error.message);
throw error;
}
}
// Usage
const accountId = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
getAccountClaimableBalances(accountId).then(balances => {
console.log("=== CLAIMABLE BALANCES ===");
balances._embedded.records.forEach(balance => {
console.log(`Balance ID: ${balance.id}`);
console.log(`Asset: ${balance.asset}`);
console.log(`Amount: ${balance.amount}`);
console.log(`Claimants: ${balance.claimants.length}`);
console.log("---");
});
});
Great for: Airdrop tracking, vesting schedules, and reward distribution
Payment Tracking
Monitor Payments
def get_account_payments(account_id, limit=10):
"""Fetch payment operations for an account"""
url = f"https://api.hoops.finance/classic/accounts/{account_id}/payments"
params = {'limit': limit}
response = requests.get(url, params=params)
response.raise_for_status()
return response.json()
# Usage
account_id = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
payments = get_account_payments(account_id, limit=5)
print("=== RECENT PAYMENTS ===")
for payment in payments['_embedded']['records']:
print(f"Type: {payment['type']}")
print(f"Amount: {payment['amount']}")
print(f"Asset: {payment['asset_type']}")
if payment['asset_type'] != 'native':
print(f"Asset Code: {payment['asset_code']}")
print(f"Asset Issuer: {payment['asset_issuer']}")
print(f"From: {payment['from']}")
print(f"To: {payment['to']}")
print("---")
async function getAccountPayments(accountId, limit = 10) {
try {
const url = new URL(`https://api.hoops.finance/classic/accounts/${accountId}/payments`);
url.searchParams.append('limit', limit);
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return response.json();
} catch (error) {
console.error('Error fetching payments:', error.message);
throw error;
}
}
// Usage
const accountId = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
getAccountPayments(accountId, 5).then(payments => {
console.log("=== RECENT PAYMENTS ===");
payments._embedded.records.forEach(payment => {
console.log(`Type: ${payment.type}`);
console.log(`Amount: ${payment.amount}`);
console.log(`Asset: ${payment.asset_type}`);
if (payment.asset_type !== 'native') {
console.log(`Asset Code: ${payment.asset_code}`);
console.log(`Asset Issuer: ${payment.asset_issuer}`);
}
console.log(`From: ${payment.from}`);
console.log(`To: ${payment.to}`);
console.log("---");
});
});
Great for: Payment tracking, transaction monitoring, and financial reporting
Building a Wallet Dashboard
Complete Wallet Monitoring System
import requests
from datetime import datetime
import json
class WalletTracker:
def __init__(self):
self.base_url = "https://api.hoops.finance"
def get_wallet_summary(self, account_id):
"""Get comprehensive wallet summary"""
try:
# Get account info
account_info = requests.get(f"{self.base_url}/classic/accounts/{account_id}").json()
# Get recent transactions
transactions = requests.get(f"{self.base_url}/classic/accounts/{account_id}/transactions?limit=5").json()
# Get claimable balances
claimable_balances = requests.get(f"{self.base_url}/classic/accounts/{account_id}/claimable_balances").json()
return {
'account': account_info,
'recent_transactions': transactions['_embedded']['records'],
'claimable_balances': claimable_balances['_embedded']['records']
}
except Exception as e:
print(f"Error fetching wallet data: {e}")
return None
def format_balance(self, balance):
"""Format balance for display"""
if balance['asset_type'] == 'native':
return f"{float(balance['balance']):.7f} XLM"
else:
return f"{balance['balance']} {balance['asset_code']}"
def display_wallet_summary(self, account_id):
"""Display formatted wallet summary"""
data = self.get_wallet_summary(account_id)
if not data:
return
print("=== WALLET SUMMARY ===")
print(f"Account: {data['account']['account_id']}")
print(f"Sequence: {data['account']['sequence']}")
print()
print("=== BALANCES ===")
for balance in data['account']['balances']:
print(f" {self.format_balance(balance)}")
print()
print("=== RECENT TRANSACTIONS ===")
for tx in data['recent_transactions']:
print(f" Hash: {tx['hash'][:16]}...")
print(f" Ledger: {tx['ledger']}")
print(f" Operations: {tx['operation_count']}")
print(f" Fee: {tx['fee_paid']} XLM")
print()
print("=== CLAIMABLE BALANCES ===")
if data['claimable_balances']:
for balance in data['claimable_balances']:
print(f" ID: {balance['id'][:16]}...")
print(f" Asset: {balance['asset']}")
print(f" Amount: {balance['amount']}")
else:
print(" No claimable balances")
# Usage
tracker = WalletTracker()
account_id = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ"
tracker.display_wallet_summary(account_id)
class WalletTracker {
constructor() {
this.baseUrl = 'https://api.hoops.finance';
}
async getWalletSummary(accountId) {
try {
const [accountInfo, transactions, claimableBalances] = await Promise.all([
fetch(`${this.baseUrl}/classic/accounts/${accountId}`),
fetch(`${this.baseUrl}/classic/accounts/${accountId}/transactions?limit=5`),
fetch(`${this.baseUrl}/classic/accounts/${accountId}/claimable_balances`)
]);
if (!accountInfo.ok || !transactions.ok || !claimableBalances.ok) {
throw new Error(`HTTP error! status: ${accountInfo.status}, ${transactions.status}, or ${claimableBalances.status}`);
}
const [accountData, transactionsData, claimableBalancesData] = await Promise.all([
accountInfo.json(),
transactions.json(),
claimableBalances.json()
]);
return {
account: accountData,
recentTransactions: transactionsData._embedded.records,
claimableBalances: claimableBalancesData._embedded.records
};
} catch (error) {
console.error('Error fetching wallet data:', error.message);
return null;
}
}
formatBalance(balance) {
if (balance.asset_type === 'native') {
return `${parseFloat(balance.balance).toFixed(7)} XLM`;
} else {
return `${balance.balance} ${balance.asset_code}`;
}
}
async displayWalletSummary(accountId) {
const data = await this.getWalletSummary(accountId);
if (!data) return;
console.log('=== WALLET SUMMARY ===');
console.log(`Account: ${data.account.account_id}`);
console.log(`Sequence: ${data.account.sequence}`);
console.log();
console.log('=== BALANCES ===');
data.account.balances.forEach(balance => {
console.log(` ${this.formatBalance(balance)}`);
});
console.log();
console.log('=== RECENT TRANSACTIONS ===');
data.recentTransactions.forEach(tx => {
console.log(` Hash: ${tx.hash.substring(0, 16)}...`);
console.log(` Ledger: ${tx.ledger}`);
console.log(` Operations: ${tx.operation_count}`);
console.log(` Fee: ${tx.fee_paid} XLM`);
console.log();
});
console.log('=== CLAIMABLE BALANCES ===');
if (data.claimableBalances.length > 0) {
data.claimableBalances.forEach(balance => {
console.log(` ID: ${balance.id.substring(0, 16)}...`);
console.log(` Asset: ${balance.asset}`);
console.log(` Amount: ${balance.amount}`);
});
} else {
console.log(' No claimable balances');
}
}
}
// Usage
const tracker = new WalletTracker();
const accountId = "GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ";
tracker.displayWalletSummary(accountId);
Network Considerations
Testnet vs Mainnet
Always verify you're using the correct network (testnet vs mainnet) for your use case. Account addresses look the same but operate on different networks.
Testnet Account Example:
GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ
Mainnet Account Example:
GCEZWKCA5VLDNRLN3RPRJMRZOX3Z6G5CHCGSNFHEYVXM3XOJMDS674JZ
Error Handling
def safe_get_account_info(account_id):
"""Safely fetch account info with error handling"""
try:
response = requests.get(f"https://api.hoops.finance/classic/accounts/{account_id}")
response.raise_for_status()
return response.json()
except requests.exceptions.HTTPError as e:
if e.response.status_code == 404:
print(f"Account {account_id} not found")
else:
print(f"HTTP Error: {e}")
return None
except requests.exceptions.RequestException as e:
print(f"Request Error: {e}")
return None
Next Steps
- Combine with Analytics Dashboard to track wallet performance
- Use Token Data to display token metadata in wallet views
- Integrate with Liquidity Monitoring for DeFi activity tracking
Remember to implement proper rate limiting in production applications. The API allows 120 requests per minute.