Dashboard
Real-time platform overview
Traffic (Last 24 Hours)
System Health
Campaign Summary
Message Status
Weekly Traffic
Recent Activity
Activity will appear here
Failure Reasons Summary
No failures in selected period
Quick Actions
Top Enterprise Accounts
| Account | Messages | Delivered | Failed | Rate |
|---|---|---|---|---|
Top Routes / Connectors
| Connector | Messages | Delivered | Failed | Rate |
|---|---|---|---|---|
Recent Errors (Last 24h)
| Time | To | From | Connector | Status | Error |
|---|---|---|---|---|---|
Message Logs
| ID | Dir | From | To | Message | Connector | Source | Campaign | User | Status | DLR | Enc | Credits | Error | Time | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
No messages yet | |||||||||||||||
Delivery Reports
| Message ID | Sender ID | MSISDN | DLR Status | Error | Connector | Delay | Submit Date | Done Date | Received | EA Account | |
|---|---|---|---|---|---|---|---|---|---|---|---|
Delivery reports appear here when DLR status updates are received | |||||||||||
DLR Detail
Inbound SMS (MO)
| From | To / Short Code | Message | Connector | Routed To | Fwd Status | Time |
|---|---|---|---|---|---|---|
Inbound messages will appear here | ||||||
Test Inbound SMS (Simulate deliver_sm)
Simulate an MO (mobile-originated) message to test shortcode matching, auto-reply, forwarding, and enterprise inbox routing β without sending from a real phone.
Send SMS
SMPP Client Connectors
| Connector ID | Provider | Host | Port | Username | Bind | Status | Throughput | Billing | Balance / Quota | Usage Month | Balance State | Window | Queued | Last Submit | Last DLR | Actions |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Connector Logs β β
Connector Diagnostics β β
HTTP Connectors
| Connector ID | Provider | Base URL | Method | Status | Billing | Balance / Quota | Usage Month | Balance State | Window | Queued | Created | Actions |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
MT (Outbound) Routes
β οΈ Routing Profiles (Gateway β Routing Profiles) are the recommended way for per-client routing β they wrap MT routes with prefix tables and auto-assign connectors per destination. Use raw MT routes only for system-wide defaults or advanced bypass rules.
| Order | Details | Actions |
|---|---|---|
MO (Inbound) Routes
| Order | SMPP Connector | Inbox User | HTTP Forward | Details | Actions |
|---|---|---|---|---|---|
Routing Filters
| Filter ID | Details | Actions |
|---|---|---|
Routing Profiles
Define number-prefix routing rules with connector and sender ID mappings. Assign profiles to users and API accounts.
Sender IDs
Manage sender IDs linked to routing profiles and connectors
| Sender ID | Status | Type | Routing Profiles | Connectors | EAs | Created | Actions |
|---|---|---|---|---|---|---|---|
No sender IDs registered | |||||||
Blacklist / Opt-Out
Numbers that are blocked from receiving SMS messages
| Phone Number | Reason | Active | Added | Actions |
|---|---|---|---|---|
No blacklisted numbers | ||||
MNO / Number Portability Prefixes
Lookup table for mobile network operator identification by number prefix
| Prefix | Operator | Country | MCC | MNC | Actions |
|---|---|---|---|---|---|
No prefixes configured. Add prefixes for MNO identification. | |||||
SMS Campaigns
| Name | Routing Profile | Sender | Recipients | Progress | Status | Created By | Created | Actions |
|---|---|---|---|---|---|---|---|---|
Campaign Monitor
Loading...
Live Activity
| Number | Status | DLR | Connector | Error / Details | Sent | Delivered |
|---|---|---|---|---|---|---|
Waiting for activity... | ||||||
Failure Summary
| Reason | Count |
|---|
Send Errors
| Number | Error |
|---|
Campaign Templates
| Name | Message Preview | Sender ID | Created | Actions |
|---|---|---|---|---|
Create message templates for quick campaign setup | ||||
Number Lists
| Name | Description | Numbers | Created | Actions |
|---|---|---|---|---|
Upload or create number lists for campaigns | ||||
Campaign A/B Tests
Split-test two campaign variants to compare delivery performance
| Name | Campaign A | Campaign B | Split | Status | A Delivery | B Delivery | Actions |
|---|---|---|---|---|---|---|---|
No A/B tests yet. Create one to compare two campaign variants. | |||||||
Groups
| Group ID | Actions |
|---|---|
Enterprise Users
| Username | Company | Perm Group | Routing | Sender IDs | Credits | TPS | Bindings | Status | Created | Actions |
|---|---|---|---|---|---|---|---|---|---|---|
Permission Groups
Define role-based access groups and assign them to Enterprise Users
| Group Name | Description | Status | Permissions | Users | Created | Actions |
|---|---|---|---|---|---|---|
Credits & Wallet
Manage credit balances, top-ups, deductions, and transaction ledger for all accounts
| Account | Company | Balance | Today | Month | Mode | Last Top-up | Status | Actions |
|---|---|---|---|---|---|---|---|---|
Transaction Ledger
Full audit trail of all credit movements
| Date | Account | Type | Amount | Before | After | Description | Source | By | Ref |
|---|---|---|---|---|---|---|---|---|---|
No transactions yet | |||||||||
Invoices
Generate and manage billing invoices based on credit usage
| Invoice # | Account | Period | Amount | Status | Generated | Actions |
|---|---|---|---|---|---|---|
No invoices yet. Generate one from the credit transaction history. | ||||||
API Keys
POST /panel/api/v1/send with header X-API-Key: your_key| Name | Key Prefix | Owner | Status | Last Used | Created | Actions |
|---|---|---|---|---|---|---|
No API keys generated | ||||||
Webhooks
| Name | URL | Events | Status | Actions |
|---|---|---|---|---|
Configure webhooks for DLR and MO notifications | ||||
Admin Users
| Username | Role | Created | Actions |
|---|---|---|---|
Audit Logs
| # | Time | User | Action | Entity | ID | IP | Details |
|---|---|---|---|---|---|---|---|
Audit trail will appear after actions are performed | |||||||
System Settings
Branding & Identity
Company Contact Details
Platform Configuration
Jasmin HTTP API Credentials
Alerts
SMTP (Email Alerts)
About
| Platform | SMS Gateway v3.0 |
| Core Engine | Jasmin SMS Gateway (Docker) |
| Architecture | Core System Architecture by Azhar |
| Components | Node.js, PostgreSQL, Redis, RabbitMQ, Nginx |
Gateway CLI
Type help for commands. This is a direct jCLI session.
ESME / SMPP Client Accounts
Manage SMPP bind credentials for your clients and applications
| System ID | Assigned User | Routing Profile | Max Binds | IP Whitelist | Status | Actions |
|---|---|---|---|---|---|---|
No ESME accounts yet. Add one to allow SMPP client binds. | ||||||
HTTP API Accounts
Enterprise-linked REST API credentials β each account uses its enterprise account's credits, routing, and message logs.
| Username | Description | Enterprise Account | Credits | Rate | DLR URL | Status | API Key | Actions |
|---|---|---|---|---|---|---|---|---|
No HTTP API accounts yet. | ||||||||
Shortcode Management
Create shortcodes, assign to enterprise accounts, configure auto-replies and forwarding
| Shortcode | Description | SMPP Connector | Assigned EA | Forward URL | Auto-Reply | Keywords | Received | Status | Actions |
|---|---|---|---|---|---|---|---|---|---|
No shortcodes configured yet. | |||||||||
Route Tester / Simulator
Test how a destination number will be routed without sending a real message
Test Parameters
Result
Enter a destination number and click Run to test routing
Documentation & Guides
Complete step-by-step guides for administrators and enterprise clients. All examples are copy-paste ready.
Table of Contents
1. HTTP API Account Setup
Step-by-Step: Create an HTTP API Account
- Navigate to Gateway β HTTP API Clients in the sidebar
- Click Add HTTP API Account
- Fill in the required fields:
Username Unique identifier, e.g. company_otp. This is used for Basic Auth.Password Set a strong password. This is used for Basic Auth. Routing Profile Select which SMPP connector(s) to route through. Leave blank for default. Rate Limit Messages per second allowed (default: 10). Excess messages are queued automatically. Credit Balance Starting credits. Each SMS deducts 1 credit. Set 0 + check "Unlimited" for no limit. - (Optional) Under Enterprise Account Linking:
- Select the Enterprise user this API account belongs to
- Set a default Sender ID
- Set a DLR Webhook URL for delivery receipts
- Click Save β the system auto-generates an API Key
Authentication Methods
Your client application can authenticate using any of these methods:
X-API-Key: httpapi_abc123def456...# The API key is shown after creating the account.
# Click the key icon in the table to copy it.
Authorization: Basic base64(username:password)# Use the username and password you created.
# Most HTTP libraries support Basic Auth natively.
?user=USERNAME&password=PASSWORD# Pass credentials as query params (GET or POST).
# Useful for simple integrations & legacy systems.
2. Sending SMS via API
Endpoints
POST /api/v1/http-send (JSON body)
GET /api/v1/http-send?user=USERNAME&password=PASSWORD&to=PHONE&content=MSG&from=SENDER (URL params)Request Parameters (JSON body or URL query params)
| Field | Type | Required | Description |
|---|---|---|---|
to | string | Yes | Destination phone number in international format, e.g. 971501234567 |
content | string | Yes | SMS message body (auto-splits long messages) |
from | string | No | Sender ID (alphanumeric max 11 chars or numeric). Uses routing profile default if blank. |
coding | string | No | 0 = GSM7 (English/Latin), 8 = UCS2 (Arabic/Unicode). Auto-detected if omitted. |
cURL Example β English SMS (API Key)
curl -X POST /api/v1/http-send \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"to": "971501234567",
"content": "Your OTP code is 4829. Valid for 5 minutes.",
"from": "MYCOMPANY"
}'
GET β URL Parameter Style (Username/Password)
curl "/api/v1/http-send?user=YOUR_USERNAME&password=YOUR_PASSWORD&from=MYCOMPANY&to=971501234567&content=Hello+World&dr=1"
cURL Example β Arabic / Unicode SMS
curl -X POST /api/v1/http-send \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"to": "971501234567",
"content": "\u0645\u0631\u062d\u0628\u0627 \u0628\u0643\u0645 \u0641\u064a \u062e\u062f\u0645\u062a\u0646\u0627",
"coding": "8"
}'
PHP Example
<?php
\$url = '/api/v1/http-send';
\$data = [
'to' => '971501234567',
'content' => 'Your verification code is 1234',
'from' => 'MYCOMPANY'
];
\$ch = curl_init(\$url);
curl_setopt_array(\$ch, [
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-API-Key: YOUR_API_KEY'
],
CURLOPT_POSTFIELDS => json_encode(\$data),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30
]);
\$response = json_decode(curl_exec(\$ch), true);
curl_close(\$ch);
if (\$response['ok']) {
echo "SMS sent! Message ID: " . \$response['message_id'];
} else {
echo "Error: " . \$response['error'];
}
?>
Python Example
import requests
url = "/api/v1/http-send"
headers = {
"Content-Type": "application/json",
"X-API-Key": "YOUR_API_KEY"
}
payload = {
"to": "971501234567",
"content": "Hello from Python!",
"from": "MYAPP"
}
response = requests.post(url, json=payload, headers=headers)
data = response.json()
if data["ok"]:
print(f"Sent! ID: {data['message_id']}")
else:
print(f"Error: {data['error']}")
Node.js Example
const response = await fetch('/api/v1/http-send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': 'YOUR_API_KEY'
},
body: JSON.stringify({
to: '971501234567',
content: 'Hello from Node.js!',
from: 'MYAPP'
})
});
const data = await response.json();
console.log(data.ok ? 'Sent: ' + data.message_id : 'Error: ' + data.error);
Response
{"ok":true,"message_id":"abc-def-789"}{"ok":false,"error":"to and content required"}401
{"ok":false,"error":"Invalid credentials"}402
{"ok":false,"error":"Insufficient credits"}200
{"ok":true,"queued":true,"message_id":"queued_..."} — Rate/daily limit exceeded, message queued
3. API Authentication Details
Which username and password to use?
| Credential | Where to Find | Used For |
|---|---|---|
| API Key | Shown in HTTP API Clients table (click icon to copy) | Header: X-API-Key |
| API Username | The username you set when creating the HTTP API account | Basic Auth: username:password |
| API Password | The password you set when creating the HTTP API account | Basic Auth: username:password |
| Panel Username | Your login to this dashboard | NOT for API calls |
curl -X POST /api/v1/http-send -H "Content-Type: application/json" -H "X-API-Key: PASTE_YOUR_KEY_HERE" -d '{"to":"971501234567","content":"Test"}'4. How to Create a Shortcode
Step-by-Step
- Go to Gateway β Shortcodes in the sidebar
- Click Add Shortcode
- Fill in the form:
Shortcode * The number that mobile users send SMS to (e.g., 3536)SMPP Connector * Select the SMPP connector that handles this shortcode's traffic. This is the connection to the telco. Assigned EA Select an enterprise user. Inbound messages will appear in their inbox (Messaging β Inbound SMS). Leave blank for admin-only visibility. Description Optional label, e.g., "Marketing opt-in" or "Customer support" - Configure optional features (HTTP Forwarding, Auto-Reply) β see sections 5 and 6 below
- Click Save Shortcode
Mobile User β Telco β SMPP Connector β Shortcode Match β [Save to Inbox] + [Forward to URL] + [Auto-Reply]
5. How to Forward Inbound SMS to External URL
Enable Forwarding
- Edit or create a shortcode
- Toggle Enable HTTP Forwarding ON
- Enter your server URL, e.g.,
https://your-app.com/inbound-sms - Save
What your server receives (POST JSON)
{
"from": "971501234567",
"to": "3536",
"content": "HELP I need information about your service",
"connector": "MAIN-SMPP",
"message_id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": "2026-04-10T12:30:00.000Z",
"shortcode_id": 1,
"ea_username": "company_user"
}
Building your endpoint
Your server must:
- Accept POST requests with
Content-Type: application/json - Return HTTP 2xx status to confirm receipt
- Respond within 10 seconds (timeout)
Example PHP receiver
<?php
// inbound-sms.php β receive forwarded inbound SMS
\$payload = json_decode(file_get_contents('php://input'), true);
\$from = \$payload['from']; // Sender phone number
\$to = \$payload['to']; // Shortcode number
\$message = \$payload['content']; // SMS text
\$msgId = \$payload['message_id'];
// Process the message (save to DB, trigger workflow, etc.)
file_put_contents('inbound_log.txt', date('c')." | From: \$from | To: \$to | Msg: \$message\n", FILE_APPEND);
// MUST return 2xx or it will be logged as failed forward
http_response_code(200);
echo json_encode(['status' => 'received']);
?>
6. How to Set Up Auto-Reply & Keywords
Default Auto-Reply
- Edit or create a shortcode
- Toggle Enable Auto-Reply ON
- Type a default reply message, e.g., "Thank you for contacting us! We'll respond shortly."
- Save β every inbound SMS to this shortcode will now get this auto-reply
Keyword-Based Replies
You can set different replies for different keywords. The system checks the first word of the incoming message (case-insensitive).
- In the shortcode table, click the Keywords button (shows count)
- In the modal, type a keyword (e.g.,
HELP) and a reply message - Click Add Keyword Rule
How matching works
| Incoming SMS | Keyword Match | Reply Sent |
|---|---|---|
| "HELP I need info" | HELP | Custom HELP reply |
| "help please" | HELP (case-insensitive) | Custom HELP reply |
| "INFO" | INFO | Custom INFO reply |
| "Hello there" | No keyword match | Default auto-reply message |
β’ Inbox only β messages saved, no forwarding, no reply
β’ Inbox + Auto-Reply β messages saved + automatic responses
β’ Inbox + Forward + Auto-Reply β full pipeline (message saved, forwarded to URL, and reply sent)
7. How to Test a Shortcode Without Sending From a Phone
Method 1: Use the Panel Test Form
- Go to Messaging β Inbound SMS
- Scroll down to Test Inbound SMS (Simulate deliver_sm)
- Enter a From number (any), the shortcode in "To", and a test message
- Click Send Test
- The message flows through the full inbound pipeline: shortcode matching, inbox routing, forwarding, auto-reply
Method 2: Direct API Call
Use the /api/deliver_sm endpoint to simulate an inbound message programmatically:
# GET method (quick test):
curl "/api/deliver_sm?src=971508994714&dst=3536&msg=HELP"
# POST method (full control):
curl -X POST /api/deliver_sm \
-H "Content-Type: application/json" \
-d '{
"src": "971508994714",
"dst": "3536",
"msg": "HELP I need information"
}'
Parameters
| Field | Required | Description |
|---|---|---|
src | Yes | Source / sender phone number (simulated mobile number) |
msg | Yes | Message content (the SMS text the "mobile user" sends) |
dst | Recommended | Destination / shortcode number. If blank, the message is saved without shortcode matching. |
msg_id | No | Custom message ID. Auto-generated UUID if blank. |
ea | No | Enterprise account username override (bypasses shortcode EA assignment) |
type | No | Message type (default: "sms") |
What happens
- Message is saved to inbox with
connector = "test-deliver-sm" - If
dstmatches a shortcode: enterprise inbox routing activates - If forwarding is enabled: your external URL receives the POST
- If auto-reply is enabled: the reply message is sent back via SMPP
8. DLR (Delivery Report) Callbacks
Setup
Set a DLR Webhook URL on the HTTP API account. When the carrier sends a delivery receipt, we forward it to your URL via HTTP POST with JSON body:
{
"message_id": "abc123-def456",
"from": "MYCOMPANY",
"to": "971501234567",
"msisdn": "971501234567",
"status": "DELIVRD",
"error_code": "000",
"connector": "smpp_connector_1",
"timestamp": "2026-04-10T12:30:00.000Z"
}
DLR Payload Fields
| Field | Type | Description |
|---|---|---|
message_id | string | Unique message identifier returned when SMS was sent |
from | string | Sender ID / source address used when sending the SMS |
to | string | Destination phone number the SMS was sent to |
msisdn | string | Recipient MSISDN (same as to) |
status | string | Delivery status: DELIVRD, UNDELIV, REJECTD, EXPIRED, ENROUTE |
error_code | string | Error code from carrier (000 = no error) |
connector | string | SMPP connector that handled the message |
timestamp | string | ISO 8601 timestamp when DLR was received |
| Status | Meaning |
|---|---|
DELIVRD | Delivered to handset |
UNDELIV | Undeliverable |
REJECTD | Rejected by carrier |
EXPIRED | TTL expired |
ENROUTE | In transit |
9. Sender ID & Unicode SMS
Sender ID
- Alphanumeric: up to 11 characters (e.g.,
MYCOMPANY) - Numeric: full phone number (e.g.,
971501234567) - If
fromfield is provided in the API, it overrides the routing profile default
Unicode / Arabic
- System auto-detects non-GSM characters and switches to UCS-2 encoding
- GSM 7-bit: max 160 chars β Unicode: max 70 chars per SMS part
- Force Unicode with
"coding":"8"
10. Credits & Billing
How to assign credits clearly to EA accounts
- Go to Accounts β Enterprise Users and create/select the EA user.
- Set initial balance in the user form (Credit Balance) and save.
- Go to Accounts β Credits & Wallet to top-up/debit with reason notes.
- If this EA uses HTTP API, link the API account to the EA in Gateway β HTTP API Clients (EA Username field).
- If needed, enable Unlimited Credits on EA to bypass credit checks.
credits_used follows the route rate (example 0.5500), while EA balance deduction is currently 1 credit per SMS unless unlimited.Quick policy summary
- Each SMS sent deducts 1 credit from the EA/account balance (unless Unlimited).
- Route rate (Routing Profiles) is logged as
credits_usedfor reporting and costing. - Admin manages manual top-ups/debits via Credits & Wallet.
- Enterprise user sees own balance in the header and credits page.
Connector commercial fields (SMPP + HTTP)
Open Gateway β SMPP Connectors or Gateway β HTTP Connectors, then Add/Edit connector and fill Provider Billing & Limits:
| Field | Meaning | Stored As (DB) |
|---|---|---|
| Cost / SMS | Provider cost per message for reporting | connector_profiles.cost_per_message |
| Current Balance | Provider prepaid balance | connector_profiles.current_provider_balance |
| Monthly Limit | Postpaid monthly cap | connector_profiles.monthly_limit |
connector_profiles and is reflected in SMPP/HTTP connector lists and policy engine.Alert triggers and channels
- Prepaid alerts: Low/Critical/Exhausted trigger when
current_provider_balancecrosses thresholds. - Postpaid alerts: Warning/Critical/100% trigger when monthly usage crosses configured percentages.
- SMS alert API: alerts are sent through Jasmin HTTP API endpoint
http://smsplus-jasmin:1401/sendusing Settings β Jasmin HTTP user/password. - Email alerts: sent to connector
alert_email_recipientsusing SMTP settings configured in System Settings β SMTP (Email Alerts). - Cooldown: repeats are suppressed by connector cooldown minutes unless alert level changes.
11. Enterprise Account Setup
Creating an Enterprise User
- Go to Accounts β Enterprise Users β Click Add User
- Set username, password, group, SMS quota, credit balance
- Create a Permission Group to control visibility:
view_logsMessage logs, DLR, Inbound SMS, Shortcodes send_smsSend SMS page manage_campaignsCampaigns, Templates, Number Lists manage_api_keysAPI Keys manage_webhooksWebhooks - Enterprise users see only their own data (message logs, inbound, campaigns, credits)
EA + API + Credits mapping checklist
- Create EA user and assign permissions/group.
- Create HTTP API account and set EA Username to link billing and logs.
- Assign routing profile to control connector selection and route rate.
- Top-up EA credits in Credits & Wallet and keep threshold policy documented.
- Optionally set low credit threshold in System Settings for dashboard alerts.
12. Troubleshooting
| Problem | Solution |
|---|---|
API returns 401 | Check API key or username/password. Make sure youβre using the HTTP API account credentials, not panel login. |
API returns 402 | Add credits or enable Unlimited Credits on the account. |
API returns 429 | Sending too fast. Reduce rate or increase the accountβs rate limit. |
| SMS not delivered | Check DLR reports. Verify the SMPP connector is started and the MT route exists. |
| Arabic text garbled | Set "coding":"8" in the request or let auto-detect handle it. |
| Inbound SMS not received | Verify: shortcode exists, SMPP connector is active/started, MO route is configured. |
| Forward webhook failing | Ensure URL is accessible, returns 2xx within 10s. Check Forward Failed count in Inbound SMS stats. |
| Shortcode not matching | The destination number of the incoming SMS must exactly match the shortcode value. Use Test Inbound to verify. |
| Auto-reply not sending | Ensure Auto-Reply is enabled on the shortcode AND at least one SMPP connector is started for outbound. |
Gateway Control
Monitor and manage services (Super Admin only)
Docker Services
| Service | State | Uptime | Ports | Actions |
|---|---|---|---|---|