Build With MyBundlePay

One integration for payments, cards, bills and payouts.

MyBundlePay gives developers a clean payment gateway, virtual account funding, payout rails, card issuing tools, bill payments, webhooks and merchant-ready checkout experiences.

REST APIs JSON based
Webhooks Real time events
Sandbox Test first

API Test Console

Test the current endpoint directly from the documentation. Secret keys stay inside this browser session.

Enter your test key, review the sample body for this page, then send a request.

Post https://mybundlepay.com/ng/api/transaction/verify

HEADERS

Authorization* string

Pass your {secret_key} as a bearer token in the request header to authorize this call.

Content-Type application/json

Ensure requests are sent as JSON.

BODY PARAMS

Your unique transaction reference you used during virtual account creation. This is used to verify funding status.

WEBHOOK NOTIFICATION

After successful payment, MyBundlePay will send a POST request to your webhook URL.

Headers

Content-Type application/json

X-Webhook-Secret Your webhook secret

Webhook Payload

{
  "amount": "6000.00",
  "fee": "230.00",
  "netAmount": "5770.00",

  "accountName": "OTTI MERCY",

  "bankName": "NIBSS",

  "method": "Virtual Account Funding",

  "externalReference": "8520985893522125839",

  "sessionId": "000010260615112957111052973618",

  "narration": "REF8520985893522125839 BO OTTI MERCY IFO MYBUNDLE",

  "status": "Completed",

  "date": "15 Jun 2026, 12:30 PM"
}
Webhook Verification Example (PHP)

<?php

$payload = file_get_contents("php://input");

$data = json_decode($payload,true);


$receivedSecret = $_SERVER['HTTP_X_WEBHOOK_SECRET'] ?? null;


$myWebhookSecret = "YOUR_WEBHOOK_SECRET";


if($receivedSecret !== $myWebhookSecret){

    http_response_code(401);

    echo json_encode([
        "status"=>"error",
        "message"=>"Invalid webhook secret"
    ]);

    exit;

}


// Process payment

$amount = $data['amount'];

$reference = $data['externalReference'];

$status = $data['status'];



// Your logic here



echo json_encode([

    "status"=>"success",

    "message"=>"Webhook received"

]);

?>
Expected Webhook Response

{
  "status": "success",
  "message": "Webhook received"
}
Webhook Failure Response

{
  "status": "error",
  "message": "Invalid webhook secret"
}

<?php
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://mybundlepay.com/ng/api/transaction/verify",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
      "tx_ref" => "TX8456463755"
  ]),
  CURLOPT_HTTPHEADER => array(
    "Content-Type: application/json",
    "Authorization: Bearer {secret_key}"
  ),
));

$response = curl_exec($curl);
curl_close($curl);
echo $response;
?>

                                

var axios = require('axios');
var data = JSON.stringify({
    "tx_ref": "TX8456463755"
});

var config = {
  method: 'post',
  url: 'https://mybundlepay.com/ng/api/transaction/verify',
  headers: { 
    'Content-Type': 'application/json', 
    'Authorization': 'Bearer {secret_key}'
  },
  data : data
};

axios(config)
.then(function (response) {
  console.log(JSON.stringify(response.data));
})
.catch(function (error) {
  console.log(error);
});

                                

Sample Responses

✅ Successful Transaction (Funded)


{
  "status": "success",
  "message": "Transaction verified successfully",
  "data": {
    "amount": 5000,
    "accountNumber": "60225522600",
    "accountName": "MYBUNDLEPAYLTD Checkout",
    "currency": "NGN",
    "expired_at": "2025-09-18 11:22:54"
  }
}

                        

❌ Pending Transaction (Active)


{
  "status": "failed",
  "message": "Transaction not yet funded",
  "data": {
    "amount": 5000,
    "accountNumber": "60225522600",
    "accountName": "MYBUNDLEPAYLTD Checkout",
    "currency": "NGN",
    "expired_at": "2025-09-18 11:22:54"
  }
}