Staking lets your users put their crypto to work — locking eligible assets to help secure a proof-of-stake network and earning rewards in return. zerohash runs the validator infrastructure behind the scenes, so your platform gets to offer native staking without operating a single node. You submit stakes and unstakes on behalf of your participants, zerohash handles the on-chain mechanics and reward distribution, and you apply your own platform fee on top.
For engineers and PMs, the thing to internalize up front is that staking is a lifecycle, not a transaction. A stake doesn't go live the instant you submit it, and it doesn't unwind instantly either — funds move through network queues that can take days or weeks. Your integration's job is to drive that lifecycle from your own systems and keep the user informed at every step: submit the request, track it through activation, surface rewards as they accrue, and manage the unstaking wind-down. Get the state handling right and the rest is straightforward.
How it works
- Confirm eligibility - the participant is KYC-approved, in a permitted jurisdiction, and has an active staking
signed_agreement. - Submit a stake with
POST /stakes. Funds move fromavailabletocollateral, then tostakedonce the stake activates (currently around 3 days for ETH). - Track lifecycle via webhooks
stake.*,unstake.*,staking_reward.received) or by polling the status endpoints. Requests can be canceled whilesubmittedorqueued. - Rewards are credited daily. Consensus rewards compound into the
stakedbalance; MEV rewards are credited toavailable. All figures are net of your platform fee. - Unstake with
POST /stakes/unstake. Funds return toavailableafter the network cooldown, marked bycompleted_atand theunstake.unstakedwebhook.
Endpoints in this section
- Discover stakeable assets: GET /assets?staking_enabled=true
- Validate available balance: GET /accounts?account_type=available
- Check staking parameters: GET /assets/{asset}/staking_info
- Verify terms acceptance: GET /participant/{participant_code}
- Update terms acceptance: PATCH /participants/customers/{participant\_code}
- Submit stake: POST /stakes
- Cancel pending stake: POST /stakes/{stake\_id}/cancel
- Monitor stake status: GET /stakes/{stake_id}/status
- View portfolio: GET /stakes/{participant_code}
- Track rewards: GET /stakes/{participant_code}/rewards
- Staking summary: GET/stakes/{participant_code}/{asset}/summary
- Submit unstake: POST /stakes/unstake
- Cancel pending unstake: POST /stakes/unstake/{unstake\_id}/cancel
- Monitor unstake status: GET /stakes/unstake/{unstake\_id}/status
- List participant unstakes: GET /stakes/{participant_code}/unstakes
ETH is supported today, with SOL planned for Q3 2026. There are no minimum stake or unstake amounts. Staking is API-only - there is no SDK path at this time.
For the full lifecycle, state machine, balance flow rules, webhook payloads, error codes, and UX best practices, see the Staking integration guide.