Overview
Daya sends merchant webhooks for funding account, deposit, transfer, withdrawal, and customer verification lifecycle changes.
Every webhook uses the same envelope:
{
"event" : "transfer.completed" ,
"id" : "550e8400-e29b-41d4-a716-446655440000" ,
"data" : {
"id" : "650e8400-e29b-41d4-a716-446655440000" ,
"status" : "SETTLED" ,
"rail" : "NGN_BANK"
},
"timestamp" : "2026-03-10T09:03:00Z"
}
event tells you what changed, id identifies the webhook event for idempotency, and data is the public API response shape for the resource that changed.
Common Payload Fields
Event type for the lifecycle transition that occurred.
Unique webhook event identifier. Use this value for idempotency.
Resource payload for the event. The shape follows the resource response linked below.
RFC3339 timestamp for when the event was emitted.
Data Shapes
Webhook events are documented here at the event-name level. The data object follows the same public response object returned by the corresponding resource endpoint.
Event family data shapeResource docs funding_account.*Funding account response object Get Funding Account deposit.*Deposit response object Get Deposit transfer.*Transfer response object Get Transfer withdrawal.*Withdrawal response object Get Withdrawal customer.verification.*Customer response object with the latest verification state Get Customer
If you need the latest state while processing a webhook, fetch the resource again by the ID in data.
Deposit Events
Event Terminal? When Sent deposit.receivedNo Deposit received (NGN or crypto) deposit.processingNo Settlement has started and may be waiting on conversion or delivery deposit.requires_reviewNo Deposit needs review before it can continue deposit.completedYes Deposit reached its settlement destination deposit.failedYes Deposit permanently fails deposit.reversedYes A completed deposit was reversed
Deposit payloads for NGN and crypto receive flows include funding_account_id. Track the merchant-facing settlement lifecycle with deposit.* events.
Funding Account Events
Funding account events track receive-instruction provisioning and disablement. The data object is the public funding account response.
Event Terminal? When Sent funding_account.createdNo Funding account record has been created in PENDING status funding_account.activeNo Payment details are ready and the account is active funding_account.failedYes Receive instruction provisioning failed funding_account.disabledYes Active funding account was disabled
Transfer Events
Transfer events are emitted for POST /v1/transfers and follow the merchant-created transfer lifecycle.
Event Terminal? When Sent transfer.createdNo Transfer record and initial attempt have been created transfer.processingNo Funds have been locked and provider submission has been queued transfer.requires_reviewNo Risk or ops policy flagged the transfer for review transfer.submittedNo Provider accepted the transfer submission transfer.completedYes Provider success and ledger finalization are complete transfer.failedYes Transfer failed terminally after release or failure reconciliation transfer.reversedYes A previously completed transfer was reversed
Withdrawal Events
Event Terminal? When Sent withdrawal.createdNo Withdrawal request has been accepted withdrawal.submittedNo Withdrawal submitted to chain withdrawal.completedYes Withdrawal confirmed on-chain withdrawal.failedYes Withdrawal failed
Customer Verification Events
Event Terminal? When Sent customer.verification.submittedNo Customer verification has been submitted for review customer.verification.approvedYes Customer verification has been approved customer.verification.rejectedYes Customer verification has been rejected
funding_account.* and customer.verification.* events use the same webhook envelope as money movement events. Funding account payloads use the public funding account response shape.
Lifecycle Examples
These examples show how webhook names follow the public resource being reconciled.
Funding Account Deposit
When a customer sends NGN to a funding account’s virtual account, the incoming money is a deposit. The payment detail is the funding account; the money movement is tracked with deposit.* events.
Step Event Notes Funds arrive deposit.receivedDaya records the NGN deposit. Settlement starts deposit.processingSent when delivery or conversion work begins. Deposit completes deposit.completedFunds have reached the configured settlement destination. Review or failure path deposit.requires_review or deposit.failedSent if the deposit cannot proceed automatically.
Internal Balance to NGN Bank Transfer
When a merchant sends withdrawal balance to an NGN bank account through POST /v1/transfers, the public resource is a transfer.
Step Event Notes Request accepted transfer.createdTransfer record and initial attempt exist. Funds locked transfer.processingFunds are held and provider submission is queued. Manual review, if needed transfer.requires_reviewRisk or ops policy paused the transfer. Provider accepts submission transfer.submittedProvider accepted the transfer request. Final success transfer.completedProvider success and ledger finalization are complete. Final failure transfer.failedTransfer failed terminally after release or failure reconciliation.
Crypto Wallet Withdrawal
When a merchant sends stablecoin or crypto from the withdrawal balance to an on-chain wallet, the public resource is a withdrawal.
Step Event Notes Request accepted withdrawal.createdWithdrawal record exists. On-chain transaction submitted withdrawal.submittedDaya submitted the withdrawal to the chain/provider. On-chain transaction confirmed withdrawal.completedWithdrawal is confirmed and complete. Final failure withdrawal.failedWithdrawal failed terminally.
Payload Examples
These examples are intentionally representative. The full data object follows the linked resource response shape for each event family.
Funding Account Active
{
"event" : "funding_account.active" ,
"id" : "550e8400-e29b-41d4-a716-446655440000" ,
"data" : {
"object" : "funding_account" ,
"id" : "750e8400-e29b-41d4-a716-446655440000" ,
"type" : "PERMANENT" ,
"status" : "ACTIVE" ,
"rail" : "NGN_VIRTUAL_ACCOUNT" ,
"customer_id" : "650e8400-e29b-41d4-a716-446655440000" ,
"currency" : "NGN" ,
"settlement_destination" : {
"type" : "INTERNAL_BALANCE"
},
"instructions" : [
{
"type" : "NGN_VIRTUAL_ACCOUNT" ,
"status" : "ACTIVE" ,
"bank_name" : "Wema Bank" ,
"bank_code" : "035" ,
"account_number" : "1234567890" ,
"account_name" : "Daya - Ada Lovelace" ,
"currency" : "NGN"
}
],
"created_at" : "2026-01-05T15:04:05Z" ,
"updated_at" : "2026-01-05T15:04:10Z"
},
"timestamp" : "2026-01-05T15:04:10Z"
}
Deposit Completed
{
"event" : "deposit.completed" ,
"id" : "550e8400-e29b-41d4-a716-446655440001" ,
"data" : {
"type" : "NGN_DEPOSIT" ,
"id" : "850e8400-e29b-41d4-a716-446655440000" ,
"funding_account_id" : "750e8400-e29b-41d4-a716-446655440000" ,
"customer_id" : "650e8400-e29b-41d4-a716-446655440000" ,
"amount" : "50000.00" ,
"currency" : "NGN" ,
"status" : "COMPLETED" ,
"settlement_status" : "COMPLETED" ,
"settlement_mode" : "INTERNAL_BALANCE" ,
"fees" : {
"total_fee_usd" : "0.0000"
},
"created_at" : "2026-01-05T15:04:05Z" ,
"updated_at" : "2026-01-05T15:04:10Z"
},
"timestamp" : "2026-01-05T15:04:10Z"
}
Transfer Completed
{
"event" : "transfer.completed" ,
"id" : "550e8400-e29b-41d4-a716-446655440000" ,
"data" : {
"id" : "850e8400-e29b-41d4-a716-446655440000" ,
"reference" : "txn_ngn_001" ,
"status" : "SETTLED" ,
"rail" : "NGN_BANK" ,
"currency" : "NGN" ,
"amount" : "50000.000000" ,
"debit_currency" : "USD" ,
"debit_amount" : "33.070000" ,
"fee" : "0.810000" ,
"rate" : {
"side" : "SELL" ,
"value" : "1550.00" ,
"captured_at" : "2026-01-05T15:04:05Z"
},
"on_behalf_of" : null ,
"created_at" : "2026-01-05T15:04:05Z" ,
"settled_at" : "2026-01-05T15:10:00Z"
},
"timestamp" : "2026-01-05T15:10:00Z"
}
Customer Verification Approved
{
"event" : "customer.verification.approved" ,
"id" : "450e8400-e29b-41d4-a716-446655440004" ,
"data" : {
"id" : "650e8400-e29b-41d4-a716-446655440000" ,
"email" : "customer@example.com" ,
"first_name" : "John" ,
"last_name" : "Doe" ,
"tier_1_kyc_complete" : true ,
"tier_2_kyc_complete" : true ,
"is_verified" : true ,
"capabilities" : [
{
"name" : "base" ,
"status" : "approved"
},
{
"name" : "usd_banking" ,
"status" : "approved"
}
],
"rejection_reasons" : [],
"created_at" : "2026-01-05T15:04:05Z" ,
"updated_at" : "2026-01-05T16:00:00Z"
},
"timestamp" : "2026-01-05T16:00:00Z"
}
Next Steps
Webhook Overview Delivery guarantees, retries, and handler guidance
Webhook Verification Verify the HMAC signature on incoming requests