# Consultar el estado de un mensaje

`GET /v1/messages/:id`

GET /v1/messages/:id con el `msg_…` que devolvió el POST (un id numérico → 404). Un único vocabulario de estado: `queued | sending | sent | delivered | read | failed | held`. ⚠ Terminales: **solo `read` y `failed`**. `delivered` NO es terminal (`delivered→read` es válido) — si cortás el polling en `delivered` no ves la lectura.

**Un rechazo de WhatsApp NO vuelve como error HTTP.** El POST ya contestó 202 (aceptado, no enviado); si Meta lo rechaza, te enterás acá: el mensaje queda `failed` (o `held`) con **`lastErrorCode`**, un código estable sobre el que podés hacer `switch` — `WINDOW_24H_EXPIRED`, `RECIPIENT_OPTED_OUT`, `CONNECTION_TOKEN_REVOKED`… El `lastError` que viene al lado es ayuda en inglés para un humano, no el contrato. El catálogo completo está en el módulo de errores.

## Ejemplos

### cURL

```bash
curl https://api.waiaconnect.com/v1/messages/msg_5d325780fe504d0f87eb45009d28ae4f \
  -H "Authorization: Bearer wc_live_YOUR_API_KEY"
# → { "id": "msg_…", "status": "delivered", "attempts": 1, "createdAt": "…Z", … }
```

### Node.js

```javascript
const res = await fetch("https://api.waiaconnect.com/v1/messages/msg_5d325780fe504d0f87eb45009d28ae4f", {
  headers: { "Authorization": "Bearer wc_live_YOUR_API_KEY" }
});
const msg = await res.json();
console.log(msg.status); // queued|sending|sent|delivered|read|failed|held (terminal: read|failed)
```

### PHP

```php
<?php
$ch = curl_init("https://api.waiaconnect.com/v1/messages/msg_5d325780fe504d0f87eb45009d28ae4f");
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["Authorization: Bearer wc_live_YOUR_API_KEY"],
]);
$msg = json_decode(curl_exec($ch), true);
echo $msg["status"]; // read|failed are terminal; delivered can still become read
```

### Python

```python
import requests
res = requests.get("https://api.waiaconnect.com/v1/messages/msg_5d325780fe504d0f87eb45009d28ae4f",
  headers={"Authorization": "Bearer wc_live_YOUR_API_KEY"})
msg = res.json()
print(msg["status"])  # read|failed are terminal; delivered can still become read
```

## Notas

- No guardamos contenido: esta respuesta trae metadata (estado, intentos, holdReason), nunca el texto del mensaje.
- El rechazo más común es `WINDOW_24H_EXPIRED`: mandaste texto libre a alguien que no te escribió en las últimas 24 horas. Se resuelve con una plantilla aprobada.
