Bridge API DocsBridge API Docs
Bridge API Docs
Api reference

Transfer Money / Payout Payment (MTC)

Send payments or transfer money to customers via mobile money or bank accounts

Payout Payment (MTC)

Send payments or transfer money to customers via mobile money or bank accounts. This is ideal for money transfers, payouts, withdrawals, refunds, and any scenario where you need to send money to customers.

Overview

Payout payments (MTC - Merchant to Customer) allow you to send money from your account to customers' mobile money accounts or bank accounts. This is perfect for refunds, payouts, rewards, and any customer disbursements.

Endpoint

POST https://api.bridgeagw.com/make_payment

Request Headers

Authorization: Basic <base64_encoded_credentials>
Content-Type: application/json

Request Body

{
  "service_id": 1,
  "reference": "Refund for Order #123",
  "customer_number": "0541234567",
  "transaction_id": "PAYOUT_001",
  "trans_type": "MTC",
  "amount": 25.50,
  "nw": "MTN",
  "nickname": "John Doe",
  "payment_option": "MOM",
  "currency_code": "GHS",
  "currency_val": "1",
  "callback_url": "https://your-site.com/webhook/payout-status",
  "request_time": "2025-01-15 14:30:00"
}

Parameters

ParameterTypeRequiredDescription
service_idintegerYesYour service identifier
referencestringYesPayout reference/description
customer_numberstringYesCustomer's phone number or bank account number or card number
transaction_idstringYesUnique transaction identifier
trans_typestringYesMust be "MTC" for payouts
amountnumberYesPayout amount
nwstringYesNetwork provider or bank code (MTN, VOD, AIR, MAS, VIS, FNB, UBA, etc.)
nicknamestringYesCustomer's display name
payment_optionstringYesMust be "MOM" for mobile money or "CRD" for card payment or "BNK" for bank transfer
currency_codestringNoCurrency code (e.g., "GHS")
currency_valstringNoCurrency value
callback_urlstringYesURL to receive payout notifications
request_timestringYesRequest timestamp

Supported Networks

The payout API supports mobile money networks, card payments, and bank transfers. Use the appropriate network code (nw parameter) and payment option (payment_option parameter) based on your payout method.

Mobile Money Networks

NetworkCodeDescription
MTN Mobile MoneyMTNMTN Mobile Money
Vodafone CashVODTelecel Cash
AirtelTigo MoneyAIRAirtelTigo Money
G-MoneyGMOG-Money

Card Networks

NetworkCodeDescription
MastercardMASMastercard
VisaVISVisa Card

Bank Networks

BankCodeDescription
Access BankACBAccess Bank
ABSA BankABSABSA Bank
ADBADBADB
Apex BankARBApex Bank
Bank of GhanaBOGBank of Ghana
BOABOABOA
CAL BankCALCAL Bank
CBGCBGCBG
Ecobank GhanaECOEcobank Ghana
FABFABFAB
FBN BankFBNFBN Bank
Fidelity BankFIBFidelity Bank
FNBFNBFNB
GCB BankGCBGCB Bank
GHL BankGHLGHL Bank
GT BankGTBGT Bank
NIBNIBNIB
Omni BankOMNOmni Bank
PBLPRBPBL
Republic BankRPBRepublic Bank
SGSGBSG
Services Integrity Savings & LoansSISServices Integrity Savings & Loans
Standard CharteredSCBStandard Chartered
Stanbic BankSTBStanbic Bank
UBAUBAUBA
UMBUMBUMB
Zeepay GhanaZEEZeepay Ghana
Zenith BankZEBZenith Bank

Response

Success Response (202)

{
  "response_message": "Request successfully received for processing",
  "response_code": "202"
}

Error Response (401)

{
  "response_message": "You are not allowed to use this service",
  "response_code": "100"
}

Example Usage

cURL

curl -X POST "https://api.bridgeagw.com/make_payment" \
  -H "Authorization: Basic <your_credentials>" \
  -H "Content-Type: application/json" \
  -d '{
    "service_id": 1,
    "reference": "Refund for Order #123",
    "customer_number": "0541234567 or 104321234567 or 012345678901",
    "transaction_id": "PAYOUT_001",
    "trans_type": "MTC",
    "amount": 25.50,
    "nw": "MTN",
    "nickname": "John Doe",
    "payment_option": "MOM",  # Use "BNK" for bank transfers, "CRD" for card payments
    "currency_code": "GHS",
    "currency_val": "1",
    "callback_url": "https://your-site.com/webhook/payout-status",
    "request_time": "2025-01-15 14:30:00"
  }'

JavaScript

const sendPayout = async (customerPhone, amount, network, reference) => {
  const response = await fetch('https://api.bridgeagw.com/make_payment', {
    method: 'POST',
    headers: {
      'Authorization': 'Basic <your_credentials>',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      service_id: 1,
      reference: reference,
      customer_number: customerPhone,
      transaction_id: `PAYOUT_${Date.now()}`,
      trans_type: "MTC",
      amount: amount,
      nw: network,
      nickname: "Customer",
      payment_option: "MOM", // Use "BNK" for bank transfers, "CRD" for card payments
      currency_code: "GHS",
      currency_val: "1",
      callback_url: "https://your-site.com/webhook/payout-status",
      request_time: new Date().toISOString()
    })
  });

  const result = await response.json();
  return result;
};

// Usage
sendPayout("0541234567", 25.50, "MTN", "Refund for Order #123")
  .then(result => {
    if (result.response_code === "202") {
      console.log("Payout initiated successfully");
    } else {
      console.error("Payout failed:", result.response_message);
    }
  });

Python

import requests
from datetime import datetime

def send_payout(customer_phone, amount, network, reference):
    url = "https://api.bridgeagw.com/make_payment"
    headers = {
        "Authorization": "Basic <your_credentials>",
        "Content-Type": "application/json"
    }
    data = {
        "service_id": 1,
        "reference": reference,
        "customer_number": customer_phone,
        "transaction_id": f"PAYOUT_{int(datetime.now().timestamp())}",
        "trans_type": "MTC",
        "amount": amount,
        "nw": network,
        "nickname": "Customer",
        "payment_option": "MOM",  # Use "BNK" for bank transfers, "CRD" for card payments
        "currency_code": "GHS",
        "currency_val": "1",
        "callback_url": "https://your-site.com/webhook/payout-status",
        "request_time": datetime.now().isoformat()
    }
    
    response = requests.post(url, headers=headers, json=data)
    return response.json()

# Usage
result = send_payout("0541234567", 25.50, "MTN", "Refund for Order #123")
if result['response_code'] == '202':
    print("Payout initiated successfully")
else:
    print(f"Payout failed: {result['response_message']}")

Payout Flow

  1. Initiate Payout: Send payout request with customer details (phone number for mobile money, account number for bank transfer, or card number for card payment)
  2. Funds Verification: System checks your account balance
  3. Payout Processing: Money is transferred to customer's mobile money account, bank account, or card
  4. Customer Notification: Customer receives notification (mobile money notification, bank transfer confirmation, or card payment receipt)
  5. Callback Notification: You receive confirmation via webhook

Use Cases

E-commerce & Marketplaces

  • Refunds: Return money to customers for cancelled orders
  • Seller Payouts: Pay marketplace sellers for completed sales
  • Rewards: Send cashback and loyalty rewards
  • Commission Payments: Pay affiliates and partners

Financial Services

  • Loan Disbursements: Send approved loans to borrowers
  • Insurance Claims: Process insurance claim payments
  • Investment Returns: Distribute investment profits
  • Salary Payments: Pay employees and contractors

Gig Economy

  • Worker Payments: Pay gig workers for completed tasks
  • Driver Payouts: Pay ride-sharing or delivery drivers
  • Freelancer Payments: Pay freelancers for completed work
  • Task Rewards: Reward users for completing tasks

Account Balance Requirements

Before sending payouts, ensure you have sufficient balance:

Check Payout Balance

const checkPayoutBalance = async () => {
  const response = await fetch('https://api.bridgeagw.com/get_account_balance', {
    method: 'POST',
    headers: {
      'Authorization': 'Basic <your_credentials>',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      service_id: 1,
      request_time: new Date().toISOString()
    })
  });
  
  const result = await response.json();
  const payoutBalance = result.response_data.payout_balance;
  
  if (payoutBalance < requiredAmount) {
    console.log('Insufficient payout balance. Please fund your wallet.');
  }
};

Fund Your Wallet

If you need to add funds to your payout balance, use the Deposit to Transfer Wallet feature.

Batch Payouts

Processing Multiple Payouts

const processBatchPayouts = async (payouts) => {
  const results = [];
  
  for (const payout of payouts) {
    try {
      const result = await sendPayout(
        payout.phone,
        payout.amount,
        payout.network,
        payout.reference
      );
      results.push({ ...payout, result });
    } catch (error) {
      results.push({ ...payout, error: error.message });
    }
  }
  
  return results;
};

// Usage
const payouts = [
  { phone: "0541234567", amount: 25.50, network: "MTN", reference: "Refund #1" },
  { phone: "0201234567", amount: 15.00, network: "VOD", reference: "Refund #2" },
  { phone: "104321234567", amount: 30.00, network: "UBA", reference: "Bank Payout #1" }
];

processBatchPayouts(payouts).then(results => {
  console.log('Batch payout results:', results);
});

Integration Examples

React Component for Payouts

import React, { useState } from 'react';

const PayoutForm = () => {
  const [formData, setFormData] = useState({
    phone: '',
    amount: '',
    network: 'MTN',
    reference: ''
  });
  const [loading, setLoading] = useState(false);

  const handleSubmit = async (e) => {
    e.preventDefault();
    setLoading(true);
    
    try {
      const result = await sendPayout(
        formData.phone,
        parseFloat(formData.amount),
        formData.network,
        formData.reference
      );
      
      if (result.response_code === "202") {
        alert('Payout initiated successfully!');
        setFormData({ phone: '', amount: '', network: 'MTN', reference: '' });
      } else {
        alert(`Payout failed: ${result.response_message}`);
      }
    } catch (error) {
      alert(`Error: ${error.message}`);
    } finally {
      setLoading(false);
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="text"
        placeholder="Customer Phone/Account/Card Number"
        value={formData.phone}
        onChange={(e) => setFormData({...formData, phone: e.target.value})}
        required
      />
      <input
        type="number"
        placeholder="Amount"
        value={formData.amount}
        onChange={(e) => setFormData({...formData, amount: e.target.value})}
        required
      />
      <select
        value={formData.network}
        onChange={(e) => setFormData({...formData, network: e.target.value})}
      >
        <optgroup label="Mobile Money">
          <option value="MTN">MTN Mobile Money</option>
          <option value="VOD">Vodafone Cash</option>
          <option value="AIR">AirtelTigo Money</option>
          <option value="GMO">G-Money</option>
        </optgroup>
        <optgroup label="Banks">
          <option value="ACB">Access Bank</option>
          <option value="ABS">ABSA Bank</option>
          <option value="UBA">UBA</option>
          <option value="GCB">GCB Bank</option>
          <option value="STB">Stanbic Bank</option>
          <option value="SCB">Standard Chartered</option>
          <option value="ZEB">Zenith Bank</option>
          <option value="ECO">Ecobank Ghana</option>
          <option value="GTB">GT Bank</option>
          <option value="FNB">FNB</option>
        </optgroup>
        <optgroup label="Cards">
          <option value="MAS">Mastercard</option>
          <option value="VIS">Visa</option>
        </optgroup>
      </select>
      <input
        type="text"
        placeholder="Reference"
        value={formData.reference}
        onChange={(e) => setFormData({...formData, reference: e.target.value})}
        required
      />
      <button type="submit" disabled={loading}>
        {loading ? 'Processing...' : 'Send Payout'}
      </button>
    </form>
  );
};

Best Practices

  • Sufficient Balance: Always check payout balance before sending
  • Valid Account Details: Ensure phone numbers (for mobile money), bank account numbers (for bank transfers), or card numbers (for card payments) are correct and active
  • Correct Network Codes: Use the appropriate network code from the Supported Networks table above
  • Payment Option Matching: Ensure payment_option matches your network type (MOM for mobile money, BNK for bank transfer, CRD for card payment)
  • Transaction References: Use clear, unique references for tracking
  • Error Handling: Implement proper error handling for failed payouts
  • Batch Processing: Process multiple payouts efficiently
  • Monitoring: Monitor payout success rates and failures

Common Use Cases

  • E-commerce Refunds: Return money to customers
  • Marketplace Payouts: Pay sellers and partners
  • Gig Economy: Pay workers and contractors
  • Financial Services: Disburse loans and claims
  • Rewards & Loyalty: Send cashback and bonuses
  • Emergency Payments: Send urgent payments to customers

Notes

  • Payouts are processed in real-time
  • Sufficient payout balance is required
  • Customer account details must be valid and active:
    • Phone numbers for mobile money payouts
    • Bank account numbers for bank transfer payouts
    • Card numbers for card payment payouts
  • Use the correct network code (nw) from the Supported Networks table
  • Ensure payment_option matches your payout method (MOM, BNK, or CRD)
  • Transaction limits may apply based on network or bank
  • Always monitor payout success rates
  • Use appropriate transaction references for easy tracking