---
title: "Return one message row, account-scoped by X-Api-Key"
method: GET
path: "/v2/messages/{message_id}"
tags: ["messages-v2"]
---

# Return one message row, account-scoped by X-Api-Key

`GET /v2/messages/{message_id}`

## Request

- Base URL: `https://api.tracklysms.com/api`
- URL: `https://api.tracklysms.com/api/v2/messages/{message_id}`
- Auth: API key in header `X-Api-Key`

## Response `200`

Success

- MessageDetailResponse
  - `message` MessageRow
    - `api_key_id` string, nullable: ID of the API key that sent the message; null for dashboard, scheduled, or journey sends
    - `body` string: Message body text
    - `cost_state` string: estimated | settled | billed | refunded
    - `dlr_status` string: Normalized carrier DLR status
    - `encoding` string: GSM-7 or UCS-2, derived from body text
    - `error_code` string: Normalized carrier error code
    - `error_description` string: Normalized carrier error description
    - `external_ids` object: Partner-supplied external ids echoed from the account
    - `from_number` string: Sender number (E.164)
    - `id` string: Message ID
    - `is_delivered` boolean: Normalized delivered flag
    - `is_terminal` boolean: Whether the DLR is a terminal state
    - `message_type` string: mms for MMS records; omitted for legacy SMS
    - `provider_message_id` string: Carrier/provider message id from the delivery receipt (present when the provider pmid is globally unique)
    - `replied_at` string: Reply timestamp (ISO8601)
    - `reply_id` string: AllReplies ID if the recipient replied
    - `reply_kind` string, nullable: human | reaction | stop | start | help | keyword; null when there is no reply or the reply predates classification
    - `reply_text` string, nullable: Text of the most recent linked inbound reply, capped at 1600 characters; null when there is no reply and when the reply carried no text (media-only or reaction), so use reply_id to tell the two apart
    - `segment_count` integer: Billed SMS segment count
    - `sending_list_id` integer: Sending list ID
    - `status` string: Lifecycle status
    - `status_detail` string: Status detail / drop reason
    - `timestamp` string: Send timestamp (ISO8601)
    - `to_number` string: Recipient number (E.164)
    - `updated_at` string: Last-mutated timestamp (ISO8601); falls back to timestamp on legacy rows

## Other responses

- `401`: Authentication error
- `404`: Message not found

---

[API](https://skmtc.dev/tracklysms/apis/trackly-sms-api.md) · [All operations](https://skmtc.dev/tracklysms/apis/trackly-sms-api/llms.txt) · [OpenAPI document](https://skmtc.dev/tracklysms/apis/trackly-sms-api/revisions/ac1ad22cb2a9?raw)
