Conecta tu producto a WhatsApp en minutos.
Una sola integración para enviar y recibir mensajes de WhatsApp Business desde tu sistema. Bearer-token por canal, idempotencia nativa, webhooks firmados, errores tipados. Diseñada para flujos productivos como cgmoda-style.
Quick start
- 1
Crea un canal de WhatsApp
En la app, ve a Settings → WhatsApp → Conectar. Vincula tu número Meta Business y dejas el canal en estado active. - 2
Genera tu API token
En Settings → WhatsApp → API token → Regenerar obtienes un stringstk_xxxde 64 caracteres. Guárdalo con cuidado; puedes rotarlo en cualquier momento. - 3
Envía tu primer mensaje
Si todo está bien, el endpoint devuelvebashcurl -X POST https://www.smarttalkapp.com/api/v1/messages/text \ -H "Authorization: Bearer stk_xxx" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: $(uuidgen)" \ -d '{ "to": "573108760539", "text": "Hola desde mi integración" }'201con unwa_message_idde Meta.
Autenticación
Todas las llamadas a /api/v1/* exigen el header Authorization: Bearer stk_…. El token está asociado a un solo canal de WhatsApp y a la organización dueña del canal — no a un usuario. Si necesitas multi-canal, emite un token por canal.
Buenas prácticas
- No hardcodees el token en el cliente — guárdalo server-side.
- Rotalo si lo expones por error. La rotación es instantánea.
- Usa
Idempotency-Key: <uuid>en cada POST para reintentos seguros (TTL 24h). - Incluye
x-request-idpara correlación cliente↔servidor.
Mensajes
/messages/textEnviar un mensaje de texto
Soporta dentro de la ventana 24h. Fuera de ventana, devuelve 403 y debes usar /messages/template.
Request body
json{ "to": "573108760539", "text": "Hola, tu pedido sale hoy.", "contact_name": "Diana", "channel_id": 468350 }
Response 200
json{ "ok": true, "message_id": "uuid", "wa_message_id": "wamid.HBg...", "conversation_id": "uuid", "contact_id": "uuid", "status": "sent", "sent_at": "2026-05-19T05:13:19.570Z" }
/messages/templateEnviar plantilla pre-aprobada
Funciona fuera de la ventana 24h. Los nombres deben coincidir con tus templates aprobados en Meta Business Manager.
Request body
json{ "to": "573108760539", "name": "despacho", "language": "es_CO", "body_params": ["Diana", "INTER-1234"], "contact_name": "Diana" }
Response 200
json{ "ok": true, "wa_message_id": "wamid.HBg...", ... }
/messages/mediaEnviar media (imagen, video, audio, documento)
Meta descarga el binario del media_url y lo renderiza nativo en WhatsApp.
Request body
json{ "to": "573108760539", "type": "image", "media_url": "https://cdn.tuapp.com/foto.jpg", "caption": "Tu pedido.", "contact_name": "Diana" }
Response 200
json{ "ok": true, "wa_message_id": "wamid.HBg...", ... }
/messages/recent?limit=50Listar los últimos N mensajes del canal
Contactos
/contacts/{id}Lookup por UUID interno
/contacts/by-phone/{phone}Lookup por número (digits only)
Health
/healthLiveness probe
Response 200
json{ "ok": true, "version": "v1", "deployment": "dpl_xxx", "channels_active": 2, "now": "2026-05-19T..." }
Códigos de error
Todos los errores devuelven un shape consistente con un request_id para correlación. Los errores de WhatsApp Cloud API se traducen a códigos accionables.
json{ "error": { "code": "forbidden", "message": "The 24-hour WhatsApp customer service window has expired...", "meta": { "meta_code": 131047, "classification": "outside_24h_window", "hint": "POST /api/v1/messages/template" } }, "request_id": "req_xxx" }
| Status | Code | Classification | Significado |
|---|---|---|---|
| 400 | invalid_request | — | Body inválido (zod), JSON malformado. |
| 401 | unauthorized | — | Bearer ausente, malformado o inválido. |
| 403 | forbidden | outside_24h_window | La ventana 24h expiró. Usa /messages/template. |
| 403 | forbidden | channel_inactive | Channel en status disconnected/error. |
| 422 | invalid_request | invalid_recipient | El número no es WhatsApp válido. |
| 422 | invalid_request | template_disapproved | Template paused/rejected en Meta. |
| 429 | provider_error | rate_limited | Meta rate limit. Backoff exponencial. |
| 502 | provider_error | unknown | Error genérico del provider WhatsApp. |
| 503 | internal_error | auth_failed | Access token del channel inválido/expirado. |
Rate limits
| Capa | Límite | Headers |
|---|---|---|
| smarttalkapp | 60 req/min por token | X-RateLimit-Remaining |
| WhatsApp Cloud (Meta) | Variable por tier (250 → 100k+ /24h) | 429 → backoff exp. |
| Idempotencia | 24h TTL por Idempotency-Key | replay devuelve la respuesta original |
Changelog
- 2026-05-19 — clasificación de errores Meta (outside_24h_window, invalid_recipient, rate_limited, …).
- 2026-05-18 — primeros endpoints públicos
/messages/text|template|media,/contacts/*,/health.