Documentation for the SMS Queue and App Version APIs
SMS Queue endpoints require authentication via an API token passed in the URL path:
/api/{your-api-token}/endpoint
You can find your 64-character API token in your dashboard settings.
Note: App Version endpoints (/api/app-version, /api/app-versions, /download/*) are public and do not require authentication.
API requests are limited to 60 requests per minute per API token.
These endpoints are public and do not require authentication.
/api/app-version
Get the currently active app version information.
{
"version": "1.2.0",
"versionCode": 5,
"downloadUrl": "https://selfhostedsms.com/download/app.apk",
"releaseNotes": "- Bug fixes\n- Performance improvements",
"fileSize": 15728640,
"publishedAt": "2026-01-26T12:00:00+00:00"
}
{
"error": "No active version available",
"code": "no_active_version"
}
/api/app-versions
List all published app versions, sorted by version code (newest first).
{
"versions": [
{
"version": "1.2.0",
"versionCode": 5,
"isActive": true,
"downloadUrl": "https://selfhostedsms.com/api/download/5",
"releaseNotes": "- Bug fixes",
"fileSize": 15728640,
"publishedAt": "2026-01-26T12:00:00+00:00"
}
]
}
/download/app.apk
Download the currently active APK file.
Content-Type |
application/vnd.android.package-archive |
Content-Disposition |
attachment; filename="app-v1.2.0.apk" |
Note: Returns the binary APK file for direct download. Each download increments the download counter.
/api/download/{version_code}
Download a specific APK version by its version code.
| Parameter | Required | Description |
|---|---|---|
version_code |
Yes | Numeric version code (e.g., 5) |
{
"error": "Version not found",
"code": "version_not_found"
}
These endpoints require API token authentication.
/api/{api_token}/queue
Add one or more SMS messages to the queue.
[
{
"phone": "+1234567890",
"message": "Hello, this is a test message"
},
{
"phone": "0712345678",
"message": "Another test message"
}
]
| Field | Required | Rules |
|---|---|---|
phone |
Yes | 6-20 digits, optionally starting with + |
message or text |
Yes | Max 1000 characters |
{
"ok": true,
"queued": 2,
"failed": 0,
"items": [
{ "index": 0, "hash": "a1b2c3d4e5f67890", "phone": "+1234567890" },
{ "index": 1, "hash": "f8e7d6c5b4a32109", "phone": "0712345678" }
],
"errors": []
}
/api/{api_token}/get_messages
Retrieve pending SMS messages from the queue. Messages are returned in FIFO order and automatically marked as "initiated".
| Parameter | Required | Default | Description |
|---|---|---|---|
limit |
No | 20 | Number of messages to retrieve (max 200) |
[
{
"phone": "+1234567890",
"text": "Hello, this is a test message",
"hash": "a1b2c3d4e5f67890"
}
]
Note: Once retrieved, messages are marked as "initiated" (status 1).
Use the /status endpoint to report delivery success or failure.
/api/{api_token}/status
Update the delivery status of one or more SMS messages.
{
"device": "MyPhone",
"messages": [
{ "hash": "a1b2c3d4e5f67890", "status": 2 },
{ "hash": "f8e7d6c5b4a32109", "status": 3 }
]
}
| Field | Required | Description |
|---|---|---|
device |
No | Device name that sent the messages (max 15 chars) |
messages |
Yes | Array of status updates |
messages[].hash |
Yes | Message hash from queue |
messages[].status |
Yes | Status code (2 = success, 3 = fail) |
| Status | Meaning |
|---|---|
0 |
New (default, cannot set via API) |
1 |
Initiated (set automatically on retrieval) |
2 |
Success - Message delivered |
3 |
Fail - Message failed to deliver |
{
"ok": true,
"updated": 2
}
{ "error": "Invalid API token" }
{
"error": "No active subscription",
"code": "subscription_required"
}
{
"error": "SMS limit exceeded for this month",
"code": "limit_exceeded",
"limit": 1000,
"used": 1000
}
{
"ok": false,
"queued": 0,
"failed": 1,
"items": [],
"errors": [
{ "index": 0, "error": "Invalid phone format" }
]
}
© 2026 Self Hosted SMS API. All rights reserved.