Skip to main content

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
string
Event type for the lifecycle transition that occurred.
id
string
Unique webhook event identifier. Use this value for idempotency.
data
object
Resource payload for the event. The shape follows the resource response linked below.
timestamp
string
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 familydata shapeResource docs
funding_account.*Funding account response objectGet Funding Account
deposit.*Deposit response objectGet Deposit
transfer.*Transfer response objectGet Transfer
withdrawal.*Withdrawal response objectGet Withdrawal
customer.verification.*Customer response object with the latest verification stateGet Customer
If you need the latest state while processing a webhook, fetch the resource again by the ID in data.

Deposit Events

EventTerminal?When Sent
deposit.receivedNoDeposit received (NGN or crypto)
deposit.processingNoSettlement has started and may be waiting on conversion or delivery
deposit.requires_reviewNoDeposit needs review before it can continue
deposit.completedYesDeposit reached its settlement destination
deposit.failedYesDeposit permanently fails
deposit.reversedYesA 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.
EventTerminal?When Sent
funding_account.createdNoFunding account record has been created in PENDING status
funding_account.activeNoPayment details are ready and the account is active
funding_account.failedYesReceive instruction provisioning failed
funding_account.disabledYesActive funding account was disabled

Transfer Events

Transfer events are emitted for POST /v1/transfers and follow the merchant-created transfer lifecycle.
EventTerminal?When Sent
transfer.createdNoTransfer record and initial attempt have been created
transfer.processingNoFunds have been locked and provider submission has been queued
transfer.requires_reviewNoRisk or ops policy flagged the transfer for review
transfer.submittedNoProvider accepted the transfer submission
transfer.completedYesProvider success and ledger finalization are complete
transfer.failedYesTransfer failed terminally after release or failure reconciliation
transfer.reversedYesA previously completed transfer was reversed

Withdrawal Events

EventTerminal?When Sent
withdrawal.createdNoWithdrawal request has been accepted
withdrawal.submittedNoWithdrawal submitted to chain
withdrawal.completedYesWithdrawal confirmed on-chain
withdrawal.failedYesWithdrawal failed

Customer Verification Events

EventTerminal?When Sent
customer.verification.submittedNoCustomer verification has been submitted for review
customer.verification.approvedYesCustomer verification has been approved
customer.verification.rejectedYesCustomer 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.
StepEventNotes
Funds arrivedeposit.receivedDaya records the NGN deposit.
Settlement startsdeposit.processingSent when delivery or conversion work begins.
Deposit completesdeposit.completedFunds have reached the configured settlement destination.
Review or failure pathdeposit.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.
StepEventNotes
Request acceptedtransfer.createdTransfer record and initial attempt exist.
Funds lockedtransfer.processingFunds are held and provider submission is queued.
Manual review, if neededtransfer.requires_reviewRisk or ops policy paused the transfer.
Provider accepts submissiontransfer.submittedProvider accepted the transfer request.
Final successtransfer.completedProvider success and ledger finalization are complete.
Final failuretransfer.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.
StepEventNotes
Request acceptedwithdrawal.createdWithdrawal record exists.
On-chain transaction submittedwithdrawal.submittedDaya submitted the withdrawal to the chain/provider.
On-chain transaction confirmedwithdrawal.completedWithdrawal is confirmed and complete.
Final failurewithdrawal.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