Bridge API DocsBridge API Docs
Bridge API Docs
Api reference

Bill Payments

Pay utility and service bills via the Bridge API using bill product codes

Bill Payments

Pay supported bills by posting the customer or account identifier and the bill product code (nw). The API accepts the request and processes it asynchronously; final status is delivered to your callback URL.

Endpoint

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

Request Headers

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

Request Body

{
  "service_id": 55,
  "reference": "Bill payment",
  "transaction_id": "ksnyew2kei4a-alnlapk-uou",
  "trans_type": "BLP",
  "amount": 5,
  "account_number": "100000000001",
  "nw": "GOT",
  "callback_url": "https://webhook.site/0b429e73-ce5c-420b-af82-a346fb577c43",
  "request_time": "2025-10-03 23:50"
}

Parameters

ParameterTypeRequiredDescription
service_idintegerYesYour service identifier
referencestringYesPayment reference or description
transaction_idstringYesUnique transaction identifier
trans_typestringYesMust be BLP for bill payment
amountnumberYesPayment amount
account_numberstringYesCustomer or account number for the bill
nwstringYesBill product code (see table below)
callback_urlstringYesURL for asynchronous status notifications
request_timestringYesRequest timestamp

Supported bill products (nw)

CodeService
GOTGoTV
GTMGoTV Max
DSTDSTv
MPOMTN Postpaid
MPPMTN Prepaid Data
VPOVodafone Postpaid
VPPVodafone Prepaid Data
SFLSurfline
TLSTelesol
STTStartimes
ECGECG Postpaid
VBBVodafone Broadband (ADSL)
BXOBox Office
EPPECG Prepaid
GHWGhana Water
SCPSchool Placement
WREWAEC Result

Response

Accepted (202)

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

Example Usage

curl -X POST "https://api.bridgeagw.com/pay_bill" \
  -H "Authorization: Basic <your_credentials>" \
  -H "Content-Type: application/json" \
  -d '{
    "service_id": 55,
    "reference": "Bill payment",
    "transaction_id": "ksnyew2kei4a-alnlapk-uou",
    "trans_type": "BLP",
    "amount": 5,
    "account_number": "100000000001",
    "nw": "GOT",
    "callback_url": "https://your-site.com/webhook/bill-status",
    "request_time": "2025-10-03 23:50"
  }'
const response = await fetch('https://api.bridgeagw.com/pay_bill', {
  method: 'POST',
  headers: {
    'Authorization': 'Basic <your_credentials>',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    service_id: 55,
    reference: "Bill payment",
    transaction_id: "ksnyew2kei4a-alnlapk-uou",
    trans_type: "BLP",
    amount: 5,
    account_number: "100000000001",
    nw: "GOT",
    callback_url: "https://your-site.com/webhook/bill-status",
    request_time: "2025-10-03 23:50"
  })
});

const result = await response.json();
console.log(result);
import requests

url = "https://api.bridgeagw.com/pay_bill"
headers = {
    "Authorization": "Basic <your_credentials>",
    "Content-Type": "application/json"
}
data = {
    "service_id": 55,
    "reference": "Bill payment",
    "transaction_id": "ksnyew2kei4a-alnlapk-uou",
    "trans_type": "BLP",
    "amount": 5,
    "account_number": "100000000001",
    "nw": "GOT",
    "callback_url": "https://your-site.com/webhook/bill-status",
    "request_time": "2025-10-03 23:50"
}

response = requests.post(url, headers=headers, json=data)
result = response.json()
print(result)

Sandbox testing

Bill payment in sandbox uses 12-digit account numbers specific to each biller, not mobile MSISDNs. Passing a mobile number (e.g. 0244000001) with a biller nw code returns 019.

Last-digit rule: The last digit of the 12-digit account number controls the outcome — digits 08 produce a success, digit 9 produces a failure. The same rule applies to all billers.

Sandbox account numbers by biller

nwBillerSuccess account (…001)Failure account (…009)
GOTGoTV100000000001100000000009
GTMGoTV Max101000000001101000000009
DSTDSTv102000000001102000000009
MPOMTN Postpaid103000000001103000000009
MPPMTN Prepaid Data104000000001104000000009
VPOVodafone Postpaid105000000001105000000009
VPPVodafone Prepaid Data106000000001106000000009
SFLSurfline107000000001107000000009
TLSTelesol108000000001108000000009
STTStarTimes109000000001109000000009
ECGECG Postpaid200000000001200000000009
VBBVodafone Broadband201000000001201000000009
BXOBox Office202000000001202000000009
EPPECG Prepaid203000000001203000000009
GHWGhana Water204000000001204000000009
SCPSchool Placement205000000001205000000009
WREWAEC Result206000000001206000000009

Account number pattern: for biller at index N in the table (0-based), accounts are 100000000000 + N × 1000000000 through …000009. The payment_option field is optional — the API defaults it to BLP when omitted.

Scenarioaccount_numbernwExpected response_codeCallback sent?
Success (GoTV)100000000001GOT202Yes → 000/SUCCESS
Failure (GoTV)100000000009GOT015No
Success (ECG Prepaid)203000000001EPP202Yes → 000/SUCCESS
Success (Ghana Water)204000000001GHW202Yes → 000/SUCCESS
Invalid account3928978903232EPP019No
Wrong pairing (MSISDN + biller)0244000001GOT019No
Limit exceeded100000000001GOT016 (amount > 10000)No

Example sandbox request (ECG Prepaid):

{
  "service_id": 12345,
  "reference": "ECG top-up",
  "transaction_id": "BLP-SANDBOX-001",
  "trans_type": "BLP",
  "amount": 20,
  "account_number": "203000000001",
  "nw": "EPP",
  "callback_url": "https://your-site.com/webhook/bill-status",
  "request_time": "2026-01-15T14:30:00Z"
}

Callbacks

After you receive 202, rely on your callback_url for final status. See Callbacks.