Reseller API Documentation
Powering Ghana's automated data delivery infrastructure.
Scale Your Business Today
CREATE AN ACCOUNTLogin to generate Your API Key.
Everything You Can Do as a Reseller
API Key Management
Generate your own API key to process orders, integrate into your website, or automate your sales system.
Developer Sandbox
Use your test API key to simulate successful orders and payments without using real wallet funds or MoMo.
Instant Wallet Loading
Load your wallet directly on the platform using Paystack to ensure you never run out of credit.
Pay & Order (No Wallet Needed)
Allow your customers to pay directly on your platform. Once payment is successful, data is delivered instantly without manually funding your wallet.
Manual & Bulk Orders
Buy data directly from your account. Support for individual manual orders or massive bulk data orders.
Real-time Webhooks
Receive instant POST notifications to your server whenever the status of your data order changes.
Authentication & Environments
Your environment is automatically determined by your API key prefix.
| Environment | API Key Prefix | Outcome |
|---|---|---|
| Sandbox | nd_test_xxxxxx |
Simulation mode. No wallet charges. No real data sent, but records are inserted into the database for testing. |
| Live | nd_live_xxxxxx |
Real Mode. Charges wallet. Sends actual data to phone. |
| Pay & Order | nd_live_xxxxxx |
Zero Wallet Balance: No wallet funding needed. We handle the payment via Paystack, and your profit is automatically sent to you.
Click here for Pay & Order details |
Required Headers for all requests:
- ✅ x-api-key: YOUR_API_KEY
- ✅ Content-Type: application/json
- ✅ Accept: application/json
Data Plans & Three-Tier Pricing
https://onlinehorsepowerdata.com/api/reseller/plans
Quick URL Examples:
.../plans?network=mtn
.../plans?network=at&show=text
.../plans?packageId=18
Available Query Parameters
| Parameter | Type | Description |
|---|---|---|
network |
String | Filter by mtn, telecel, or at. |
packageId |
Integer | Returns data for one specific package ID. |
show |
String | Use text to get a clean, numbered list for WhatsApp. |
Pricing Logic
JSON Response
For web and app integrationsText Response
For WhatsApp & SMS botsJSON Output Structure
{
"status": "success",
"mode": "live",
"data": {
"package_id": 18,
"network": "MTN",
"gig_size": "10GB",
"price": "12.00"
}
}
Developer Notes
Auto-Pricing
The system automatically calculates the price based on your assigned Reseller Tier.
Single Fetch
Use packageId for instant price checks without loading the entire list.
text mode to display prices directly to your customers on WhatsApp without any coding.
Wallet Balance
Check your current GHS balance. (Sandbox keys return a static value of 99,999.00).
GEThttps://onlinehorsepowerdata.com/api/reseller/wallet
Place Data Order
Use this endpoint to trigger a data purchase.
422 (status: failed, reason: not_on_beneficiary_list) without charging your wallet balance, and are automatically recorded in our system as candidates for future approval.
placed immediately, but no data will be delivered to the number (customer).
https://onlinehorsepowerdata.com/api/reseller/order
{
"package_id": 16,
"phone_number": "0240000000",
"network": "MTN"
}
Example Sandbox Response:
{
"status": "success",
"reference": "TEST_API_1775642298260",
"mode": "sandbox"
}
🔍 Verify Beneficiaries (MTN)
Check whether phone numbers are on our beneficiary list before you accept or dispatch an order. This lets you warn customers or filter numbers upfront so transactions run smoothly.
Automatic Candidate Registration
When you verify a number that is not currently on our beneficiary list, the number is automatically recorded in our system as a candidate so it can be approved for future orders.
Zero Wallet Risk
If you place an API order for an ineligible MTN number, our system immediately rejects the order (HTTP 422) with no wallet debit, keeping your balance 100% safe.
https://onlinehorsepowerdata.com/api/reseller/verify-beneficiaries
Request Body (JSON) — Single or Batch (up to 500 numbers):
{
"phoneNumbers": [
"0240000000",
"0551234567"
],
"network": "MTN"
}
Successful JSON Response:
{
"status": "success",
"summary": {
"total": 2,
"eligible": 1,
"ineligible": 1
},
"results": [
{
"phoneNumber": "0240000000",
"normalizedPhone": "0240000000",
"eligible": true,
"reason": "eligible",
"message": "This number is on our beneficiary list."
},
{
"phoneNumber": "0551234567",
"normalizedPhone": "0551234567",
"eligible": false,
"reason": "not_on_beneficiary_list",
"message": "This number is not on our beneficiary list. It has been recorded for future addition."
}
],
"eligible_numbers": [
"0240000000"
],
"ineligible_numbers": [
"0551234567"
]
}
eligible_numbers array to proceed with only verified contacts in bulk checkout flows.
📞 Instant Airtime Top-Up (2% Reseller Discount)
Top up airtime instantly for numbers across MTN, Telecel, and AT (AirtelTigo). Resellers automatically receive an instant 2% commission / discount off the face value, meaning you are only charged 98% of the amount.
2% Instant Discount
When you top up ₵100.00 airtime, only ₵98.00 is deducted from your wallet balance. Your 2% savings is applied in real-time with zero delay.
Automatic Wallet Protection
If the telecommunication network or gateway experiences downtime, your wallet is automatically refunded with the exact charged amount instantly.
https://onlinehorsepowerdata.com/api/reseller/airtime
Request Body (JSON):
{
"phone_number": "0241234567",
"network": "MTN",
"amount": 50
}
| Parameter | Type | Required | Description |
|---|---|---|---|
phone_number |
String | Yes | 10-digit Ghana phone number (e.g., 0241234567 or 233241234567). |
network |
String | Yes | Recipient network: MTN, TELECEL, or AT. |
amount |
Numeric | Yes | Airtime face value amount in GHS (minimum 1.00). |
Successful Live JSON Response:
{
"status": "success",
"mode": "live",
"reference": "APIAT6A8E0F2B0B8A1",
"network": "MTN",
"phone_number": "0241234567",
"amount": 50,
"commission": 1,
"charged_amount": 49,
"commission_rate": "2%",
"wallet_balance": 245.50,
"message": "Airtime top-up delivered successfully."
}
Successful Sandbox Response:
{
"status": "success",
"mode": "sandbox",
"reference": "TEST-AIRTIME-6A8E0F2B",
"network": "MTN",
"phone_number": "0241234567",
"amount": 50,
"commission": 1,
"charged_amount": 49,
"commission_rate": "2%",
"wallet_balance": 99999,
"message": "Sandbox test airtime order processed successfully (Simulated)."
}
📡 Airtime Order Status
Query the real-time status and delivery confirmation of an airtime order using its reference string.
GEThttps://onlinehorsepowerdata.com/api/reseller/airtime/status/{reference}
{
"status": "success",
"mode": "live",
"data": {
"reference": "APIAT6A8E0F2B0B8A1",
"phone_number": "0241234567",
"network": "MTN",
"amount": 50,
"charged_amount": 49,
"status": "delivered",
"api_status": "success",
"created_at": "2026-09-16 12:45:00"
}
}
Data Order Status
Retrieve order details using the reference number.
POSThttps://onlinehorsepowerdata.com/api/reseller/order/status/{reference}
{
"status": "success",
"data": {
"reference": "REF65249619998",
"phone_number": "0545506....",
"network": "MTN",
"order_status": "delivered",
"mode": "live",
"created_at": "2025-10-08 09:38:42"
}
}
Order Status Definitions
🔥 Pay & Order (No Wallet Needed)
Allow your customers to pay directly with Paystack on your website or app. Zero wallet pre-funding required. When payment completes, your profit is automatically split into your account and the data bundle is delivered immediately.
💡 Do I Need to Handle Paystack Webhooks on My Server?
NO! Notify Data handles the entire Paystack webhook automatically.
- Automated Payment Verification: Paystack communicates directly with Notify Data's server when a customer completes payment.
- Instant Profit Settlement: Your profit share (the markup between your retail price and wholesale cost) is automatically routed to your Paystack Subaccount (MoMo or Bank).
- Instant Data Fulfillment: The data bundle is dispatched and delivered directly to your customer's phone number upon payment.
How The Flow Works in 3 Steps:
Initialize Payment
Your backend calls POST /api/reseller/initialize-payment with customer and bundle details to get an authorization_url.
Customer Pays
Redirect your customer to the authorization_url where they pay securely via Mobile Money or Card.
Automatic Delivery
Notify Data's webhook automatically fulfills the order and pays your profit. You can verify order status anytime using the status API.
Endpoint Specification
https://onlinehorsepowerdata.com/api/reseller/initialize-payment
| Header | Type | Description |
|---|---|---|
Authorization | string | Bearer <YOUR_API_KEY> |
Content-Type | string | application/json |
Accept | string | application/json |
Request Body (JSON):
| Field | Type | Required | Description |
|---|---|---|---|
email |
string |
Required | Customer's email address for receiving Paystack payment receipts. |
package_id |
integer |
Required | ID of the data bundle package (fetch package IDs from GET /api/reseller/plans). |
phone_number |
string |
Required | Recipient phone number that will receive the data bundle (e.g., 0240000000). |
network |
string |
Required | Network carrier: MTN, Telecel, or AT. |
client_price |
numeric |
Required | The amount in GHS you want to charge your customer (must be equal to or higher than wholesale package price). |
user_id |
integer |
Required | Your numeric Reseller User ID (found in your dashboard profile). |
type |
string |
Optional | redirect (default) or inline. |
Example Request:
curl -X POST "https://onlinehorsepowerdata.com/api/reseller/initialize-payment" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email": "customer@email.com",
"package_id": 16,
"phone_number": "0240000000",
"network": "MTN",
"client_price": 12.00,
"user_id": 5
}'
Successful Response:
{
"status": true,
"authorization_url": "https://checkout.paystack.com/3v9y8ab7cd",
"reference": "PAY_6A7E89B10F2",
"message": "Payment initialized successfully"
}
authorization_url redirects to a simulated success page without charging real mobile money, and automatically fulfills a test order.
🔍 Check Transaction & Delivery Status
Query the payment confirmation and data bundle delivery status using the unique payment reference.
https://onlinehorsepowerdata.com/api/reseller/payment-status/{reference}
Example Status Request:
curl -X GET "https://onlinehorsepowerdata.com/api/reseller/payment-status/PAY_6A7E89B10F2" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Accept: application/json"
Successful Response:
{
"status": "success",
"payment": {
"reference": "PAY_6A7E89B10F2",
"amount": "12.24",
"gateway": "paystack",
"status": "success"
},
"order": {
"id": 147,
"phone_number": "0240000000",
"network": "MTN",
"status": "delivered"
}
}
🎫 Purchase Result Checker Cards
Purchase WAEC result checker serials and PIN codes (WASSCE or BECE) instantly using your reseller wallet balance. If you have uploaded your own result checkers in your dashboard inventory, the API will automatically prioritize your uploaded pins and fulfill the order for free (₵0 cost price).
POSThttps://onlinehorsepowerdata.com/api/reseller/result-checker
Request Body (JSON):
{
"checker_type": "WASSCE",
"phone_number": "0541234567"
}
Successful JSON Response:
{
"status": "success",
"mode": "live",
"checker_type": "WASSCE",
"serial_number": "WGR240103245",
"pin": "102947294827",
"reference": "APIRC6A8E0F2B0B8A1"
}
📱 MTN AFA Registration
Submit a registration request for MTN AFA (African Alliance) services for any customer. The registration will be automatically queued and processed by administrators.
POSThttps://onlinehorsepowerdata.com/api/reseller/afa-register
Request Body (JSON):
{
"full_name": "Kofi Mensah",
"ghana_card_number": "GHA-719384918-3",
"town": "Kumasi",
"phone_number": "0241234567"
}
Successful JSON Response:
{
"status": "success",
"mode": "live",
"reference": "APIADA6A8E0F3D0C2F"
}
Webhooks (Real-time Notifications)
Instead of polling the status endpoint, configure a Webhook URL in your dashboard to receive instant POST updates.
200 OK status. We will retry up to 3 times if your server is unreachable.
Testing with Webhook.site
- Go to Webhook.site and copy your unique URL.
- Paste it into your Dashboard > Developer Access webhook settings.
- Use the API Tester below to place a Sandbox order.
- Watch the POST request arrive instantly on Webhook.site!
Event Payload (JSON)
{
"reference": "TEST1775880958226",
"order_id": 15071,
"status": "placed",
"phone_number": "0248189335",
"network": "MTN",
"signature": "bb09c8606002af8fd1719a18a4dceb9f232e0ea36aeb927ade5e0fc47acd1d41"
}
Retry Policy
- Attempt 1: Immediate on status change.
- Attempt 2: 5 minutes after first failure.
- Attempt 3: 15 minutes after second failure.
WhatsApp Bot Automation (via BroadcastBuddy)
Integrate your business directly with the BroadcastBuddy API to deploy custom WhatsApp bots. This allows you to automate data order processing, handle real-time price inquiries, and manage customer interactions without manual intervention.
1. Check Session Status
Verify if your WhatsApp bot instance is currently online and connected to the BroadcastBuddy engine.
GEThttps://broadcastbuddy.app/api/v1/session/status/{sessionId}
2. Sync Profile & Subscription
Retrieve active subscription plans (Pro/Free), license expiration dates, and account metadata.
GEThttps://broadcastbuddy.app/api/profile?sessionId={sessionId}
3. Deploy Custom Bot Flows
Instantly clone a pre-configured data-vending flow from a master session to an agent's session using the Flow API.
POSThttps://broadcastbuddy.app/api/bot-flows/copy
{
"flowId": 3,
"sourceSessionId": "YOUR_MASTER_ID",
"targetSessionId": "AGENT_SESSION_ID"
}
sessionId stored in your local database to authenticate requests. Ensure your Paystack callback updates the local subscription_status to 'active' before triggering the session start command.
API Live Tester
{}