> ## 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.

# Estado del mensaje

> Consultar el estado de entrega de un mensaje individual enviado con template

## Descripción

Este endpoint devuelve el estado actualizado de un mensaje individual enviado con un template de WhatsApp. Es el complemento del patrón fire-and-forget de [Enviar mensaje](/api-reference/mensajes/enviar-mensaje): usás el `message_id` (wamid) que retorna el envío para consultar en qué estado de entrega está el mensaje.

Los estados de entrega (`sent`, `delivered`, `read`, `failed`) se actualizan automáticamente a medida que Meta envía los webhooks correspondientes. Un mensaje recién enviado suele mostrar `sent` hasta que llegan las confirmaciones de entrega y lectura.

## Header de autenticación

<ParamField header="X-API-Key" type="string" required>
  Tu API Key de Mindo. Formato: `mindo_xxxxxxxxxxxxxxxxxxxxxxxx`
</ParamField>

## Parámetros de ruta

<ParamField path="message_id" type="string" required>
  ID del mensaje asignado por Meta (wamid). Es el valor de `message_id` que retorna [Enviar mensaje](/api-reference/mensajes/enviar-mensaje) al enviar el template.
</ParamField>

## Respuesta (200 OK)

<ResponseField name="id" type="integer">
  ID interno del registro de envío en Mindo.
</ResponseField>

<ResponseField name="template" type="object">
  Información del template utilizado.

  <Expandable title="Propiedades de template">
    <ResponseField name="id" type="integer">
      ID interno del template.
    </ResponseField>

    <ResponseField name="name" type="string">
      Nombre del template.
    </ResponseField>

    <ResponseField name="language" type="string">
      Idioma del template (ej: `"es"`, `"en"`, `"pt_BR"`).
    </ResponseField>

    <ResponseField name="category" type="string">
      Categoría del template en Meta (ej: `"MARKETING"`, `"UTILITY"`, `"AUTHENTICATION"`).
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="recipient" type="object">
  Información del destinatario.

  <Expandable title="Propiedades de recipient">
    <ResponseField name="phone" type="string">
      Número de teléfono del destinatario.
    </ResponseField>

    <ResponseField name="contact_name" type="string | null">
      Nombre del contacto en Mindo. `null` si el teléfono no corresponde a un contacto registrado.
    </ResponseField>

    <ResponseField name="contact_id" type="integer | null">
      ID del contacto en Mindo. `null` si el teléfono no corresponde a un contacto registrado.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="variables_used" type="object">
  Variables que se usaron para renderizar el template en este envío.
</ResponseField>

<ResponseField name="delivery_status" type="object">
  Estado de entrega detallado con los timestamps de cada transición. Se actualiza vía webhooks de Meta.

  <Expandable title="Propiedades de delivery_status">
    <ResponseField name="current" type="string">
      Estado actual del mensaje. Ver [tabla de estados](#estados-del-mensaje).
    </ResponseField>

    <ResponseField name="sent_at" type="string (ISO 8601) | null">
      Fecha y hora en que el mensaje fue enviado a Meta.
    </ResponseField>

    <ResponseField name="delivered_at" type="string (ISO 8601) | null">
      Fecha y hora de entrega al dispositivo. `null` si aún no fue entregado.
    </ResponseField>

    <ResponseField name="read_at" type="string (ISO 8601) | null">
      Fecha y hora de lectura. `null` si aún no fue leído.
    </ResponseField>

    <ResponseField name="failed_at" type="string (ISO 8601) | null">
      Fecha y hora en que falló el envío. `null` si no falló.
    </ResponseField>

    <ResponseField name="error_code" type="string | null">
      Código de error de Meta si el mensaje falló. `null` si no hubo error.
    </ResponseField>

    <ResponseField name="error_message" type="string | null">
      Descripción del error si el mensaje falló. `null` si no hubo error.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="meta_message_id" type="string | null">
  ID del mensaje en Meta (wamid). Coincide con el `message_id` de la ruta.
</ResponseField>

<ResponseField name="was_successful" type="boolean">
  Indica si el envío inicial a Meta fue exitoso.
</ResponseField>

<ResponseField name="error_message" type="string | null">
  Mensaje de error del envío inicial. `null` si no hubo error.
</ResponseField>

<ResponseField name="sent_at" type="string (ISO 8601)">
  Fecha y hora en que se registró el envío.
</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"Estado actual: {data['delivery_status']['current']}")
  print(f"Entregado: {data['delivery_status']['delivered_at']}")
  print(f"Leído: {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("Estado actual:", data.delivery_status.current);
  console.log("Entregado:", data.delivery_status.delivered_at);
  console.log("Leído:", 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 - Mensaje no encontrado theme={null}
  {
    "error": "Mensaje no encontrado"
  }
  ```

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

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

## Estados del mensaje

El campo `delivery_status.current` puede tener los siguientes valores:

| Estado      | Descripción                                       |
| ----------- | ------------------------------------------------- |
| `sent`      | Mensaje enviado a Meta exitosamente               |
| `delivered` | Mensaje entregado al dispositivo del destinatario |
| `read`      | Mensaje leído por el destinatario                 |
| `failed`    | El envío del mensaje falló                        |

<Note>
  Los estados se actualizan automáticamente a medida que Meta envía los webhooks de entrega y lectura. Si consultás inmediatamente después de enviar, es normal ver el estado `sent` hasta que lleguen las confirmaciones.
</Note>
