> ## Documentation Index
> Fetch the complete documentation index at: https://doc.convo.co.in/llms.txt
> Use this file to discover all available pages before exploring further.

# Retrieve a WhatsApp Message — Status and Timestamps

> GET /project/{project_id}/messages/{message_id} — Retrieve full details of a sent or received WhatsApp message including delivery status and timestamps.

Use this endpoint to retrieve the full details of any WhatsApp message — sent or received — including its current delivery status, timestamps, billing information, and content.

## Endpoint

```text theme={null}
GET https://connect.api-wa.co/project-apis/v1/project/{project_id}/messages/{message_id}
```

## Authentication

Include your project API password in every request header:

```text theme={null}
X-API-WA-Project-API-Pwd: YOUR_API_PASSWORD
```

## Path Parameters

<ParamField path="project_id" type="string" required>
  Your Convo project ID. You can find this in your Convo dashboard under **Project Settings**.
</ParamField>

<ParamField path="message_id" type="string" required>
  The Convo message ID or the WhatsApp message ID (`wamid...`) returned when the message was sent. Both formats are accepted.
</ParamField>

## Example Request

```bash theme={null}
curl -X GET \
  "https://connect.api-wa.co/project-apis/v1/project/YOUR_PROJECT_ID/messages/wamid.HBgMOTE4ODUxOTQ0MzgxFQIAERgSRkMwRDFGM0FCRDI5ODVEREQ3AA==" \
  -H "X-API-WA-Project-API-Pwd: YOUR_API_PASSWORD"
```

## Response

**200 OK**

```json theme={null}
{
  "id": "wamid.HBgMOTE4ODUxOTQ0MzgxFQIAERgSRkMwRDFGM0FCRDI5ODVEREQ3AA==",
  "project_id": "YOUR_PROJECT_ID",
  "phone_number": "917089379345",
  "contact_id": "64f3a1e0c8e4d500123abc00",
  "sender": "API",
  "status": "READ",
  "message_type": "TEXT",
  "message_content": {
    "text": "Hello! How can we help you today?"
  },
  "is_HSM": false,
  "campaign": null,
  "sent_at": 1710000000000,
  "delivered_at": 1710000015000,
  "read_at": 1710000060000,
  "message_price": 1,
  "deductionType": "WC",
  "mau_details": null,
  "whatsapp_conversation_details": {
    "type": "service",
    "expiry": 1710086400000
  }
}
```

## Response Fields

<ResponseField name="id" type="string">
  The WhatsApp-assigned message ID (starts with `wamid`). This is the same ID returned in the [Send Message](/api-reference/messages/send-message) response.
</ResponseField>

<ResponseField name="project_id" type="string">
  The Convo project this message belongs to.
</ResponseField>

<ResponseField name="phone_number" type="string">
  The contact's WhatsApp phone number (with country code, no `+`).
</ResponseField>

<ResponseField name="contact_id" type="string">
  The Convo internal ID of the contact associated with this message. Use this with the [Get Contact](/api-reference/contacts/get-contact) endpoint.
</ResponseField>

<ResponseField name="sender" type="string">
  Who sent the message. Possible values:

  | Value    | Description                                      |
  | -------- | ------------------------------------------------ |
  | `SYSTEM` | Sent automatically by Convo (e.g., auto-replies) |
  | `AGENT`  | Sent manually by a team agent via the dashboard  |
  | `USER`   | Inbound message from the contact                 |
  | `API`    | Sent via the Convo REST API                      |
</ResponseField>

<ResponseField name="status" type="string">
  Current delivery status of the message.

  | Value       | Description                               |
  | ----------- | ----------------------------------------- |
  | `SENT`      | Message has been sent to WhatsApp servers |
  | `DELIVERED` | Message has been delivered to the device  |
  | `READ`      | Message has been read by the recipient    |
</ResponseField>

<ResponseField name="message_type" type="string">
  The content type of the message. Possible values include: `TEXT`, `IMAGE`, `VIDEO`, `FILE`, `AUDIO`, `STICKER`, `LOCATION`, `CONTACT`, `QUICK_REPLY`, and others.
</ResponseField>

<ResponseField name="message_content" type="object">
  The actual content of the message. The structure varies by `message_type`:

  * For `TEXT`: contains a `text` field (string) with the message body.
  * For `IMAGE`, `VIDEO`, `FILE`, `AUDIO`: contains a `link` field (URL) and optional `caption`.
  * For `LOCATION`: contains `latitude`, `longitude`, and optional `name`.
</ResponseField>

<ResponseField name="is_HSM" type="boolean">
  `true` if this message was sent as a WhatsApp template (Highly Structured Message). `false` for session messages.
</ResponseField>

<ResponseField name="campaign" type="object | null">
  If the message was sent as part of a broadcast campaign, this object contains:

  * `name` (string): The campaign name.
  * `campaign_id` (string): The campaign's unique ID.

  Returns `null` for messages not tied to a campaign.
</ResponseField>

<ResponseField name="sent_at" type="number">
  Unix timestamp in milliseconds when the message was sent.
</ResponseField>

<ResponseField name="delivered_at" type="number | null">
  Unix timestamp in milliseconds when the message was delivered to the recipient's device. `null` if not yet delivered.
</ResponseField>

<ResponseField name="read_at" type="number | null">
  Unix timestamp in milliseconds when the recipient read the message. `null` if not yet read (or if read receipts are disabled).
</ResponseField>

<ResponseField name="message_price" type="integer">
  The number of Convo credits deducted for this message.
</ResponseField>

<ResponseField name="deductionType" type="string">
  The billing model used for this message:

  * `MAU` — deducted under Monthly Active User pricing.
  * `WC` — deducted under WhatsApp Conversation-based pricing.
</ResponseField>

<ResponseField name="mau_details" type="object | null">
  Additional billing details when `deductionType` is `MAU`. `null` for `WC` messages.
</ResponseField>

<ResponseField name="whatsapp_conversation_details" type="object | null">
  Details about the WhatsApp conversation window this message belongs to:

  * `type` (string): Conversation category, e.g., `"service"`, `"marketing"`, `"utility"`, `"authentication"`.
  * `expiry` (number): Unix timestamp in milliseconds when the conversation window closes.

  Returns `null` if conversation details are unavailable.
</ResponseField>

## Error Responses

| HTTP Status | Meaning                                                              |
| ----------- | -------------------------------------------------------------------- |
| `401`       | Unauthorized — invalid or missing `X-API-WA-Project-API-Pwd` header. |
| `404`       | Message not found — the `message_id` does not exist in this project. |
