# Inicio rápido

> Manda tu primer mensaje de WhatsApp por la API en 5 minutos.

En esta guía mandas una plantilla aprobada a un teléfono y después consultas si llegó y si la leyeron.

<Info>
  **Necesitas:** un plan Escala o Enterprise, un número de WhatsApp conectado, al menos una plantilla aprobada y una [clave de API](/api/autenticacion).
</Info>

<Steps>
  <Step title="Guarda tu clave en una variable de entorno">
    Así no queda escrita en tu código.

    ```bash
    export MINDO_API_KEY="etk_live_…"
    ```
  </Step>

  <Step title="Busca el id de tu plantilla">
    `GET /templates` devuelve solo las plantillas **aprobadas por Meta**, con el nombre de cada variable.

    ```bash
    curl https://app.mindo.ar/api/v1/templates \
      -H "Authorization: Bearer $MINDO_API_KEY"
    ```

    ```json
    {
      "data": [
        {
          "id": "01a0d46d-2a61-7753-b644-1f139e1e71ed",
          "name": "Pedido listo para retirar",
          "metaName": "pedido_listo_para_retirar",
          "language": "es",
          "category": "UTILITY",
          "wabaId": "264827751339679",
          "variables": [{ "name": "nombre", "label": "nombre" }]
        }
      ]
    }
    ```

    Anota el `id` y los `name` de las variables: los vas a usar en el paso siguiente.
  </Step>

  <Step title="Manda el mensaje">
    <CodeGroup>

    ```bash curl
    curl -X POST https://app.mindo.ar/api/v1/messages \
      -H "Authorization: Bearer $MINDO_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "to": "+57 300 123 4567",
        "template": {
          "id": "01a0d46d-2a61-7753-b644-1f139e1e71ed",
          "variables": { "nombre": "Andrés" }
        }
      }'
    ```

    ```javascript Node
    const res = await fetch("https://app.mindo.ar/api/v1/messages", {
      method: "POST",
      headers: {
        Authorization: `Bearer ${process.env.MINDO_API_KEY}`,
        "Content-Type": "application/json",
      },
      body: JSON.stringify({
        to: "+57 300 123 4567",
        template: {
          id: "01a0d46d-2a61-7753-b644-1f139e1e71ed",
          variables: { nombre: "Andrés" },
        },
      }),
    })
    const message = await res.json()
    if (!res.ok) throw new Error(message.error)
    console.log(message.id, message.status)
    ```

    ```python Python
    import os, requests

    res = requests.post(
        "https://app.mindo.ar/api/v1/messages",
        headers={"Authorization": f"Bearer {os.environ['MINDO_API_KEY']}"},
        json={
            "to": "+57 300 123 4567",
            "template": {
                "id": "01a0d46d-2a61-7753-b644-1f139e1e71ed",
                "variables": {"nombre": "Andrés"},
            },
        },
    )
    message = res.json()
    if not res.ok:
        raise Exception(message["error"])
    print(message["id"], message["status"])
    ```

    ```php PHP
    <?php
    $ch = curl_init("https://app.mindo.ar/api/v1/messages");
    curl_setopt_array($ch, [
      CURLOPT_POST => true,
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_HTTPHEADER => [
        "Authorization: Bearer " . getenv("MINDO_API_KEY"),
        "Content-Type: application/json",
      ],
      CURLOPT_POSTFIELDS => json_encode([
        "to" => "+57 300 123 4567",
        "template" => [
          "id" => "01a0d46d-2a61-7753-b644-1f139e1e71ed",
          "variables" => ["nombre" => "Andrés"],
        ],
      ]),
    ]);
    $message = json_decode(curl_exec($ch), true);
    echo $message["id"] . " " . $message["status"];
    ```

    </CodeGroup>

    Si Meta acepta el mensaje, la respuesta es `201`:

    ```json
    {
      "id": "01a0d472-92b0-7987-ac4d-c01d37525bc5",
      "wamid": "wamid.HBgMNTczMDAxMjM0NTY3FQIAERgSN0VENTc4NDFGRDk0NEVEQkEA",
      "status": "pending",
      "conversationId": "01a0d472-90ae-7187-9bb8-9f34c8d023c1"
    }
    ```

    El mensaje ya aparece en el **Chat** de MINDO, en la conversación con ese contacto. Si el teléfono no estaba en tus contactos, se crea.
  </Step>

  <Step title="Consulta si llegó">
    Usa el `id` de la respuesta:

    ```bash
    curl https://app.mindo.ar/api/v1/messages/01a0d472-92b0-7987-ac4d-c01d37525bc5 \
      -H "Authorization: Bearer $MINDO_API_KEY"
    ```

    ```json
    {
      "id": "01a0d472-92b0-7987-ac4d-c01d37525bc5",
      "wamid": "wamid.HBgMNTczMDAxMjM0NTY3FQIAERgSN0VENTc4NDFGRDk0NEVEQkEA",
      "direction": "out",
      "status": "read",
      "type": "template",
      "body": "Hola Andrés, tu pedido ya está listo para retirar en Café Aurora. Te esperamos hasta las 20 h.",
      "errorCode": null,
      "errorTitle": null,
      "createdAt": "2026-09-24T17:24:33.341Z",
      "sentAt": "2026-09-24T17:24:34.000Z",
      "deliveredAt": "2026-09-24T17:24:34.000Z",
      "readAt": "2026-09-24T17:24:34.000Z"
    }
    ```

    `status` va pasando por `pending` → `sent` → `delivered` → `read`. Si no se pudo entregar queda en `failed`, con el motivo en `errorCode` y `errorTitle`.
  </Step>
</Steps>

<Tip>
  En lugar de consultar cada tanto, suscríbete al webhook [`message.status`](/api/webhooks/eventos#message-status) y te avisamos cada vez que cambia el estado.
</Tip>

## ¿Y si quiero mandar texto libre?

Puedes mandar `text` en lugar de `template`, pero **solo si el cliente te escribió en las últimas 24 horas**. Es una regla de WhatsApp, no de MINDO: fuera de esa ventana, la única forma de escribirle es con una plantilla aprobada. Más en [La ventana de 24 horas](/conceptos/ventana-24-horas).

```json
{ "to": "+573001234567", "text": "¡Hola Andrés! Ya preparamos tu pedido 🎉" }
```

Si la ventana está cerrada, la API responde `409`:

```json
{
  "error": "Pasaron más de 24 horas desde el último mensaje del cliente. Para escribirle, usá una plantilla.",
  "cause": null
}
```

## Cómo se completan las variables

Para cada variable de la plantilla, MINDO usa, en este orden:

1. El valor que mandes en `template.variables`.
2. El dato del contacto: `nombre` usa el primer nombre del contacto; las demás variables buscan un atributo con el mismo nombre (por ejemplo, la variable `ciudad` usa el atributo `ciudad`).
3. El texto alternativo que definiste en la plantilla.
4. El ejemplo que cargaste al crear la plantilla.

<Warning>
  Si no mandas una variable y el contacto no tiene ese dato, sale el **ejemplo** de la plantilla (por ejemplo, “Sofía”). Para mensajes transaccionales, manda siempre todas las variables.
</Warning>

## Siguientes pasos

<CardGroup cols={2}>
  <Card title="Recibir webhooks" icon="webhook" href="/api/webhooks/introduccion">
    Entérate cuando un cliente responde o cuando un mensaje se lee.
  </Card>
  <Card title="Confirmación de pedidos" icon="shopping-bag" href="/api/recetas/confirmacion-de-pedido">
    Una integración completa con tu tienda online.
  </Card>
</CardGroup>
