Solana wallet data made easy
One REST API for getting Solana wallet balances, history, identity, and funding sources. No Solana JSON-RPC methods to memorize or lamport math required.



Know who a wallet is
Resolve a Solana address or domain name to an identity. Supports 32,500+ labels and 21.5M+ tags.
- Single lookup or batch up to 100 addresses
- SNS and ANS custom TLDs resolve on mainnet
- Supports labels for exchange addresses, protocol wallets, institutions, and flagged addresses
{
"address": "HXsKP7wrBWaQ8T2Vtjry3Nj3oUgwYcqq9vrHDM12G664",
"type": "exchange",
"name": "Binance 1",
"category": "Centralized Exchange",
"tags": ["Centralized Exchange"]
}
- Single lookup or batch up to 100 addresses
- SNS and ANS custom TLDs resolve on mainnet
- Supports labels for exchange addresses, protocol wallets, institutions, and flagged addresses
{
"address": "HXsKP7wrBWaQ8T2Vtjry3Nj3oUgwYcqq9vrHDM12G664",
"type": "exchange",
"name": "Binance 1",
"category": "Centralized Exchange",
"tags": ["Centralized Exchange"]
}
Trace who funded a wallet
The original funding source of a wallet: who sent the first SOL, how much, and when. Funder name and type come from the same identity system.
- Immediate funder address, amount, slot, and signature
- Exchange, protocol, or unknown, labeled if we know it
- Cache forever. A wallet's first funder never changes
{
"funder": "26MAyPNpK4At8LgRECMMbgiKQuJyg3oACtw1Q9FRyuba",
"funderName": null,
"funderType": null,
"mint": "So11111111111111111111111111111111111111111",
"symbol": "SOL",
"amount": 0.09811972,
"amountRaw": "98119720",
"decimals": 9,
"date": "2022-01-19T20:46:34.000Z",
"signature": "5WX9C5kCQNULGGrSHJBR1WDFyetVyekbUpe1KQ45p3zEBe6jVgSsJuMqLWijjTDcnaAK2518ZriktRMCNycnsNAG",
"timestamp": 1642625194,
"slot": 116984883,
"explorerUrl": "https://orbmarkets.io/tx/5WX9C5kCQNULGGrSHJBR1WDFyetVyekbUpe1KQ45p3zEBe6jVgSsJuMqLWijjTDcnaAK2518ZriktRMCNycnsNAG?tab=summary"
}
- Immediate funder address, amount, slot, and signature
- Exchange, protocol, or unknown, labeled if we know it
- Cache forever. A wallet's first funder never changes
{
"funder": "26MAyPNpK4At8LgRECMMbgiKQuJyg3oACtw1Q9FRyuba",
"funderName": null,
"funderType": null,
"mint": "So11111111111111111111111111111111111111111",
"symbol": "SOL",
"amount": 0.09811972,
"amountRaw": "98119720",
"decimals": 9,
"date": "2022-01-19T20:46:34.000Z",
"signature": "5WX9C5kCQNULGGrSHJBR1WDFyetVyekbUpe1KQ45p3zEBe6jVgSsJuMqLWijjTDcnaAK2518ZriktRMCNycnsNAG",
"timestamp": 1642625194,
"slot": 116984883,
"explorerUrl": "https://orbmarkets.io/tx/5WX9C5kCQNULGGrSHJBR1WDFyetVyekbUpe1KQ45p3zEBe6jVgSsJuMqLWijjTDcnaAK2518ZriktRMCNycnsNAG?tab=summary"
}
Wallet activity, fully parsed
Transaction history with per-transaction balance changes in human-readable language.
- Newest first, up to 100 transactions per page
tokenAccounts=balanceChangedfor updates onlyamountis already decimal-adjusted; no lamport math
{
"data": [
{
"signature": "5wHu1qwD7Jsj3xqWjdSEJmYr3Q5f5RjXqjqQJ7jqEj7jqEj7jqEj7jqEj7jqEj7jqE",
"timestamp": 1704067200,
"slot": 250000000,
"fee": 0.000005,
"feePayer": "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
"error": null,
"balanceChanges": [
{
"mint": "So11111111111111111111111111111111111111111",
"amount": -0.05,
"decimals": 9
}
]
}
],
"pagination": {
"hasMore": true,
"nextCursor": "5wHu1qwD7Jsj3xqWjdSEJmYr3Q5f5RjXqjqQJ7jqEj7jqEj7jqEj7jqEj7jqEj7jqE"
}
}
- Newest first, up to 100 transactions per page
tokenAccounts=balanceChangedfor updates onlyamountis already decimal-adjusted; no lamport math
{
"data": [
{
"signature": "5wHu1qwD7Jsj3xqWjdSEJmYr3Q5f5RjXqjqQJ7jqEj7jqEj7jqEj7jqEj7jqEj7jqE",
"timestamp": 1704067200,
"slot": 250000000,
"fee": 0.000005,
"feePayer": "86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY",
"error": null,
"balanceChanges": [
{
"mint": "So11111111111111111111111111111111111111111",
"amount": -0.05,
"decimals": 9
}
]
}
],
"pagination": {
"hasMore": true,
"nextCursor": "5wHu1qwD7Jsj3xqWjdSEJmYr3Q5f5RjXqjqQJ7jqEj7jqEj7jqEj7jqEj7jqEj7jqE"
}
}
Ship the wallet and data layer together
Add non-custodial embedded wallets to your app with sign in option support for passkeys, email, and existing wallets via helius-wallet-kit
Wallet API use cases
Wallet dashboards
Balances, USD values, and metadata in one REST call. No DAS stitching or lamport math
Portfolio trackers
Use history and balance-at to reconstruct holdings and compute PnLs over time
Payment processors
Log transactions and transfers with counterparty, amount, mint, and direction
Tax and accounting
Get human-readable history with per-transaction balance holdings and changes
Compliance and AML
Look up known exchanges, treasury wallets, see how wallets were funded
Explorers and analytics
Get tags for over 21 million wallets to add account labels in your app
One REST API, all Solana wallet data
1. Get an API key
Sign up, get your Helius API key, and pass the api-key on the query string or as an X-Api-Key header
2. Hit one REST path
GET /v1/wallet/{wallet}/balances, identity, history, or any other Wallet API endpoint
3. Drop it into your app
Amounts are decimal-adjusted, identities are labeled, and data is correctly formatted; no extra steps required
const getWalletBalances = async (address) => {
const url = `https://api.helius.xyz/v1/wallet/${address}/balances?api-key=YOUR_API_KEY`;
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
const solBalance = data.balances[0]; // SOL is always first when showNative=true
console.log(`SOL Balance: ${solBalance.balance} SOL ($${solBalance.usdValue})`);
console.log(`Page ${data.pagination.page} Total Value: $${data.totalUsdValue}`);
console.log(`Token Count (this page): ${data.balances.length}`);
// Display top holdings
data.balances.slice(0, 5).forEach(token => {
console.log(`${token.symbol}: ${token.balance} ($${token.usdValue || 'N/A'})`);
});
return data;
};
getWalletBalances("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY");1. Get an API key
Sign up, get your Helius API key, and pass the api-key on the query string or as an X-Api-Key header
2. Hit one REST path
GET /v1/wallet/{wallet}/balances, identity, history, or any other Wallet API endpoint
3. Drop it into your app
Amounts are decimal-adjusted, identities are labeled, and data is correctly formatted; no extra steps required
const getWalletBalances = async (address) => {
const url = `https://api.helius.xyz/v1/wallet/${address}/balances?api-key=YOUR_API_KEY`;
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
const solBalance = data.balances[0]; // SOL is always first when showNative=true
console.log(`SOL Balance: ${solBalance.balance} SOL ($${solBalance.usdValue})`);
console.log(`Page ${data.pagination.page} Total Value: $${data.totalUsdValue}`);
console.log(`Token Count (this page): ${data.balances.length}`);
// Display top holdings
data.balances.slice(0, 5).forEach(token => {
console.log(`${token.symbol}: ${token.balance} ($${token.usdValue || 'N/A'})`);
});
return data;
};
getWalletBalances("86xCnPeV69n6t3DnyGvkKobf9FdN2H9oiVDdaMpo2MMY");Balances, historical balance (balance-at), history, and transfers are available on every plan, including Free. Identity (single and batch) and funded-by require any paid plan (Developer and above) and return 403 on Free.
Every Wallet API request costs 100 credits, including batch identity (up to 100 addresses in one call). See the full credit table.
Use balances for the current portfolio, balance-at for a holding at a past slot or timestamp, history for a full activity feed with per-transaction balance changes, and transfers when you only need sent or received payments with a counterparty. Use identity to label a known exchange, protocol, or institution, and funded-by to find the wallet that sent the first SOL.
The Wallet API is the read path: get balances, history, identity, and funded-by wallet information over REST. WaaS is embedded wallets: create and sign transactions using helius-wallet-kit.
WaaS is in beta and available on all paid plans (Developer, Business, Professional, and Enterprise). It is not available on Free.
There is no separate subscription and no per-user fee. Each signature costs 200 credits ($0.001 at the standard credit rate). Wallet creation is free. signMessage, signTransaction, and signAndSendTransaction each count as one signature. A signature is billed even if the transaction later fails onchain. A cancelled prompt is free. Track usage in the dashboard under WaaS → Analytics. See WaaS credits.
Upgrade to a paid plan, create an API key, and install helius-wallet-kit. Wrap your app in HeliusWalletProvider and follow the WaaS quickstart.
Wallet data without the complexity
Skip raw Solana JSON-RPC methods, and start querying onchain wallet data in minutes




