API Documentation
The NotifyPro API lets you send SMS, emails, and OTP codes programmatically from your application. All requests use HTTPS and return JSON responses.
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
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
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
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
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
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
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
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
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.