Skip to main content
Message delivery status comes through webhook events, not the REST API response. The create endpoint (POST /accounts/{account_id}/messages) returns the message object immediately — the status at that point is “created”, and what happens next depends on the carrier.

How delivery works

Status advances in one direction only. If Surge receives an out-of-order carrier status report (a rare but real occurrence on some networks), it is discarded rather than rolling the status back. A message in delivered state will never revert to sent.
Not all carriers send delivery receipts. If you never receive message.delivered after message.sent, it doesn’t mean the message wasn’t delivered. The carrier simply didn’t confirm it. This can be seen in messaging to the US and Canada, but it’s especially prevalent outside of North America. Configure a webhook endpoint (Settings → Webhooks in the dashboard) and handle the events you care about:
Return 200 quickly. If your processing takes time, enqueue the work and return immediately — Surge retries if your handler times out.
See Receiving Messages & Webhooks for endpoint setup and signature verification.

Retrieving a message by ID

The retrieve-message response does not include a status field. It returns the message body, attachments, conversation thread, and metadata. For status, rely on the webhook events.
You can retrieve a sent message to check its current fields:
Use this endpoint to fetch the message body or attachment URLs if you didn’t store them at send time. For status, rely on the webhook events.

Listing messages

To retrieve all messages for an account, use the list endpoint with cursor-based pagination:
Pass after=CURSOR or before=CURSOR as query parameters to page through results. The list returns messages in reverse chronological order (most recent first).