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:

Header (Recommended)
X-Api-Key: jqn_your_api_key_here
Bearer Token
Authorization: Bearer jqn_your_api_key_here

2 Send SMS

Send a single SMS message to one or more recipients

POST /api/sms/send

Request Body

sender_id
string
Required
Your approved sender ID (max 11 chars)
message
string
Required
The SMS text content (max 1,600 characters)
contacts
string
Required
Comma-separated phone numbers

Responses

200 OK — Success
{
  "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"
  }
}
400 Bad Request — Low Credits
{ "message": "Low credits. Please topup" }
401 Unauthorized
{ "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

400 Bad Request — Invalid parameters, insufficient credits, or unapproved sender ID
401 Unauthorized — Invalid, missing, or revoked API key
403 Forbidden — Sender ID not owned by authenticated user
404 Not Found — Endpoint does not exist
429 Rate Limited — Too many requests, try again later
500 Server Error — Internal processing failure

5 Rate Limits

Request throttling to protect service stability

100
requests per 15 minutes
General API endpoints
10
requests per 15 minutes
Auth endpoints (login/signup)

6 Important Notes

Things to keep in mind when using the API

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.