> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mindosoftware.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Message status

> Check the delivery status of an individual template message

## Description

This endpoint returns the updated status of an individual message sent with a WhatsApp template. It complements the fire-and-forget pattern of [Send message](/en/api-reference/mensajes/enviar-mensaje): you use the `message_id` (wamid) returned when sending to check the message's current delivery status.

Delivery statuses (`sent`, `delivered`, `read`, `failed`) are updated automatically as Meta sends the corresponding webhooks. A message just sent will typically show `sent` until the delivery and read confirmations arrive.

## Authentication header

<ParamField header="X-API-Key" type="string" required>
  Your Mindo API Key. Format: `mindo_xxxxxxxxxxxxxxxxxxxxxxxx`
</ParamField>

## Path parameters

<ParamField path="message_id" type="string" required>
  Message ID assigned by Meta (wamid). It's the `message_id` value returned by [Send message](/en/api-reference/mensajes/enviar-mensaje) when sending the template.
</ParamField>

## Response (200 OK)

<ResponseField name="id" type="integer">
  Internal ID of the send record in Mindo.
</ResponseField>

<ResponseField name="template" type="object">
  Information about the template used.

  <Expandable title="template properties">
    <ResponseField name="id" type="integer">
      Internal template ID.
    </ResponseField>

    <ResponseField name="name" type="string">
      Template name.
    </ResponseField>

    <ResponseField name="language" type="string">
      Template language (e.g.: `"es"`, `"en"`, `"pt_BR"`).
    </ResponseField>

    <ResponseField name="category" type="string">
      Template category in Meta (e.g.: `"MARKETING"`, `"UTILITY"`, `"AUTHENTICATION"`).
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="recipient" type="object">
  Recipient information.

  <Expandable title="recipient properties">
    <ResponseField name="phone" type="string">
      Recipient's phone number.
    </ResponseField>

    <ResponseField name="contact_name" type="string | null">
      Contact name in Mindo. `null` if the phone number doesn't match a registered contact.
    </ResponseField>

    <ResponseField name="contact_id" type="integer | null">
      Contact ID in Mindo. `null` if the phone number doesn't match a registered contact.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="variables_used" type="object">
  Variables used to render the template for this send.
</ResponseField>

<ResponseField name="delivery_status" type="object">
  Detailed delivery status with the timestamp of each transition. Updated via Meta webhooks.

  <Expandable title="delivery_status properties">
    <ResponseField name="current" type="string">
      Current message status. See [status table](#message-statuses).
    </ResponseField>

    <ResponseField name="sent_at" type="string (ISO 8601) | null">
      Date and time the message was sent to Meta.
    </ResponseField>

    <ResponseField name="delivered_at" type="string (ISO 8601) | null">
      Date and time of delivery to the device. `null` if not yet delivered.
    </ResponseField>

    <ResponseField name="read_at" type="string (ISO 8601) | null">
      Date and time of read. `null` if not yet read.
    </ResponseField>

    <ResponseField name="failed_at" type="string (ISO 8601) | null">
      Date and time the send failed. `null` if it didn't fail.
    </ResponseField>

    <ResponseField name="error_code" type="string | null">
      Meta error code if the message failed. `null` if there was no error.
    </ResponseField>

    <ResponseField name="error_message" type="string | null">
      Error description if the message failed. `null` if there was no error.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="meta_message_id" type="string | null">
  Message ID in Meta (wamid). Matches the `message_id` in the path.
</ResponseField>

<ResponseField name="was_successful" type="boolean">
  Whether the initial send to Meta was successful.
</ResponseField>

<ResponseField name="error_message" type="string | null">
  Error message from the initial send. `null` if there was no error.
</ResponseField>

<ResponseField name="sent_at" type="string (ISO 8601)">
  Date and time the send was recorded.
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X GET "https://api.mindosoftware.com/api/v1/meta-templates/messages/wamid.HBgNNTQ5MTEyMzQ1Njc4FQIAERgSQjVBN0YzRjQ2NzFCNDVBNQA=/" \
    -H "X-API-Key: mindo_xxxxxxxxxxxxxxxxxxxxxxxx"
  ```

  ```python Python theme={null}
  import requests

  message_id = "wamid.HBgNNTQ5MTEyMzQ1Njc4FQIAERgSQjVBN0YzRjQ2NzFCNDVBNQA="

  response = requests.get(
      f"https://api.mindosoftware.com/api/v1/meta-templates/messages/{message_id}/",
      headers={"X-API-Key": "mindo_xxxxxxxxxxxxxxxxxxxxxxxx"}
  )

  data = response.json()
  print(f"Current status: {data['delivery_status']['current']}")
  print(f"Delivered: {data['delivery_status']['delivered_at']}")
  print(f"Read: {data['delivery_status']['read_at']}")
  ```

  ```javascript JavaScript theme={null}
  const messageId = "wamid.HBgNNTQ5MTEyMzQ1Njc4FQIAERgSQjVBN0YzRjQ2NzFCNDVBNQA=";

  const response = await fetch(
    `https://api.mindosoftware.com/api/v1/meta-templates/messages/${encodeURIComponent(messageId)}/`,
    {
      method: "GET",
      headers: {
        "X-API-Key": "mindo_xxxxxxxxxxxxxxxxxxxxxxxx"
      }
    }
  );

  const data = await response.json();
  console.log("Current status:", data.delivery_status.current);
  console.log("Delivered:", data.delivery_status.delivered_at);
  console.log("Read:", data.delivery_status.read_at);
  ```
</RequestExample>

<ResponseExample>
  ```json 200 - OK theme={null}
  {
    "id": 123,
    "template": {
      "id": 45,
      "name": "welcome_message",
      "language": "es",
      "category": "MARKETING"
    },
    "recipient": {
      "phone": "+5491112345678",
      "contact_name": "Juan Perez",
      "contact_id": 789
    },
    "variables_used": {
      "name": "Juan Perez",
      "code": "ABC123"
    },
    "delivery_status": {
      "current": "read",
      "sent_at": "2025-11-16T21:30:00Z",
      "delivered_at": "2025-11-16T21:30:05Z",
      "read_at": "2025-11-16T21:31:00Z",
      "failed_at": null,
      "error_code": null,
      "error_message": null
    },
    "meta_message_id": "wamid.HBgNNTQ5MTEyMzQ1Njc4FQIAERgSQjVBN0YzRjQ2NzFCNDVBNQA=",
    "was_successful": true,
    "error_message": null,
    "sent_at": "2025-11-16T21:30:00Z"
  }
  ```

  ```json 404 - Message not found theme={null}
  {
    "error": "Mensaje no encontrado"
  }
  ```

  ```json 403 - No access theme={null}
  {
    "error": "No tienes acceso a este mensaje"
  }
  ```

  ```json 401 - Unauthenticated theme={null}
  {
    "error": "Este endpoint requiere autenticacion con API Key (header X-API-Key)"
  }
  ```
</ResponseExample>

## Message statuses

The `delivery_status.current` field can have the following values:

| Status      | Description                                 |
| ----------- | ------------------------------------------- |
| `sent`      | Message successfully sent to Meta           |
| `delivered` | Message delivered to the recipient's device |
| `read`      | Message read by the recipient               |
| `failed`    | Message send failed                         |

<Note>
  Statuses update automatically as Meta sends the delivery and read webhooks. If you query immediately after sending, it's normal to see the `sent` status until the confirmations arrive.
</Note>
