API Documentation

Version 1.0  ·  REST API  ·  JSON

The NotifyPro API lets you send SMS, emails, and OTP codes programmatically from your application. All requests use HTTPS and return JSON responses.

Base URL https://api.notifypro.ng/v1

Authentication

All API requests must include your secret API key in the request header. Generate API keys from your dashboard.

Authorization: Bearer YOUR_API_KEY

Keep your API key secret. Never expose it in frontend code or public repositories.

Error Codes

Code Meaning
200 Success
400 Bad request — missing or invalid parameters
401 Unauthorized — invalid or missing API key
402 Insufficient wallet balance
422 Unprocessable — e.g. invalid phone number format
429 Rate limit exceeded
500 Internal server error

Send SMS

POST/sms/send

Send a single SMS to one recipient.

Request Body

Parameter Type Description
torequired string Recipient phone number in E.164 format (e.g. +2348012345678)
messagerequired string SMS body text. Max 160 characters per SMS unit.
sender_id string Custom sender name (max 11 chars). Defaults to NotifyPro.

Example Request

curl -X POST https://api.notifypro.ng/v1/sms/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+2348012345678",
    "message": "Your order #1042 has been shipped!",
    "sender_id": "MyBrand"
  }'
const res = await fetch('https://api.notifypro.ng/v1/sms/send', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    to: '+2348012345678',
    message: 'Your order #1042 has been shipped!',
    sender_id: 'MyBrand'
  })
});
const data = await res.json();
console.log(data);
import requests

response = requests.post(
    'https://api.notifypro.ng/v1/sms/send',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    json={
        'to': '+2348012345678',
        'message': 'Your order #1042 has been shipped!',
        'sender_id': 'MyBrand'
    }
)
print(response.json())
<?php
$ch = curl_init('https://api.notifypro.ng/v1/sms/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'to'        => '+2348012345678',
    'message'   => 'Your order #1042 has been shipped!',
    'sender_id' => 'MyBrand'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
  "to": "+2348012345678",
  "message": "Your order #1042 has been shipped!",
  "sender_id": "MyBrand"
}

Example Response

{
  "status": "queued",
  "message_id": "msg_01HXYZ123ABC",
  "to": "+2348012345678",
  "units": 1,
  "cost": 4.00
}

Bulk SMS

POST/sms/bulk

Send the same message to multiple recipients at once. Maximum 10,000 recipients per request.

Request Body

Parameter Type Description
recipientsrequired array Array of phone numbers in E.164 format.
messagerequired string SMS body text.
sender_id string Custom sender name (max 11 chars).
schedule_at string ISO 8601 datetime to schedule delivery. Omit to send immediately.

Example Request

curl -X POST https://api.notifypro.ng/v1/sms/bulk \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "recipients": ["+2348012345678", "+2348087654321"],
    "message": "Flash sale! 30% off all items today only.",
    "sender_id": "MyBrand"
  }'
const res = await fetch('https://api.notifypro.ng/v1/sms/bulk', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    recipients: ['+2348012345678', '+2348087654321'],
    message: 'Flash sale! 30% off all items today only.',
    sender_id: 'MyBrand'
  })
});
const data = await res.json();
console.log(data);
import requests

response = requests.post(
    'https://api.notifypro.ng/v1/sms/bulk',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    json={
        'recipients': ['+2348012345678', '+2348087654321'],
        'message': 'Flash sale! 30% off all items today only.',
        'sender_id': 'MyBrand'
    }
)
print(response.json())
<?php
$ch = curl_init('https://api.notifypro.ng/v1/sms/bulk');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'recipients' => ['+2348012345678', '+2348087654321'],
    'message'    => 'Flash sale! 30% off all items today only.',
    'sender_id'  => 'MyBrand'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
  "recipients": ["+2348012345678", "+2348087654321"],
  "message": "Flash sale! 30% off all items today only.",
  "sender_id": "MyBrand"
}

Example Response

{
  "status": "queued",
  "batch_id": "batch_01HXYZ456DEF",
  "total_recipients": 2,
  "total_units": 2,
  "total_cost": 8.00
}

Delivery Status

GET/sms/status/:message_id

Check the delivery status of a sent message.

Example Request

curl https://api.notifypro.ng/v1/sms/status/msg_01HXYZ123ABC \
  -H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch(
  'https://api.notifypro.ng/v1/sms/status/msg_01HXYZ123ABC',
  { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const data = await res.json();
console.log(data);
import requests

response = requests.get(
    'https://api.notifypro.ng/v1/sms/status/msg_01HXYZ123ABC',
    headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
print(response.json())
<?php
$ch = curl_init(
    'https://api.notifypro.ng/v1/sms/status/msg_01HXYZ123ABC'
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
// GET request — no request body.
// Pass the message_id in the URL path:
// GET /sms/status/{message_id}

Example Response

{
  "message_id": "msg_01HXYZ123ABC",
  "to": "+2348012345678",
  "status": "delivered",
  "delivered_at": "2026-03-27T10:45:00Z"
}

Status values: queued · sent · delivered · failed

Send Email

POST/email/send

Send a transactional or marketing email.

Request Body

Parameter Type Description
torequired string or array Recipient email address(es).
subjectrequired string Email subject line.
body_htmlrequired string HTML content of the email.
body_text string Plain text fallback.
from_name string Sender display name. Defaults to your business name.

Example Request

curl -X POST https://api.notifypro.ng/v1/email/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "customer@example.com",
    "subject": "Your receipt from MyBrand",
    "body_html": "<h1>Thank you!</h1><p>Your order is confirmed.</p>",
    "from_name": "MyBrand"
  }'
const res = await fetch('https://api.notifypro.ng/v1/email/send', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    to: 'customer@example.com',
    subject: 'Your receipt from MyBrand',
    body_html: '<h1>Thank you!</h1><p>Your order is confirmed.</p>',
    from_name: 'MyBrand'
  })
});
const data = await res.json();
console.log(data);
import requests

response = requests.post(
    'https://api.notifypro.ng/v1/email/send',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    json={
        'to': 'customer@example.com',
        'subject': 'Your receipt from MyBrand',
        'body_html': '<h1>Thank you!</h1><p>Your order is confirmed.</p>',
        'from_name': 'MyBrand'
    }
)
print(response.json())
<?php
$ch = curl_init('https://api.notifypro.ng/v1/email/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'to'        => 'customer@example.com',
    'subject'   => 'Your receipt from MyBrand',
    'body_html' => '<h1>Thank you!</h1><p>Your order is confirmed.</p>',
    'from_name' => 'MyBrand'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
  "to": "customer@example.com",
  "subject": "Your receipt from MyBrand",
  "body_html": "<h1>Thank you!</h1><p>Your order is confirmed.</p>",
  "from_name": "MyBrand"
}

Send OTP

POST/otp/send

Generate and send a one-time password via SMS or email.

Request Body

Parameter Type Description
torequired string Phone number or email address of the recipient.
channelrequired string sms or email
length integer OTP digit length. Default: 6. Max: 8.
expiry integer OTP validity in minutes. Default: 10.

Example Request

curl -X POST https://api.notifypro.ng/v1/otp/send \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "to": "+2348012345678",
    "channel": "sms",
    "length": 6,
    "expiry": 10
  }'
const res = await fetch('https://api.notifypro.ng/v1/otp/send', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    to: '+2348012345678',
    channel: 'sms',
    length: 6,
    expiry: 10
  })
});
const data = await res.json();
console.log(data);
import requests

response = requests.post(
    'https://api.notifypro.ng/v1/otp/send',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    json={
        'to': '+2348012345678',
        'channel': 'sms',
        'length': 6,
        'expiry': 10
    }
)
print(response.json())
<?php
$ch = curl_init('https://api.notifypro.ng/v1/otp/send');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'to'      => '+2348012345678',
    'channel' => 'sms',
    'length'  => 6,
    'expiry'  => 10
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
  "to": "+2348012345678",
  "channel": "sms",
  "length": 6,
  "expiry": 10
}

Example Response

{
  "status": "sent",
  "otp_id": "otp_01HXYZ789GHI",
  "expires_at": "2026-03-27T11:00:00Z"
}

Verify OTP

POST/otp/verify

Verify a code entered by the user against the one you sent.

Request Body

Parameter Type Description
otp_idrequired string The otp_id returned from /otp/send.
coderequired string The code entered by the user.

Example Request

curl -X POST https://api.notifypro.ng/v1/otp/verify \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "otp_id": "otp_01HXYZ789GHI",
    "code": "482910"
  }'
const res = await fetch('https://api.notifypro.ng/v1/otp/verify', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    otp_id: 'otp_01HXYZ789GHI',
    code: '482910'
  })
});
const data = await res.json();
console.log(data.valid); // true or false
import requests

response = requests.post(
    'https://api.notifypro.ng/v1/otp/verify',
    headers={
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json'
    },
    json={
        'otp_id': 'otp_01HXYZ789GHI',
        'code': '482910'
    }
)
print(response.json())
<?php
$ch = curl_init('https://api.notifypro.ng/v1/otp/verify');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY',
    'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
    'otp_id' => 'otp_01HXYZ789GHI',
    'code'   => '482910'
]));
$response = curl_exec($ch);
curl_close($ch);
echo $response;
{
  "otp_id": "otp_01HXYZ789GHI",
  "code": "482910"
}

Example Response

{
  "valid": true,
  "message": "OTP verified successfully."
}

Wallet Balance

GET/account/balance

Retrieve your current wallet balance and SMS units remaining.

Example Request

curl https://api.notifypro.ng/v1/account/balance \
  -H "Authorization: Bearer YOUR_API_KEY"
const res = await fetch('https://api.notifypro.ng/v1/account/balance', {
  headers: { 'Authorization': 'Bearer YOUR_API_KEY' }
});
const data = await res.json();
console.log(data);
import requests

response = requests.get(
    'https://api.notifypro.ng/v1/account/balance',
    headers={'Authorization': 'Bearer YOUR_API_KEY'}
)
print(response.json())
<?php
$ch = curl_init('https://api.notifypro.ng/v1/account/balance');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
// GET request — no request body.
// Only the Authorization header is required.

Example Response

{
  "balance_ngn": 47500.00,
  "sms_units_remaining": 11875,
  "plan": "business"
}

Delivery Logs

GET/logs

Retrieve your recent message delivery logs. Returns the latest 100 by default.

Query Parameters

Parameter Type Description
limit integer Number of results (max 500). Default: 100.
offset integer Pagination offset. Default: 0.
channel string Filter by sms, email, or otp.
status string Filter by delivered, failed, etc.

Example Request

curl "https://api.notifypro.ng/v1/logs?limit=10&channel=sms" \
  -H "Authorization: Bearer YOUR_API_KEY"
const params = new URLSearchParams({ limit: 10, channel: 'sms' });
const res = await fetch(
  `https://api.notifypro.ng/v1/logs?${params}`,
  { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
);
const data = await res.json();
console.log(data);
import requests

response = requests.get(
    'https://api.notifypro.ng/v1/logs',
    headers={'Authorization': 'Bearer YOUR_API_KEY'},
    params={'limit': 10, 'channel': 'sms'}
)
print(response.json())
<?php
$ch = curl_init(
    'https://api.notifypro.ng/v1/logs?limit=10&channel=sms'
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer YOUR_API_KEY'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
// GET request — pass filters as query parameters:
// ?limit=10&channel=sms&status=delivered&offset=0

Need help? Email us at support@notifypro.ng or chat on WhatsApp.