> ## Documentation Index
> Fetch the complete documentation index at: https://docs.zodia-custody.com/llms.txt
> Use this file to discover all available pages before exploring further.

# DOT Staking

> Bond, nominate, unbond and withdraw DOT through the Digital Asset Service Desk API, and track your staking position with the DOT staking dashboard.

Zodia Custody enables you to stake DOT from a DeFi custody wallet directly through the Digital Asset Service Desk API, and to track your stake balance, nomination status and unbonding amounts with a dashboard endpoint. For ETH staking, see [the ETH staking guide](https://docs.zodia-custody.com/staking-guide.md).

## How DOT Staking Works

DOT staking is made of five operations, each submitted as its own service request:

| Operation | Service ID | What it does |
| - | - | - |
| Bond | `0x0020-012` | Bonds DOT from your wallet. Bonded DOT is locked for staking. |
| Bond Extra | `0x0020-013` | Adds DOT to your existing bond. |
| Nominate | `0x0020-047` | Chooses the validators or nomination pools your bonded DOT is nominated to. |
| Unbond | `0x0020-014` | Starts unbonding DOT. Unbonded DOT is released at the end of the unbonding period. |
| Withdraw Unbonded | `0x0020-015` | Moves the DOT whose unbonding period is over back to your wallet. |

Unbonding and withdrawing are two separate steps: Unbond starts the unbonding period, and Withdraw Unbonded completes it once the period is over. The dashboard shows when each unbond can be withdrawn.

## Wallets

All five operations require a DeFi wallet that holds DOT. Otherwise the request is rejected with `ER-259` for a wallet that isn't a DeFi wallet, or `ER-3016` for a wallet that doesn't hold DOT.

## Staking Operations

Every DOT staking operation is submitted the same way as any other Digital Asset Service Desk product: create the instruction with `POST /v3/api/servicedesk/create` and a `{"serviceId": ..., "payload": ...}` body, then submit, confirm and approve it following the same steps described in [Signing the Payload](https://docs.zodia-custody.com/authentication/signing-payload.md) and demonstrated end-to-end in [Wallet Creation](https://docs.zodia-custody.com/service-desk-guide/wallet-creation.md). What follows is what's specific to each DOT operation; see [Products & Services](https://docs.zodia-custody.com/service-desk-guide/products-and-services.md) for the exact payload template of each one.

Amounts are expressed in DOT and sent as strings. In the wallet's transactions, each DOT staking operation appears as a transfer to your own wallet: no funds move to another account.

### Bond (`0x0020-012`)

Bonding locks `amount` DOT from `walletId` for staking.

* **Amount:** `amount` must be a plain decimal number, otherwise the request is rejected with `ER-116`. It must be above zero and at least the smallest unit of DOT (0.0000000001 DOT), otherwise it is rejected with `ER-121`.
* **Balance:** the wallet must hold the amount plus the network fee, otherwise the request is rejected with `ER-255` or `ER-214`.
* **Status:** the first bond of a wallet moves its dashboard `status` from `NOT_BONDED` to `BONDED`.

### Bond Extra (`0x0020-013`)

Bond Extra adds `amount` DOT to the wallet's existing bond. The payload and the rules on `amount` and balance are the same as for Bond. It doesn't change the dashboard `status`.

### Nominate (`0x0020-047`)

Nominating chooses the validators or nomination pools your bonded DOT is nominated to, with the addresses in `stakePoolAddresses`. Nominating again replaces the previous nominations.

* **Addresses:** send between 1 and 16 addresses, otherwise the request is rejected with `ER-3007`. An address can't be blank (`ER-107`). Zodia doesn't check the addresses when the request is created, so check them before you submit.
* **Bonded DOT:** nominating requires bonded DOT.
* **Status:** once a Nominate request is confirmed, the dashboard `status` shows `NOMINATING`.

### Unbond (`0x0020-014`)

Unbonding starts the unbonding period for `amount` DOT. The rules on `amount` and balance are the same as for Bond.

* **Available amount:** `amount` can't exceed the amount available to unbond, which is the dashboard `stakeBalance` minus the amounts in `unbondingIntents`. A larger amount is rejected with `ER-122`, and the message gives the limit.
* **Still bonded:** unbonding DOT stays part of `stakeBalance` until it is withdrawn.
* **Withdrawal date:** each unbond appears in `unbondingIntents` with a `withdrawableAt` date, the point at which it can be withdrawn.
* **Status:** unbonding doesn't change the dashboard `status`.

### Withdraw Unbonded (`0x0020-015`)

Withdraw Unbonded moves back to your wallet all the unbonded DOT whose unbonding period is over. There is no `amount`: if you send one, it is ignored.

* **Nothing to withdraw:** if no unbond has reached its `withdrawableAt` date yet, the request is rejected with `ER-3008`.
* **One at a time:** a request withdraws what is eligible when it is confirmed, so submit one Withdraw Unbonded at a time for a wallet.

## Tracking Your Position

[Get DOT Staking Dashboard](https://docs.zodia-custody.com/api-reference/staking-v3/get-dot-staking-dashboard) returns the staking position of a DOT wallet: its status, its stake balance and its unbonding amounts. It takes the wallet ID only:

```json theme={null}
{
  "walletId": "Wallet_ID"
}
```

Here is an example response for a wallet that is nominating and has one unbond in progress:

```json theme={null}
{
  "currency": "DOT",
  "status": "NOMINATING",
  "stakeBalance": {
    "amount": "1,250.00000000",
    "fiatValue": "5,625.00",
    "fiatCurrency": "USD"
  },
  "unbondingIntents": [
    {
      "amount": "100.00000000",
      "fiatValue": "450.00",
      "fiatCurrency": "USD",
      "withdrawableAt": "2026-10-15T09:00:00Z"
    }
  ]
}
```

| Field | Meaning |
| - | - |
| `status` | `NOT_BONDED`: the wallet has no bonded DOT. `BONDED`: it has bonded DOT and no confirmed Nominate request yet. `NOMINATING`: it has bonded DOT and a confirmed Nominate request. |
| `stakeBalance` | The DOT currently bonded: your bonds minus what has been withdrawn. DOT that is unbonding is still part of it until it is withdrawn. |
| `unbondingIntents` | One entry for each unbond not yet withdrawn, soonest `withdrawableAt` first. `withdrawableAt` is when that amount can be withdrawn with Withdraw Unbonded. It is independent of `status`: a wallet can be `NOMINATING` and have unbonds in progress. |

* **Amounts:** `amount` is a string in DOT with 8 decimals and comma thousands separators. `fiatValue` is a string with 2 decimals and comma thousands separators, expressed in `fiatCurrency`, the fiat currency configured for your account.
* **No staking activity:** a wallet that has never bonded returns `NOT_BONDED`, a `stakeBalance` of `0` and an empty `unbondingIntents` list, not an error.
* **Up to date:** the figures reflect your confirmed staking requests at the time of the call.

## Notifications

Each DOT operation results in an on-chain transaction. If you have [webhooks](https://docs.zodia-custody.com/webhooks.md) configured, you receive Transfer notifications when it is posted on chain and when it is confirmed. To know when unbonded DOT can be withdrawn, use `withdrawableAt` on the dashboard.

## Errors

See [Staking Error Codes](https://docs.zodia-custody.com/working-with-apis/staking-error-codes.md) for the errors specific to DOT staking.

## FAQs

### How long until I can withdraw unbonded DOT?

Unbonded DOT can be withdrawn once the network's unbonding period is over. The `withdrawableAt` date of each entry in `unbondingIntents` shows when.

### Why does my stake balance still include the DOT I unbonded?

Unbonding DOT stays bonded until it is withdrawn, as it does on Polkadot itself. It leaves `stakeBalance` once you withdraw it with Withdraw Unbonded. The amount you can still unbond is `stakeBalance` minus the amounts in `unbondingIntents`.

### Can I change the validators I nominate?

Yes. Send a new Nominate request: its addresses replace the previous ones.

### Why does my wallet show `BONDED` and not `NOMINATING`?

`NOMINATING` appears once a Nominate request (`0x0020-047`) for the wallet is confirmed. Until then, a wallet with bonded DOT shows `BONDED`.

### Why was my Withdraw Unbonded rejected with `ER-3008`?

None of the wallet's unbonds has reached its `withdrawableAt` date yet. Check the dashboard and try again once one has.

## Contact

If you're a Zodia client and want to learn more about this feature or enable it, contact our customer service team.

Email us at [customerservice@zodia.io](mailto:customerservice@zodia.io). We're here to answer questions, provide more details, or help activate the feature. Our team is ready to assist you with quick and effective support.
