Skip to main content

What is a virtual account event?

Whenever a deposit is received, Bridge generates a VirtualAccountEvent with a unique id. You can:
  • Fetch historical events using the Virtual Account Activity API.
  • Receive real-time webhook notifications when:
    • A new deposit is received.
    • The status of an event changes (e.g. funds delivered, refund issued).
Each VirtualAccountEvent includes detailed information about the deposit, source, status, and destination.

Event Types

Below are the different types of virtual account events you may receive. You can identify the type of each event by checking the type field in the virtual account event object.
TypeDescription
funds_receivedBridge received funds via ACH or wire.
payment_submittedBridge submitted the crypto payment.
payment_processedPayment confirmed on-chain. Final state.
funds_scheduled(ACH only) Incoming funds are in transit with estimated arrival date.
in_reviewTransaction is under manual review.
refundedFunds could not be delivered and were refunded to the sender.
account_updateVirtual Account was updated (e.g. new destination address).
deactivationVirtual Account was deactivated.
reactivationVirtual Account was reactivated.
microdepositMicrodeposit verification detected. Funds are never onramped.
Deposit ID

All transaction-triggered events include a deposit_id field. This id is unique for each transaction that Bridge receives through this Virtual Account and can be used to link separate events to the same source transaction.

Event Breakdown

Information about a fiat deposit received. The funds_received event amount always matches the full amount that the customer sent before any fees are deducted. We also provide any source information we have about the sender of a deposit.
  • payment_rail- ach_push or wire. The payment rail on which the deposit was received. Different information is available for each of these payment rail types.
  • For ACH deposits, funding events have these details:
    • description- This field contains the sender-related information set by the sending bank according to the NACHA ACH file specifications;
    • sender_routing_number- The routing number of the entity that initiated this ACH transaction
    • sender_name- The name of the business or individual who initiated the ACH as provided through the ACH system
    • trace_number- The unique, a 15-digit number associated with each ACH transaction that is used for tracking and reconciling transactions
  • For wire deposits, funding events have these details:
    • bank_routing_number - The routing number of the bank which sent this wire
    • bank_name - The name of the bank which sent this wire
    • bank_beneficiary_name - The name the sender used for the beneficiary name of the wire
    • originator_name- The name of the sender
    • originator_address - The address of the sender
    • imad - A unique number given to each FedWire payment when using the Federal Reserve Bank Service which can be used to investigate and track wire transfers.
{
  "id": "va_event_457",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "funds_received",
  "amount": "120.0",
  "currency": "usd",
  "developer_fee_amount": "1.25",
  "exchange_fee_amount": "2.2",
  "subtotal_amount": "120.0",
  "gas_fee": "0.0",
  "created_at": "2020-01-01T00:00:00.000Z",
  "deposit_id": "deposit_123",
  "source": {
    "payment_rail": "ach_push",
    "description": "ACH description",
    "sender_name": "The name of the business or individual who sent the ACH",
    "sender_bank_routing_number": "The routing number of the entity who sent this ACH transaction",
    "trace_number": "111222333444555"
  }
}
Information about any funds sent on chain using the deposit instructions. This event is created when the funds are sent on chain. The payment_submitted event amount is the funds sent to the destination after all fees are taken out and includes a breakdown of the amount of each fee. Some information such as destination_tx_hash may not be available immediately after the event is created but will be populated later when the transaction is confirmed on chain.For convenience, the source deposit information is included in this event as well if available.
{
  "id": "va_event_456",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "payment_submitted",
  "amount": "116.66",
  "currency": "usd",
  "developer_fee_amount": "1.25",
  "exchange_fee_amount": "2.2",
  "subtotal_amount": "120.0",
  "gas_fee": "0.0",
  "created_at": "2020-01-01T00:00:00.000Z",
  "deposit_id": "deposit_123",
  "source": {
    "payment_rail": "ach_push",
    "description": "ACH description",
    "sender_name": "The name of the business or individual who sent the ACH",
    "sender_bank_routing_number": "The routing number of the entity who sent this ACH transaction",
    "trace_number": "111222333444555"
  },
  "receipt": {
    "initial_amount": "120.0",
    "developer_fee": "1.25",
    "exchange_fee": "2.2",
    "subtotal_amount": "116.55",
    "url": "https://dashboard.bridge.xyz/transaction/dac30205-854f-4d8e-af41-d71bc1a48f13/receipt/eaf7a53b-d223-48e5-8089-23aa59862717",
    "gas_fee": "0.0",
    "final_amount": "116.55",
  }
}
Information about any funds sent on chain using the deposit instructions. This event is created when the funds are confirmed on chain. The payment_processed event amount is the funds sent to the destination after all fees are taken out and includes a breakdown of the amount of each fee. Thedestination_tx_hashwill always be populated for these events. This is final event in the onramp payment lifecycle and the best event to determine when a payment is fully complete.For convenience, the source deposit information is included in this event as well if available.
{
  "id": "va_event_456",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "payment_procesed",
  "amount": "116.55",
  "currency": "usd",
  "developer_fee_amount": "1.25",
  "exchange_fee_amount": "2.2",
  "subtotal_amount": "120.0",
  "gas_fee": "0.0",
  "created_at": "2020-01-01T00:00:00.000Z",
  "destination_tx_hash": "0xdeadbeef",
  "deposit_id": "deposit_123",
  "source": {
    "payment_rail": "ach_push",
    "description": "ACH description",
    "sender_name": "The name of the business or individual who sent the ACH",
    "sender_bank_routing_number": "The routing number of the entity who sent this ACH transaction",
    "trace_number": "111222333444555"
  },
  "receipt": {
    "initial_amount": "120.0",
    "developer_fee": "1.25",
    "exchange_fee": "2.2",
    "subtotal_amount": "116.55",
    "url": "https://dashboard.bridge.xyz/transaction/dac30205-854f-4d8e-af41-d71bc1a48f13/receipt/eaf7a53b-d223-48e5-8089-23aa59862717",
    "gas_fee": "0.0",
    "final_amount": "116.55",
    "destination_tx_hash": "0xdeadbeef" 
  }
}
The events provides a notification that incoming funds are processing through the ACH system and an estimated arrival date for the credit. These events only occur for funds sent through ACH.
{
    "id": "va_event_400f",
    "type": "funds_scheduled",
    "currency": "usd",
    "created_at": "2024-09-06T03:23:09.597Z",
    "customer_id": "cust_alice",
    "virtual_account_id": "va_123",
    "amount": "482.5",
    "source": {
        "payment_rail": "ach_push",
        "description": "ACH description",
        "sender_name": "The name of the business or individual who sent the ACH",
        "sender_bank_routing_number": "The routing number of the entity who sent this ACH transaction",
        "trace_number": "111222333444555",
        "estimated_arrival_date": "2024-09-06"
    }
}
This event happens when a transaction enters the manual review queue. Bridge may reach out to obtain more information about the transaction before processing.
{
  "id": "va_event_363",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "in_review",
  "amount": "120.0",
  "currency": "usd",
  "developer_fee_amount": "1.25",
  "exchange_fee_amount": "2.2",
  "subtotal_amount": "120.0",
  "gas_fee": "0.0",
  "created_at": "2020-01-01T00:00:00.000Z",
  "deposit_id": "deposit_123",
  "source": {
    "payment_rail": "ach_push",
    "description": "ACH description",
    "sender_name": "The name of the business or individual who sent the ACH",
    "sender_bank_routing_number": "The routing number of the entity who sent this ACH transaction",
    "trace_number": "111222333444555"
  }
}
Information about funds this Virtual Account received which were refunded back to the sender. Details about the refund are included in the “refund” section of the event which includes:
  • Reason: a brief, human-readable explanation of why this transaction was refunded
  • Code: an alphanumeric code representing the reason inside Bridge’s system
  • Refunded At: when the refund was initiated
{
  "id": "va_event_5dd679",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "deposit_id": "deposit_daec03",
  "type": "refunded",
  "amount": "98.76",
  "currency": "usd",
  "created_at": "2024-03-27T00:00:00.000Z",
  "source": {
    "description": "ACH description",
    "payment_rail": "ach_push",
    "sender_name": "The name of the business or individual who sent the ACH",
    "sender_bank_routing_number": "611161312",
    "trace_number": "111222333444555"
  },
  "refund": {
    "code": "300",
    "reason": "Transaction Review",
    "refunded_at": "2024-03-27T00:00:00.000Z",
  }
}
Note that not all refund events will include a deposit_id. This may be omitted in cases where the refund occurred before a deposit completed. For example:
{
  "id": "va_event_5dd680",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "refunded",
  "amount": "98.76",
  "currency": "usd",
  "created_at": "2024-03-27T00:00:00.000Z",
  "source": {
    "description": "wire description",
    "payment_rail": "wire",
    "originator_name": "The name of the business or individual who sent the wire",
    "originator_address" "The address of the sender",
    "beneficiary_name": "The beneficiary name of this wire",
    "beneficiary_address": "The beneficiary address of this wire",
    "sender_bank_routing_number": "611161312",
    "trace_number": "111222333444555"
  },
  "refund": {
    "code": "610",
    "reason": "Wire Rejected: Unmatched",
    "refunded_at": "2024-03-27T00:00:00.000Z",
  }
}
Virtual Accounts support microdeposit and challenge deposit verification to help your customers link external bank accounts.

This is currently only supported for ACH.
When a customer links their Virtual Account with another financial platform (e.g. a fintech app or payroll provider), they may be prompted to verify ownership through one of two methods:
  • Microdeposit Verification – A small amount (typically less than $1) is deposited and withdrawn to confirm the account is active.
  • Challenge deposit verification – One or more microdeposits are made, and the customer must input the exact deposit amounts (e.g. $0.56 and $0.84) to pass verification.
Bridge supports both of these methods by allowing microdebits and credits to pass through. Please note:
  • Microdeposits are never onramped – Any deposit under $1 is treated as a verification attempt and will not trigger a payment or transfer.
  • Only Virtual Accounts support verification – Static memo-based deposit flows (e.g. with shared memos) are not compatible with microdeposit verification
We automatically generate a microdeposit event for each verification attempt. This event includes the amount, source bank details, and timestamp—so you can display them to the customer for verification if needed.
Credit and debit entries (positive and negative amounts) may both appear during the verification process. However, some providers may only send a credit—behavior varies by the verifying institution.
{
  "id": "va_event_2641619d",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "microdeposit", // indicates a microdeposit event
  "amount": "0.30",
  "currency": "usd",
  "created_at": "2024-01-03T19:09:46.676Z",
  "source": {
    "payment_rail": "ach_push",
    "description": "ACH description",
    "sender_name": "The name of the sending bank",
    "sender_bank_routing_number": "The routing number of the sending bank",
    "trace_number": "111222333444555"
  }
},
{
  "id": "va_event_2c86b184",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "microdeposit",
  "amount": "0.12",
  "currency": "usd",
  "created_at": "2024-01-03T19:09:46.676Z",
  "source": {
    "payment_rail": "ach_push",
    "description": "ACH description",
    "sender_name": "The name of the sending bank",
    "sender_bank_routing_number": "The routing number of the sending bank",
    "trace_number": "111222333444556"
  }
},
{
  "id": "va_event_88294b57",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "microdeposit",
  "amount": "-0.42",
  "currency": "usd",
  "created_at": "2024-01-03T19:13:19.281Z",
  "source": {
    "payment_rail": "ach_push",
    "description": "ACH description",
    "sender_name": "The name of the sending bank",
    "sender_bank_routing_number": "The routing number of the sending bank",
    "trace_number": "111222333444557"
  }
}
If a Virtual Account is modified using the Update a Virtual Account endpoint, its history will include an account_update event to track what changed. The account_updates field in this event will contain a map of fields with their previous and updated values.
{
  "id": "va_event_456",
  "customer_id": "cust_alice",
  "virtual_account_id": "va_123",
  "type": "account_update",
  "amount": "0.0",
  "currency": "usd",
  "created_at": "2020-01-01T00:00:00.000Z",
  "account_updates": {
    "destination_currency": ["usdc", "usdt"],
  }
I