Quick Start
Get started with the JQuickNet SMS API in minutes
The JQuickNet API lets you submit SMS messages and check your submission records programmatically. All requests are authenticated via API key or Bearer token.
1Get an API Key
Go to Developers page and generate a key.
2Make a Request
Send a POST request to /api/sms/send with your API key.
3Track Delivery
Check submissionState. Gateway acceptance does not confirm handset delivery.
1 Authentication
Include your API key in every request
All API requests require authentication. Include your API key in one of two ways:
X-Api-Key: jqn_your_api_key_here
Authorization: Bearer jqn_your_api_key_here
2 Send SMS
Send a single SMS message to one or more recipients
/api/sms/send
Request Body
Responses
{
"service": {
"id": 42,
"sender_id": "JQUICKNET",
"message": "Hello from JQuickNet API!",
"contacts": "255712345678,255687654321",
"status": "success",
"submissionState": "accepted",
"created_at": "2026-07-12T12:00:00.000Z"
}
}
{ "message": "Low credits. Please topup" }
{ "message": "Invalid or inactive API key." }
3 Code Examples
Integration examples in popular languages
curl -X POST https://jquicknet.com/api/sms/send \
-H "X-Api-Key: jqn_your_api_key_here" \
-H "Idempotency-Key: unique-request-001" \
-H "Content-Type: application/json" \
-d '{
"sender_id": "JQUICKNET",
"message": "Hello from API",
"contacts": "255712345678,255687654321"
}'
const response = await fetch("https://jquicknet.com/api/sms/send", {
method: "POST",
headers: {
"X-Api-Key": "jqn_your_api_key_here",
"Content-Type": "application/json",
"Idempotency-Key": "unique-request-001"
},
body: JSON.stringify({
sender_id: "JQUICKNET",
message: "Hello from API",
contacts: "255712345678,255687654321"
})
});
const data = await response.json();
console.log(data);
import requests
url = "https://jquicknet.com/api/sms/send"
headers = {
"X-Api-Key": "jqn_your_api_key_here",
"Content-Type": "application/json",
"Idempotency-Key": "unique-request-001"
}
payload = {
"sender_id": "JQUICKNET",
"message": "Hello from API",
"contacts": "255712345678,255687654321"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
<?php
$ch = curl_init("https://jquicknet.com/api/sms/send");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"X-Api-Key: jqn_your_api_key_here",
"Content-Type: application/json",
"Idempotency-Key: unique-request-001"
],
CURLOPT_POSTFIELDS => json_encode([
"sender_id" => "JQUICKNET",
"message" => "Hello from API",
"contacts" => "255712345678,255687654321"
])
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
4 Error Codes
Common HTTP status codes and their meanings
5 Rate Limits
Request throttling to protect service stability
6 Important Notes
Things to keep in mind when using the API
- One credit = 20 TZS. The current charge is one credit per unique recipient per submission, including multipart messages. Segment counts are informational.
- Your sender ID must be approved before you can send messages
- Phone numbers should be in international format (e.g. 255712345678)
- Comma-separated contacts support bulk sending to multiple recipients
- API keys can be revoked at any time from the Developers page
- Maximum message length is 1,600 characters
- All requests must include
Content-Type: application/json - Delivery times vary. Confirmed delivery reports and scheduling are not available.
Need an API Key?
Generate your API key from the Developers page. You need at least one completed wallet top-up.
Submission safety and billing
New accounts start with zero credits. A verified completed top-up is required before creating an API key. Minimum top-up: 1,000 TZS = 50 credits. Only owned, approved sender IDs can send. Keys are displayed once; revoked keys stop authenticating immediately.
For POST /api/sms/send, supply Idempotency-Key: a unique 8–128 character value using letters, digits, hyphens or underscores. Reuse that key with the same payload after a network error. A changed payload returns 409. Never retry an uncertain send with a new key.
Limits: message 1,600 UTF-16 units; contacts field 5,000 characters. Tanzanian mobile formats: 07/06…, +255…, 255…, or nine-digit 7/6…. Recipients are normalized and deduplicated. POST /api/sms/preview returns invalid entries, recipients, encoding, segments, credits and costTzs. Correct all invalid entries before sending.
GET /api/sms/:id returns only your submission. submissionState is submitted, accepted, unknown, or legacy. status is a legacy compatibility field, never proof of delivery. Partial or unrecognized provider outcomes are unknown and need operator reconciliation. There is no automatic resend or automatic refund; the existing application charges on submission.
GSM-7 extension characters use two units. Estimates use 160 units for a single GSM-7 segment and 153 for multipart; Unicode uses 70 / 67 UTF-16 units. Provider-specific segmentation and downstream billing are unverified. 401: expired session or invalid key; 403: sender ownership, top-up requirement or browser-origin validation; 409: conflicting idempotency key; 429: rate limit; 503: outcome uncertain—retain the same key.