> ## Documentation Index
> Fetch the complete documentation index at: https://docs.visitoai.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Control de conversaciones y entrega

> Control de conversaciones y entrega — Visito M2M API

Las rutas son relativas a `/m2m/v1`. Envía `Authorization: Bearer <clave>`. La clave determina el tenant.

## Recibir, leer, responder y verificar

Si tu integración controla las respuestas, activa el modo manual antes de procesar eventos. Recibir un webhook no pausa la IA de Visito; de lo contrario, ambos sistemas podrían responder.

1. Suscríbete a `message.created` con `webhooks:write` y `conversations:read`.
2. Responde automáticamente solo cuando `data.direction=inbound`. Las respuestas salientes también generan eventos.
3. Lee `GET /conversations/{conversationId}/messages` y pagina hasta encontrar `messageId`. El webhook no incluye el texto.
4. Usa `POST /conversations/{conversationId}/reply` con `conversations:write` y un `Idempotency-Key` estable por evento entrante.
5. Consulta `GET /message-requests/{requestEventId}/status` con `messages:read`, usando el identificador devuelto al aceptar la respuesta. Recibe cambios por `message.delivery.updated`.

La aceptación en cola no confirma entrega. Los estados incluyen `queued`, `sent`, `delivered`, `read`, `failed`, `blocked`, `partial_sent` y `unknown`. Consulta un mensaje con `GET /messages/{messageId}/status`; para solicitudes con varios mensajes, revisa cada elemento de `messages`.

## Control de IA y atención humana

* `GET /conversations/{id}/policy`: `conversations:read`.
* `PATCH /conversations/{id}/policy`: `conversations:policy:write`. Usa `{"manualEnabled":true}` para pausar IA y `false` para reanudar. También acepta `statusAction`, `freezeForMinutes` y `unfreeze`. No combines congelación y descongelación. Una transferencia pendiente bloquea cambios de política.
* `GET /conversations/assignable-operators`: `conversations:assignment:read`.
* `PUT /conversations/{id}/assignment`: `conversations:assignment:write`. Envía `{"operatorId":"id"}` o `{"operatorId":null}`; el operador debe pertenecer al tenant.
* `GET /conversations/{id}/handoffs`: `conversations:read`.
* `POST /conversations/{id}/handoff/resolve`: `conversations:handoffs:write`. Acepta `resolutionNote` opcional y devuelve el control a IA; no resuelve una obligación de respuesta pendiente independiente.

Las respuestas normales requieren una conversación existente. Para iniciar contacto por WhatsApp, utiliza el envío de una plantilla aprobada.
