CadaDocumentation Index
Fetch the complete documentation index at: https://docs.waspytech.com/llms.txt
Use this file to discover all available pages before exploring further.
MessagePublic incluye un campo origin que te dice exactamente quién generó ese mensaje. Es la señal canónica para implementar handoff humano sin que tu bot pise a un agente real.
Valores de origin
| Valor | Significado |
|---|---|
inbound | Mensaje recibido del contacto (no aplica handoff — vos respondés a estos) |
panel | Lo mandó un agente humano desde el panel web de Waspy |
external_api | Lo mandó tu integración (esta API v2 con tu API key) |
ai_agent | Lo mandó la AI nativa de Waspy (chatbot flows, AI agents) |
campaign | Es parte de una campaña / template scheduled |
history | Backfill de history sync de Meta (no es reactivo, ignoralo en lógica de negocio) |
Patrón de handoff
Cómo lo aplicás en webhooks
Los eventosmessage.status_changed y message.received traen origin en el payload. Tu bot debería:
message.receivedconorigin: 'inbound'→ procesar normalmente.message.status_changedconorigin: 'panel'→ marcar la conversación como “humano-controlada”, no responder.message.status_changedconorigin: 'external_api'→ confirmación de que tu propio mensaje fue entregado.
Estado por conversación
Si tu CRM mantiene estado por conversación (ej. “bot vs humano”), una buena heurística:- Cuando llega cualquier mensaje saliente con
origin: 'panel', marcá la conversación comobotPaused: true. - Cuando llega un mensaje entrante después de N minutos sin actividad humana, podés re-activar el bot (
botPaused: false).
Origin para mensajes pre-abril 2026 (legacy fallback)
Los mensajes creados antes de que existierametadata.origin tienen el campo derivado en orden de prioridad:
| Si… | Entonces origin = |
|---|---|
direction === 'inbound' | inbound |
source === 'history' | history |
campaignId no es null | campaign |
sentByAi === true | ai_agent |
sentBy no es null (era un user UUID en panel) | panel |
| ninguna de las anteriores | external_api |
- Mensaje viejo enviado por API con
sentBypoblado por error → se clasifica comopanel. Workaround: si tu lógica depende del orden de eventos, considerá tambiénmetadata.apiKeyIdcuando esté presente (mensajes nuevos sí lo setean). - Mensaje de history sync que ALSO tenía
sentByAi: true→ clasifica comohistory(ganaba precedencia). Esos mensajes no son reactivos, ignoralos.
metadata.origin siempre se setea explícitamente y este fallback no aplica.
Notas adicionales
metadata.origines la fuente de verdad en DB; el campo públicoorigines la versión canónica que vas a usar.