Staking enables clients to earn rewards by participating in blockchain consensus. With Prime’s Staking APIs, clients can stake supported assets directly from eligible wallets and initiate unstaking when desired. While many assets are available for staking through the Prime UI, the Stake and Unstake APIs currently support Ethereum (ETH) and Solana (SOL) only, with additional assets to be supported over time. Reward accrual, stake and unstake activity, and associated balance states can all be monitored through existing API endpoints for all stakable assets on Prime. Coinbase Prime supports both partial staking and multiple concurrent staking operations from the same wallet for ETH only. In practice, this means you can stake a specific amount (e.g. 64 ETH) without needing to stake the entire wallet balance, and you can initiate multiple stakes without waiting for earlier ones to complete. For Solana, partial staking and unstaking are not yet supported. This means that the only valid actions on a SOL vault wallet are to fully stake or fully unstake. Solana rewards may be either added to the staked or unstaked balance, depending on reward type.

Staking from a Wallet

To stake from a Vault wallet, use Create Stake. Instead of requiring a public address, this endpoint operates using Wallet IDs. For a refresher on Vault wallets and Wallet IDs, refer to the Wallets page. Once the request is successfully submitted, the response will include an activity_id. As with other sensitive operations in Prime, this request must be approved in the Prime UI or Mobile App before it is processed. Once approved, the asset selected for staking will begin the bonding process, assuming the underlying protocol has a bonding period.

stakingService := staking.NewStakingService(client)  
  
request := &staking.CreateStakeRequest{  
    PortfolioId:   "PORTFOLIO_ID_HERE",  
    WalletId:      "WALLET_ID_HERE",  
    IdempotencyKey: uuid.New().String(),  
    Inputs:         &staking.CreateStakeInputs{  
        Amount: '32'  
    }  
}  
  
response, err := stakingService.CreateStake(context.Background(), request)  
For more information, please visit the Prime Go SDK.

Unstaking from a wallet

The process for unstaking is nearly identical to staking. As with staking, partial unstaking for ETH is supported. For example, if a wallet has 320 ETH staked, an unstake request can be submitted for just 96 ETH. Unstaking is not immediate. For Ethereum, after initiating the request and approving it in the Prime UI, ETH enters the Ethereum exit queue and becomes withdrawable only once the network finalizes the exit. For Solana, withdrawals typically take 2-4 days.

stakingService := staking.NewStakingService(client)  
  
request := &staking.CreateUnstakeRequest{  
    PortfolioId:   "PORTFOLIO_ID_HERE",  
    WalletId:      "WALLET_ID_HERE",  
    IdempotencyKey: uuid.New().String(),  
    Inputs:         &staking.CreateUnstakeInputs{  
        Amount: '1'  
    }  
}  
response, err := stakingService.CreateUnstake(context.Background(), request)  

For more information, please visit the Prime Go SDK.

Tracking staking events and rewards

Staking-related transaction events can be tracked using either the List Portfolio Transactions or List Wallet Transactions endpoints. Both endpoints return identical response structures; the wallet-level endpoint simply scopes the results to a single wallet. You can use these APIs to monitor staking lifecycle events (e.g., initiation, exit) and to track reward distribution over time. For all non-ETH assets, rewards are deposited directly into the wallet from which the asset was staked.

ETH Reward Types and Tracking

ETH staking rewards come in two distinct types, both with different characteristics and tracking requirements: MEV and Transaction Rewards are unstaked by default and paid out to a special wallet called ‘Staking Transaction Rewards’. Consensus Layer Rewards are paid out to the same vault wallet as the one that is staked. Rewards that are earned but not yet distributed are tracked in the pending rewards balance field. Only consensus layer rewards can be pending since there is a protocol-level delay between when rewards are earned versus distributed. To track all reward distributions over time, use the List Portfolio Transactions or List Wallet Transactions endpoints and filter for REWARD transaction type. Below is an example of querying for staking rewards at the portfolio level.
TransactionsService transactionsService = PrimeServiceFactory.createTransactionsService(client);  
  
ListPortfolioTransactionsRequest request = new ListPortfolioTransactionsRequest.Builder()  
.portfolioId("PORTFOLIO_ID_HERE")  
.types("REWARD")  
.build();  
  
ListPortfolioTransactionsResponse response = transactionsService.listPortfolioTransactions(request);  

To learn more about this SDK, please visit the Prime Java SDK.

Balance Tracking for Staked Assets

The Get Wallet Balance endpoint provides several staking-specific balance subtypes that help you monitor the complete lifecycle of your staked assets:
  • bondable_amount - Withdrawable balance that can be staked. Returns 0 for the ETH Staking Transaction Rewards wallet
  • bonded_amount - How much balance is currently staked
  • unbonding_amount - Amount in the process of unstaking (not yet withdrawable)
  • unbondable_amount - Amount that can be unstaked
  • pending_rewards_amount - Accrued rewards awaiting distribution
These balance subtypes provide real-time visibility into your staking positions and can be used to programmatically manage staking operations or build dashboards. For more information on calling the SDKs for balances, please visit the Balances page.