WiPay
WAPIsv2.0.0Withdrawals

Create Withdrawal

Create a WAPI withdrawal request

Create a withdrawal request for the authenticated account. The request can use the account's own Bank details or provide payout details for an MMA-authorized external recipient.

This feature is available to verified WiPay accounts and is not limited to BUSINESS accounts. Availability depends on the withdrawal type, the selected currency, the available balance, and the required payout details.

Endpoint

POST /withdrawals
AccessRequirement
AuthenticatedYes
Required Scopewapi-withdrawals-create, or wapi-withdrawals-all
Rate Limit15 requests per minute

Request

Headers

HeaderValue
Acceptapplication/json
AuthorizationBearer <access_token>
X-WAPI-Keywapi_live_<kid>_<secret> or wapi_test_<kid>_<secret>

Send exactly one of Authorization or X-WAPI-Key.

Body (form-data)

Required For All Withdrawal Types

ParameterTypeRequiredDescription
withdrawal_typestringYesOne of normal, sub_banked, or sub_unbanked. See Withdrawal Meta
currencystringYesA supported platform currency
amountnumericYesWithdrawal amount. WiPay normalizes the value to money format and enforces a minimum amount based on the selected currency

Additional Parameters For MMA-Authorized External Recipient Withdrawals

Use these fields when withdrawal_type is sub_banked or sub_unbanked.

ParameterTypeRequiredDescription
emailstringYesRecipient email address
phonestringYesRecipient phone number in E.164 format
bank_namestringYesBank name from Withdrawal Meta
name_in_bankstringYesRecipient name as it appears on the Bank account. WiPay normalizes this value before processing
bank_accountstringYesNumeric Bank account number. Length rules depend on the selected Bank
id_typestringYesOne of driver_permit, national_id, or passport
id_numberstringYesIdentification value validated against the selected id_type and platform

Jamaica-Only Additional Parameters For MMA-Authorized External Recipient Withdrawals

Use these additional fields when withdrawal_type is sub_banked or sub_unbanked on Jamaica JM platform.

ParameterTypeRequiredDescription
bank_account_typestringYeschequing or savings
bank_branchstringYesBranch string returned by Withdrawal Meta for the selected Bank

Withdrawal Types

The sub_banked and sub_unbanked values are part of the API design. They identify how the withdrawal is processed, not whether the recipient is inherently "banked" or "unbanked" in a business sense.

normal

Uses the authenticated account's own Bank details.

  • Local-currency withdrawals require local Bank details to already be configured on the account
  • Foreign-currency withdrawals require foreign Bank details to already be configured on the account
  • Recipient Bank and identity fields are not submitted in the request

sub_banked

Creates an MMA-authorized withdrawal for an external recipient whose payout Bank details are supplied in the request.

  • The recipient does not need to already exist as a WiPay user
  • The MMA is responsible for the request because this flow is available only through authenticated WAPI calls
  • Funds are settled to the Bank account submitted in the API request, not to the authenticated MMA's Bank account

sub_unbanked

Creates an MMA-authorized withdrawal for an external recipient without creating a Bank transaction record.

  • The API still requires recipient identity and payout fields submitted by the authenticated MMA
  • The recipient does not need to already exist as a WiPay user
  • On success, the response includes a reference UUID that can be used to track the request

Operational Behavior

  • The authenticated account must be verified before a withdrawal can be created
  • The account must have sufficient balance in the selected currency
  • The withdrawal fee depends on withdrawal_type, currency, and platform
  • External-recipient withdrawal requests are wholly the responsibility of the authenticated MMA that submits them
  • On success, the API returns a withdrawal record and deducts the amount from the authenticated account balance

Responses

201 Created

Normal or external-recipient Bank account withdrawal
{
  "message": "Created",
  "data": {
    "reference": null,
    "transaction_id": "SB-47-1-W12345-20250306010101"
  }
}
External-recipient tracked withdrawal
{
  "message": "Created",
  "data": {
    "reference": "7d5d8d65-71de-41e5-8fb1-3f9a3b3a2749",
    "transaction_id": "SB-47-1-W12345-20250306010101"
  }
}
FieldTypeDescription
data.transaction_idstringPublic transaction identifier for the created withdrawal
data.referencestring | nullUUID reference for sub_unbanked withdrawals. null for normal and sub_banked

400 Bad Request

Insufficient funds
{
  "message": "Insufficient USD funds."
}
Missing Bank configuration for normal withdrawal
{
  "message": "Please update your USD Bank details before proceeding."
}

401 Unauthorized

{
  "message": "Unauthorized"
}

403 Forbidden

{
  "message": "Please verify your account before proceeding."
}

Example

Normal withdrawal
curl -X POST https://ttsb.wipayfinancial.com/wapi/withdrawals \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <access_token>" \
  -F "withdrawal_type=normal" \
  -F "currency=USD" \
  -F "amount=100.00"
External-recipient Bank account withdrawal (sub_banked)
curl -X POST https://ttsb.wipayfinancial.com/wapi/withdrawals \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <access_token>" \
  -F "withdrawal_type=sub_banked" \
  -F "currency=USD" \
  -F "amount=100.00" \
  -F "email=recipient@example.com" \
  -F "phone=+18687778899" \
  -F "bank_name=First Citizens" \
  -F "name_in_bank=TEST RECIPIENT" \
  -F "bank_account=1234567890" \
  -F "id_type=passport" \
  -F "id_number=TB963809"