> ## 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.

# Cryptocurrency transfer notifications

> Reference for cryptocurrency transfer webhook payloads: intermediate and terminal statuses, destination types, deduplication, and recommended handler actions.

## Introduction

Bastion sends transaction notification events whenever a cryptocurrency transfer changes status. These events notify your app of status updates related to transfers submitted via the [Submit Cryptocurrency Transfer API](/v2/api-reference/cryptocurrency-transfers/submit-cryptocurrency-transfer).

Bastion sends a webhook on **every status change**, not just at the terminal state. The top-level `id` equals `data.id` (the transfer ID) and repeats across a transfer's events. Deduplicate on `id` + `status`, and use `request_id` to correlate events with your original request. Make your handler idempotent.

***

## Destination types

Event payloads include a `destination_type` field that indicates where the transfer was sent.

| **Destination Type** | **Description**                                           |
| -------------------- | --------------------------------------------------------- |
| `ON_CHAIN`           | Transfer was sent to an external on-chain wallet address. |

***

## Transfer statuses

The `status` field reflects the current state of the transfer. Statuses fall into two categories: **intermediate** (more updates will follow) and **terminal** (no further updates).

| **Status**  | **Type**     | **Description**                                                                             | **Recommended Action**                                                                                                                          |
| ----------- | ------------ | ------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `ACCEPTED`  | Intermediate | Transfer received and queued for processing.                                                | Wait for further updates.                                                                                                                       |
| `SUBMITTED` | Intermediate | Transaction submitted to the blockchain.                                                    | Wait for confirmation.                                                                                                                          |
| `CONFIRMED` | Terminal     | Transaction mined and confirmed on-chain.                                                   | Mark transfer complete and refresh balances.                                                                                                    |
| `FAILED`    | Terminal     | Transfer failed before or during submission.                                                | Show error from `failure_details`; if the cause is transient (RPC), retry with a new request; otherwise resolve the root cause before retrying. |
| `CANCELED`  | Terminal     | Transaction was submitted but never mined; Bastion automatically cleared the account nonce. | Funds were not moved; retry by creating a new transfer request.                                                                                 |
| `DROPPED`   | Terminal     | Transaction was not picked up by the network (SVM only).                                    | Funds were not moved; retry by creating a new transfer request.                                                                                 |

> Note: Bastion automatically cancels transfers that are not confirmed within 5 minutes of submission to prevent stale execution.

***

## Cryptocurrency transfer events

<CodeGroup>
  ```json theme={"theme":{"light":"vitesse-light","dark":"vitesse-dark"}}
  {
    "id": "3B577wxiV8Y8l1DllcEPQ1CU8rR",
    "type": "submit_cryptocurrency_transfer_v2",
    "data": {
      "id": "3B577wxiV8Y8l1DllcEPQ1CU8rR",
      "request_id": "0037a041-fcb0-4565-b026-f5cd1ce3ebb4",
      "account_id": "3B5766avX4ECshxgU4JuiqB9sRz",
      "account_address": "0x56c8d09e2A17FEf5B43aEd72A0f3F9cfFAC71afA",
      "currency_symbol": "TEST",
      "amount": "0.00001",
      "destination_address": "0x084a39ebB91797Ec4deB1cd82959Cc2Da96fE363",
      "destination_chain": "BASE_SEPOLIA",
      "status": "CONFIRMED",
      "created_at": "2026-03-17T17:01:53Z",
      "updated_at": "2026-03-17T17:03:53Z",
      "transaction_hash": "0x809dd38dd05d3c2362dd99426ccaf047d5ec6d3545cb8c1e1aa7e50913d1e248",
      "completed_at": "2026-03-17T17:03:53Z",
      "failure_details": null,
      "events": [
        {
          "event_name": "Transfer",
          "event_info": {
            "from": ["0x56c8d09e2A17FEf5B43aEd72A0f3F9cfFAC71afA"],
            "to": ["0x084a39ebB91797Ec4deB1cd82959Cc2Da96fE363"],
            "value": ["10000000000000"]
          },
          "contract_address": "0x30d79b806C70463290261B5e8c332C36cD13a1D4"
        }
      ],
      "destination_type": "ON_CHAIN",
      "destination_account_id": ""
    }
  }
  ```
</CodeGroup>

***

## Field reference

| **Field**                | **Type**       | **Description**                                                                                                                                              |
| ------------------------ | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `id`                     | string         | The unique KSUID identifier for this transfer in Bastion's system.                                                                                           |
| `type`                   | string         | The type of the event. Always `submit_cryptocurrency_transfer_v2` for transfer events.                                                                       |
| `request_id`             | string         | The idempotency key provided by the caller when submitting the transfer. Use this to match events back to your original request.                             |
| `account_id`             | string         | The Bastion account ID of the sender.                                                                                                                        |
| `account_address`        | string         | The wallet address of the sender.                                                                                                                            |
| `currency_symbol`        | string         | The symbol of the transferred asset (e.g. `USDC`).                                                                                                           |
| `amount`                 | string         | The transfer amount as a human-readable decimal string (e.g. `"0.00001"`).                                                                                   |
| `destination_address`    | string         | The recipient's on-chain wallet address. Populated for `ON_CHAIN` transfers.                                                                                 |
| `destination_chain`      | string         | The destination chain (e.g. `SOLANA_MAINNET`, `BASE_SEPOLIA`).                                                                                               |
| `status`                 | string         | The current transfer status. See [Transfer Statuses](#transfer-statuses) above for all possible values and their meanings.                                   |
| `created_at`             | string         | ISO 8601 timestamp of when the transfer was created.                                                                                                         |
| `updated_at`             | string         | ISO 8601 timestamp of the most recent status update.                                                                                                         |
| `transaction_hash`       | string         | The on-chain transaction identifier. Populated once the transaction has been submitted.                                                                      |
| `completed_at`           | string         | ISO 8601 timestamp of when the transfer reached a terminal status. Null if not yet complete.                                                                 |
| `failure_details`        | object or null | Details about why the transfer failed when `status` is `FAILED`. Contains a `code` and `message` describing the failure reason. Null for all other statuses. |
| `events`                 | array          | On-chain contract event logs captured from the transaction. Only present for on-chain transfers.                                                             |
| `destination_type`       | string         | Indicates the transfer destination type. `ON_CHAIN` for transfers to an external wallet address.                                                             |
| `destination_account_id` | string         | The destination Bastion account ID. Empty for `ON_CHAIN` transfers.                                                                                          |


## Related topics

- [Get Cryptocurrency Transfer](/v2/api-reference/cryptocurrency-transfers/get-cryptocurrency-transfer.md)
- [List Cryptocurrency Transfers](/v2/api-reference/cryptocurrency-transfers/list-cryptocurrency-transfers.md)
- [Submit Cryptocurrency Transfer](/v2/api-reference/cryptocurrency-transfers/submit-cryptocurrency-transfer.md)
- [Transaction limit notifications](/v2/api-reference/webhooks/notifications/transaction-limit-notifications.md)
- [Bastion platform overview](/guides/getting-started/bastion-platform-overview.md)
