Skip to main content
POST
/
public
/
v1
/
withdrawals
/
bank
Withdraw to Bank
curl --request POST \
  --url https://api.pro.daya.co/public/v1/withdrawals/bank \
  --header 'Content-Type: application/json' \
  --header 'X-Api-Key: <x-api-key>' \
  --data '
{
  "idempotency_key": "<string>",
  "amount": "<string>",
  "currency": "<string>",
  "bank_account_id": "<string>",
  "account_number": "<string>",
  "bank_code": "<string>",
  "account_name": "<string>",
  "bank_name": "<string>",
  "narration": "<string>"
}
'
{
  "success": true,
  "message": "Withdrawal initiated successfully",
  "data": {
    "transaction_id": "22222222-2222-2222-2222-222222222222",
    "status": "processing",
    "amount": "1000000.00",
    "currency": "NGN",
    "fee": "100.00",
    "transfer_id": "FLW-TRF-9001",
    "created_at": "2026-05-06T12:00:00Z"
  }
}

Documentation Index

Fetch the complete documentation index at: https://docs.daya.co/llms.txt

Use this file to discover all available pages before exploring further.

Overview

Move NGN from your Daya Pro balance to a Nigerian bank account. The withdrawal is queued and dispatched through Daya’s payout provider; the response returns immediately with a transaction ID and the initial status. Requires Trade scope.
Requests are idempotent on idempotency_key. Replaying the same key always returns the original transaction without re-running the withdrawal — safe to retry on network failures.
There are two ways to specify the destination:
  1. Saved beneficiary — pass bank_account_id (UUID of a beneficiary previously stored on your account). All other bank fields are ignored.
  2. Inline details — pass account_number, bank_code, account_name, bank_name directly.

Authentication

X-Api-Key
string
required
Your API key with Trade scope

Request Body

idempotency_key
string
required
Caller-supplied unique key. Reuse on retry to avoid double-spend.Example: wd-2026-05-06-01
amount
string
required
Withdrawal amount as a decimal string.Example: 1000000.00
currency
string
required
Currency code.Example: NGN
bank_account_id
string
UUID of a saved bank account on the user. When set, the inline bank fields below are ignored.
account_number
string
Destination NUBAN. Required when bank_account_id is omitted.Example: 0123456789
bank_code
string
CBN bank code. Required when bank_account_id is omitted.Example: 058
account_name
string
Account holder name as registered with the destination bank. Required when bank_account_id is omitted. Must match — the provider rejects mismatched names.
bank_name
string
Display name of the destination bank. Required when bank_account_id is omitted.Example: GTBank
narration
string
Optional free-form narration shown on the recipient’s bank statement.

Request Example

curl --request POST \
  --url https://api.pro.daya.co/public/v1/withdrawals/bank \
  --header 'X-Api-Key: daya_sk_YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "idempotency_key": "wd-2026-05-06-01",
    "account_number": "0123456789",
    "bank_code": "058",
    "account_name": "Jane Doe",
    "bank_name": "GTBank",
    "amount": "1000000.00",
    "currency": "NGN",
    "narration": "Payout for invoice 123"
  }'

Response

data.transaction_id
string
required
Daya transaction UUID. Use this to track status.
data.status
string
required
Initial status. Most withdrawals return as processing and transition asynchronously.Values: pending, processing, completed, failed
data.amount
string
required
Echoed amount.
data.currency
string
required
Echoed currency.
data.fee
string
Fee charged for the withdrawal.
data.transfer_id
string
Provider-side transfer reference (when available).
data.created_at
string
required
ISO 8601 timestamp when the withdrawal was accepted.
{
  "success": true,
  "message": "Withdrawal initiated successfully",
  "data": {
    "transaction_id": "22222222-2222-2222-2222-222222222222",
    "status": "processing",
    "amount": "1000000.00",
    "currency": "NGN",
    "fee": "100.00",
    "transfer_id": "FLW-TRF-9001",
    "created_at": "2026-05-06T12:00:00Z"
  }
}

Error Responses

CodeMeaning
400Validation error or insufficient balance
403Missing Trade scope, or account restricted
409Same idempotency_key previously used with a different request body

Notes on settlement

The response confirms the withdrawal was accepted, not that funds have arrived. Final settlement happens through the underlying payout provider and can take seconds to minutes depending on the destination bank.