Skip to main content
Social Boost Lab

SMS API

Send SMS from your own app and check delivery.

Send SMS from your own app or website, such as sign-up codes, order updates and reminders, and check delivery. Messages are charged from your wallet at the same prices as the dashboard.

You need an approved sender ID. For codes and alerts, use your transactional sender ID.

Send a message

POSThttps://socialboostlab.com/api/sms/v1/messages
JSON fieldDescription
torequiredPhone number, ideally with country code, e.g. +2348031234567. Local numbers use your default country.
messagerequiredThe text, up to 1,600 characters (long messages are sent as several SMS pages).
sender_idOne of your approved sender IDs. Leave it out to use your default.
curl -X POST https://socialboostlab.com/api/sms/v1/messages \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to": "+2348031234567", "message": "Your code is 482913. It expires in 10 minutes.", "sender_id": "MYBRAND"}'
import requests

r = requests.post(
    "https://socialboostlab.com/api/sms/v1/messages",
    headers={"Authorization": "Bearer YOUR_API_KEY"},
    json={"to": "+2348031234567", "message": "Your code is 482913.", "sender_id": "MYBRAND"},
    timeout=30,
)
r.raise_for_status()
print(r.json()["data"]["id"])
$ch = curl_init("https://socialboostlab.com/api/sms/v1/messages");
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["Authorization: Bearer YOUR_API_KEY", "Content-Type: application/json"],
    CURLOPT_POSTFIELDS => json_encode(["to" => "+2348031234567", "message" => "Your code is 482913.", "sender_id" => "MYBRAND"]),
]);
$result = json_decode(curl_exec($ch), true);
const res = await fetch("https://socialboostlab.com/api/sms/v1/messages", {
  method: "POST",
  headers: { Authorization: "Bearer YOUR_API_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ to: "+2348031234567", message: "Your code is 482913.", sender_id: "MYBRAND" }),
});
const { data } = await res.json();

Response 201 Created:

{
  "data": {
    "id": 90412,
    "to": "+2348031234567",
    "status": "sent",
    "sender_id": "MYBRAND",
    "cost": "4.8000",
    "error": null,
    "sent_at": "2026-10-16T15:54:02+00:00",
    "delivered_at": null
  }
}

Check delivery

GEThttps://socialboostlab.com/api/sms/v1/messages/{id}
curl https://socialboostlab.com/api/sms/v1/messages/90412 -H "Authorization: Bearer YOUR_API_KEY"
requests.get("https://socialboostlab.com/api/sms/v1/messages/90412", headers={"Authorization": "Bearer YOUR_API_KEY"}).json()
statusMeaning
queuedAccepted, waiting to go to the network.
sentHanded to the network; waiting for the delivery report (usually seconds to minutes).
deliveredDelivered to the phone. delivered_at is set.
failedNot delivered; error says why. If the network rejected it, the cost is refunded.
rejectedThe network refused the message (e.g. the sender ID isn't approved on that network). The cost is refunded.
rejected_dndThe number is on the Do-Not-Disturb list and the message wasn't transactional. The cost is refunded.

Balance

GEThttps://socialboostlab.com/api/sms/v1/balance
curl https://socialboostlab.com/api/sms/v1/balance -H "Authorization: Bearer YOUR_API_KEY"
# {"data": {"balance": "12500.00", "currency": "NGN"}}

Good practice

  • Send the number with its country code to avoid surprises.
  • Only text people who gave you their number for this purpose; marketing messages need a promotional sender ID and an opt-out.
  • Retry on 429 after a minute; don't retry on 400 without fixing the request.
  • Keep your key on your server and rotate it if it might have leaked.
Was this page helpful?