For production integrations, always prefer HTTPS and pass credentials via the Authorization header or HTTP Basic Auth, instead of placing username/password directly in a GET URL. Query-string credentials can be exposed in server logs, browser history, and referrer headers.
The Get Verified SMS HTTP API allows you to send SMS messages and check delivery status via simple HTTP requests. Replace <your-api-host> below with the host provided to you at onboarding. Code examples are shown in curl, Node.js, and Python — click a tab to switch.
http://<your-api-host>:8001/api?username=<username>&password=<password>&ani=<ani>&dnis=<dnis>&message=<message>&command=submit&serviceType=<serviceType>&longMessageMode=<longMessageMode>
const params = new URLSearchParams({
username: '<username>',
password: '<password>',
ani: '<ani>',
dnis: '<dnis>',
message: '<message>',
command: 'submit',
serviceType: '<serviceType>',
longMessageMode: '<longMessageMode>'
});
const response = await fetch(`http://<your-api-host>:8001/api?${params}`);
const data = await response.json();
import requests
params = {
'username': '<username>',
'password': '<password>',
'ani': '<ani>',
'dnis': '<dnis>',
'message': '<message>',
'command': 'submit',
'serviceType': '<serviceType>',
'longMessageMode': '<longMessageMode>'
}
response = requests.get('http://<your-api-host>:8001/api', params=params)
print(response.json())
https://<your-api-host>:8002/api?username=<username>&password=<password>&ani=<ani>&dnis=<dnis>&message=<message>&command=submit&serviceType=<serviceType>&longMessageMode=<longMessageMode>
const params = new URLSearchParams({
username: '<username>',
password: '<password>',
ani: '<ani>',
dnis: '<dnis>',
message: '<message>',
command: 'submit',
serviceType: '<serviceType>',
longMessageMode: '<longMessageMode>'
});
const response = await fetch(`https://<your-api-host>:8002/api?${params}`);
const data = await response.json();
import requests
params = {
'username': '<username>',
'password': '<password>',
'ani': '<ani>',
'dnis': '<dnis>',
'message': '<message>',
'command': 'submit',
'serviceType': '<serviceType>',
'longMessageMode': '<longMessageMode>'
}
response = requests.get('https://<your-api-host>:8002/api', params=params)
print(response.json())
curl -H 'Content-Type: application/json' -X POST \
-d '{"ani":"ani","dnis":"dnis","message":"test"}' \
'https://<your-api-host>:8002/api?command=submit&username=username&password=password'
const response = await fetch(
'https://<your-api-host>:8002/api?command=submit&username=username&password=password',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ ani: 'ani', dnis: 'dnis', message: 'test' })
}
);
import requests
response = requests.post(
'https://<your-api-host>:8002/api',
params={'command': 'submit', 'username': 'username', 'password': 'password'},
json={'ani': 'ani', 'dnis': 'dnis', 'message': 'test'}
)
curl -H 'Content-Type: application/json' -X POST \
-d '{"username":"username","password":"password","command":"submit","ani":"ani","dnis":"dnis","message":"test"}' \
'https://<your-api-host>:8002/api'
const response = await fetch('https://<your-api-host>:8002/api', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
username: 'username',
password: 'password',
command: 'submit',
ani: 'ani',
dnis: 'dnis',
message: 'test'
})
});
import requests
response = requests.post('https://<your-api-host>:8002/api', json={
'username': 'username',
'password': 'password',
'command': 'submit',
'ani': 'ani',
'dnis': 'dnis',
'message': 'test'
})
curl -H 'Content-Type: application/json' -X POST \
-d '{"ani":"ani","dnis":"dnis","message":"test"}' \
-u 'username:password' \
'https://<your-api-host>:8002/api?command=submit'
const response = await fetch('https://<your-api-host>:8002/api?command=submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic ' + Buffer.from('username:password').toString('base64')
},
body: JSON.stringify({ ani: 'ani', dnis: 'dnis', message: 'test' })
});
import requests
from requests.auth import HTTPBasicAuth
response = requests.post(
'https://<your-api-host>:8002/api?command=submit',
json={'ani': 'ani', 'dnis': 'dnis', 'message': 'test'},
auth=HTTPBasicAuth('username', 'password')
)
curl -H 'Content-Type: application/json' -X POST \
-H 'Authorization: Basic base64(username:password)' \
-d '{"ani":"ani","dnis":"dnis","message":"test"}' \
'https://<your-api-host>:8002/api?command=submit'
const credentials = Buffer.from('username:password').toString('base64');
const response = await fetch('https://<your-api-host>:8002/api?command=submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Basic ${credentials}`
},
body: JSON.stringify({ ani: 'ani', dnis: 'dnis', message: 'test' })
});
import requests
import base64
credentials = base64.b64encode(b'username:password').decode()
response = requests.post(
'https://<your-api-host>:8002/api?command=submit',
headers={'Authorization': f'Basic {credentials}'},
json={'ani': 'ani', 'dnis': 'dnis', 'message': 'test'}
)
Note: To send the same message to multiple recipients, provide several comma-separated numbers in the dnis field.
| Parameter | Description | Required |
|---|---|---|
command | Request type: submit, query, or mo. To send a message, use command=submit. | Required |
dnis | Destination number in international E.164 format (up to 15 digits). Max 2048 characters or 100 numbers per request; longer requests are rejected with 400 Bad Request. Duplicate numbers in the same request are only sent once. Cannot contain multiple numbers when longMessageMode=split_or_payload. | Required |
message | Message text. Must be URL-encoded for GET requests. | Required |
username | API login. | Required |
password | API password. Prefer sending via HTTPS + Authorization header rather than in the URL. | Required |
serviceType | Service type assigned by Get Verified for your interconnection. Max 9 bytes. Can be left blank. | Required |
ani | Caller ID / Sender ID. Alphanumeric, up to 32 characters. Some destinations may impose additional restrictions. | Optional |
dataCoding | Character encoding for the outgoing message. Integer. Allowed: 0 (SMSC default), 1 (IA5/ASCII), 3 (Latin-1), 6 (Cyrillic), 7 (Latin/Hebrew), 8 (UCS2), 10 (ISO-2022-JP), 14 (KS C 5601). | Optional |
esmClass | Corresponds to the SMPP parameter of the same name. Integer, 0–255. | Optional |
flash | Marks the message as a flash SMS. 0 = regular, 1 = flash (shown on screen, not stored). Does not change the data coding. | Optional |
longMessageMode | How long messages are handled: cut (default, trims to 140 bytes), split / split_sar (splits into segments with different headers), single_id_split (splits but keeps one message ID), payload (sends full text in the payload field), split_or_payload (for HTTP-to-SMPP delivery; not supported with multiple DNIS). | Optional |
incMsgId | Your own message ID (max 124 bytes) to correlate requests, useful when no routes are available. For split messages, the same ID is reused per segment with a suffix (e.g. -1, -2). | Optional |
srcTon, srcNpi, dstTon, dstNpi | Sender/destination type and numbering plan indicators. Integer. | Optional |
priorityFlag | Corresponds to the SMPP parameter of the same name. Allowed: 0, 1. | Optional |
registeredDelivery | Corresponds to the SMPP parameter of the same name. Allowed: 0, 1. | Optional |
replaceIfPresentFlag | Corresponds to the SMPP parameter of the same name. Allowed: 0, 1. | Optional |
silent | Sends a silent SMS (no sound, not shown on screen). 0 = not silent; any other explicit value is treated as silent. Actual behavior depends on the destination carrier. | Optional |
validityPeriod | Message validity, in relative (e.g. 000002000000000R = 2 days) or absolute (e.g. 241222080910000- = valid until Dec 22 2024, 08:09:10 GMT) format. | Optional |
https://<your-api-host>:8002/api?username=<username>&password=<password>&messageId=<msgId>&command=query
const params = new URLSearchParams({
username: '<username>',
password: '<password>',
messageId: '<msgId>',
command: 'query'
});
const response = await fetch(`https://<your-api-host>:8002/api?${params}`);
const data = await response.json();
import requests
params = {
'username': '<username>',
'password': '<password>',
'messageId': '<msgId>',
'command': 'query'
}
response = requests.get('https://<your-api-host>:8002/api', params=params)
print(response.json())
| Parameter | Description | Required |
|---|---|---|
username | API login. | Required |
password | API password. | Required |
messageId | The message ID returned when the message was submitted. | Required |
command | Must be set to query. | Required |
Example response:
{"status": "DELIVRD", "delivery_time": "20260728093309"}
delivery_time format: YYYYMMDDHHMMSS, UTC.
Content-Type: application/json
{"message_id":"alss-a1b2c3d4-e5f67890"}
Content-Type: application/json
[{"dnis":"34511121","message_id":"5b4c46a8-8dc9-44b4-f55f-3bef56819305","segment_num":"1"},
{"dnis":"34511121","message_id":"5b4c46a8-46bc-7ee6-4a16-7d4e5a0d14af","segment_num":"2"}]
Content-Type: text/html; charset=UTF-8 NO ROUTES
Content-Type: text/html; charset=UTF-8 not authorized (check login and password)
Content-Type: text/html; charset=UTF-8 Service type is invalid
Content-Type: text/html; charset=UTF-8 loop detected