Endpoint
GET https://app.octopods.io/api/v1/sms/messages/:message_id
:message_id is the message_id returned when the SMS was created via the send endpoint.
Authentication
Include your Channel API Key in the request header:
X-Octopods-Auth: YOUR_CHANNEL_API_KEY
The key must belong to the same SMS channel that sent the message.
Example request
GET https://app.octopods.io/api/v1/sms/messages/4829174 X-Octopods-Auth: YOUR_CHANNEL_API_KEY
Success response
On success the API returns HTTP 200 OK with a JSON body describing the current status:
{
"request_id": "b14f0e5a-3f3c-4e9c-b1d1-6d19f0c4a721",
"message_id": 4829174,
"status": "delivered",
"phone_number": "+15551234567",
"sent_at": "2026-04-24T10:23:45Z",
"delivered_at": "2026-04-24T10:23:49Z",
"failure_reason": null
}
The exact set of timestamp fields depends on how far the message has progressed. Fields for stages the message hasn’t reached yet are null.
Status values
Status | Meaning |
| The SMS has been accepted and is waiting to be handed to the carrier. |
| The SMS provider confirmed the message has been handed to the mobile network. |
| The carrier confirmed the message reached the recipient’s handset. |
| The send failed. |
| The carrier could not deliver the message within its retry window. |
Common failure reasons
When status is failed or undelivered, failure_reason typically contains one of:
The phone number is not a valid mobile subscriber.
The carrier blocked the message for content or sender reputation reasons.
The recipient’s handset is out of coverage or powered off for too long.
The sender number is not approved to deliver to the recipient’s country.
Error response
If the request is malformed or the message cannot be found, the API returns HTTP 400 Bad Request:
{
"request_id": "b14f0e5a-3f3c-4e9c-b1d1-6d19f0c4a721",
"error_code": 1,
"error": "You must supply message_id in your request payload."
}
Error codes
Code | Name | When it happens |
1 |
|
|
5 |
| The API key has been rotated or revoked. Fetch the current key from Octopods. |
Polling tips
Wait a few seconds before polling. Status updates from the carrier arrive asynchronously. An immediate poll typically returns
queuedorsent.Stop polling once the status is terminal.
delivered,failed, andundeliveredare terminal — polling further will not change the result.
What’s next
