Get wallet balances
Retrieves balances for a custody wallet.
GET/Run in dashboard
If any SOL or SPL balance read fails, returns 503 instead of partial or zero balances. Optional minimumSlot requires confirmed account state at or after that Solana slot; the response acknowledges the bound in data.balanceReadContext.minimumSlot. Wallet lifecycle and provisioning are managed through /v1/wallets.
Requires an API key with the wallets.read action.
Path parameters
-
walletId·string· required · min length 1 · exampleprivy_wallet_123Provider wallet ID — the
walletIdfield returned by GET /v1/wallets. The wallet recordidand the public key are not accepted.
Query parameters
minimumSlot·string· pattern^(0|[1-9]\d*)$
Headers
-
x-project-id·string· min length 1 · exampleprj_exampleRequired for dashboard sessions. API keys use their assigned project.
Responses
-
200Wallet balances-
data·object· requiredWallet balances response payload.
-
walletBalances·object· requiredWallet balances details.
-
walletId·string· required · min length 1 · exampleprivy_wallet_123Provider wallet ID — the
walletIdfield returned by GET /v1/wallets. -
address·string· required · min length 32 · max length 44 · exampleSo11111111111111111111111111111111111111112Wallet address.
-
balances·object[]· requiredToken balances.
-
token·string· required · exampleUSDCToken symbol or mint address.
-
mint·string· required · min length 32 · max length 44 · exampleSo11111111111111111111111111111111111111112Token mint address.
-
amount·string· required · example100000000Raw amount in smallest units.
-
uiAmount·string· required · example100.00Token amount in UI units (decimal string).
-
decimals·integer· required · example6Token decimals.
-
usdPrice·number· example1Resolved USD price per token when available.
-
usdValue·number· example100Resolved USD value of this balance when pricing is available.
-
confidential·boolean· examplefalseConfidential balance flag (when applicable).
-
-
-
balanceReadContext·objectminimumSlot·integer· required · min 0 · max 9007199254740991
-
-
meta·object· requiredResponse metadata.
-
requestId·string· required · min length 1 · examplereq_exampleRequest identifier for tracing.
-
timestamp·string· required · formatdate-time· example2025-01-01T00:00:00.000ZISO 8601 timestamp.
-
-
-
400Bad Request-
error·object· requiredStandard error payload.
-
code·string· requiredMachine-readable error code.
-
message·string· requiredHuman-readable error message.
-
details·objectOptional error details for debugging.
*·any
-
-
meta·object-
requestId·string· min length 1 · examplereq_exampleRequest identifier for tracing.
-
-
-
401UnauthorizedSame fields as
400. -
403Forbidden. Requires thewallets.readaction: an API key must hold it (a module'smanageorexecutealso covers itsread), and a signed-in member's organization role must include it. Without it the error is INSUFFICIENT_PERMISSIONS anderror.details.actionnames the action. Any other 403 names its own reason.Same fields as
400. -
404Not FoundSame fields as
400. -
409ConflictSame fields as
400. -
500Internal Server ErrorSame fields as
400. -
503Service UnavailableSame fields as
400.
Example request
curl 'https://api.solana.com/v1/payments/wallets/privy_wallet_123/balances' \
-H "Authorization: Bearer $SDP_API_KEY"Example responses
{
"data": {
"walletBalances": {
"walletId": "privy_wallet_123",
"address": "So11111111111111111111111111111111111111112",
"balances": [
{
"token": "USDC",
"mint": "So11111111111111111111111111111111111111112",
"amount": "100000000",
"uiAmount": "100.00",
"decimals": 6,
"usdPrice": 1,
"usdValue": 100,
"confidential": false
}
]
},
"balanceReadContext": {
"minimumSlot": 1
}
},
"meta": {
"requestId": "req_example",
"timestamp": "2025-01-01T00:00:00.000Z"
}
}Error responses use the standard error shape.