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

# Deposit notifications

> Reference for deposit_v2 webhook payloads: on-chain versus internal ACCOUNT deposits, dedup_key idempotency, source and destination fields, and status.

## Introduction

Bastion triggers deposit notification events whenever a Bastion-custodied wallet receives an on-chain token deposit that has been confirmed and passed compliance screening. Bastion fires one webhook per deposit event.

Make your handler idempotent. Use the `dedup_key` field to avoid double-processing on retries or duplicate deliveries.

***

## Source types

Event payloads include a `source_type` field that indicates the origin of the deposit.

| **Source Type** | **Description**                                                                                                             |
| --------------- | --------------------------------------------------------------------------------------------------------------------------- |
| `ON_CHAIN`      | Deposit received from an external on-chain wallet address (e.g., a user sending USDC from their personal wallet).           |
| `ACCOUNT`       | Deposit received from an internal Bastion-to-Bastion P2P transfer. The sender is another account within the Bastion system. |

***

## Deposit notifications

<CodeGroup>
  ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  {
    "id": "3AX4GQAUWy8OgAvmkmK1QPPK6GA",
    "type": "deposit_v2",
    "data": {
      "id": "3AX4GQAUWy8OgAvmkmK1QPPK6GA",
      "dedup_key": "4vJ9jDQkpMHcpbNSG8YRXfj7WEdNRpQ2bXkh6M3TzKVrE9Pf5C1gNwHzYuL8aJqRdmF7BhN2sKpXvWcTy6D3oAn::0",
      "account_id": "3BX5HRAVXz9PgBwnlL2zKR4tYdB",
      "account_address": "7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU",
      "source_type": "ON_CHAIN",
      "source_address": "8DwKActJ8swmNXGLyfdaoe6vmD2TxX19bhyE3txsmwfj",
      "currency_symbol": "USDC",
      "amount": "123.44",
      "destination_chain": "SOLANA_MAINNET",
      "transaction_hash": "4vJ9jDQkpMHcpbNSG8YRXfj7WEdNRpQ2bXkh6M3TzKVrE9Pf5C1gNwHzYuL8aJqRdmF7BhN2sKpXvWcTy6D3oAn",
      "status": "CONFIRMED",
      "confirmed_at": "2026-03-05T15:45:14Z",
      "created_at": "2026-03-05T15:45:14Z"
    }
  }
  ```
</CodeGroup>

***

## Recommended action

When you receive a `deposit_v2` event, credit the recipient account with the deposited `amount` and `currency_symbol`. Use `dedup_key` to guard against double-crediting if the same event is delivered more than once.

***

## Field reference

| **Field**           | **Type** | **Description**                                                                                                                                                                                    |
| ------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                | string   | The unique KSUID identifier for this deposit record in Bastion's system.                                                                                                                           |
| `type`              | string   | The type of the event. Always `deposit_v2` for deposit events.                                                                                                                                     |
| `dedup_key`         | string   | A unique key used for deduplication. Composed of the on-chain transaction signature and a transfer index (e.g. `{signature}::{index}`). Use this to safely handle retries or duplicate deliveries. |
| `account_id`        | string   | The Bastion account ID of the deposit recipient.                                                                                                                                                   |
| `account_address`   | string   | The wallet address that received the deposit.                                                                                                                                                      |
| `source_type`       | string   | The origin of the deposit. `ON_CHAIN` for external deposits; `ACCOUNT` for internal Bastion-to-Bastion P2P transfers.                                                                              |
| `source_address`    | string   | The sender's wallet address.                                                                                                                                                                       |
| `currency_symbol`   | string   | The symbol of the deposited asset (e.g. `USDC`).                                                                                                                                                   |
| `amount`            | string   | The amount deposited as a human-readable decimal string (e.g. `"123.44"`).                                                                                                                         |
| `destination_chain` | string   | The chain on which the deposit was received (e.g. `SOLANA_MAINNET`).                                                                                                                               |
| `transaction_hash`  | string   | The on-chain transaction identifier. For Solana this is the transaction signature; the field name is kept consistent with EVM conventions for familiarity.                                         |
| `status`            | string   | The deposit status. Always `CONFIRMED` — only confirmed deposits trigger a webhook.                                                                                                                |
| `confirmed_at`      | string   | ISO 8601 timestamp of when the deposit was confirmed on-chain.                                                                                                                                     |
| `created_at`        | string   | ISO 8601 timestamp of when the deposit record was created (mapped from the on-chain block timestamp).                                                                                              |


## Related topics

- [Product updates](/changelog.md)
- [Conversion notifications](/v2/api-reference/webhooks/notifications/conversions-notifications.md)
- [Webhooks API overview](/v2/api-reference/webhooks/overview.md)
- [Compliance notifications](/v2/api-reference/webhooks/notifications/compliance-notifications.md)
- [Crypto custody](/guides/concepts/custody.md)
