Deposits & Settlements
Understanding fiat deposits via virtual accounts and their crypto settlement lifecycle.
Virtual accounts allow your business to receive fiat deposits that are automatically settled into crypto. This is ideal for businesses that want to accept local bank transfers and settle in stablecoins.
How it works
1. Create a virtual account for a user (POST /v1/virtual-accounts)
2. User sends fiat to the virtual account via bank transfer
3. IvoryPay detects the deposit → webhook: deposit.received
4. Settlement begins: fiat is converted to crypto
5. Crypto is sent to your configured wallet
6. Settlement lifecycle webhooks fire at each stageIntegration steps
Create a virtual account
curl -X POST https://ramp-api.ivorypay.io/api/v1/virtual-accounts \
-H "Authorization: your_api_key" \
-H "Content-Type: application/json" \
-d '{
"email": "merchant-user@example.com",
"identityType": "bvn",
"identityNumber": "22222222222",
"currency": "NGN"
}'The user can now transfer fiat to this virtual account at any time.
Receive deposit notifications
When a user transfers money to the virtual account, you will receive a webhook:
Webhook: deposit.received
{
"event": "deposit.received",
"data": {
"reference": "dep_abc123",
"processorReference": "prov_xyz789",
"accountNumber": "1234567890",
"accountName": "IvoryPay - User Name",
"currency": "NGN",
"receivedAmount": 100000,
"settledAmount": 99500,
"status": "SUCCESS",
"sourceAccountNumber": "0987654321",
"sourceAccountName": "Sender Name",
"sourceBankName": "GTBank",
"paymentDate": "2026-03-26T14:30:00.000Z"
}
}Track settlement lifecycle
After a deposit is received, IvoryPay automatically initiates settlement (converting fiat to crypto). The settlement progresses through these stages:
Awaiting account
settlement.awaitingSettlementAccount
Waiting for settlement account configuration
Converting
settlement.converting
Fiat-to-crypto conversion in progress
Payout initiated
settlement.payoutInitiated
Crypto payout has been queued
Payout processing
settlement.payoutProcessing
Crypto is being sent on-chain
Completed
settlement.success
Crypto delivered to your wallet
Failed
settlement.failed
Settlement failed — check failureReason
Webhook: settlement.success
{
"event": "settlement.success",
"data": {
"reference": "set_abc123",
"settlementId": "uuid-here",
"depositId": "dep_abc123",
"fiatAmount": 99500,
"fiatCurrency": "NGN",
"cryptoAmount": 62.18,
"token": "USDT",
"chain": "BSC_MAINNET",
"destinationAddress": "0xYourWalletAddress...",
"conversionRate": 1600,
"platformFee": 0.31,
"businessFee": 0,
"gasFee": 0.5,
"transactionHash": "0xsettlement123...",
"status": "COMPLETED"
}
}Query deposits and settlements
List all deposits
curl -X GET "https://ramp-api.ivorypay.io/api/v1/deposits" \
-H "Authorization: your_api_key"GET /v1/deposits does not currently accept query filters — it returns the merchant's deposits as wired by the controller.
Get settlement for a specific deposit
The :depositId path parameter is validated as a UUID.
curl -X GET "https://ramp-api.ivorypay.io/api/v1/settlements/deposit/f1e2d3c4-b5a6-7890-fedc-ba0987654321" \
-H "Authorization: your_api_key"Settlement lifecycle
DEPOSIT RECEIVED → AWAITING_SETTLEMENT_ACCOUNT → CONVERTING → PAYOUT_INITIATED
→ PAYOUT_PROCESSING → COMPLETED
→ FAILEDFrequently asked questions
Last updated