ChapaChapa Docs

Deposit to Virtual Account

Credit money into a virtual account to increase its available balance.

A Deposit credits money into a Virtual Account, increasing its available balance.

Use deposits to:

  • Fund customer wallets
  • Top up balances
  • Load escrow accounts
  • Record offline or online funding events (depending on your product flow)

After a successful deposit:

  • The virtual account balance increases
  • A credit record appears in the account's credit history

Endpoint

POST /v2/virtual-accounts/{virtual_account_id}/deposit
Host: api.chapa.co

Authentication

Headers

NameRequiredDescription
AuthorizationYesBearer <PRIVATE_API_KEY>
Content-TypeYesapplication/json
Idempotency-KeyNoPrevents duplicate deposits on retries

Path Parameter

ParameterRequiredDescription
virtual_account_idYesUnique virtual account identifier

Request Body

Required Fields

FieldTypeDescription
amountnumberAmount to deposit
currencystringCurrency (must match the virtual account currency)

Optional Fields

FieldTypeDescription
merchant_referencestringMerchant-generated reference for the deposit
reasonstringDescription of why the deposit happened
metaobjectCustom metadata (order_id, customer_id, etc.)

Example Request

POST https://api.chapa.co/v2/virtual-accounts/VA_ABC123456/deposit
Authorization: Bearer CHAPA_TEST_xxxxxxxxxxxxx
Content-Type: application/json
{
  "amount": 5000,
  "currency": "ETB",
  "merchant_reference": "DEP_001",
  "reason": "Wallet top-up",
  "meta": {
    "customer_id": "CUST_12345",
    "order_id": "ORD_99887"
  }
}

Example Response

{
  "status": "success",
  "message": "Deposit completed successfully",
  "data": {
    "virtual_account_id": "VA_ABC123456",
    "deposit_reference": "DEP_TRX_987654",
    "amount": 5000,
    "currency": "ETB",
    "balance_before": 7500,
    "balance_after": 12500,
    "created_at": "2025-11-07T13:10:00Z"
  }
}

Response Fields

FieldTypeDescription
virtual_account_idstringVirtual account credited
deposit_referencestringUnique deposit transaction reference
amountnumberAmount deposited
currencystringCurrency deposited
balance_beforenumberBalance before deposit
balance_afternumberBalance after deposit
created_atstringDeposit timestamp

Validation Rules

  • currency must match the virtual account's currency
  • amount must be positive
  • merchant_reference should be unique (recommended)

Best Practices

  • Use an Idempotency-Key on retries
  • Store deposit_reference for reconciliation
  • Store balance_before and balance_after for audit trails
  • Use meta to link deposits to internal records (order_id, customer_id)

Common Errors

HTTPError CodeDescription
400INVALID_VALUEAmount must be positive
400INVALID_VALUECurrency mismatch
404NOT_FOUNDVirtual account not found
409DUPLICATE_REQUESTDuplicate idempotency key
500PROCESSING_FAILEDFailed to process deposit

Next Steps

On this page