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"
}'
FieldTypeRequiredDescription
tostring[]Yes1 to 100 phone numbers in E.164 format (+ optional, 6-15 digits)
messagestringYesMessage text — encoding is detected automatically; max 10 SMS segments
sender_idstringYesSender ID for the message: 3-11 ASCII alphanumeric characters, first character cannot be a number
Idempotency-Key headerstringNo1-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
}
}
FieldDescription
messagesAccepted messages only (backward-compatible array)
resultsAll recipients with their individual status
summaryTotals: accepted, blocked, errors, cost, detected encoding
results[].statusMeaning
acceptedQueued for delivery
blocked_countryRecipient’s country is in your blocked list
unpricedLegacy/sandbox non-acceptance status retained for compatibility. Current live pricing misses are accepted and queued with a provisional local cost
queue_errorSandbox simulator storage failure (sk_test_ only); live Redis enqueue failures stay accepted and are recovered from the durable outbox
config_errorSMS sending not configured on the account
db_errorThe recipient’s outbox row could not be written
HTTPCodeDescription
400INVALID_BODYCannot parse request body
400INVALID_TOMissing or malformed recipient
400INVALID_MESSAGEMissing message or text over 10 SMS segments
400INVALID_SENDERMissing or invalid sender_id
400TOO_MANY_RECIPIENTSOver 100 recipients
400INVALID_IDEMPOTENCY_KEYIdempotency key is over 128 characters or has unsupported characters
403NO_SMS_ACCESSSMS not enabled on your account
403CONFIG_ERRORSMS credentials incomplete — contact support
403WORKSPACE_NOT_AVAILABLETarget workspace was deleted — use a live workspace
409IDEMPOTENCY_KEY_REUSEDSame key was used with a different request body
409IDEMPOTENCY_REQUEST_IN_PROGRESSSame key is still processing — retry after it completes
429RATE_LIMIT_EXCEEDEDRequest exceeds your per-second message budget — retry later or reduce request rate
500DB_ERRORCould not queue (atomic rollback) — retry the whole request
500IDEMPOTENCY_ERRORCould not reserve the idempotency key — retry with the same key
503SANDBOX_UNAVAILABLE / RATE_LIMIT_UNAVAILABLE / QUEUE_UNAVAILABLESandbox 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: