DOCUMENTATION
SMSHub API Reference
Everything you need to integrate Ethiopian SMS delivery into your application. All endpoints return JSON and accept JSON. Authentication is via Bearer token.
Base URL
https://sms.hizcore.com/index.php?endpoint=sms
Quick start
- Create an account and verify your phone number.
- Copy your API key from Dashboard → API access.
- POST to
?endpoint=smswith your key and message.
curl -X POST 'https://sms.hizcore.com/index.php?endpoint=sms' \
-H 'Authorization: Bearer sk_live_your_key' \
-H 'Content-Type: application/json' \
-d '{"msisdn":"0911234567","text":"Hello from SMSHub"}'
Authentication
Every request must include your API key as a Bearer token in the Authorization header.
Authorization: Bearer sk_live_xxxxxxxxxxxxxxxxxxxx
Missing or invalid keys return 401 Unauthorized.
Send SMS
POST
https://sms.hizcore.com/index.php?endpoint=sms
Headers
Authorization—Bearer <your_api_key>Content-Type—application/json
Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
| msisdn | string | Yes | Recipient: 09xxxxxxxx or 07xxxxxxxx |
| text | string | Yes | Message body. Max 160 characters. |
Example request
{
"msisdn": "0911234567",
"text": "Your OTP is 4821"
}
Success response
{
"status": "success",
"data": {
"msisdn": "0911234567",
"message_status": "sent",
"credits_remaining": 49
}
}
Every successful send decrements your account by 1 credit. Failed sends do not consume credits.
Error codes
| HTTP | Meaning |
|---|---|
| 200 | Success |
| 401 | Invalid or missing API key |
| 402 | Insufficient credits |
| 403 | Account not verified |
| 405 | Wrong HTTP method |
| 422 | Invalid msisdn or text |
| 502 | Upstream provider error |
Code examples
cURL
curl -X POST 'https://sms.hizcore.com/index.php?endpoint=sms' \
-H 'Authorization: Bearer sk_live_your_key' \
-H 'Content-Type: application/json' \
-d '{"msisdn":"0911234567","text":"Hello"}'
PHP
<?php
$ch = curl_init('https://sms.hizcore.com/index.php?endpoint=sms');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer sk_live_your_key',
'Content-Type: application/json'
],
CURLOPT_POSTFIELDS => json_encode([
'msisdn' => '0911234567',
'text' => 'Hello'
])
]);
echo curl_exec($ch);
Node.js
await fetch('https://sms.hizcore.com/index.php?endpoint=sms', {
method: 'POST',
headers: {
'Authorization': 'Bearer sk_live_your_key',
'Content-Type': 'application/json'
},
body: JSON.stringify({ msisdn: '0911234567', text: 'Hello' })
}).then(r => r.json());
Python
import requests
r = requests.post(
'https://sms.hizcore.com/index.php?endpoint=sms',
headers={'Authorization': 'Bearer sk_live_your_key'},
json={'msisdn': '0911234567', 'text': 'Hello'}
)
print(r.json())
Rate limits & rules
- Rate limit: 60 requests per minute per key.
- Message max 160 chars — longer is rejected (422).
- Numbers must match
09xxxxxxxxor07xxxxxxxx. - SMSHub does not auto-retry — retry from your side as needed.
Chapa checkout flow
When you click Buy now on the billing tab, SMSHub:
- Creates a pending transaction with a unique
tx_ref. - Renders an auto-submitting HTML form pointing to Chapa's hosted page:
https://api.chapa.co/v1/hosted/pay - Sends your browser there automatically.
- After you pay, Chapa redirects to
?page=payment-return&tx_ref=... - SMSHub calls Chapa's
/transaction/verify/{tx_ref}using the secret key. - If verified, credits are added — idempotent, so double-callbacks are safe.
Webhook
Point your Chapa dashboard webhook to:
https://sms.hizcore.com/index.php?endpoint=chapa
The webhook re-verifies every transaction with Chapa's API before crediting. The same idempotency guard prevents double-credits between the webhook and the return URL.
Credits & billing
| Package | Price | Per SMS |
|---|---|---|
| 500 SMS | 300 ETB | 0.600 ETB |
| 2,000 SMS | 1,000 ETB | 0.500 ETB |
| 5,000 SMS | 2,400 ETB | 0.480 ETB |
| 10,000 SMS | 4,700 ETB | 0.470 ETB |
| 25,000 SMS | 11,500 ETB | 0.460 ETB |
| 50,000 SMS | 22,000 ETB | 0.440 ETB |