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.

Status Description Final?
pending Queued, waiting to send No
sent Submitted to carrier network No
ENROUTE Accepted by carrier, in transit No
ACCEPTD Accepted by carrier for delivery No
DELIVRD Delivered to recipient’s handset Yes
UNDELIV Delivery failed (invalid number, phone off) Yes
REJECTD Rejected by carrier (filtered, blacklisted) Yes
EXPIRED Delivery timed out Yes
DELETED Message deleted on the carrier network Yes
UNKNOWN Final status unknown Yes
failed Rejected by the gateway before routing (usually no route available), or an internal queue failure. Never charged — the portal reports these as Not Billed. Yes

Raw carrier statuses (ENROUTE, ACCEPTD, DELETED) can appear verbatim — treat any status not in your known set as non-final and keep polling, except the clearly terminal ones above. See delivery statuses for typical status flows.

When filtering the message list by status, the accepted filter values are delivered, undelivered, expired, pending, not_billed and sent (legacy aliases failed and unknown map to undelivered) — these map to groups of the raw statuses above.

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.