Deposits
Overview
Once a virtual account is created and active, it can receive deposits via bank transfers. The deposit behavior depends on the virtual account mode:
- Crypto Mode: Deposits are automatically converted to stablecoins (USDC or USDT) and sent to the configured destination wallet
- Fiat Mode: Deposits are added to the virtual account's USD balance
Get Deposits
List Deposits by Virtual Account
GET /v1/virtual-accounts/{virtualAccountId}/deposits
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
limit | integer | No | 10 | Number of deposits to return (1-100) |
Example Request
curl -X GET "https://api.balampay.com/v1/virtual-accounts/550e8400-e29b-41d4-a716-446655440001/deposits?limit=20" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "x-api-key: YOUR_API_KEY"Response
[
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"virtual_account_id": "550e8400-e29b-41d4-a716-446655440001",
"amount": "1000.00",
"currency": "USD",
"status": "COMPLETED",
"sender": {
"name": "Acme Corporation",
"account_number": null,
"address": null
},
"recipient": {
"name": "John Doe",
"company_name": "Acme Corp",
"country": "US"
},
"payment_rail": "wire",
"settlement_tx_hash": "5KYmFMZ3qvX7h8sN...",
"created_at": "2024-01-15T14:30:05Z",
"updated_at": "2024-01-15T14:30:05Z"
}
]List Deposits by Client
Returns deposits across all virtual accounts for the authenticated client, with pagination.
GET /v1/virtual-accounts/deposits
Query Parameters
| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
page | integer | No | 1 | Page number |
limit | integer | No | 10 | Results per page (1-100) |
status | string | No | — | Filter by status: PENDING, COMPLETED, FAILED, REFUNDED |
virtual_account_id | string (UUID) | No | — | Filter by virtual account ID |
from_date | string | No | — | Filter deposits after this date (YYYY-MM-DD or ISO 8601) |
to_date | string | No | — | Filter deposits before this date (YYYY-MM-DD or ISO 8601) |
Example Request
curl -X GET "https://api.balampay.com/v1/virtual-accounts/deposits?page=1&limit=20&status=COMPLETED" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "x-api-key: YOUR_API_KEY"Response
{
"deposits": [
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"virtual_account_id": "550e8400-e29b-41d4-a716-446655440001",
"amount": "1000.00",
"currency": "USD",
"status": "COMPLETED",
"sender": {
"name": "Acme Corporation",
"account_number": null,
"address": null
},
"recipient": {
"name": "John Doe",
"company_name": "Acme Corp",
"country": "US"
},
"payment_rail": "wire",
"settlement_tx_hash": "5KYmFMZ3qvX7h8sN...",
"created_at": "2024-01-15T14:30:05Z",
"updated_at": "2024-01-15T14:30:05Z"
}
],
"total": 47,
"page": 1,
"limit": 20,
"total_pages": 3
}Get Single Deposit
GET /v1/virtual-accounts/{virtualAccountId}/deposits/{depositId}
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
virtualAccountId | string (UUID) | Yes | Virtual account ID |
depositId | string (UUID) | Yes | Deposit ID |
Example Request
curl -X GET "https://api.balampay.com/v1/virtual-accounts/550e8400-e29b-41d4-a716-446655440001/deposits/550e8400-e29b-41d4-a716-446655440010" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "x-api-key: YOUR_API_KEY"Response
{
"id": "550e8400-e29b-41d4-a716-446655440010",
"virtual_account_id": "550e8400-e29b-41d4-a716-446655440001",
"amount": "1000.00",
"currency": "USD",
"status": "COMPLETED",
"sender": {
"name": "Acme Corporation",
"account_number": null,
"address": null
},
"recipient": {
"name": "John Doe",
"company_name": "Acme Corp",
"country": "US"
},
"payment_rail": "wire",
"settlement_tx_hash": "5KYmFMZ3qvX7h8sN...",
"created_at": "2024-01-15T14:30:05Z",
"updated_at": "2024-01-15T14:30:05Z"
}Deposit Response Fields
| Field | Type | Description |
|---|---|---|
id | string | Deposit ID |
virtual_account_id | string | Virtual account that received the deposit |
amount | string | Deposit amount |
currency | string | Currency code (USD, MXN) |
status | string | Deposit status (COMPLETED, REFUNDED, PENDING) |
sender | object | null | Sender information (provider-specific) |
sender.name | string | null | Sender name |
sender.account_number | string | null | Sender account number or CLABE |
sender.address | string | null | Sender address |
recipient | object | null | Recipient (VA owner) information |
recipient.name | string | null | Full name (first + middle + last) |
recipient.company_name | string | null | Company name (for business accounts) |
recipient.country | string | null | ISO country code |
payment_rail | string | null | Payment method used (wire, swift, ach_push, spei) |
settlement_tx_hash | string | null | Blockchain transaction hash (crypto mode, after settlement) |
created_at | string | ISO 8601 timestamp |
updated_at | string | ISO 8601 timestamp |
Deposit Status
| Status | Description |
|---|---|
completed | Deposit successfully received and processed |
refunded | Deposit was returned/reversed to the sender |
Deposit Lifecycle
Crypto Mode
When a deposit arrives at a crypto mode VA, the system automatically converts the funds and sends stablecoins to the destination wallet:
sequenceDiagram
participant Sender
participant Sender Bank
participant Kira
participant Your Server
participant Blockchain
Sender->>Sender Bank: Initiate ACH/Wire transfer
Sender Bank->>Kira: Transfer USD
Note over Kira: Create deposit (status: completed)
Kira->>Your Server: Webhook: virtual_account.deposit_funds_received
Note over Kira: Convert USD to stablecoins
Kira->>Your Server: Webhook: virtual_account.deposit_funds_in_transit
Kira->>Blockchain: Send stablecoins to destination wallet
Blockchain-->>Kira: Transaction confirmed
Kira->>Your Server: Webhook: virtual_account.deposit_funds_in_destination
Note: Deposits under $1.00 USD are treated as microdeposits. A
deposit_funds_receivedwebhook is sent but no crypto settlement is triggered.
Settlement Webhook Events
| Event | When |
|---|---|
virtual_account.deposit_funds_received | USD received at the virtual account |
virtual_account.deposit_funds_in_transit | Crypto conversion in progress |
virtual_account.deposit_funds_in_destination | Stablecoins sent to destination wallet |
virtual_account.deposit_funds_failed | Settlement failed |
See the Webhooks Guide for full payload structures.
Fiat Mode
In fiat mode, deposits increase the virtual account balance. No conversion or settlement occurs.
sequenceDiagram
participant Sender
participant Sender Bank
participant Kira
participant Your Server
Sender->>Sender Bank: Initiate ACH/Wire transfer
Sender Bank->>Kira: Transfer USD
Note over Kira: Create deposit (status: completed)
Note over Kira: Balance updated
Kira->>Your Server: Webhook: virtual_account.deposit_funds_received
Use GET /v1/virtual-accounts/{id}/balance to check the current balance.
Payment Rails
Wire / Swift Transfer
| Attribute | Detail |
|---|---|
| Speed | Same day to next business day |
| Cost | $15-$50 for sender |
| Limits | Typically unlimited |
| Reversible | Generally not reversible |
payment_railreturnswirefor domestic transfers andswiftfor international transfers.
ACH Push
| Attribute | Detail |
|---|---|
| Speed | 1-3 business days |
| Cost | Low or free for sender |
| Limits | Typically $25K - $1M per transaction |
| Reversible | Can be reversed within 60 days |
Best Practices
- Use webhooks for real-time updates - Listen for
virtual_account.deposit_funds_receivedto get notified when deposits arrive - Store deposit IDs - Track processed deposits using
deposit_idto avoid duplicates - Handle refunds - Check for
status: "refunded"deposits and update your records accordingly - Use limit parameter - Paginate results for accounts with many deposits
Troubleshooting
Deposit not showing up
- ACH transfers take 1-3 business days to arrive
- Wire transfers may still be processing (check with sender's bank)
- Verify sender used correct account/routing numbers
- Contact support with the transfer reference number
Deposit shows as refunded
- Compliance rejection or sender bank initiated a return
- Review the webhook payload for context
- Contact support with the deposit ID
Next Steps
- Set up webhooks for real-time deposit notifications
- Initiate payouts to send USD to any bank account (fiat and crypto mode)
- Review the Webhooks Guide for complete event reference
Updated about 2 months ago
