SMSPoP Zimbabwe bulk SMS REST API developer documentation

Developer docs

SMSPoP REST API

Integrate Zimbabwe bulk SMS into your applications. Send to Econet and NetOne subscribers in seconds.

Bearer token auth JSON · REST Generate API token

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:

HTTP Header
Authorization: Bearer YOUR_API_TOKEN

Keep your tokens secret. Revoke and regenerate them immediately if exposed.

Quick start

1

Generate a token

Go to your dashboard → API Tokens → Generate New Token. Copy the token.

2

Create a campaign

POST to /api/campaigns with your message text and contact numbers.

3

Messages deliver

Approved campaigns process automatically. No extra trigger needed.

4

Check delivery status

The API response contains per-contact delivery status in real time.

API Endpoints

Base URL: https://smspop.co.zw/api

POST /campaigns
Create & send bulk SMS campaign

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"
RAW

                            {
                                "name": "Welcome Campaign",
                                "message": "Hello, welcome to our service!",
                                "sender_id": "SMSPOP",
                                "contact_import_method":"manual",
                                "manual_contacts": "263771234567, 263772345678",
                            } 

Success response (200)

JSON
{
                            "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" }
                            ]
                            }
GET /campaigns
List all campaigns

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

JavaScript
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
<?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

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.

401 Unauthorized

Missing or invalid Bearer token. Regenerate from your API Tokens dashboard.

402 Insufficient credits

Your account credit balance is too low to send the campaign.

{"success":false,"message":"Insufficient credits. Please purchase more SMS credits"}
403 Account inactive

Your account has been deactivated. Contact support to reactivate.

{"success":false,"message":"Your account is inactive. Please contact support."}
403 Campaign rejected

AI content moderation blocked the message. The category field indicates the reason.

{"success":false,"message":"Campaign rejected: Content classified as political is not allowed"}
422 Validation error

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."]}}
422 Invalid sender ID

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.