Visión general
La API permite iniciar llamadas Click2Call desde cualquier sistema externo. El flujo es simple: la centralita llama primero al teléfono del agente (la extensión indicada) y, cuando éste descuelga, conecta automáticamente con el número de destino.
Todas las peticiones a la API requieren un Bearer token JWT que se obtiene con usuario y contraseña. Los tokens caducan a las 24 horas.
Inicio rápido
Llama a POST /api/auth/token con tus credenciales.
Llama a POST /api/call incluyendo el token en la cabecera Authorization.
La centralita llama al softphone de la extensión. Al descolgar, conecta con el destino.
Cuando recibas 401 Token expirado, repite el paso 1.
Ejemplo completo
# 1. Obtener token TOKEN=$(curl -s -X POST https://tu-servidor/api/auth/token \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"tu_contraseña"}' \ | grep -o '"access_token":"[^"]*' | cut -d'"' -f4) # 2. Iniciar llamada curl -X POST https://tu-servidor/api/call \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{"extension":"201","destination":"666123456"}'
Autenticación
Devuelve un Bearer token JWT válido durante 24 horas. No requiere ninguna cabecera de autenticación previa.
Parámetros del cuerpo
| Campo | Tipo | Descripción |
|---|---|---|
username requerido |
string | Nombre de usuario |
password requerido |
string | Contraseña |
Petición
curl -X POST https://tu-servidor/api/auth/token \ -H "Content-Type: application/json" \ -d '{"username": "admin", "password": "tu_contraseña"}'
const res = await fetch('/api/auth/token', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: 'admin', password: 'tu_contraseña' }) }); const { access_token } = await res.json();
Respuesta
401 Token expirado, solicita uno nuevo con este endpoint.
Usar el token
Incluye el token en la cabecera Authorization de cada petición:
Authorization: Bearer ey...
Iniciar llamada
Inicia una llamada Click2Call. La centralita marca al softphone de la extension indicada. Cuando el agente descuelga, conecta automáticamente con destination.
Parámetros del cuerpo
| Campo | Tipo | Default | Descripción |
|---|---|---|---|
extension requerido |
string | — | Extensión SIP del agente que recibirá la llamada primero (ej. "201") |
destination requerido |
string | — | Número a marcar. Espacios, guiones y paréntesis se eliminan automáticamente; se conserva +. |
timeout opcional |
number | 30 |
Segundos que suena el softphone del agente antes de cancelar |
autoAnswer opcional |
boolean | false |
Si true, el softphone contesta automáticamente sin que el agente descuelgue |
Petición
curl -X POST https://tu-servidor/api/call \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <token>" \ -d '{ "extension": "201", "destination": "666 123 456", "timeout": 30 }'
const res = await fetch('/api/call', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${access_token}` }, body: JSON.stringify({ extension: '201', destination: '666123456' }) }); const data = await res.json();
Respuesta exitosa
callId identifica la llamada en el sistema. Guárdalo si necesitas referenciarlo posteriormente.
Códigos de error
Todas las respuestas de error incluyen un campo message con la descripción del problema.
| Código | Mensaje | Qué hacer |
|---|---|---|
400 |
username y password son requeridos | Incluye ambos campos en el body de /api/auth/token |
400 |
Faltan parámetros: extension y destination son requeridos | Incluye extension y destination en el body de /api/call |
401 |
Credenciales inválidas | Comprueba usuario y contraseña |
401 |
Token requerido | Añade la cabecera Authorization: Bearer <token> |
401 |
Token expirado | Solicita un token nuevo con POST /api/auth/token |
401 |
Token inválido | El token está malformado. Solicita uno nuevo. |
500 |
Error al iniciar la llamada | Error interno o de conexión con la centralita. Inténtalo de nuevo o contacta con soporte. |