Skip to main content

Qué es

La API WhatsApp Calling de YCloud gestiona la señalización de llamadas de voz entre un usuario de WhatsApp y un número de teléfono comercial. Tu aplicación intercambia SDP a través de YCloud, mientras que tu implementación de WebRTC se encarga de la conexión de audio. Las llamadas pueden iniciarse en cualquiera de las dos direcciones:
  • Iniciadas por el usuario: Un usuario de WhatsApp llama a tu empresa. Tu aplicación recibe una oferta y acepta o rechaza la llamada.
  • Iniciadas por la empresa: Tu aplicación crea una oferta y solicita a YCloud que llame a un usuario de WhatsApp.
La Calling API gestiona la señalización de llamadas, no la pila de medios WebRTC. Tu aplicación es responsable de la configuración de la conexión peer, la captura y reproducción de audio, la generación de SDP y la liberación de recursos WebRTC.

Mapa de la API

Las Calling APIs y los eventos de webhook siguen el mismo ciclo de vida, pero no forman una única secuencia que se aplique a cada llamada. Completa la configuración compartida y luego sigue el flujo iniciado por el usuario o por la empresa. Utiliza el ID de llamada, wacid, para correlacionar cada operación y evento.

Configuración compartida

Llamadas iniciadas por el usuario

Llamadas iniciadas por la empresa

Finalización de llamadas compartida

Procesamiento de medios opcional

Estas tablas describen el flujo de trabajo de la aplicación. No garantizan que los webhooks se entreguen en el mismo orden que las filas. Correlaciona los eventos por wacid y gestiona las reentregas de forma idempotente.

Antes de comenzar

Antes de realizar una solicitud de Calling, prepara lo siguiente:
  1. Una clave de API de la cuenta de YCloud. Envíala en el encabezado X-API-Key. Consulta Autenticación.
  2. Una cuenta de WhatsApp Business y un número de teléfono comercial registrado con YCloud.
  3. Calling habilitado para ese número de teléfono.
  4. Una implementación de audio WebRTC que pueda crear y aplicar ofertas y respuestas SDP.
  5. Un endpoint de webhook de YCloud suscrito a los eventos de Calling utilizados por tu integración. Consulta Configurar webhooks.
  6. Permiso de llamada del usuario cuando sea necesario para una llamada iniciada por la empresa.
Comunícate con tu representante de YCloud para habilitar el acceso a la Calling API. Para la elegibilidad de llamadas salientes, sigue los requisitos actuales de Calling, incluido el nivel de mensajería para 2000 clientes de la cartera comercial y los países admitidos para números comerciales. El antiguo umbral de 1000 conversaciones queda sustituido por los requisitos actuales. Los siguientes ejemplos utilizan estas variables de entorno:
Mantén la clave de API en tu servidor. No la incluyas en el código del navegador ni de aplicaciones móviles.

Cómo funciona

Comienza configurando el número de teléfono comercial. Luego intercambia SDP según la dirección de la llamada. Las respuestas de la API confirman las operaciones de señalización individuales, mientras que los eventos de webhook notifican los cambios de estado y el resultado final. Si la captura está habilitada, eventos separados indican cuándo una grabación o transcripción está lista para descargarse.

Solicitud

Configura el número de teléfono comercial

La configuración de Calling y de captura pertenece a un número de teléfono comercial de WhatsApp específico. Configúralos antes de procesar llamadas.

Consultar la configuración de Calling

Usa GET /whatsapp/phoneNumbers/{wabaId}/{phoneNumber}/settings para verificar si Calling está habilitado y si el ícono de Calling está visible:
Si omites type, YCloud devuelve la respuesta con la configuración de Calling.

Habilitar Calling

Guarda la configuración de Calling con POST /whatsapp/phoneNumbers/{wabaId}/{phoneNumber}/settings antes de comenzar a aceptar o realizar llamadas:
La respuesta contiene el objeto calling guardado. Antes de gestionar llamadas en vivo, termina de configurar tus webhooks y sesiones de WebRTC.

Configurar la grabación y transcripción

La configuración de captura se aplica a las nuevas llamadas originadas mediante la API. Puedes habilitar la grabación, la transcripción o ambas.
Para consultar la configuración de captura, usa type=capture:
Puedes incluir calling y capture en la misma solicitud POST. Tras validar el acceso al número de teléfono, YCloud intenta guardar cada sección por separado. Si alguna de ellas falla al guardarse, es posible que la otra sección ya haya quedado almacenada. Lee ambas configuraciones después de un error y, a continuación, vuelve a intentar solo la sección que aún requiera actualizarse.

Gestionar una llamada iniciada por el usuario

Secuencia de Calling iniciada por el usuario En una llamada iniciada por el usuario, WhatsApp envía la oferta SDP. Tu aplicación responde a esa oferta y luego acepta o rechaza la llamada.

1. Recibir el evento de conexión

Suscríbete a whatsapp.call.connect. Un evento iniciado por el usuario tiene direction establecido en USER_INITIATED e incluye un SDP offer.
Almacena callingConnect.wacid y callingConnect.phoneId juntos. Aplica la oferta SDP recibida a tu conexión de pares WebRTC y genera una respuesta SDP.

2. Preaceptar la llamada

Llama a la operación de preaceptación después de crear una respuesta SDP, pero antes de que el agente acepte la llamada. Esto prepara la ruta de medios y puede reducir los cortes de audio cuando se responde a la llamada. Endpoint: POST /whatsapp/calls/preAccept
Una vez que la preaceptación se complete con éxito, mantén la llamada en estado de repique o lista. La preaceptación no contesta la llamada por el usuario.

3. Aceptar la llamada

Cuando el agente conteste, envía el mismo phoneId, wacid, tipo de SDP y respuesta SDP al endpoint de aceptación. Endpoint: POST /whatsapp/calls/accept
Los campos de la solicitud y la estructura de la respuesta son los mismos que en la preaceptación. Tras una respuesta exitosa, utiliza el estado de la conexión WebRTC para la preparación del contenido multimedia y espera a whatsapp.call.terminate para obtener el resultado final de la llamada. La ventana documentada para la aceptación entrante es de aproximadamente 30 a 60 segundos después del webhook de conexión. Acepta con prontitud; una llamada no contestada finaliza del lado del usuario con una notificación de Not Answered y un webhook de terminación. Incluso si la conexión WebRTC ya está establecida, inicia el audio únicamente después de que la solicitud de aceptación devuelva HTTP 200. Comenzar antes puede recortar las primeras palabras; comenzar demasiado tarde produce silencio.

Rechazar en lugar de aceptar

Si el agente no puede atender la llamada entrante, recházala en lugar de crear una sesión activa. Endpoint: POST /whatsapp/calls/reject
La respuesta utiliza la respuesta estándar de llamadas. Libera la conexión de pares local tras la solicitud y aun así acepta un evento de terminación posterior para este wacid si llega a recibirse.

Iniciar una llamada originada por la empresa

En una llamada originada por la empresa, tu aplicación crea la oferta SDP y la envía a YCloud.

Obtener permiso para llamar

Antes de iniciar una llamada, obtén el permiso de llamada del usuario. Se puede enviar una solicitud de permiso interactiva dentro de una ventana de servicio al cliente válida:
Envía este cuerpo a POST /v2/whatsapp/messages/sendDirectly o ponlo en cola con POST /v2/whatsapp/messages. También puedes crear una plantilla de permiso de llamada. Por ejemplo, envía este cuerpo a POST /v2/whatsapp/templates, luego espera la aprobación:
Envía la plantilla aprobada con su parámetro en el cuerpo:
Cuando callback_permission_status está habilitado en la configuración de llamadas del número de teléfono, una llamada iniciada por el usuario puede otorgar permiso para devolver la llamada. Un usuario también puede otorgar permiso permanente de llamada desde el perfil comercial. Las respuestas de permiso llegan como eventos whatsapp.inbound_message.received. Inspecciona el objeto interactive.call_permission_reply, no solo si se entregó el mensaje de solicitud de permiso:
No inicies la llamada tras un rechazo o un permiso vencido. El error de Meta 138006 significa que el número comercial no cuenta con el permiso de llamada requerido. Para ver detalles de errores del proveedor, consulta los errores de llamadas de Meta.

1. Crear una oferta SDP

Crea una conexión de pares WebRTC local y vincula la pista de audio. Genera la oferta SDP, establécela como la descripción local y espera a que esa operación finalice antes de enviar la oferta a YCloud.

2. Conectar la llamada

Endpoint: POST /whatsapp/calls/connect Proporciona al menos uno de entre to o recipient. Si envías ambos, YCloud usa to e ignora recipient.
Almacena inmediatamente el valor de wacid devuelto. success: true significa que la operación de conexión fue aceptada; no significa que el usuario haya contestado.

3. Aplicar la respuesta y rastrear el intento

YCloud envía whatsapp.call.connect para la llamada. Para una llamada iniciada por el negocio, el evento tiene direction: BUSINESS_INITIATED y transporta el SDP remoto answer. Aplica esa respuesta como la descripción remota para la misma conexión de pares. Suscríbete a whatsapp.call.status.updated para rastrear el intento:
Haz que el procesamiento de eventos sea idempotente para que una reentrega no repita acciones del agente, cobros o tareas de limpieza.

Finalizar una llamada activa

Llama al endpoint de terminación cuando tu aplicación necesite finalizar una llamada activa entrante o saliente. Endpoint: POST /whatsapp/calls/terminate
Los campos de la solicitud coinciden con los de la solicitud de rechazo. Una respuesta exitosa confirma que YCloud procesó la operación de terminación. Mantén abierto el registro de la llamada hasta que recibas el evento de terminación final o tu propia política de recuperación lo cierre.

Respuesta

Los cinco endpoints de señalización devuelven la misma estructura de respuesta:
wacid identifica la llamada asociada a la operación. success: true confirma que la operación de señalización fue exitosa; no confirma que el otro participante haya respondido o que la llamada haya finalizado. Utiliza el estado de WebRTC y los eventos del webhook de Calling para conocer esos resultados.

Procesar el evento final de la llamada

whatsapp.call.terminate es el evento terminal del ciclo de vida de una llamada.
Cuando recibas este evento, finaliza el registro de la llamada y libera los recursos restantes de WebRTC. Una respuesta anterior de la API no confirma que la llamada se haya completado.

Recibir grabaciones y transcripciones

Cuando la captura está habilitada, el procesamiento del contenido multimedia continúa después del ciclo de vida de la llamada. La grabación y la transcripción tienen eventos terminales independientes: El siguiente ejemplo muestra una grabación disponible:
Ambas propiedades de la carga útil utilizan los mismos campos:

Descargar un recurso disponible

Llama al endpoint de medios solo después de que el evento correspondiente reporte AVAILABLE. Endpoint: GET /whatsapp/calls/media/{mediaAssetId}
El endpoint devuelve el archivo completo como archivo adjunto y no admite descargas por rango de bytes. Las grabaciones usan .ogg; las transcripciones usan .json. Solo el tenant propietario de YCloud puede descargar un recurso. Un recurso permanece disponible durante 30 días a partir de su fecha de creación. Los recursos faltantes, no disponibles, vencidos o que no sean de tu propiedad devuelven HTTP 404.

Crear un receptor de webhook confiable

Suscribe tu endpoint a los eventos que tu integración requiera:
Para cada solicitud:
  1. Conserva el cuerpo sin procesar de la solicitud y verifica YCloud-Signature antes de confiar en el evento.
  2. Guarda el evento o pon en cola el trabajo duradero.
  3. Devuelve una respuesta 2xx exitosa con prontitud.
  4. Deduplica mediante el evento de nivel superior id.
  5. Correlacione los datos de la llamada mediante wacid; conserve phoneId junto con este para operaciones posteriores.
  6. Gestione los eventos relacionados que lleguen muy seguidos y tolere reenvíos.
Consulte Configurar webhooks para ver la creación de endpoints, validación de firmas y el comportamiento de entrega. La página Ejemplos de carga útil de Webhook contiene los ejemplos completos generados.

Gestión de errores y recuperación

Los endpoints de llamadas utilizan la respuesta estándar de error de la API de YCloud. Consulte Gestionar errores para ver la estructura de respuesta y las pautas de reintento. Use estas comprobaciones para fallos comunes de llamadas: Un tiempo de espera agotado en la solicitud no demuestra que la acción de señalización haya fallado. Antes de reintentar, coteje la solicitud con los eventos de webhook y el estado local actual de la llamada. Es posible que la acción ya haya llegado a WhatsApp.

Lista de verificación para la integración

  • Habilite las llamadas en el número de teléfono comercial correcto.
  • Configure y pruebe todas las suscripciones de webhook de llamadas requeridas.
  • Verifique las firmas de webhook y deduplique los eventos.
  • Almacene wacid, phoneId, la dirección y el estado actual juntos.
  • Considere el success de la API como la aceptación de la operación, no como el resultado final de la llamada.
  • Use preAccept solo como preparación; llame a accept para responder.
  • Finalice las llamadas a partir de whatsapp.call.terminate.
  • Descargue los medios capturados solo después de un evento AVAILABLE y dentro del plazo de 30 días.
  • Libere los recursos de WebRTC en caso de rechazo, finalización, fallo y tiempo de espera local agotado.
  • Evite registrar claves de API, SDP completo o identificadores de participantes en los registros generales de la aplicación.

Referencia de la API de llamadas

Revise los esquemas exactos de solicitud y respuesta para cada endpoint de llamadas.

Ejemplos de carga útil de Webhook

Inspeccione los ejemplos completos de eventos de llamadas generados a partir de la especificación de webhooks.