GET /v1/messages/{id}
Returns the full record for a single message — content, current status, delivery timestamps, and the step-by-step event timeline. Works for both outbound sends and inbound user replies.

Request

Authorization
string
required
Bearer <api_key>
id
string
required
The message ID returned in the send response or from GET /v1/messages.

Response

{
  "id": "msg_a1b2c3d4",
  "direction": "OUTBOUND",
  "channel_id": "ch_rcs_xxxx",
  "contact_id": "c_a1b2c3d4",
  "campaign_id": null,
  "message_type": "MESSAGE",
  "content_type": "INTERACTIVE",
  "content": {
    "rich_card": {
      "standalone": {
        "title": "Summer Sale — 50% off",
        "description": "Shop this weekend only.",
        "media": { "url": "https://cdn.arowana.app/summer-sale.jpg" }
      }
    }
  },
  "status": "READ",
  "cost": "0.0800",
  "error_code": null,
  "error_message": null,
  "sent_at": "2026-03-28T09:00:01Z",
  "delivered_at": "2026-03-28T09:00:04Z",
  "read_at": "2026-03-28T09:03:22Z",
  "created_at": "2026-03-28T09:00:00Z",
  "events": [
    { "type": "queued",    "at": "2026-03-28T09:00:00Z" },
    { "type": "sent",      "at": "2026-03-28T09:00:01Z" },
    { "type": "delivered", "at": "2026-03-28T09:00:04Z" },
    { "type": "read",      "at": "2026-03-28T09:03:22Z" }
  ]
}

Response fields

id
string
Unique message identifier.
direction
string
OUTBOUND (sent to a user) or INBOUND (received from a user).
channel_id
string
The channel the message was sent on or received from.
contact_id
string
The contact associated with this message.
campaign_id
string
Set if the message was dispatched by a campaign. null for API sends.
content_type
string
Shape of content: TEXT, TEMPLATE, MEDIA, or INTERACTIVE.
content
object
Full message content as originally sent (or received for inbound). Shape matches the content field in POST /v1/messages.
status
string
Current lifecycle status. See List messages for all values.
cost
string
Settled cost in EUR as a decimal string (e.g. "0.0800"). null for inbound messages and messages that failed before billing. Returned as a string to preserve decimal precision — unlike the numeric hold_amount / message_price fields in the send response.
error_code
string
Machine-readable failure code. null for successful or in-progress messages.
events
array
Ordered timeline of status transitions. Each entry has type (the status reached) and at (ISO 8601 timestamp).

Example

curl "https://api.arowana.app/v1/messages/msg_a1b2c3d4" \
  -H "Authorization: Bearer $API_KEY"

List messages

Filter and paginate across all messages in your workspace.

Revoke message

Cancel a queued message before it is delivered.