curl --request POST \
--url https://api.nomba.com/v2/bill/betting \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'accountId: <accountid>' \
--data '
{
"bettingProvider": "bet9ja",
"merchantTxRef": "12345",
"phoneNumber": "09012345678",
"payerName": "John Doe",
"amount": 1000,
"customerId": "customer123"
}
'import requests
url = "https://api.nomba.com/v2/bill/betting"
payload = {
"bettingProvider": "bet9ja",
"merchantTxRef": "12345",
"phoneNumber": "09012345678",
"payerName": "John Doe",
"amount": 1000,
"customerId": "customer123"
}
headers = {
"accountId": "<accountid>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
accountId: '<accountid>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
bettingProvider: 'bet9ja',
merchantTxRef: '12345',
phoneNumber: '09012345678',
payerName: 'John Doe',
amount: 1000,
customerId: 'customer123'
})
};
fetch('https://api.nomba.com/v2/bill/betting', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nomba.com/v2/bill/betting",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'bettingProvider' => 'bet9ja',
'merchantTxRef' => '12345',
'phoneNumber' => '09012345678',
'payerName' => 'John Doe',
'amount' => 1000,
'customerId' => 'customer123'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"accountId: <accountid>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nomba.com/v2/bill/betting"
payload := strings.NewReader("{\n \"bettingProvider\": \"bet9ja\",\n \"merchantTxRef\": \"12345\",\n \"phoneNumber\": \"09012345678\",\n \"payerName\": \"John Doe\",\n \"amount\": 1000,\n \"customerId\": \"customer123\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("accountId", "<accountid>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.nomba.com/v2/bill/betting")
.header("accountId", "<accountid>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"bettingProvider\": \"bet9ja\",\n \"merchantTxRef\": \"12345\",\n \"phoneNumber\": \"09012345678\",\n \"payerName\": \"John Doe\",\n \"amount\": 1000,\n \"customerId\": \"customer123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nomba.com/v2/bill/betting")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["accountId"] = '<accountid>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bettingProvider\": \"bet9ja\",\n \"merchantTxRef\": \"12345\",\n \"phoneNumber\": \"09012345678\",\n \"payerName\": \"John Doe\",\n \"amount\": 1000,\n \"customerId\": \"customer123\"\n}"
response = http.request(request)
puts response.read_body{
"code": "200",
"description": "SUCCESS",
"message": "Transaction completed Successfully",
"status": true,
"data": {
"id": "API-BETTING-4B8C8-7e3a91c2-58d4-4f0b-b6a2-c9d18e5f3a47",
"status": "SUCCESS",
"type": "betting",
"amount": 2000,
"source": "api",
"sourceUserId": null,
"customerBillerId": "1234567890",
"productId": "bet9ja",
"meta": {
"api_rrn": "260927113024",
"rrn": "260927113024",
"api_account_id": "0167288-d989-460a-bbde-9842f2b4320f",
"api_client_id": "2167288-d989-460a-bbde-9842f2b4320f",
"user_id": "0167288-d989-460a-bbde-9842f2b4320f",
"merchantTxRef": "REF-29-07-2026-15",
"allowDuplicate": true,
"sender_name": "John Doe",
"idempotentKey": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"pos_withdrawal_id": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"userName": "John Doe",
"isCorporate": "true",
"currency": "NGN",
"hooksEligible": "true",
"isSubscribedToSavingsService": false,
"isSubscribedToLoanService": false,
"txnAlertEligible": false,
"banking_entity_id": 189585760,
"banking_entity_user_id": 188595905,
"banking_entity_type": "CORPORATE",
"transactionCategory": "Bills & Utility",
"bettingProvider": "bet9ja",
"customerId": "1234567890",
"phoneNumber": "09012345678",
"amount_charged": "2000.0",
"paymentVendor": "wallet",
"wallet_balance": "955.85",
"wallet_currency": "NGN",
"gatewayMessage": "Success",
"billingServiceResponse": "SUCCESS"
},
"userId": null,
"timeCreated": "2026-09-27T10:30:24.207+00:00"
}
}{
"code": "201",
"description": "PROCESSING",
"message": "Processing",
"status": true,
"data": {
"id": "API-BETTING-4B8C8-7e3a91c2-58d4-4f0b-b6a2-c9d18e5f3a47",
"status": "PENDING_BILLING",
"type": "betting",
"amount": 2000,
"source": "api",
"sourceUserId": null,
"customerBillerId": "1234567890",
"productId": "bet9ja",
"meta": {
"api_rrn": "260927113024",
"rrn": "260927113024",
"api_account_id": "0167288-d989-460a-bbde-9842f2b4320f",
"api_client_id": "2167288-d989-460a-bbde-9842f2b4320f",
"user_id": "0167288-d989-460a-bbde-9842f2b4320f",
"merchantTxRef": "REF-29-07-2026-15",
"allowDuplicate": true,
"sender_name": "John Doe",
"idempotentKey": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"pos_withdrawal_id": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"userName": "John Doe",
"isCorporate": "true",
"currency": "NGN",
"hooksEligible": "true",
"isSubscribedToSavingsService": false,
"isSubscribedToLoanService": false,
"txnAlertEligible": false,
"banking_entity_id": 189585760,
"banking_entity_user_id": 188595905,
"banking_entity_type": "CORPORATE",
"transactionCategory": "Bills & Utility",
"bettingProvider": "bet9ja",
"customerId": "1234567890",
"phoneNumber": "09012345678",
"amount_charged": "2000.0",
"paymentVendor": "wallet",
"wallet_balance": "955.85",
"wallet_currency": "NGN"
},
"userId": null,
"timeCreated": "2026-09-27T10:30:24.207+00:00"
}
}{
"code": "400",
"description": "Request failed."
}{
"code": "401",
"description": "Unauthorized"
}{
"code": "403",
"description": "Forbidden"
}{
"code": "404",
"description": "Record not found"
}{
"code": "429",
"description": "Too many requests"
}{
"code": "500",
"description": "Server error"
}{
"code": "400",
"description": "Request failed."
}Vend betting via parent account (v2)
You can use this endpoint to vend betting via parent account
curl --request POST \
--url https://api.nomba.com/v2/bill/betting \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'accountId: <accountid>' \
--data '
{
"bettingProvider": "bet9ja",
"merchantTxRef": "12345",
"phoneNumber": "09012345678",
"payerName": "John Doe",
"amount": 1000,
"customerId": "customer123"
}
'import requests
url = "https://api.nomba.com/v2/bill/betting"
payload = {
"bettingProvider": "bet9ja",
"merchantTxRef": "12345",
"phoneNumber": "09012345678",
"payerName": "John Doe",
"amount": 1000,
"customerId": "customer123"
}
headers = {
"accountId": "<accountid>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
accountId: '<accountid>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
bettingProvider: 'bet9ja',
merchantTxRef: '12345',
phoneNumber: '09012345678',
payerName: 'John Doe',
amount: 1000,
customerId: 'customer123'
})
};
fetch('https://api.nomba.com/v2/bill/betting', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.nomba.com/v2/bill/betting",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'bettingProvider' => 'bet9ja',
'merchantTxRef' => '12345',
'phoneNumber' => '09012345678',
'payerName' => 'John Doe',
'amount' => 1000,
'customerId' => 'customer123'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"accountId: <accountid>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.nomba.com/v2/bill/betting"
payload := strings.NewReader("{\n \"bettingProvider\": \"bet9ja\",\n \"merchantTxRef\": \"12345\",\n \"phoneNumber\": \"09012345678\",\n \"payerName\": \"John Doe\",\n \"amount\": 1000,\n \"customerId\": \"customer123\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("accountId", "<accountid>")
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.nomba.com/v2/bill/betting")
.header("accountId", "<accountid>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"bettingProvider\": \"bet9ja\",\n \"merchantTxRef\": \"12345\",\n \"phoneNumber\": \"09012345678\",\n \"payerName\": \"John Doe\",\n \"amount\": 1000,\n \"customerId\": \"customer123\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.nomba.com/v2/bill/betting")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["accountId"] = '<accountid>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"bettingProvider\": \"bet9ja\",\n \"merchantTxRef\": \"12345\",\n \"phoneNumber\": \"09012345678\",\n \"payerName\": \"John Doe\",\n \"amount\": 1000,\n \"customerId\": \"customer123\"\n}"
response = http.request(request)
puts response.read_body{
"code": "200",
"description": "SUCCESS",
"message": "Transaction completed Successfully",
"status": true,
"data": {
"id": "API-BETTING-4B8C8-7e3a91c2-58d4-4f0b-b6a2-c9d18e5f3a47",
"status": "SUCCESS",
"type": "betting",
"amount": 2000,
"source": "api",
"sourceUserId": null,
"customerBillerId": "1234567890",
"productId": "bet9ja",
"meta": {
"api_rrn": "260927113024",
"rrn": "260927113024",
"api_account_id": "0167288-d989-460a-bbde-9842f2b4320f",
"api_client_id": "2167288-d989-460a-bbde-9842f2b4320f",
"user_id": "0167288-d989-460a-bbde-9842f2b4320f",
"merchantTxRef": "REF-29-07-2026-15",
"allowDuplicate": true,
"sender_name": "John Doe",
"idempotentKey": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"pos_withdrawal_id": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"userName": "John Doe",
"isCorporate": "true",
"currency": "NGN",
"hooksEligible": "true",
"isSubscribedToSavingsService": false,
"isSubscribedToLoanService": false,
"txnAlertEligible": false,
"banking_entity_id": 189585760,
"banking_entity_user_id": 188595905,
"banking_entity_type": "CORPORATE",
"transactionCategory": "Bills & Utility",
"bettingProvider": "bet9ja",
"customerId": "1234567890",
"phoneNumber": "09012345678",
"amount_charged": "2000.0",
"paymentVendor": "wallet",
"wallet_balance": "955.85",
"wallet_currency": "NGN",
"gatewayMessage": "Success",
"billingServiceResponse": "SUCCESS"
},
"userId": null,
"timeCreated": "2026-09-27T10:30:24.207+00:00"
}
}{
"code": "201",
"description": "PROCESSING",
"message": "Processing",
"status": true,
"data": {
"id": "API-BETTING-4B8C8-7e3a91c2-58d4-4f0b-b6a2-c9d18e5f3a47",
"status": "PENDING_BILLING",
"type": "betting",
"amount": 2000,
"source": "api",
"sourceUserId": null,
"customerBillerId": "1234567890",
"productId": "bet9ja",
"meta": {
"api_rrn": "260927113024",
"rrn": "260927113024",
"api_account_id": "0167288-d989-460a-bbde-9842f2b4320f",
"api_client_id": "2167288-d989-460a-bbde-9842f2b4320f",
"user_id": "0167288-d989-460a-bbde-9842f2b4320f",
"merchantTxRef": "REF-29-07-2026-15",
"allowDuplicate": true,
"sender_name": "John Doe",
"idempotentKey": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"pos_withdrawal_id": "0167288-d989-460a-bbde-9842f2b4320f_REF-29-07-2026-15",
"userName": "John Doe",
"isCorporate": "true",
"currency": "NGN",
"hooksEligible": "true",
"isSubscribedToSavingsService": false,
"isSubscribedToLoanService": false,
"txnAlertEligible": false,
"banking_entity_id": 189585760,
"banking_entity_user_id": 188595905,
"banking_entity_type": "CORPORATE",
"transactionCategory": "Bills & Utility",
"bettingProvider": "bet9ja",
"customerId": "1234567890",
"phoneNumber": "09012345678",
"amount_charged": "2000.0",
"paymentVendor": "wallet",
"wallet_balance": "955.85",
"wallet_currency": "NGN"
},
"userId": null,
"timeCreated": "2026-09-27T10:30:24.207+00:00"
}
}{
"code": "400",
"description": "Request failed."
}{
"code": "401",
"description": "Unauthorized"
}{
"code": "403",
"description": "Forbidden"
}{
"code": "404",
"description": "Record not found"
}{
"code": "429",
"description": "Too many requests"
}{
"code": "500",
"description": "Server error"
}{
"code": "400",
"description": "Request failed."
}code field in the response reflects the HTTP status code of the response. For example, 200 means the request completed successfully, and 201 means it was accepted and is still being processed.Authorizations
Nomba authenticates API calls with OAuth2 HTTP bearer tokens. There are two methods of authentication; Client-Credentials method and PKCE (Proof Key for Code Exchange) method. In each of the methods, You will get an ACCESS_TOKEN. You need to use an "Authorization" HTTP header to provide your ACCESS_TOKEN. For example: Authorization: {ACCESS_TOKEN}.
Headers
The parent accountId of the business.
"890022ce-bae0-45c1-9b9d-ee7872e6ca27"
Body
The request payload required to vend betting
Response
OK - your request was successful.
Response code. This reflects the HTTP status code of the response, e.g. 200 when the request completed successfully and 201 when it was accepted and is still being processed.
200, 201, 400, 401, 403, 429, 500 "200"
Response description
"SUCCESS"
Show child attributes
Show child attributes
Response message
"Transaction completed Successfully"
Whether the request was successful
true