Quickstart
Send your first SMS in three steps.
1. Get an API token
Create a scoped key from your dashboard.
From your dashboard go to Settings → API Keys & Webhooks and create a token. Copy it immediately, it is shown only once. Tokens carry scopes (abilities) that limit what they can do, see Authentication.
2. Send a message
One POST puts a campaign in the queue.
POST /sms/sendsms:send
Send to one or more recipients from an approved sender ID. Pass an Idempotency-Key so a retry never double-sends.
curl -X POST https://api.helliomessaging.com/v1/sms/send \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"recipients": ["+233241234567"],
"sender": "HELLIO",
"message": "Hello from Hellio!"
}'
const res = await fetch("https://api.helliomessaging.com/v1/sms/send", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.HELLIO_API_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
recipients: ["+233241234567"],
sender: "HELLIO",
message: "Hello from Hellio!",
}),
});
const { data } = await res.json();
import os, uuid, requests
res = requests.post(
"https://api.helliomessaging.com/v1/sms/send",
headers={
"Authorization": f"Bearer {os.environ['HELLIO_API_KEY']}",
"Idempotency-Key": str(uuid.uuid4()),
},
json={
"recipients": ["+233241234567"],
"sender": "HELLIO",
"message": "Hello from Hellio!",
},
)
data = res.json()["data"]
use Illuminate\Support\Facades\Http;
$data = Http::withToken($apiKey)
->withHeaders(['Idempotency-Key' => (string) Str::uuid()])
->post("https://api.helliomessaging.com/v1/sms/send", [
'recipients' => ['+233241234567'],
'sender' => 'HELLIO',
'message' => 'Hello from Hellio!',
])
->json('data');
A 202 Accepted means the campaign is queued:
{
"data": {
"reference": "8f3a...",
"campaign_id": 1042,
"status": "queued",
"accepted_recipients": 1,
"invalid_recipients": 0,
"segments": 1,
"estimated_cost": "0.0300",
"currency": "GHS"
}
}
3. Check delivery
Confirm what happened to your message.
Fetch the campaign summary, or a single message by its reference:
curl https://api.helliomessaging.com/v1/campaigns/8f3a... \
-H "Authorization: Bearer YOUR_API_TOKEN"
Response:
{
"data": {
"reference": "8f3a...",
"campaign_id": 1042,
"status": "completed",
"recipients": 1,
"estimated_cost": "0.0300",
"charged": "0.0300",
"breakdown": { "delivered": 1 }
}
}
For real-time updates instead of polling, set up a webhook.
Recipients format
How to pass one number or many.
recipients accepts an array, or a single comma / newline separated string. Numbers may be written in local (0241234567) or international (+233241234567) form, spaces are ignored.
Other channels
The same credentials power OTP, voice, lookup and email.
The same token + base URL power OTP (/otp/send, /otp/verify), voice (/voice/send), number lookup (/lookup) and email verification (/email/verify). See the API Reference for every endpoint.
