Disburse Funds to Vendor Bank Accounts (Payouts)

πŸ“˜ Use Case

A fintech app, gig platform, or marketplace wants to send money to users, vendors, or freelancers directly into their Nigerian bank accounts.


Why Use Payouts?

  • Automate vendor or partner settlements
  • Reduce reliance on manual bank transfers
  • Track disbursements programmatically
  • Improve payout speed and reliability

Prerequisites

  • TransactPay business account with payouts enabled
  • API secret key and RSA public key
  • Verified recipient bank account details
  • Sufficient wallet or settlement balance

Step-by-Step Implementation


Step 1: Prepare Payout Payload

Basic required fields:

  • account_number
  • bank_code (e.g., 057 for Zenith, 011 for First Bank)
  • amount
  • narration (optional)
  • reference (your own transaction ID)

Node.js Code to Send Payout

const axios = require("axios");
const NodeRSA = require("node-rsa");
const fs = require("fs");
require("dotenv").config();

const pubKey = fs.readFileSync("./transactpay_pub.pem", "utf8");
const rsa = new NodeRSA(pubKey);
rsa.setOptions({ encryptionScheme: "pkcs1" });

const payoutPayload = {
  account_number: "1234567890",
  bank_code: "057", // Zenith Bank
  amount: 15000, // NGN 15,000
  reference: "PAYOUT-20250711-001",
  narration: "Vendor settlement for Order #1098"
};

const encrypted = rsa.encrypt(JSON.stringify(payoutPayload), "base64");

axios
  .post("https://api.transactpay.io/disbursement/single", {
    data: encrypted,
  }, {
    headers: {
      Authorization: `Bearer ${process.env.TRANSACTPAY_SECRET_KEY}`,
    },
  })
  .then((res) => {
    console.log("Disbursement response:", res.data);
  })
  .catch((err) => {
    console.error("Disbursement error:", err.response?.data || err.message);
  });
import json, requests, os
from dotenv import load_dotenv
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding

load_dotenv()
key = os.getenv("TRANSACTPAY_SECRET_KEY")

with open("transactpay_pub.pem", "rb") as key_file:
    pub_key = serialization.load_pem_public_key(key_file.read())

payload = {
    "account_number": "1234567890",
    "bank_code": "057",
    "amount": 15000,
    "reference": "PAYOUT-20250711-001",
    "narration": "Vendor settlement for Order #1098"
}

encrypted = pub_key.encrypt(json.dumps(payload).encode(), padding.PKCS1v15())

res = requests.post(
    "https://api.transactpay.io/disbursement/single",
    headers={"Authorization": f"Bearer {key}"},
    json={"data": encrypted.hex()}
)

print("Disbursement response:", res.json())


Sample API Response

{
  "status": true,
  "message": "Payout successful",
  "data": {
    "reference": "PAYOUT-20250711-001",
    "status": "processing"
  }
}

Step 2: Track Disbursement Status via Webhook

Listen for webhook events like:

{
  "event": "disbursement.success",
  "data": {
    "reference": "PAYOUT-20250711-001",
    "status": "success",
    "amount": 15000
  }
}

Update your database once confirmed.


Tips

  • Always store payout references uniquely
  • Log both API and webhook events for audit
  • Monitor wallet balance to avoid payout failures