Reference / Messages / Send SMS

POSTSend SMS

POST https://me-sms.com/api/v2/sms/send

Send an SMS message to a destination number. Send to a single number or batch up to 2,000,000 numbers per request. On success, the response includes a uuid you can use to fetch status and delivery reports at GET /api/v2/sms/{uuid}/recipients.

– Authentication

How to authenticate

Create an API key on the Settings → API Keys page. Then attach the x-api-key: <key> header on every request.

The POST /api/v2/sms/send endpoint requires an API key with the sms:send scope or *. Other endpoints in this doc only require any valid API key.

– Body parameters

Parameters

sender
stringREQUIRED
An approved Sender name, up to 11 characters (English/numbers/symbols). Request a new sender on the Senders page.
content
stringOPTIONAL*
Message content, up to 1,000 characters. Thai counts as 70 characters per SMS, English as 160 per SMS. *Either content or templateId is required.
msisdns
string[]OPTIONAL*
Destination numbers, format 66XXXXXXXXX or 0XXXXXXXXX. Up to 2,000,000 numbers per request. *Either msisdns or contactGroupId is required.
contactGroupId
integerOPTIONAL
Send to an existing contact group. The system resolves every number in the group automatically.
templateId
integerOPTIONAL
Use a saved template instead of content. Provide variables to fill placeholders like {{name}}.
variables
objectOPTIONAL
Key/value pairs to substitute in the template, e.g. {"name":"Toon"}.
scheduledTime
string (ISO 8601)OPTIONAL
Time to send in the future, e.g. 2026-06-01T10:00:00+07:00.
dryRun
booleanOPTIONAL
Set to true to estimate cost and message parts without consuming credits or actually sending.
– Response

Response

200 OKMessage has been queued
400 Invalid number or parameter
401 Missing / invalid API key
402 Insufficient credits — top up at the pricing page
429 Rate limit exceeded — reduce throughput
– Delivery status

Per-recipient delivery status

Call GET /api/v2/sms/{uuid}/recipients to receive the status for each number.

pending
Accepted; queued for delivery to the carrier.
success
Delivered to recipient ✓
failed
Send failed (phone off / no signal)
invalid
Invalid number
blocked
Number is on the blocklist
expired
Retry window exhausted
timeout
No delivery report received within the allowed window

Error format

When the API responds with a 4xx/5xx status code, the body is always JSON in the same shape:

{
  "error": "Insufficient credits",
  "code": "INSUFFICIENT_CREDITS"
}

error is human-readable; code is machine-readable (present on some endpoints, e.g. send/retry). Common HTTP status codes:

400
Invalid parameters
401
Missing / invalid API key
402
Insufficient credits
403
Scope insufficient or you're not the resource owner
404
Resource not found
429
Rate limit exceeded

POSTPreview cost

POST https://me-sms.com/api/v2/sms/preview-cost

Compute the number of message parts and credits that would be charged before calling /send. No credits are consumed and no SMS is sent.

Body parameters

content
stringREQUIRED
Content used for the calculation, up to 2,000 characters.
msisdns
string[]OPTIONAL*
Destination numbers — choose msisdns or contactGroupId.
contactGroupId
integerOPTIONAL
A contact group id instead of listing numbers individually.
templateId
integerOPTIONAL
Use a saved template instead of content.
variables
objectOPTIONAL
Variable substitutions in the template.

POSTCancel scheduled SMS

POST https://me-sms.com/api/v2/sms/{uuid}/cancel

Cancel a scheduled SMS that has not yet been sent. Credits are refunded after cancellation (if previously held).

Path

uuid
stringREQUIRED
The UUID returned when you called /send.

Only SMS that are scheduled and not yet started can be cancelled (i.e. with a scheduledTime). If the SMS is already processing / sent / cancelled, you'll get HTTP 400 or 409 with code: NOT_SCHEDULED / ALREADY_CANCELLED / ALREADY_PROCESSING.


GETList messages

GET https://me-sms.com/api/v2/sms

Lists the messages on the account, most recent first.

Query parameters

page
integerOPTIONAL
default 1
limit
integerOPTIONAL
default 20, max 100
status
enumOPTIONAL
sent | failed | pending | scheduled | cancelled
sender
stringOPTIONAL
Filter by sender name
from / to
ISO 8601OPTIONAL
createdAt time window
search
stringOPTIONAL
Search in refNo / content

GETGet one message

GET https://me-sms.com/api/v2/sms/{uuid}

Details of a single SMS, including drSummary (count per status) once the send is complete.


GETRecipients (per-recipient status)

GET https://me-sms.com/api/v2/sms/{uuid}/recipients

Per-recipient destination status, with cursor pagination so you can page through very large recipient lists fast — even at million-recipient scale.

Query parameters

limit
integerOPTIONAL
default 50, max 50
after
integerOPTIONAL
Cursor — pass the nextCursor from the previous response (start at 0 for the first page) to fetch the next page.
status
enumOPTIONAL
pending | success | failed | invalid | blocked | expired | timeout
search
stringOPTIONAL
Search recipient numbers (substring match)

When using after, the response carries nextCursor + hasMore in place of total (use summary[] for the per-status totals).


GETCredit balance

GET https://me-sms.com/api/v2/sms/credit/balance

Account credit balance — useful to check before a large batch send.


GETList senders

GET https://me-sms.com/api/v2/senders

All sender names on the account (including shared). You can send SMS only from senders with status = "approved".

Request a new sender name via the Senders page in the app (document verification is required — not available through the API).