Conecta PearlPBX2 con tu CRM
Un contrato abierto y documentado, en lugar de un conjunto cerrado de conectores para sistemas concretos.
Webhooks
Dos cadenas de eventos independientes para llamadas entrantes y salientes. Cada payload está firmado con HMAC-SHA256, y la plantilla JSON se edita directamente en el admin con sintaxis ${placeholder} — los cambios se aplican sin reiniciar el servicio, porque la configuración del webhook se publica en Redis de inmediato. El filtrado por contexto de dialplan, tabla de enrutamiento o cola permite que un webhook se dispare solo para las llamadas que te interesan, y la correlación vía linkedid une todos los tramos de una llamada de varias etapas (transferencias, conferencias). La entrega es best-effort, con un timeout configurable y un reintento tras 2 segundos; call.ended se deduplica vía Redis, así que tu CRM debería igualmente deduplicar por uniqueid.
- Cada payload está firmado con HMAC-SHA256 en la cabecera
X-PearlPBX-Signature. - Las llamadas de varios tramos (transferencias, conferencias) se correlacionan vía
linkedid. - La entrega es best-effort con un reintento tras 2 segundos;
call.endedse deduplica vía Redis.
{
"event": "call.ended",
"uniqueid": "1753000000.42",
"linkedid": "1753000000.42",
"channel": "PJSIP/trunk1-0000001a",
"caller_id_num": "380501234567",
"caller_id_name": "Customer",
"exten": "s",
"context": "incoming",
"direction": "inbound",
"answered": true,
"duration": 42,
"cause": "16",
"cause_txt": "Normal Clearing",
"billsec": "38",
"answered_by_member": "Operator Petrenko",
"recorded": true,
"recording_url": "https://pbx.example.com/api/v1/recordings/1753000000.42/",
"channel_vars": { "ULINE": "42" }
}Un vocabulario de 33 variables
La plantilla del payload se valida contra un vocabulario fijo de variables — cualquier texto fuera de esta lista se rechaza directamente en el formulario de edición del webhook.
eventuniqueidlinkedidchannelchannel_varscaller_id_numcaller_id_nameextencontextqueuetimestampdurationcausecause_txtanswered_timebillsecrecordedrecording_expectedrecording_urlrecording_filemissedwait_timemember_namemember_interfacemember_numberringtimeholdtimeanswered_by_memberanswered_by_interfacedirectiondest_channeldial_statusansweredEscenarios típicos
- Screen pop en el CRM justo en call.incoming.
- Mostrar la información del agente en call.answered.
- Cerrar la ficha de llamada con duración y enlace a la grabación en call.ended.
- Una tarea de devolución de llamada en call.missed.
- Click-to-call desde la ficha del cliente vía la API REST.
API REST
Autenticación por token y un esquema OpenAPI 3.0 en vivo con Swagger UI y ReDoc. Los detalles técnicos de la arquitectura están en la página para ingenieros.
/api/v1/calls/originate/Click-to-call sin exponer el secreto de AMI al CRM./api/v1/calls/conference/Conferencia ad-hoc con 2 o más participantes./api/v1/queues/members/Estado de los agentes de cola y control de pausa./api/v1/recordings/<uniqueid>/Descarga de grabaciones con soporte de Range.Flujo WebSocket del panel
ws/asterisk/ acepta una sesión de Django o un token de la API DRF — lo que permite incrustar el panel en vivo de PearlPBX2 directamente dentro de tu propia interfaz de CRM, en lugar de verlo solo por separado.