PearlPBX2
Integraciones

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.

Llamada entrante
call.incomingcall.answeredcall.missedcall.ended
Llamada saliente
call.outgoingcall.outgoing_answeredcall.outgoing_ended
  • 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.ended se deduplica vía Redis.
POST /your-crm/webhook · call.ended
{
  "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_statusanswered

Escenarios 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.

POST/api/v1/calls/originate/Click-to-call sin exponer el secreto de AMI al CRM.
POST/api/v1/calls/conference/Conferencia ad-hoc con 2 o más participantes.
GET/POST/api/v1/queues/members/Estado de los agentes de cola y control de pausa.
GET/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.