Xtopay
Payment APIs

Direct Send-To-Bank

Disburse funds directly from your Xtopay Disbursement Account to any recipient bank account via the GhIPSS network.

Direct Send-To-Bank

The Direct Send-To-Bank API allows merchants to programmatically disburse funds directly from their Xtopay Disbursement Account to any customer or supplier bank account across all available banks on the GhIPSS network. This is ideal for automated vendor payments, customer refunds to bank accounts, payroll disbursements, and settlement transfers.


Supported Banks & Channels

Xtopay supports direct transfers to the following bank channels using their specific bank codes:

Bank ChannelBankCodeCountry
STANDARD CHARTERED BANK300302Ghana
ABSA BANK GHANA LIMITED300303Ghana
GCB BANK LIMITED300304Ghana
NATIONAL INVESTMENT BANK300305Ghana
ARB APEX BANK LIMITED300306Ghana
AGRICULTURAL DEVELOPMENT BANK300307Ghana
UNIVERSAL MERCHANT BANK300309Ghana
REPUBLIC BANK LIMITED300310Ghana
ZENITH BANK GHANA LTD300311Ghana
ECOBANK GHANA LTD300312Ghana
CAL BANK LIMITED300313Ghana
FIRST ATLANTIC BANK300316Ghana
PRUDENTIAL BANK LTD300317Ghana
STANBIC BANK300318Ghana
FIRST BANK OF NIGERIA300319Ghana
BANK OF AFRICA300320Ghana
GUARANTY TRUST BANK300322Ghana
FIDELITY BANK LIMITED300323Ghana
SAHEL - SAHARA BANK (BSIC)300324Ghana
UNITED BANK OF AFRICA300325Ghana
ACCESS BANK LTD300329Ghana
CONSOLIDATED BANK GHANA300331Ghana
FIRST NATIONAL BANK300334Ghana
GHL BANK300362Ghana

Disbursement Account Funding

To disburse payments via the Direct Send-To-Bank API, your business must maintain an active balance in your Disbursement Account.

You can fund your Disbursement Account via one of two methods:

  • Online Funding: Fund it using bank transfer or card payment from your merchant dashboard.
  • Balance Transfer: Instantly transfer settled collections from your Xtopay Collection Account to your Disbursement Account.

For detailed custom limits or support, please contact your Xtopay Relationship Manager.


Business IP Whitelisting

[!WARNING] Whitelisting Required Direct Send-To-Bank endpoints are live and require strict IP whitelisting. Requests from non-whitelisted IP addresses will return a 403 Forbidden error or timeout.

Please submit your production server public IP addresses to your Xtopay Retail Systems Engineer for whitelisting. We permit a maximum of four (4) IP addresses per service key.


Understanding the Service Flow

The Direct Send-To-Bank process is asynchronous. When you initiate a bank transfer, Xtopay processes and dispatches the request to the GhIPSS network. The final settlement status is usually resolved within a few minutes.

Service Steps

StepDescription
1Your server makes a Send-To-Bank request to POST /v1/merchants/{disbursementAccountNumber}/send/bank/gh/{bankCode}.
2Xtopay validates the credentials and disbursement balance, debits the account, and returns a pending status 0001 (Accepted).
3Xtopay dispatches the funds to the recipient bank through the GhIPSS network.
4Once confirmed by the clearing house/bank, Xtopay dispatches an HTTP POST callback to your PrimaryCallbackUrl containing the final state.
5If no callback is received within five (5) minutes of initiation, query the Transaction Status Check API to verify the final status.

Direct Send-To-Bank Request Flow

sequenceDiagram
    autonumber
    actor Recipient as Recipient Bank Account
    participant AppServer as Merchant Server
    participant Xtopay as Xtopay API
    participant GhIPSS as GhIPSS / Bank Gateway

    AppServer->>Xtopay: POST /v1/merchants/{disbursementAccountNumber}/send/bank/gh/{bankCode} (Auth: Bearer secret_key)
    Xtopay-->>AppServer: Return accepted response (ResponseCode 0001)
    Xtopay->>GhIPSS: Dispatch bank transfer request
    GhIPSS-->>Recipient: Funds credited to bank account
    GhIPSS-->>Xtopay: Bank settlement confirmation
    Xtopay->>AppServer: Send Webhook Callback (POST to PrimaryCallbackUrl)
    Note over AppServer, Xtopay: Fallback: Check status via GET /v1/merchants/.../transactions/status if callback fails

API Reference

To initiate a bank transfer, send an HTTP POST request. You must replace {disbursementAccountNumber} with your Xtopay Disbursement Account Number and {bankCode} with the recipient's bank code.

DetailDescription
API Endpointhttps://api.xtopay.co/v1/merchants/{disbursementAccountNumber}/send/bank/gh/{bankCode}
Request TypePOST
Content Typeapplication/json
AuthenticationBasic Base64(clientId:clientSecret)

Path Parameters

ParameterTypeRequiredDescription
disbursementAccountNumberStringYesYour Xtopay Disbursement Account Number (e.g. 11691).
bankCodeStringYesThe 6-digit destination bank code (e.g. 300311 for Zenith Bank).

Request Parameters

ParameterTypeRequiredDescription
AmountFloatYesThe amount to send. Must be a float with exactly 2 decimal places (e.g. 0.80).
PrimaryCallbackUrlStringYesThe callback URL to receive the transaction final status payload once completed.
DescriptionStringYesNarration description of the bank transfer transaction.
BankAccountNumberStringYesRecipient's bank account number.
BankAccountNameStringNoFull legal name associated with the destination bank account.
RecipientPhoneNumberStringNoRecipient's mobile phone number in international E.164 format (e.g. 233249111411).
BankNameStringNoName of the recipient bank.
BankBranchStringNoDestination bank branch name.
BankBranchCodeStringNoBranch code of the destination bank.
ClientReferenceStringYesA unique alphanumeric transaction reference generated by your system. Maximum length is 36 characters.

Code Examples

curl https://api.xtopay.co/v1/merchants/11691/send/bank/gh/300311 \
  -u "YOUR_CLIENT_ID:YOUR_CLIENT_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
    "Amount": 0.8,
    "BankName": "",
    "BankBranch": "",
    "BankBranchCode": "",
    "BankAccountNumber": "4XXXXXXXXX",
    "BankAccountName": "",
    "ClientReference": "sendToBank101",
    "PrimaryCallbackUrl": "https://webhook.site/b503d1a9-e726-f315254a6ede",
    "Description": "Test Deposit",
    "RecipientPhoneNumber": ""
  }'

Sample Response

200 OK

{
  "ResponseCode": "0001",
  "Data": {
      "AmountDebited": 0.0,
      "TransactionId": "367121386447",
      "Description": "Your request has been accepted. We will notify you when the transaction is completed.",
      "ClientReference": "sendToBank101",
      "ExternalTransactionId": "",
      "Amount": 0.8,
      "Charges": 0.0,
      "Meta": null,
      "RecipientName": null
  }
}

Send-To-Bank Callback

Xtopay dispatches callback webhook alerts to your registered PrimaryCallbackUrl once the payout is finalized on the bank clearing network.

Sample Callback (Successful)

{
  "ResponseCode": "0000",
  "Data": {
      "AmountDebited": 0.8,
      "TransactionId": "367121386447",
      "ExternalTransactionId": "367121386447",
      "Description": "The Instant Bank Request has been processed successfully",
      "ClientReference": "sendToBank101",
      "Amount": 0.8,
      "Charges": 0.010,
      "Meta": null,
      "RecipientName": "Joe Doe"
  }
}

Sample Callback (Failed)

{
  "ResponseCode": "4075",
  "Data": {
    "AmountDebited": 10.1,
    "TransactionId": "9933e637066a406dba1a8b255b928b44",
    "ClientReference": "sendToBank102",
    "Description": "Insufficient prepaid balance.",
    "ExternalTransactionId": null,
    "Amount": 10,
    "Charges": 0.1,
    "Meta": null,
    "RecipientName": null
  }
}

Transaction Status Check

Checks the status of a bank transfer transaction. It is mandatory to implement this check to verify the final transaction state if no webhook callback is received within 5 minutes of initiation.

To poll the status, send an HTTP GET request appending the client reference as a query parameter.

DetailDescription
API Endpointhttps://api.xtopay.co/v1/merchants/{disbursementAccountNumber}/transactions/status
Request TypeGET
Content Typeapplication/json
AuthenticationBasic Base64(clientId:clientSecret)

Path Parameters

ParameterTypeRequiredDescription
disbursementAccountNumberStringYesYour Xtopay Disbursement Account Number (e.g. 11691).

Query Parameters

ParameterTypeRequiredDescription
clientReferenceStringYes (Recommended)The client reference of the transaction (sendToBank101).
xtopayTransactionIdStringNoThe transaction ID returned by Xtopay in the initial response.
networkTransactionIdStringNoThe transaction reference returned by the upstream bank provider.

Code Examples

curl "https://api.xtopay.co/v1/merchants/11691/transactions/status?clientReference=sendToBank101" \
  -u "YOUR_CLIENT_ID:YOUR_CLIENT_SECRET"

Sample Response (Succeeded)

200 OK

{
  "ResponseCode": "success",
  "Data": {
    "TransactionId": "367121386447",
    "networkTransactionId": "367121386447",
    "Amount": 0.8,
    "fees": 0.010,
    "ClientReference": "sendToBank101",
    "Channel": "gip-gh",
    "CustomerNumber": "233546335113",
    "Description": "TestSendToBankDeposit",
    "transactionStatus": "success",
    "CreatedAt": "2022-08-23 11:31:06"
  }
}

Sample Response (Failed)

200 OK

{
  "ResponseCode": "success",
  "Data": {
    "TransactionId": "9933e637066a406dba1a8b255b928b44",
    "networkTransactionId": null,
    "Amount": 10.0,
    "fees": 0.1,
    "ClientReference": "sendToBank102",
    "Channel": "gip-gh",
    "customerNumber": "233200585542",
    "Description": "TestSendToBankDeposit",
    "transactionStatus": "failed",
    "CreatedAt": "2024-08-01 08:30:53"
  }
}

Response Codes & Actions

Response CodeDescriptionRequired Action
0000The bank transfer transaction has been processed successfully.None. Update the transaction as successful in your local database.
0001Request has been accepted. A callback will be sent on final state.Mark the payout as pending. Wait for the webhook callback.
2001Transaction failed (e.g. name check failed, invalid bank account details, or GhIPSS processing error).Inspect your request parameters and account details, then try again.
3050Mobile number is not registered for Mobile Payment.Ensure to pass the appropriate payment channel if using mobile details.
4000Validation errors. Request payload contains incorrect parameters.Inspect the request schema, verify all parameters, and retry.
4075Insufficient prepaid balance in Disbursement Account.Top up your Disbursement Account balance from the Xtopay dashboard or via balance transfer.
5000Something went wrong while processing this request.Inspect your request or contact Xtopay support / Retail Systems Engineer.

How is this guide?

Edit this page on GitHub
Last updated on June 6, 2026

On this page