Virtual Account Updates

Virtual Account Status Updates

Platforms using the Virtual Accounts product can subscribe to webhooks to receive real-time updates when a customer's virtual account changes status. There are the following scenarios:

EventScenarioDescriptionStatusstatus_detail.code
virtual_account.createdCreatedThe virtual account has been successfully created and is active.ACTIVEn.a
virtual_account.closedClosedThe virtual account has been closed.CLOSEDn.a
virtual_account.blockedBlockedzerohash has blocked the virtual account; it can no longer receive deposits.BLOCKEDVA_BLOCKED
virtual_account.failedFailed - Creation declinedzerohash could not open the virtual account for the account holder.FAILEDVA_CREATION_DECLINED
virtual_account.failedFailed - Creation failedzerohash was unable to open the virtual account due to an internal or provider-side error.FAILEDVA_CREATION_FAILED
virtual_account.suspendedSuspendedzerohash has temporarily suspended the virtual account pending review.SUSPENDEDVA_SUSPENDED
virtual_account.deposit_receivedDeposit ReceivedA deposit has landed in a virtual account configured with the HOLD settlement policy. This is a terminal state - funds are credited to the account balance and no settlement events follow.n.a. (transaction-level event)n.a
virtual_account.settlement_initiatedSettlement InitiatedFor accounts configured with AUTO_CONVERT_AND_WITHDRAW, conversion of the deposited funds and payout to the configured external account has begun.n.a. (transaction-level event)n.a
virtual_account.settlement_completedSettlement CompletedFor accounts configured with AUTO_CONVERT_AND_WITHDRAW, the conversion and payout have completed successfully.n.a. (transaction-level event)n.a
virtual_account.settlement_failedSettlement FailedFor accounts configured with AUTO_CONVERT_AND_WITHDRAW, the conversion or payout leg failed.n.a. (transaction-level event)n.a

Field Definitions

FieldDescriptionAlways Present?Type
virtual_account_idzerohash-generated unique identifier for the virtual accountYesstring
participant_codeEnd customer's participant codeYesstring
platform_codeThe Participant code associated with the PlatformYesstring
provider_typeThe banking provider backing the virtual account. Currently only CRB is supported.Yesstring
statusThe current status of the virtual account. One of ACTIVE, CLOSED, BLOCKED, FAILED.Yesstring
bank_detailsThe virtual account's bank details.No - only present when status = ACTIVE (Created event)string
bank_details.account_numberThe virtual account's account numberNo - only present when bank_details is presentstring
bank_details.routing_numberThe virtual account's routing numberNo - only present when bank_details is presentstring
bank_details.provider_account_idThe banking provider's internal identifier for the accountNo - only present when bank_details is presentstring
status_detailAdditional context on why the account entered its current statusNo - only present when status = BLOCKED or FAILED, and a code has been recordedstring
status_detail.codeStable, machine-readable code describing the reason. One of VA_BLOCKED, VA_CREATION_DECLINED, VA_CREATION_FAILED, or an unclassified fallback code.No - only present when status = BLOCKED or FAILED, and a code has been recordedstring
status_detail.messageHuman-readable description of the codeNo - only present when status = BLOCKED or FAILED, and a code has been recordedstring
status_detail.atTimestamp the status detail was recordedNo - only present when status = BLOCKED or FAILED, and a code has been recordedtimestamp
created_atTimestamp the virtual account was createdYestimestamp
updated_atTimestamp the virtual account was last updatedYestimestamp

Payloads

Created

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "provider_type": "CRB",
  "status": "ACTIVE",
  "bank_details": {
    "account_number": "1234567890",
    "routing_number": "021000021",
    "provider_account_id": "crb_ac_9f13e2"
  },
  "created_at": "2026-08-20T14:32:01Z",
  "updated_at": "2026-08-20T14:32:01Z"
}

Closed

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "provider_type": "CRB",
  "status": "CLOSED",
  "created_at": "2026-08-20T14:32:01Z",
  "updated_at": "2026-08-25T09:10:44Z"
}

Blocked

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "provider_type": "CRB",
  "status": "BLOCKED",
  "status_detail": {
    "code": "VA_BLOCKED",
    "message": "zerohash has blocked this virtual account and it can no longer receive deposits. Contact zerohash support for next steps.",
    "at": "2026-08-25T09:10:44Z"
  },
  "created_at": "2026-08-20T14:32:01Z",
  "updated_at": "2026-08-25T09:10:44Z"
}

Failed - Creation declined

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "provider_type": "CRB",
  "status": "FAILED",
  "status_detail": {
    "code": "VA_CREATION_DECLINED",
    "message": "zerohash could not open this virtual account for the account holder. Contact zerohash support for next steps.",
    "at": "2026-08-20T14:32:01Z"
  },
  "created_at": "2026-08-20T14:32:01Z",
  "updated_at": "2026-08-20T14:32:01Z"
}

Failed - Creation failed

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "provider_type": "CRB",
  "status": "FAILED",
  "status_detail": {
    "code": "VA_CREATION_FAILED",
    "message": "zerohash was unable to open this virtual account. Contact zerohash support to request a new account.",
    "at": "2026-08-20T14:32:01Z"
  },
  "created_at": "2026-08-20T14:32:01Z",
  "updated_at": "2026-08-20T14:32:01Z"
}

Deposit Received (HOLD accounts)

Fires when a deposit lands in a HOLD-policy virtual account. Terminal state - no settlement events follow.

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "transaction_id": "vat_3d9f6b2c1a8e4f7d",
  "type": "DEPOSIT",
  "status": "RECEIVED",
  "amount": "2500.00",
  "currency": "USD",
  "reference": "INV-10432",
  "created_at": "2026-08-25T09:10:44Z"
}

Settlement Initiated (AUTO_CONVERT_AND_WITHDRAW accounts)

Fires when an incoming deposit begins automatic conversion and payout to the account's configured external account. Note there is no preceding deposit_received event for this settlement policy.

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "transaction_id": "vat_9c4e1f7a2b6d3e8f",
  "type": "DEPOSIT",
  "status": "SETTLEMENT_INITIATED",
  "amount": "2500.00",
  "currency": "USD",
  "reference": "INV-10432",
  "created_at": "2026-08-25T09:10:44Z"
}

Settlement Completed (AUTO_CONVERT_AND_WITHDRAW accounts)

Fires once the conversion and payout have completed successfully.

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "transaction_id": "vat_9c4e1f7a2b6d3e8f",
  "type": "DEPOSIT",
  "status": "SETTLEMENT_COMPLETED",
  "amount": "2500.00",
  "currency": "USD",
  "reference": "INV-10432",
  "created_at": "2026-08-25T09:10:44Z",
  "settled_at": "2026-08-25T09:12:03Z"
}

Settlement Failed (AUTO_CONVERT_AND_WITHDRAW accounts)

Fires if the conversion or payout leg fails.

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "transaction_id": "vat_9c4e1f7a2b6d3e8f",
  "type": "DEPOSIT",
  "status": "SETTLEMENT_FAILED",
  "amount": "2500.00",
  "currency": "USD",
  "reference": "INV-10432",
  "created_at": "2026-08-25T09:10:44Z"
}

Suspended

Fires if a virtual account is temporarily suspended (distinct from a permanent block), pausing deposit activity pending review.

{
  "virtual_account_id": "va_8f2c1a9e4b7d4e0a",
  "participant_code": "CUST01",
  "platform_code": "PLAT01",
  "provider_type": "CRB",
  "status": "SUSPENDED",
  "status_detail": {
    "code": "VA_SUSPENDED",
    "message": "zerohash has temporarily suspended this virtual account pending review.",
    "at": "2026-08-25T09:10:44Z"
  },
  "created_at": "2026-08-20T14:32:01Z",
  "updated_at": "2026-08-25T09:10:44Z"
}