# 01 · Inicio rápido

Objetivo: enviar una plantilla de WhatsApp y recibir el aviso de que se entregó. Necesitas un tenant con licencia activa y un número conectado; si aún no lo tienes, [11 · Administración](11-administracion.md) explica cómo darlo de alta.

## Lo que necesitas

| Dato | Dónde sale |
| --- | --- |
| `BASE_URL` | La URL del gateway (en local, `http://localhost:3000`) |
| `API_KEY` | `wak_live_…`: la crea el equipo de administración para vuestra app y el tenant. Se muestra **una sola vez** |
| Una plantilla **aprobada** | [04 · Plantillas](04-plantillas.md) |

```bash
export BASE_URL=http://localhost:3000
export API_KEY=wak_live_xxxxxxxx_xxxxxxxx...
```

## 1. Comprueba que la clave funciona

```bash
curl -s $BASE_URL/v1/license -H "Authorization: Bearer $API_KEY"
```

```json
{ "module": "whatsapp", "status": "active", "limits": { "max_outbound_per_month": 20000, "features": ["chat", "templates", "api", "embed", "costs"] },
  "usage": { "outbound_messages": 0, "numbers": 1, "agents": 0, "templates": 2 } }
```

Si recibes `401`, la clave es incorrecta; `403 license_inactive`, el tenant no tiene el módulo activo.

## 2. Mira qué plantillas puedes usar

```bash
curl -s "$BASE_URL/v1/templates?status=approved" -H "Authorization: Bearer $API_KEY" | jq '.data[] | {name, language, variables}'
```

```json
{ "name": "recordatorio_cita", "language": "es", "variables": ["1", "2"] }
```

## 3. Envía

```bash
curl -s $BASE_URL/v1/messages \
  -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: cita-48213-recordatorio-1" \
  -d '{
        "to": "+34600111222",
        "type": "template",
        "template": { "name": "recordatorio_cita", "language": "es", "variables": ["Ana", "15 de octubre"] },
        "external_ref": "cita-48213"
      }'
```

```json
{ "id": "msg_01a1…", "status": "queued", "to": "34600111222", "type": "template",
  "body": "Hola Ana, te recordamos tu cita del 15 de octubre.", "external_ref": "cita-48213" }
```

- `202` significa **aceptado y en cola**, no entregado.
- `Idempotency-Key` hace que repetir la petición (por un fallo de red, por ejemplo) **devuelva el mismo mensaje** en vez de enviar otro.
- `external_ref` es **vuestra** referencia (nº de cita, factura…): vuelve en todos los eventos de ese mensaje.

## 4. Consulta el resultado

```bash
curl -s $BASE_URL/v1/messages/msg_01a1… -H "Authorization: Bearer $API_KEY" | jq '{status, sent_at, delivered_at, read_at, error}'
```

`queued → sending → sent → delivered → read` (o `failed`, con `error`). En producción no se hace polling: [05 · Recibir eventos](05-recibir-eventos.md).

## 5. Recibe los eventos

Registra un destino HTTPS y verifica la firma de cada evento. Con el ejemplo de Node:

```bash
WA_WEBHOOK_SECRET=whs_… PORT=5001 node docs/ejemplos/node/receptor-eventos.mjs
```

Detalle completo en [05 · Recibir eventos](05-recibir-eventos.md).

## Lo mismo con código

- Node: [`ejemplos/node/enviar-plantilla.mjs`](ejemplos/node/enviar-plantilla.mjs)
- Python: [`ejemplos/python/enviar_plantilla.py`](ejemplos/python/enviar_plantilla.py)
- SDK de TypeScript: [12 · SDK](12-sdk.md)

## Siguientes pasos

1. [Incrustar el chat](06-ui-embebible.md) para que vuestros usuarios respondan sin salir de la app.
2. [Registrar el consentimiento](07-conversaciones-y-contactos.md) de vuestros clientes finales.
3. [Pasar a producción](10-pruebas-y-produccion.md).
