Skip to content

Send an SMS to one or more recipients.

POST /api/v1/sms/send · Permission: sms.send

Terminal window
curl -X POST https://restlink23telecom.com/api/v1/sms/send \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": [
"+14155551234",
"+447911123456"
],
"message": "Your verification code is 847291",
"sender_id": "MyApp"
}'
Field Type Required Description
to string[] Yes 1 to 100 phone numbers in E.164 format (+ optional, 6-15 digits)
message string Yes Message text — encoding is detected automatically; max 10 SMS segments
sender_id string Yes Sender ID for the message: 3-11 ASCII alphanumeric characters, first character cannot be a number
Idempotency-Key header string No 1-128 ASCII letters, numbers, _, -, . or :. Reuse it on a retry. Completed responses are retained for 24 hours and replayed byte-for-byte with Idempotent-Replayed: true; a replay is not a new send. X-Idempotency-Key is a legacy alias.

The API trims leading and trailing whitespace from to, message and sender_id before validation. Blank values, malformed phone numbers, over-10-segment messages, and invalid senders return 400.

200 OK
{
"status": true,
"messages": [
{"dnis": "+14155551234", "message_id": "api_42_1743667200123456789_a3f8b2c1d9e45f67", "segment_num": 1},
{"dnis": "+447911123456", "message_id": "api_42_1743667200123456789_b7c4e8f1a2d3690b", "segment_num": 1}
],
"results": [
{"dnis": "+14155551234", "message_id": "api_42_1743667200123456789_a3f8b2c1d9e45f67", "segments": 1, "status": "accepted"},
{"dnis": "+447911123456", "message_id": "api_42_1743667200123456789_b7c4e8f1a2d3690b", "segments": 1, "status": "accepted"}
],
"summary": {
"total_recipients": 2,
"total_segments": 2,
"total_cost": 0.02,
"encoding": "GSM-7",
"accepted_count": 2,
"blocked_count": 0,
"unpriced_count": 0,
"queue_error_count": 0,
"config_error_count": 0,
"db_error_count": 0
}
}
Field Description
messages Accepted messages only (backward-compatible array)
results All recipients with their individual status
summary Totals: accepted, blocked, errors, cost, detected encoding
results[].status Meaning
accepted Queued for delivery
blocked_country Recipient’s country is in your blocked list
unpriced Legacy/sandbox non-acceptance status retained for compatibility. Current live pricing misses are accepted and queued with a provisional local cost
queue_error Sandbox simulator storage failure (sk_test_ only); live Redis enqueue failures stay accepted and are recovered from the durable outbox
config_error SMS sending not configured on the account
db_error The recipient’s outbox row could not be written
HTTP Code Description
400 INVALID_BODY Cannot parse request body
400 INVALID_TO Missing or malformed recipient
400 INVALID_MESSAGE Missing message or text over 10 SMS segments
400 INVALID_SENDER Missing or invalid sender_id
400 TOO_MANY_RECIPIENTS Over 100 recipients
400 INVALID_IDEMPOTENCY_KEY Idempotency key is over 128 characters or has unsupported characters
403 NO_SMS_ACCESS SMS not enabled on your account
403 CONFIG_ERROR SMS credentials incomplete — contact support
403 WORKSPACE_NOT_AVAILABLE Target workspace was deleted — use a live workspace
409 IDEMPOTENCY_KEY_REUSED Same key was used with a different request body
409 IDEMPOTENCY_REQUEST_IN_PROGRESS Same key is still processing — retry after it completes
429 RATE_LIMIT_EXCEEDED Request exceeds your per-second message budget — retry later or reduce request rate
500 DB_ERROR Could not queue (atomic rollback) — retry the whole request
500 IDEMPOTENCY_ERROR Could not reserve the idempotency key — retry with the same key
503 SANDBOX_UNAVAILABLE / RATE_LIMIT_UNAVAILABLE / QUEUE_UNAVAILABLE Sandbox simulator, rate limiter, or SMS queue temporarily unavailable — retry shortly

The send response confirms acceptance, not delivery. To learn whether the message reached the handset: