Authentication
All SMSPoP API requests require authentication via a Bearer token. Generate a token from your dashboard under API Tokens → Generate New Token.
Include the token in every request's Authorization header:
Authorization: Bearer YOUR_API_TOKEN
Keep your tokens secret. Revoke and regenerate them immediately if exposed.
Quick start
Generate a token
Go to your dashboard → API Tokens → Generate New Token. Copy the token.
Create a campaign
POST to /api/campaigns with your message text and contact numbers.
Messages deliver
Approved campaigns process automatically. No extra trigger needed.
Check delivery status
The API response contains per-contact delivery status in real time.
API Endpoints
Base URL: https://smspop.co.zw/api
Creates a new SMS campaign and sends it immediately to all provided contacts. Approved campaigns process automatically — no separate send trigger is required.
Request body (JSON)
| Field | Type | Description | |
|---|---|---|---|
| name | string | Required | Campaign display name for your records |
| message | string | Required | SMS body text. Max 160 chars (GSM-7) or 70 chars (Unicode) |
| sender_id | string | Required | Approved sender ID registered on your account |
| contact_import_method | string | Required | "manual" to provide numbers inline, or "group" to use a saved contact group |
| manual_contacts | string | Optional | Comma-separated Zimbabwe numbers (263xxxxxxxxx format). Required if method is "manual" |
| group_id | integer | Optional | Contact group ID from your account. Required if method is "group" |
{
"name": "Welcome Campaign",
"message": "Hello, welcome to our service!",
"sender_id": "SMSPOP",
"contact_import_method":"manual",
"manual_contacts": "263771234567, 263772345678",
}
Success response (200)
{
"success": true,
"message": "Successfully imported 2 contacts and SMS sending completed.",
"campaign": {
"name": "Welcome Campaign",
"message": "Hello! Welcome to our service.",
"sender_id": "BRAND1",
"status": "approved"
},
"summary": { "sent": 2, "failed": 0 },
"contacts": [
{ "phone_number": "263771234567", "status": "sent" },
{ "phone_number": "263712345678", "status": "sent" }
]
}
Returns a paginated list of all SMS campaigns for the authenticated user, ordered by most recent.
No request body required. Authentication header only.
Code examples
JavaScript / Node.js
async function sendBulkSMS(token) {
const response = await fetch('https://smspop.co.zw/api/campaigns', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
'Accept': 'application/json',
},
body: JSON.stringify({
name: 'Black Friday Sale',
message: '30% OFF everything TODAY only! Visit us at Main St. Reply STOP to opt out.',
sender_id: 'MYSHOP',
contact_import_method: 'manual',
manual_contacts: '263771234567, 263712345678, 263775551234',
}),
});
if (!response.ok) {
const err = await response.json();
throw new Error(err.message);
}
const result = await response.json();
console.log(`Sent: ${result.summary.sent}, Failed: ${result.summary.failed}`);
return result;
}
sendBulkSMS('YOUR_API_TOKEN');
PHP
<?php
function sendBulkSMS(string $token): array
{
$payload = [
'name' => 'Black Friday Sale',
'message' => '30% OFF everything TODAY only! Visit us at Main St.',
'sender_id' => 'MYSHOP',
'contact_import_method' => 'manual',
'manual_contacts' => '263771234567, 263712345678',
];
$ch = curl_init('https://smspop.co.zw/api/campaigns');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Accept: application/json',
'Authorization: Bearer ' . $token,
],
]);
$body = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
$result = json_decode($body, true);
if ($status !== 200) {
throw new \RuntimeException($result['message'] ?? 'SMS send failed');
}
return $result;
}
$result = sendBulkSMS('YOUR_API_TOKEN');
echo "Sent: {$result['summary']['sent']}\n";
Python
import requests
def send_bulk_sms(token: str) -> dict:
payload = {
"name": "Black Friday Sale",
"message": "30% OFF everything TODAY only! Visit us at Main St.",
"sender_id": "MYSHOP",
"contact_import_method": "manual",
"manual_contacts": "263771234567, 263712345678",
}
response = requests.post(
"https://smspop.co.zw/api/campaigns",
json=payload,
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/json",
"Accept": "application/json",
},
timeout=30,
)
response.raise_for_status()
result = response.json()
print(f"Sent: {result['summary']['sent']}, Failed: {result['summary']['failed']}")
return result
result = send_bulk_sms("YOUR_API_TOKEN")
Error reference
All errors return JSON with a success: false flag and a human-readable message field.
Missing or invalid Bearer token. Regenerate from your API Tokens dashboard.
Your account credit balance is too low to send the campaign.
{"success":false,"message":"Insufficient credits. Please purchase more SMS credits"}
Your account has been deactivated. Contact support to reactivate.
{"success":false,"message":"Your account is inactive. Please contact support."}
AI content moderation blocked the message. The category field indicates the reason.
{"success":false,"message":"Campaign rejected: Content classified as political is not allowed"}
One or more request fields are missing or invalid. The errors object lists all failures.
{"success":false,"message":"Validation failed","errors":{"contact_import_method":["The field is required."]}}
The sender_id provided is not approved for your account on any carrier.
{"success":false,"message":"Invalid sender ID"}
Get help
Need integration support?
Our Harare team is happy to help with API integration, troubleshooting, or custom requirements.