Skip to content

Check the delivery status of a sent message.

GET  /api/v1/sms/status/:message_id  · Permission: sms.read

Terminal window
curl https://restlink23telecom.com/api/v1/sms/status/api_42_1743667200123456789_a3f8b2c1d9e45f67 \
-H "X-API-Key: $API_KEY"
200 OK
{
"status": true,
"message": {
"message_id": "api_42_1743667200123456789_a3f8b2c1d9e45f67",
"telecom_message_id": "6946d0f5-040b-106e-42c7-49026f2b5bc1",
"recipient": "+14155551234",
"segments": 1,
"message": "Your verification code is 847291",
"sender_id": "MyApp",
"status": "DELIVRD",
"status_code": "000",
"cost": 0.0085,
"created_at": "2026-02-13T10:30:00Z",
"delivered_at": "2026-02-13T10:30:04Z"
}
}

Returns 404 NOT_FOUND if the message does not exist or belongs to another account.

StatusDescriptionFinal?
pendingQueued, waiting to sendNo
sentSubmitted to carrier networkNo
DELIVRDDelivered to recipient’s handsetYes
UNDELIVDelivery failed (invalid number, phone off)Yes
REJECTDRejected by carrier (filtered, blacklisted)Yes
EXPIREDDelivery timed outYes
UNKNOWNFinal status unknownYes
failedInternal error (queue/config failure)Yes

See delivery statuses for typical status flows.

If you poll instead of using webhooks:

  • Poll every 3–5 seconds, stop on any final status.
  • Give up after a few minutes and treat the message as in-flight — some carriers report late; the hourly reconciliation will finalize stuck messages.
  • Prefer webhooks for anything beyond low-volume testing: they remove polling load and deliver statuses the moment carriers report them.