Whish Money
Whish Money
Partner Integration Guide

International Money Transfer

Programmatically send money, quote fees, track transfers, and reconcile statements through the Whish Money network.

This reference describes the HTTP request and response models used to integrate with Whish Money, and the operations available to move funds across the network.

Version 6.4.7 February 2026 JSON over HTTPS Author: TecFrac

Introduction

This document illustrates the HTTP request models used to call the API and the response models returned to your account. It also describes the operations you can perform to make a transfer through Whish Money.

All requests and responses use JSON over HTTPS. Every endpoint returns HTTP 200 with a consistent response envelope; the outcome of the operation is carried by the status field inside the body rather than by the HTTP status code. See Response conventions.

Protocol
HTTPS · JSON
Auth
username + key (headers)
Supported country
Lebanon (id = 1)
Currencies
USD (2) · LBP (1)

Version history

VersionAuthorDateComment
6.4.4TecFrac2026-01-28DeductFees was renamed to deductFees, and deductFromAmount was replaced by deductFees.
6.4.5TecFrac2026-02-02Minor updates and improvements applied.
6.4.6TecFrac2026-02-09Minor updates and improvements applied.
6.4.7TecFrac2026-02-16Added additional error codes.

Authentication

Every request (unless otherwise noted) is authenticated with two credentials issued by Whish Money, sent as HTTP headers:

HeaderDescription
usernameAccount username provided by Whish Money.
keySecret API key provided by Whish Money.
🔒

Keep credentials secret. Your key authorizes live money movement. Send it only over HTTPS, store it in a secure secrets manager, and never expose it in client-side code, logs, or version control. Rotate it immediately if you suspect it has been leaked.

Environments

Whish Money provides two isolated environments. Validate your full integration in Sandbox before requesting Production access.

EnvironmentBase URLPurpose
Sandboxhttps://sandbox.woocash.money/apiTesting, QA, and integration verification.
Productionhttps://api.woocash.moneyLive environment for real users and transactions.

Building a request URL

Each endpoint path in this reference begins with /api/woo/…. Append the endpoint path to the environment base URL. Note that the Sandbox base URL already ends in /api, so the full Sandbox URL contains /api/api/….

For the example endpoint POST /api/woo/send/money:

EnvironmentFull URL
Sandboxhttps://sandbox.woocash.money/api/api/woo/send/money
Productionhttps://api.woocash.money/api/woo/send/money
ℹ️

The two environments use different base-URL conventions. Sandbox includes a trailing /api segment while Production does not. Construct URLs by concatenating the base URL and the endpoint path exactly as shown above, rather than assuming both environments share the same prefix. Endpoint sections below list the path only.

Request headers

Unless an endpoint states otherwise, all requests must include the following headers:

HeaderValueDescription
username-Account username, provided by Whish Money.
key-Secret API key, provided by Whish Money.
Acceptapplication/jsonResponse media type.
Content-Typeapplication/jsonRequired for requests that send a JSON body.
Request-id-Unique request identifier generated by your account. See the note below.
⚠️

Request-id must be unique for every Send Money transfer. Reusing an id can cause the transfer to be rejected or treated as a duplicate. Use a fresh, idempotent value (for example a UUID or your own transaction reference) per send request. You may reuse the same Request-id later when querying status via Get Transfer Status (it maps to requestId).

Response conventions

All endpoints return HTTP 200 with Content-Type: application/json and a shared envelope. Always branch on the status field in the body, not on the HTTP status code.

FieldTypeDescription
statusBooleantrue = success · false = failure.
codeStringError code when status = false; null on success. See Error codes.
dataObjectPayload of the operation on success; null on failure. Shape varies per endpoint.
dialogObjectUser-friendly message for display; null on success.
dialog.titleStringTitle of the message (e.g. "Sorry!").
dialog.messageStringHuman-readable description of the error.
extraObjectReserved for additional context; typically null.
Envelope shape success
Success envelope
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": { }
}
Envelope shape failure
Failure envelope
{
  "status": false,
  "code": "api.account.invalid_request",
  "dialog": {
    "title": "Sorry!",
    "message": "api.account.invalid_request"
  },
  "extra": null,
  "data": null
}

Recommended handling: read status first. On true, process data. On false, switch on code for programmatic logic and surface dialog.message to end users. Specialized rules apply to Get Transfer Status and the Send Money / Mobile Wallet responses.

Transaction status & handling

Interpret every Send Money outcome using the rule below. It applies to both payment modes and lets you resolve most cases automatically, without escalating to Whish Money.

Transaction status interpretation

OutcomeConditionHow to treat it
Successfulstatus: trueConsider the transaction successful.
Failedstatus: false and code is not 500Consider it failed. Handle it automatically based on the returned error code. No escalation to Whish Money is required.
Pendingstatus: false and code is 500 (Internal Server Error)Consider it pending. Escalate and follow up with Whish Money to determine the final outcome.

Receipt issuance

Issue a receipt to the customer only in these cases:

CaseIssue receipt?
Successful (status: true)Yes
Pending (status: false, code: 500)Yes (pending investigation)
Failed (business-validation error)No
⚠️

Do not issue receipts for failed transactions. Any transaction returned as failed because of one of the final-failure error codes below must not produce a customer receipt.

Handling timeouts & network issues

If you do not receive a response from POST /api/woo/send/money because of a timeout, network interruption, or any communication issue, resend the same request using the exact same Request-id. This is safe:

  • If the original request never reached Whish Money, the payment is initiated.
  • If the original request was already received and processed, the system returns the original response for that Request-id, so no duplicate transaction is created.
🔁

Resend before you check status. Confirm the original POST /api/woo/send/money was received before relying on Get Transfer Status. If you query the status of a transfer that was never received, the status endpoint returns sending.transfer.invalid.info, which means the referenced transaction does not exist in Whish Money's records (most likely the original request never arrived). Resend the original request with the same Request-id first, then check status only after the transfer is registered.

Error codes to treat as final failures

Automate the following as failed transactions and resolve them on your side. None of these require contacting Whish Money.

Error codeDescription
api.account.invalid_requestInvalid account request.
receiver.emptyReceiver information is missing.
receiver.invalid.phone_numberReceiver phone number is invalid.
receiver.customer.invalid_nameReceiver name is invalid.
receiver.customer.info_invalidReceiver information is invalid.
receiver.customer.name_enlgishReceiver name must be in English.
sender.invalid.phone_numberSender phone number is invalid.
sender.customer.invalid_nameSender name is invalid.
sender.customer.info_invalidSender information is invalid.
sender.customer.name_enlgishSender name must be in English.
transfer.already.doneTransfer already completed.
sender.missing_infoSender information is missing.
currency.not_supportedCurrency not supported.
transfer.invalid_amountAmount is negative or sending amount not found in price list.
transfer.reason_emptyReason not provided in the request.
transfer.from_country_not_allowedTransfers from this country are not allowed.
transfer.sourceOfFunds_emptySource of funds not provided in the request.
transfer.not_allowed_countriesTransfer to these countries is not allowed.
transfer.account_reach_balance_limitReached balance limit or insufficient funds.
transfer.exceeds_account_transaction_limitSending amount exceeds the allowed transaction limit.
service.inactiveService is inactive.
service.price_not_activeService price is not active.
transfer.miss_configTransfer configuration is missing.
service.transaction_status_unknownTransaction status is unknown.
service.transaction_failedTransaction failed.
sender.invalid.date.of.birthInvalid date of birth.
transfer.exceeds_account_daily_limitReached daily sending limit.
receiver.whish.account.not.existsWhish account does not exist (Mobile Wallet mode).
sender.kyc.neededSender's KYC is required.
receiver.kyc.neededReceiver's KYC is required.
sender.interview.neededAdditional information required for the sender.
receiver.interview.neededAdditional information required for the receiver.
ℹ️

Implementing this logic avoids unnecessary escalations, prevents status misinterpretation, and gives customers accurate transaction status information. The code: 500 pending case is the only outcome that warrants follow-up with Whish Money.

Request models

Request models form the JSON body of a request and carry the information the API needs to process the operation.

Sending Money Fees request

Used to quote the fees for an amount to be sent.

FieldTypeDescriptionRequired
fromCountryLongSending country (currently Lebanon only, id = 1).Required
toCountryLongReceiving country (currently Lebanon only, id = 1).Required
currencyIdLongCurrency id (USD = 2, LBP = 1).Required
paymentModeStringEnum: CASH_COLLECTION, MOBILE_WALLET.Required
amountdoubleSending amount in the chosen currency.Required
deductFeesBooleanIf true, fees are deducted from the sending amount.Optional
phoneNumberStringRecipient phone number the fees are quoted for.Optional
Sending Money Fees sample
{
  "fromCountry": 1,
  "toCountry": 1,
  "currencyId": 2,
  "amount": 1,
  "deductFees": false,
  "paymentMode": "CASH_COLLECTION",
  "phoneNumber": "9613888999"
}

Customer model (sender / receiver)

Represents a party to the transfer. Carries the basic information needed to identify a sender or receiver.

FieldTypeDescriptionRequired
firstNameStringFirst name.Required
middleNameStringMiddle name.Optional
lastNameStringLast name.Required
phoneStringPhone number.Required
extraInformationStringAdditional information about the customer.Optional
identityIdentityIdentity details about the customer.Required
ℹ️

The source spec lists this field as xextraInformation in the model table but uses extraInformation in every JSON sample. Use extraInformation, as shown in the examples.

Customer (receiver) sample
"receiver": {
  "firstName": "Alex",
  "middleName": "something",
  "lastName": "hunter",
  "phone": "96170852258",
  "extraInformation": "useful info",
  "identity": {
    "dateBirth": "01-01-1990",
    "nationality": "lebanese"
  }
}

Identity model

Provides additional detail about a customer's identity.

FieldTypeDescriptionRequired
nationalityStringNationality.Optional
dateBirthStringDate of birth. Format: dd-MM-yyyy.Required
Identity sample
"identity": {
  "dateBirth": "01-01-1990",
  "nationality": "lebanese"
}

Send Money request

Body of the Send Money endpoint.

FieldTypeDescriptionRequired
paymentModeStringEnum: CASH_COLLECTION, MOBILE_WALLET.Required
fromCountryLongSending country (currently Lebanon only, id = 1).Required
toCountryLongReceiving country (currently Lebanon only, id = 1).Required
currencyIdLongCurrency id (USD = 2, LBP = 1).Required
amountdoubleSending amount in the chosen currency.Required
senderCustomerInformation about the sender.Required
receiverCustomerInformation about the receiver.Required
deductFeesBooleanIf true, fees are deducted from the sending amount.Optional
reasonStringReason for the transfer. See Reason values.Required
sourceOfFundsStringSource of funds (e.g. Salary, Sale of Property or Goods). See Source of Funds.Required
callbackUrlStringCash Collection only. URL Whish Money calls when the transaction changes from SENT to RECEIVED. Not used for Mobile Wallet. See Callbacks.Optional
ℹ️

The Customer model marks identity (and its dateBirth) as required, but the sample Send Money bodies in the source spec omit it. Include identity details where your account configuration requires them; a missing or invalid date of birth returns sender.invalid.date.of.birth.

Send Money sample
{
  "fromCountry": 1,
  "toCountry": 1,
  "currencyId": 1,
  "amount": 1000,
  "receiver": {
    "firstName": "person",
    "middleName": "m",
    "lastName": "personLastName",
    "extraInformation": "useful info"
  },
  "reason": "GIFT",
  "sourceOfFunds": "BUSSINESS",
  "deductFees": false,
  "callbackUrl": "http://test.com/callback"
}

Cancel Transfer request

Body of the Cancel Transfer endpoint.

FieldTypeDescriptionRequired
transferIdStringId of the transfer.Required
ltnNumberStringLTN number of the transfer.Required
reasonStringReason for cancellation.Optional
Cancel Transfer sample
{
  "transferId": 202000001,
  "ltnNumber": "5405-6838-5079",
  "reason": "test"
}

Get Transfer Status request

Body of the Get Transfer Status endpoint. Provide at least one identifier.

FieldTypeDescriptionRequired
transferIdStringId of the transfer.Optional
ltnNumberStringLTN number of the transfer.Optional
requestIdLongThe Request-id header value you sent with the original Send Money request. You can pass it here to look up any transaction by your own reference, for either payment mode. For Cash Collection, sending it also re-triggers the callback if the status has changed.Optional
ℹ️

All three fields are individually optional, but you must supply at least one identifier so the transfer can be located.

Get Transfer Status sample
{
  "transferId": 202000001,
  "ltnNumber": "5405-6838-5079"
}

Statement / Activity request

Used for the Get Activity and Get Statement endpoints.

FieldTypeDescriptionRequired
fromDateStringStart date. Format: yyyy-MM-dd HH:mm:ss.Required
toDateStringEnd date. Format: yyyy-MM-dd HH:mm:ss.Required
currencyIdLongCurrency id (USD = 2, LBP = 1). Send null to include both.Optional
Statement / Activity sample
{
  "fromDate": "2020-01-01 00:00:00",
  "toDate": "2022-01-01 00:00:00",
  "currencyId": 1
}

Response models

Response models are returned in the data object of the envelope. Fields listed below are nested inside data unless stated otherwise.

Send Money Fees response

The cost the user will pay to send the amount.

Field (in data)TypeDescription
feesDoubleFees in the sending currency.
amountDoubleAmount to be sent.
totalAmountDoubleSum of amount and fees.
Response success
Fees response
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "fees": 5,
    "amount": 400,
    "totalAmount": 405
  }
}
Response failure
Fees response
{
  "status": false,
  "code": "transfer.invalid_amount",
  "dialog": {
    "title": "Sorry!",
    "message": "Transfer Amount Outside Range"
  },
  "extra": null,
  "data": null
}

Send Money response

Returned when the transfer was successfully created.

Field (in data)TypeDescription
ltnNumberStringLTN number the receiver uses to collect the transfer from Whish Money cash agents.
transferIdStringReference of the transfer.
chargesDoubleFees applied to the transfer.

Mobile Wallet responses may additionally include collectionAmount, balance, transactionId, and currency. See below.

Cash Collection success
Send Money response
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "ltnNumber": "9262-6531-4941",
    "transferId": "2020125708",
    "charges": 250
  }
}
Cash Collection failure
Send Money response
{
  "status": false,
  "code": "api.account.invalid_request",
  "dialog": {
    "title": "Sorry!",
    "message": "api.account.invalid_request"
  },
  "extra": null,
  "data": null
}

Mobile Wallet response interpretation

CaseConditionTreat as
Successstatus = trueSuccess
Pendingstatus = false and code = 500Pending
Failurestatus = false and code ≠ 500Failure
ℹ️

For Mobile Wallet outcomes, code is compared against the value 500. Elsewhere in the API code holds a string error identifier; handle this comparison specifically for Mobile Wallet sends.

Mobile Wallet success
Mobile Wallet top-up success
{
  "status": true,
  "code": null,
  "dialog": {
    "title": "Success",
    "message": "Your Account Has Been Successfully Topup"
  },
  "extra": null,
  "data": {
    "ltnNumber": "MW223871662783",
    "transferId": "AA 2500000104",
    "currency": null,
    "charges": 250.0,
    "collectionAmount": 30000.0,
    "balance": 0.0,
    "transactionId": 130482
  }
}

Cancel Transfer response

Field (in data)TypeDescription
ltnNumberStringLTN number of the transfer.
transferIdStringReference of the transfer.
statusStringResulting status of the transfer (e.g. CANCELED_FULL).
Response success
Cancel Transfer response
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "ltnNumber": "9262-6531-4941",
    "transferId": "2020125708",
    "status": "CANCELED_FULL"
  }
}

Get Transfer Status response

Field (in data)TypeDescription
ltnNumberStringLTN number of the transfer.
transferIdStringReference of the transfer.
statusStringStatus of the transfer (e.g. SENT, RECEIVED, CANCELED_FULL).
receiverIdentityObjectReceiver identity details (see nested fields).
receiverIdentity.numberStringIdentity number.
receiverIdentity.typeStringIdentity type (e.g. Lebanese ID).
receiverIdentity.frontImageStringURL of the identity front image.
receiverIdentity.backImageStringURL of the identity back image.
Response success
Get Transfer Status response
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "ltnNumber": "9262-6531-4941",
    "transferId": "2020125708",
    "status": "CANCELED_FULL",
    "receiverIdentity": {
      "number": "000042902600",
      "type": "Lebanese ID",
      "frontImage": "url",
      "backImage": "url"
    }
  }
}

Get Country response

Field (in data.list[])TypeDescription
idLongCountry id.
nameStringCountry name.
codeStringISO country code (e.g. LB).
defaultCurrencyIdLongDefault currency id for the country, or null.
dateCreationLongCreation timestamp (epoch milliseconds).
Response success
Get Country response
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "list": [
      {
        "id": 1,
        "name": "LEBANON",
        "code": "LB",
        "defaultCurrencyId": 2,
        "dateCreation": 1570457810000
      },
      {
        "id": 2,
        "name": "Afghanistan",
        "code": "AF",
        "defaultCurrencyId": null,
        "dateCreation": 1587573801000
      }
    ]
  }
}

Get Activity response

Field (in data.list[])TypeDescription
idStringTransfer id.
statusStringStatus of the transfer.
amountDoubleAmount of the transfer.
feeDoubleFee of the transfer.
totalDoubleTotal charges of the transfer.
currencyStringCurrency code.
dateLongTimestamp (epoch milliseconds).
Response success
Get Activity response
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "list": [
      {
        "id": "2200000001",
        "status": "",
        "amount": 1000,
        "fee": 20,
        "total": 1020,
        "currency": "USD",
        "date": 1649173044000
      },
      {
        "id": "2200000001",
        "status": "",
        "amount": 1000,
        "fee": 0,
        "total": 1000,
        "currency": "USD",
        "date": 1649174292000
      }
    ]
  }
}

Get Statement response

Returns the statement grouped per currency.

FieldTypeDescription
data.list[]ArrayOne entry per currency.
…transactions[]ArrayTransactions for the currency.
…transactions[].idStringTransaction id.
…transactions[].typeStringTransaction type: TRANSFER or CANCELLATION.
…transactions[].debitDoubleDebit amount.
…transactions[].creditDoubleCredit amount.
…transactions[].balanceDoubleBalance after the transaction.
…transactions[].currencyStringCurrency code.
…transactions[].dateStringTransaction date. Format: yyyy-MM-dd HH:mm:ss.
…currentBalanceObjectCurrent balance for the currency.
…currentBalance.currencyStringCurrency code.
…currentBalance.balanceDoubleBalance amount.
…currentBalance.dateStringFormat: yyyy-MM-dd HH:mm:ss.
Response success
Get Statement response
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "list": [
      {
        "transactions": [
          {
            "id": "MIC2 2200000011",
            "type": "TRANSFER",
            "debit": 0,
            "credit": 45522.75,
            "balance": -2040695.5,
            "currency": "LBP",
            "date": "2022-04-06 11:30:20"
          }
        ],
        "currentBalance": {
          "currency": "LBP",
          "balance": -2040695.5,
          "date": "2022-04-06 12:37:57"
        }
      },
      {
        "transactions": [
          {
            "id": "ARCADOUS 2200000001",
            "type": "TRANSFER",
            "debit": 0,
            "credit": 1020,
            "balance": -1690,
            "currency": "USD",
            "date": "2022-04-05 18:37:24"
          }
        ],
        "currentBalance": {
          "currency": "USD",
          "balance": -1690,
          "date": "2022-04-06 12:37:57"
        }
      }
    ]
  }
}

Operations summary

OperationMethod & pathRequest body
Get Send Money FeesPOST /api/woo/send/money/feesSending Money Fees request
Send MoneyPOST /api/woo/send/moneySend Money request
Cancel TransferPOST /api/woo/cancel/send/moneyCancel Transfer request
Get Transfer StatusPOST /api/woo/send/money/statusGet Transfer Status request
Get Sending CountriesGET /api/woo/sending/countriesNone
Get ActivityPOST /api/woo/activityStatement / Activity request
Get StatementPOST /api/woo/statementStatement / Activity request
Get Payment ModesGET /api/woo/send/money/modesNone

Get send-money fees

Retrieve the fees for an amount to be sent, given the amount, currency, and payment mode.

POST/api/woo/send/money/fees

Request body: Sending Money Fees request.

Request
Request body
{
  "fromCountry": 1,
  "toCountry": 1,
  "currencyId": 2,
  "amount": 1,
  "deductFees": false,
  "paymentMode": "CASH_COLLECTION",
  "phoneNumber": "9613888999"
}
Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "fees": 5,
    "amount": 400,
    "totalAmount": 405
  }
}
Response · 200 failure
application/json
{
  "status": false,
  "code": "transfer.invalid_amount",
  "dialog": {
    "title": "Sorry!",
    "message": "Transfer Amount Outside Range"
  },
  "extra": null,
  "data": null
}

Error codes

CodeDescription
transfer.invalid_amountThe amount is not within the price list.
amount.not_allowedThe amount is less than the price or is negative.

Send money

Create a transfer through Whish Money, specifying the amount, currency, countries, and parties.

POST/api/woo/send/money
⚠️

Request-id must be unique for each transfer. See Request headers.

Request body: Send Money request.

Request
Request body
{
  "fromCountry": 1,
  "toCountry": 1,
  "currencyId": 1,
  "amount": 1000,
  "sender": {
    "firstName": "personName",
    "middleName": "m",
    "lastName": "LastName",
    "phone": "96170852258",
    "extraInformation": "extraInformation"
  },
  "receiver": {
    "firstName": "personName",
    "middleName": "m",
    "lastName": "LastName",
    "phone": "96170852258",
    "extraInformation": "extraInformation"
  },
  "reason": "GIFT",
  "sourceOfFunds": "BUSSINESS",
  "callbackUrl": "http://test.com"
}
Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "ltnNumber": "9262-6531-4941",
    "transferId": "2020125708",
    "charges": 250
  }
}
Response · 200 failure
application/json
{
  "status": false,
  "code": "transfer.reason_empty",
  "dialog": {
    "title": "Sorry!",
    "message": "Transfer Reason is Missing"
  },
  "extra": null,
  "data": null
}

Error codes

CodeDescription
api.account.invalid_requestInvalid account request.
receiver.emptyReceiver information is missing.
receiver.invalid.phone_numberReceiver phone number is invalid.
receiver.customer.invalid_nameReceiver name is invalid.
receiver.customer.info_invalidReceiver information is invalid.
receiver.customer.name_enlgishReceiver name must be in English.
sender.invalid.phone_numberSender phone number is invalid.
sender.customer.invalid_nameSender name is invalid.
sender.customer.info_invalidSender information is invalid.
sender.customer.name_enlgishSender name must be in English.
transfer.already.doneTransfer already completed.
sender.missing_infoSender information is missing.
currency.not_supportedCurrency not supported.
transfer.invalid_amountAmount is negative, or the sending amount is not found in the price list.
transfer.reason_emptyReason not provided in the request.
transfer.from_country_not_allowedTransfers from this country are not allowed.
transfer.sourceOfFunds_emptySource of funds not provided in the request.
transfer.not_allowed_countriesTransfer to these countries is not allowed.
transfer.account_reach_balance_limitReached balance limit, or insufficient funds.
transfer.exceeds_account_transaction_limitSending amount exceeds the allowed transaction amount per transfer.
service.inactiveService is inactive.
service.price_not_activeService price is not active.
transfer.miss_configTransfer configuration is missing.
service.transaction_status_unknownTransaction status is unknown.
service.transaction_failedTransaction failed.
sender.invalid.date.of.birthInvalid date of birth.
transfer.exceeds_account_daily_limitReached daily sending limit.
receiver.whish.account.not.existsWhish account does not exist (Mobile Wallet mode).
receiver.customer.under_ageReceiver is underage. (Source description reads “>18”; interpret per your account rules.)
sender.kyc.neededSender's KYC is required.
receiver.kyc.neededReceiver's KYC is required.
sender.interview.neededAdditional information required for the sender.
receiver.interview.neededAdditional information required for the receiver.

Cancel transfer

Cancel a transfer that has already been sent, by transfer id and LTN number.

POST/api/woo/cancel/send/money

Request body: Cancel Transfer request.

Request
Request body
{
  "transferId": 202000001,
  "ltnNumber": "5405-6838-5079",
  "reason": "test"
}
Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "ltnNumber": "9262-6531-4941",
    "transferId": "2020125708",
    "status": "CANCELED_FULL"
  }
}
Response · 200 failure
application/json
{
  "status": false,
  "code": "transfer.not_exists",
  "dialog": {
    "title": "Sorry!",
    "message": "Transfer Not Found"
  },
  "extra": null,
  "data": null
}

Error codes

CodeDescription
transfer.not_existsTransfer id not found.
transfer.cannot_be_canceledThe transfer is already canceled or received.

Get transfer status

Retrieve the current status of a transfer.

POST/api/woo/send/money/status

Request body: Get Transfer Status request.

Request
Request body
{
  "transferId": 202000001,
  "ltnNumber": "5405-6838-5079"
}
Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "ltnNumber": "9262-6531-4941",
    "transferId": "2020125708",
    "status": "CANCELED_FULL"
  }
}
Response · 200 failure
application/json
{
  "status": false,
  "code": "transfer.not_exists",
  "dialog": {
    "title": "Sorry!",
    "message": "Transfer Not Found"
  },
  "extra": null,
  "data": null
}

Error codes

CodeDescription
sending.transfer.invalid.infoSending transfer info is invalid.
transfer.not_existsTransfer does not exist.

Response handling

🧭

If status = true → treat the request as successful and read data.status for the actual transaction status (e.g. SENT, RECEIVED, CANCELED_FULL).

If status = false → branch on the error code:

sending.transfer.invalid.info → the referenced transfer does not exist in Whish Money's records. Usually this means the original Send Money request never arrived. Resend it with the same Request-id before checking status again. See Handling timeouts & network issues.
transfer.not_exists → treat as Failed.
• Any other code → apply the transaction status interpretation (code: 500 is Pending and warrants follow-up; other codes are final failures).

Callback (Cash Collection only): if you send the original requestId in the body, this call re-evaluates the transfer and triggers your configured callbackUrl when the status has changed (for example from SENT to RECEIVED). Mobile Wallet has no callback; its outcome is final at send time.

Get sending countries

Retrieve the list of countries allowed to send from.

GET/api/woo/sending/countries

Request body: None.

ℹ️

In the source spec the section heading reads POST /api/woo/sending/countires, while the request line specifies GET /api/woo/sending/countries with no body. Both the method and the spelling are inconsistent in the source; this reference documents it as GET …/countries. Confirm the exact method with Whish Money if your call fails.

Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "list": [
      {
        "id": 1,
        "name": "LEBANON",
        "code": "LB"
      },
      {
        "id": 2,
        "name": "Afghanistan",
        "code": "AF"
      }
    ]
  }
}

Get activity

Retrieve transfers sent or received within a given period.

POST/api/woo/activity

Request body: Statement / Activity request.

Request
Request body
{
  "fromDate": "2020-01-01 00:00:00",
  "toDate": "2022-01-01 00:00:00",
  "currencyId": 1
}
Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "list": [
      {
        "id": "2200000001",
        "status": "",
        "amount": 1000,
        "fee": 20,
        "total": 1020,
        "currency": "USD",
        "date": 1649173044000
      },
      {
        "id": "2200000001",
        "status": "",
        "amount": 1000,
        "fee": 0,
        "total": 1000,
        "currency": "USD",
        "date": 1649174292000
      }
    ]
  }
}
Response · 200 failure
application/json
{
  "status": false,
  "code": "transfer.invalid_amount",
  "dialog": {
    "title": "Sorry!",
    "message": "Error"
  },
  "extra": null,
  "data": null
}

Get statement

Retrieve the account statement within a given period, grouped per currency.

POST/api/woo/statement

Request body: Statement / Activity request.

Request
Request body
{
  "fromDate": "2020-01-01 00:00:00",
  "toDate": "2022-01-01 00:00:00",
  "currencyId": 1
}
Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": {
    "list": [
      {
        "transactions": [
          {
            "id": "MIC2 2200000011",
            "type": "TRANSFER",
            "debit": 0,
            "credit": 45522.75,
            "balance": -2040695.5,
            "currency": "LBP",
            "date": "2022-04-06 11:30:20"
          }
        ],
        "currentBalance": {
          "currency": "LBP",
          "balance": -2040695.5,
          "date": "2022-04-06 12:37:57"
        }
      },
      {
        "transactions": [
          {
            "id": "ARCADOUS 2200000001",
            "type": "TRANSFER",
            "debit": 0,
            "credit": 1020,
            "balance": -1690,
            "currency": "USD",
            "date": "2022-04-05 18:37:24"
          }
        ],
        "currentBalance": {
          "currency": "USD",
          "balance": -1690,
          "date": "2022-04-06 12:37:57"
        }
      }
    ]
  }
}
Response · 200 failure
application/json
{
  "status": false,
  "code": "error",
  "dialog": {
    "title": "Sorry!",
    "message": "Error"
  },
  "extra": null,
  "data": null
}

Get payment modes

Retrieve the payment modes supported by your account.

GET/api/woo/send/money/modes

Request body: None.

Response · 200 success
application/json
{
  "status": true,
  "code": null,
  "dialog": null,
  "extra": null,
  "data": ["CASH_COLLECTION", "MOBILE_WALLET"]
}
Response · 200 failure
application/json
{
  "status": false,
  "code": "error",
  "dialog": {
    "title": "Sorry!",
    "message": "Error"
  },
  "extra": null,
  "data": null
}

Callbacks & status updates

⚠️

callbackUrl applies to Cash Collection mode only. Mobile Wallet does not use callbacks, because its outcome is known instantly at send time (see Mobile Wallet below).

In Cash Collection mode a transfer moves through several statuses (SENT, RECEIVED, CANCELED_FULL), so Whish Money needs a way to tell you when the transaction changes. When you provide a callbackUrl in the Send Money request, Whish Money calls it when the transaction status changes from SENT to RECEIVED.

Cash Collection transfer statuses

StatusMeaning
SENTThe transfer has been sent and is available for collection.
RECEIVEDThe receiver has collected the transfer. The callback fires on this transition from SENT.
CANCELED_FULLThe transfer has been fully cancelled.

Triggering the callback manually

You can also trigger the callback on demand by calling Get Transfer Status with the same requestId in the request body (the Request-id you sent with the original transfer). This re-evaluates the transaction and fires your callbackUrl if the status has changed.

ℹ️

Pass the original Request-id as requestId in the Get Transfer Status body to reference the transfer and re-trigger its callback. See Get Transfer Status.

Mobile Wallet

📲

Mobile Wallet does not support callbackUrl. The outcome is determined instantly by the Send Money response: the transaction either succeeds or fails, with no intermediate statuses to track. There is nothing to notify later, so no callback is sent. See Mobile Wallet response interpretation.

Reference data

Currencies

CurrencyId
LBP1
USD2

Countries

Currently only Lebanon (id = 1, code LB) is supported for sending and receiving. Use Get Sending Countries for the live list.

Payment modes

ValueDescription
CASH_COLLECTIONReceiver collects cash from a Whish Money agent using the ltnNumber.
MOBILE_WALLETFunds are credited directly to a Whish mobile wallet account.

Source of Funds (SoF)

ValueDescription
SalaryIncome earned from employment, wages, or regular payroll.
Income from Own BusinessRevenue generated from operating a personal or self-owned business.
Income from InvestmentsReturns or profits from investments such as stocks, bonds, dividends, or interest.
RentIncome received from renting out property, land, or other assets.
InheritanceFunds received from the estate of a deceased individual.
SavingsMoney accumulated and withdrawn from personal savings or bank accounts.
Sale of Property or GoodsProceeds from selling physical property, assets, or personal goods.
LoanMoney borrowed from financial institutions, individuals, or other entities.
Lottery / GamblingFunds from lottery winnings, betting, or other gambling activities.
OtherAny source of funds not covered by the categories above.

Reason

ValueDescription
Donations & GiftsVoluntary donations or personal gifts to individuals or organizations.
EducationEducational expenses such as tuition, fees, books, or training programs.
Family SupportFinancial assistance to family members for living or personal needs.
Medical TreatmentHealthcare services, treatments, medication, or hospital fees.
Purchase of GoodsBuying goods, products, or merchandise.
Travel ExpensesCosts associated with travel spending.
Insurance Plan / ClaimInsurance premiums, or funds received/used as part of an insurance claim.
Retirement / PensionContributions to or withdrawals from retirement or pension funds.
OtherAny reason not covered by the categories above.
ℹ️

The sample requests use short enum-style tokens (e.g. reason: "GIFT", sourceOfFunds: "BUSSINESS"). Confirm with Whish Money whether your account expects the display values above or coded tokens, and use the exact strings your account is provisioned with.

Consolidated error codes

When status = false, the code field carries one of the identifiers below. Surface dialog.message to end users and branch your logic on code. Error codes are literal API values and are reproduced exactly, including their original spelling.

CodeDescriptionEndpoint(s)
api.account.invalid_requestInvalid account request.All
amount.not_allowedThe amount is less than the price or is negative.Fees
transfer.invalid_amountAmount not within the price list / negative.Fees, Send, Activity
receiver.emptyReceiver information is missing.Send
receiver.invalid.phone_numberReceiver phone number is invalid.Send
receiver.customer.invalid_nameReceiver name is invalid.Send
receiver.customer.info_invalidReceiver information is invalid.Send
receiver.customer.name_enlgishReceiver name must be in English.Send
receiver.customer.under_ageReceiver is underage.Send
receiver.whish.account.not.existsWhish account does not exist (Mobile Wallet).Send
sender.invalid.phone_numberSender phone number is invalid.Send
sender.customer.invalid_nameSender name is invalid.Send
sender.customer.info_invalidSender information is invalid.Send
sender.customer.name_enlgishSender name must be in English.Send
sender.missing_infoSender information is missing.Send
sender.invalid.date.of.birthInvalid date of birth.Send
sender.kyc.neededSender's KYC is required.Send
receiver.kyc.neededReceiver's KYC is required.Send
sender.interview.neededAdditional information required for the sender.Send
receiver.interview.neededAdditional information required for the receiver.Send
currency.not_supportedCurrency not supported.Send
transfer.reason_emptyReason not provided.Send
transfer.sourceOfFunds_emptySource of funds not provided.Send
transfer.from_country_not_allowedTransfers from this country are not allowed.Send
transfer.not_allowed_countriesTransfer to these countries is not allowed.Send
transfer.account_reach_balance_limitReached balance limit / insufficient funds.Send
transfer.exceeds_account_transaction_limitAmount exceeds per-transfer limit.Send
transfer.exceeds_account_daily_limitReached daily sending limit.Send
transfer.already.doneTransfer already completed.Send
transfer.miss_configTransfer configuration is missing.Send
service.inactiveService is inactive.Send
service.price_not_activeService price is not active.Send
service.transaction_status_unknownTransaction status is unknown.Send
service.transaction_failedTransaction failed.Send
transfer.not_existsTransfer does not exist / id not found.Cancel, Status
transfer.cannot_be_canceledTransfer already canceled or received.Cancel
sending.transfer.invalid.infoSending transfer info is invalid.Status
errorGeneric error.Statement, Modes
ℹ️

For Mobile Wallet sends only, code may carry the numeric value 500 to indicate a Pending transaction. See Mobile Wallet response interpretation.

Integration best practices

  1. Test in Sandbox first. Verify every flow against sandbox.woocash.money before requesting Production access, and remember the differing base-URL conventions between environments.
  2. Quote before you send. Call Get Send Money Fees to confirm fees and total, then send with the same amount and currency.
  3. Use a unique Request-id per transfer. Generate an idempotent value (e.g. a UUID) for each send to avoid duplicates, and store it so you can later query by requestId.
  4. Branch on status, not HTTP code. All responses return HTTP 200; the outcome lives in the body.
  5. Mobile Wallet is instant. Its outcome is final in the Send Money response (no callback). Map status = false + code = 500 to Pending and reconcile later.
  6. Callbacks are Cash Collection only. Configure callbackUrl for Cash Collection and update state when the transfer moves from SENT to RECEIVED. You can re-trigger it by calling Get Transfer Status with the original requestId.
  7. Escalate unknown status codes. On Get Transfer Status, any code other than sending.transfer.invalid.info or transfer.not_exists should be escalated to Whish Money rather than assumed failed.
  8. Use English names. Sender and receiver names must be in English, or the send is rejected (*.name_enlgish).
  9. Store references. Persist transferId and ltnNumber from every send; both are needed for cancel and status lookups.
  10. Secure your credentials. Keep username / key server-side and out of logs and version control.
  11. Respect limits. Design for per-transfer, daily, and balance limits, and surface dialog.message to end users when they are hit.
  12. Reconcile regularly. Use Get Activity and Get Statement to reconcile your ledger against Whish Money.

Sandbox test cases

Cash Collection

ScenarioInputExpected result
English nameValidPASS
Arabic nameInvalidFAIL

Mobile Wallet

ScenarioInputExpected result
Payment to wallet96170123456PASS
Payment to wallet96170123123FAIL

Postman & tools

Import the ready-made Postman collection for this API, set your username and key as collection variables (or attach a Sandbox / Production environment), and call every endpoint without writing code. Request-id auto-generates a unique GUID per send.

⤓ Download collection All downloads & environments

ℹ️

In Postman: Import → select the file → choose the Sandbox or Production environment → fill in your credentials. Requests use {{baseUrl}} and the credential variables provided.