Base URL
https://simhosting.ogdams.ng/api/v1
All endpoints below are relative to this base URL.
Authentication
Send your secret key as a Bearer token in the Authorization header:
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx
Get your key from Dashboard → API Key →
Network IDs
| ID | Network |
|---|---|
| 1 | MTN |
| 2 | Airtel |
| 3 | Glo |
| 4 | T2Mobile (formerly 9mobile) |
Network 4 is now branded T2Mobile (formerly 9mobile). The API may still return "9mobile" for this network.
Endpoints
Tap any endpoint to see its request parameters, a sample request and a sample response.
| Method | Endpoint | Description |
|---|---|---|
| GET | /get/balances | Wallet & stock balances |
| GET | /get/networks/id | Network IDs |
| GET | /get/data/plans | Data plans (v1 – v4) |
| POST | /vend/data | Vend data bundle |
| POST | /vend/airtime | Vend airtime |
| POST | /sns/airtime | Share & sell airtime |
| POST | /custom/ussd/code | Run a custom USSD code |
| POST | /data/purchase | SmePlug-compatible data |
| POST | /airtime/purchase | SmePlug-compatible airtime |
| POST | /data (no /v1) | Msorg-compatible data |
| POST | /topup (no /v1) | Msorg-compatible airtime |
Wallet & Lookup
GET
/get/balances
/get/balances
Fetch your wallet and stock balances.
No request body.
Request
curl -X GET \
'{{ config('app.url') }}/api/v1/get/balances' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx'
Response
{
"status": true,
"code": 200,
"data": {
"msg": {
"mainBalance": "25000.00",
"vtuMtn": "0.00",
"smeMtn": "0.00",
"dgMtn": "0.00"
},
"ref": null
}
}
GET
/get/networks/id
/get/networks/id
Fetch the network IDs used across the API.
No request body.
Request
curl -X GET \
'{{ config('app.url') }}/api/v1/get/networks/id' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx'
Response
{
"status": true,
"code": 200,
"data": {
"msg": { "1": "MTN", "2": "Airtel", "3": "Glo", "4": "9mobile" },
"ref": null
}
}
GET
/get/data/plans
/get/data/plans
Fetch all available data plans with their planId, price and validity. Also available at /v2, /v3 and /v4 (different grouping / extra fields).
No request body.
Request
curl -X GET \
'{{ config('app.url') }}/api/v1/get/data/plans' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx'
Response
{
"status": true,
"code": 200,
"data": {
"msg": [
{ "networkId": 1, "planId": 101, "name": "MTN SME 1GB", "price": "500.00", "validity": "30 Days" }
],
"ref": null
}
}
Vending
POST
/vend/data
/vend/data
Vend a data bundle to a phone number.
| Field | Type | Required | Description |
|---|---|---|---|
| networkId | integer | Required | 1, 2, 3 or 4 |
| planId | integer | Required | Plan ID from /get/data/plans |
| phoneNumber | string | Required | Recipient phone number |
| reference | string | Optional | Your unique reference (max 40 chars) |
Request
curl -X POST \
'{{ config('app.url') }}/api/v1/vend/data' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"networkId": 1, "planId": 101, "phoneNumber": "08012345678", "reference": "ref-12345"}'
Response
{
"status": true,
"code": 202,
"data": {
"msg": "Transaction recorded. Expect response in 5 secs",
"ref": "SX8K2J4NQ9"
}
}
POST
/vend/airtime
/vend/airtime
Vend airtime (VTU, MoMo, SNS or Awoof4u) to a phone number.
| Field | Type | Required | Description |
|---|---|---|---|
| networkId | integer | Required | 1, 2, 3 or 4 |
| amount | integer | Required | Amount in Naira (minimum 50) |
| phoneNumber | string | Required | Recipient phone number |
| type | string | Optional | vtu, momo, sns or awuf4u (default: vtu) |
| reference | string | Optional | Your unique reference (max 40 chars) |
Request
curl -X POST \
'{{ config('app.url') }}/api/v1/vend/airtime' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"networkId": 1, "amount": 500, "phoneNumber": "08012345678", "type": "vtu", "reference": "ref-12345"}'
Response
{
"status": true,
"code": 202,
"data": {
"msg": "Transaction recorded. Expect response in 5 secs",
"ref": "SX8K2J4NQ9"
}
}
POST
/sns/airtime
/sns/airtime
Share & sell (SNS) airtime on MTN, Airtel or Glo.
| Field | Type | Required | Description |
|---|---|---|---|
| networkId | integer | Required | 1 (MTN), 2 (Airtel) or 3 (Glo) |
| amount | integer | Required | Amount in Naira |
| phoneNumber | string | Required | Recipient phone number |
| nTimes | integer | Optional | Repeat count (default: 1) |
Request
curl -X POST \
'{{ config('app.url') }}/api/v1/sns/airtime' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"networkId": 1, "amount": 500, "phoneNumber": "08012345678"}'
Response
{
"status": true,
"code": 200,
"data": {
"msg": "Transaction recorded. Expect response in 5 secs",
"ref": null
}
}
POST
/custom/ussd/code
/custom/ussd/code
Run a custom USSD code on your SIM.
| Field | Type | Required | Description |
|---|---|---|---|
| networkId | integer | Required | 1, 2, 3 or 4 |
| ussd | string | Required | USSD code (must start with * and end with #) |
| reference | string | Optional | Your unique reference (max 40 chars) |
Request
curl -X POST \
'{{ config('app.url') }}/api/v1/custom/ussd/code' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"networkId": 1, "ussd": "*131*08012345678#", "reference": "ref-12345"}'
Response
{
"status": true,
"code": 202,
"data": {
"msg": "Transaction recorded. Expect response in 5 secs",
"ref": "SX8K2J4NQ9"
}
}
SmePlug-Compatible Endpoints
POST
/data/purchase
/data/purchase
SmePlug-style data purchase (mounted at /api/v1/data/purchase). Drop-in for SmePlug clients.
| Field | Type | Required | Description |
|---|---|---|---|
| network_id | integer | Required | SmePlug network ID |
| plan_id | integer | Required | Plan ID |
| phone | string | Required | Recipient phone number |
| customer_reference | string | Optional | Your reference |
Request
curl -X POST \
'{{ config('app.url') }}/api/v1/data/purchase' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"network_id": 1, "plan_id": 101, "phone": "08012345678", "customer_reference": "ref-12345"}'
Response
{
"status": true,
"data": {
"reference": "SX8K2J4NQ9",
"msg": "Transaction recorded. Expect response in 5 secs"
}
}
POST
/airtime/purchase
/airtime/purchase
SmePlug-style airtime purchase (mounted at /api/v1/airtime/purchase).
| Field | Type | Required | Description |
|---|---|---|---|
| network_id | integer | Required | SmePlug network ID |
| amount | integer | Required | Amount in Naira |
| phone | string | Required | Recipient phone number |
| customer_reference | string | Optional | Your reference |
Request
curl -X POST \
'{{ config('app.url') }}/api/v1/airtime/purchase' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"network_id": 1, "amount": 500, "phone": "08012345678", "customer_reference": "ref-12345"}'
Response
{
"status": true,
"data": {
"reference": "SX8K2J4NQ9",
"msg": "Transaction recorded. Expect response in 5 secs"
}
}
Msorg-Compatible Endpoints
POST
/data
/data
Msorg-style data purchase (mounted at /api/data, outside /v1). Drop-in for Msorg clients.
| Field | Type | Required | Description |
|---|---|---|---|
| network | integer | Required | Msorg network ID |
| plan | integer | Required | Plan ID |
| mobile_number | string | Required | Recipient phone number |
Header may use "Token sk_live_..." — the platform accepts it.
Request
curl -X POST \
'{{ config('app.url') }}/api/data' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"network": 1, "plan": 101, "mobile_number": "08012345678"}'
Response
{
"ident": "SX8K2J4NQ9",
"network": 1,
"mobile_number": "08012345678",
"Status": "successful",
"api_response": "Transaction recorded. Expect response in 5 secs",
"plan_network": "MTN",
"create_date": "2026-08-16T12:00:00.000000"
}
POST
/topup
/topup
Msorg-style airtime purchase (mounted at /api/topup).
| Field | Type | Required | Description |
|---|---|---|---|
| network | integer | Required | Msorg network ID |
| amount | integer | Required | Amount in Naira |
| mobile_number | string | Required | Recipient phone number |
| airtime_type | string | Optional | e.g. vtu |
Header may use "Token sk_live_..." — the platform accepts it.
Request
curl -X POST \
'{{ config('app.url') }}/api/topup' \
-H 'Authorization: Bearer sk_live_xxxxxxxxxxxxxxxx' \
-H 'Content-Type: application/json' \
-d '{"network": 1, "amount": 500, "mobile_number": "08012345678"}'
Response
{
"ident": "SX8K2J4NQ9",
"network": 1,
"mobile_number": "08012345678",
"plan": 101,
"Status": "successful",
"api_response": "Transaction recorded. Expect response in 5 secs",
"plan_network": "MTN",
"create_date": "2026-08-16T12:00:00.000000"
}
Response Format & Codes
Native endpoints return a consistent envelope: {"status": true|false, "code": <int>, "data": {"msg": "…", "ref": "…"}}
| Code | Meaning |
|---|---|
| 200 | Successful |
| 201 | Queued — received by the platform |
| 202 | Processing — in progress |
| 424 | Failed — provider returned an error |
| 401 | Invalid or missing API key |
| 404 | Transaction not found |
Msorg-compatible endpoints (/api/data & /api/topup) return a different flat shape (see their examples).
Webhooks (Optional)
Get notified when a transaction succeeds or fails. Set your webhook URL in your Dashboard → Webhook URL →
Events are sent as POST requests with an
ogdams-simhosting-signature header — an
HMAC-SHA512 hash of the raw request body signed with your secret key.
MTN
Airtel
Glo
T2Mobile