Esta página existe para que sepas exactamente qué se puede y qué no se puede hacer hoy con la API pública. Si algo de lo siguiente es bloqueante para vos, contactanos.Documentation Index
Fetch the complete documentation index at: https://docs.waspytech.com/llms.txt
Use this file to discover all available pages before exploring further.
Webhooks
- Sin streaming / WebSocket público. Si necesitás latencia sub-segundo, hablá con nosotros.
- Eventos de templates no implementados todavía. No existe
template.approved/template.rejected. Mientras tanto, polleáGET /templatesoGET /templates/by-name/:name. - Replay de delivery histórico: el endpoint
POST /webhooks/:id/replay/:deliveryIdre-fires un evento sintético del mismoeventname. El payload original no se almacena verbatim (solo su hash), por eso tu integración debe ser idempotente sobredata.id. POST /webhooks/:id/testsimula unmessage.receivedcon datos dummy. La response incluyesamplePayloadcon el envelope exacto que se entrega.
Mensajes
- Templates se pueden enviar y consultar pero no crear/editar/borrar vía API. Usá el panel de Waspy o Meta Business Manager.
- Campañas no tienen endpoints v2 todavía (existen vía API interna del panel).
- Reacciones outbound no están soportadas vía API.
Media
- Upload vía API v2 no está expuesto todavía. Para enviar media, pasá
link(URL pública) oid(media ID de Meta) en el body dePOST /messages. La descarga inbound víaGET /media/:idsí funciona. - Si tu integración necesita subir blobs (imágenes generadas en runtime, audios) y no tenés CDN propio, esto es un gap. Avisanos.
Conversations
- Typing
offse acepta pero no manda nada a Meta — Meta no soporta apagar manualmente el typing (se auto-clarea ~25s). - Mark-as-read marca la última inbound con
waMessageIdpor conversación. Si necesitás marcar un mensaje específico, usáPOST /messages/:waMessageId/read.
Origin tracking
- Para mensajes anteriores a abril 2026,
originse deriva de campos legacy. Ver Handoff: legacy fallback para los criterios exactos. - Para mensajes nuevos siempre se setea explícitamente vía
metadata.origin.
Schemas
WebhookEventEnvelope.datayMessage.contentsonunknownen el OpenAPI spec (no discriminated union por evento/tipo). El payload real sí tiene shape definida — ver catálogo de eventos y los ejemplos por tipo en Messages. Pendiente: tipar discriminated union para que clientes de TypeScript inferieran sin asumir.
Rate limits
- 120 req/min por API key (no por canal). Si tenés múltiples números bajo la misma cuenta, comparten cuota — para cuotas independientes hoy hay que tener API keys separadas.
- 80 mensajes/seg por número (límite Meta, no de Waspy).
Errores de servidor
A partir de abril 2026 los errores 5xx se serializan SIEMPRE como{ error: { code: "INTERNAL_ERROR", message: "Internal server error" } }. Códigos internos (ej. SQLSTATE de PostgreSQL como 23503) no se filtran al cliente. El detalle se loggea server-side bajo originalCode para que ops pueda diagnosticar.
Resiliencia y reintentos del integrador
Waspy corre sobre Cloud Run con auto-scaling. Esto significa que vas a recibir respuestas transitorias 503 ocasionales durante:- Despliegues (rolling restart de instancias)
- Cold starts cuando el tráfico salta de 0 instancias activas
- Caídas momentáneas de la conexión a la DB
- Implementá retry con backoff exponencial ante 503, 429 y errores de red. Sugerencia:
[1s, 2s, 4s, 8s]con jitter. - Para
POST /messagesusá el headerIdempotency-Keypara que los retries no generen duplicados. - Si recibís 429, respetá el header
Retry-After(segundos hasta que se libera tu rate limit). - Después de 4-5 intentos fallidos, escalá a alerta — probable incidente del lado nuestro.
Service window helper
Hoy el camposerviceWindowExpiresAt aparece dentro de cada ConversationPublic (response de GET /conversations/:id y de la lista). NO existe todavía un endpoint corto tipo GET /contacts/:id/can-send-text. Si tu integración necesita decidir entre texto libre vs template antes de enviar, hacé GET /conversations/by-phone/:phone y leé serviceWindowExpiresAt.
Sandbox / test mode
No existe un canal sandbox que sea no-op. Cualquier mensaje que envíes desde tu integración llega al usuario real de WhatsApp. Para desarrollo seguro:- Usá un número WhatsApp de test (Meta provee uno gratis al crear app)
- O un número personal tuyo como
to POST /webhooks/:id/testSÍ es un sandbox para probar la firma + URL sin generar mensaje real
Cloud Run 503 sin envelope JSON
Cuando Cloud Run rota una instancia o tiene cold start, devuelve503 Service Unavailable con body text/html (no nuestro envelope JSON { error: { code, message } }). El integrador debe distinguir 503 con Content-Type: text/html (Cloud Run, retry) vs 5xx con application/json (app, ver mensaje).
Lo que sí está cubierto
Account, Channels, Contacts, Conversations (read/typing/mark-as-read), Messages (incluyeorigin para handoff), Templates (lectura + by-name), Media (descarga), Webhooks (CRUD + deliveries + rotate-secret + test + replay).
Si algo no está documentado y lo necesitás para tu integración, decinos.