Documentación de la API Call Trace
Envíe grabaciones de llamadas desde su sistema, reciba una respuesta 202 inmediata y obtenga la transcripción y evaluación finales mediante webhooks.
Cree una clave API
Abra Admin > Integraciones y cree una clave con el alcance analysis:write.
Envíe una URL de archivo
Envíe un fileUrl HTTPS a POST /api/v1/analyses. La API responde con 202 Accepted.
Reciba el resultado
Suscríbase a analysis.completed y analysis.failed para obtener la evaluación final.
Verifique el secret
Compare X-CallTrace-Secret con el webhook secret guardado al crear el endpoint.
Claves API
Cree un token en el panel de administración
Solo los administradores pueden crear claves API de integración. Las claves tienen alcances, pueden expirar, revocarse y son independientes de las sesiones de empleados.
- 01
Abra Integraciones
Inicie sesión como administrador y abra Admin > Integraciones > API Keys.
- 02
Nombre la clave
Use un nombre que identifique el sistema externo, entorno y responsable.
- 03
Elija los alcances
Seleccione solo los permisos que el sistema necesita. La mayoría de integraciones de carga necesitan analysis:write y analysis:read.
- 04
Defina la vigencia
Elija una fecha de expiración para acceso temporal o déjela permanente para integraciones de servicio de larga duración.
- 05
Copie una vez
El token ct_live_ completo se muestra solo una vez. Tras cerrar el panel, solo permanece visible el prefijo.
ct_live_••••••••
Formato del token
ct_live_8Lk3...full-secret-valueGuarde el token completo en el gestor de secretos de su sistema externo. Call Trace almacena solo un hash y muestra únicamente el prefijo tras la creación.
Autenticación
Use una clave de integración con alcances
Las claves API de integración están separadas de las sesiones de empleados. Envíe la clave en el encabezado Authorization y conceda solo los alcances que su sistema necesita.
Encabezado
Authorization: Bearer ct_live_...
Content-Type: application/jsonAlcances
analysis:write crea análisis.
analysis:read lee estado y resultados.
webhooks:write gestiona la configuración de webhooks.
Permisos
Qué permite cada alcance
Los alcances son acumulativos. Comience con el conjunto mínimo que soporta la integración y añada más solo cuando un endpoint específico lo requiera.
analysis:writeanalysis:readcalls:readstorage:writewebhooks:readwebhooks:writeMínimo recomendado
Para el flujo estándar, cree un token con analysis:write y analysis:read. Los webhooks los configura un admin en la UI, por lo que el remitente externo normalmente no necesita webhooks:write.
Vida útil del token
Expiración, acceso permanente y rotación
Cada clave API tiene su propia vigencia. Un token puede ser permanente, expirar automáticamente o revocarse manualmente.
Token permanente
expiresAt está vacío. El token permanece activo hasta que un admin lo revoque. Úselo solo para integraciones backend-to-backend de confianza con proceso de rotación.
Token con expiración
expiresAt está definido. Tras esa fecha la API devuelve 401 y no se aceptan nuevas solicitudes. Úselo para pruebas, contratistas o acceso temporal.
Token revocado
revokedAt se establece de inmediato cuando un admin revoca la clave. La revocación es instantánea e irreversible; cree una clave nueva.
Rotación
Cree una clave nueva, desplieguela en el sistema externo, confirme que last used se actualizó y luego revoque la clave antigua. Esto evita tiempo de inactividad.
Referencia de la API
Crear un análisis
La solicitud almacena el archivo de origen e inicia el procesamiento en segundo plano. Su cliente no debe esperar a que termine la transcripción o evaluación en esta solicitud.
Crear análisis
Devuelve 202 Accepted y encola el procesamiento.
/api/v1/analysesSolicitud
POST /api/v1/analyses
Authorization: Bearer ct_live_...
Content-Type: application/json
{
"fileUrl": "https://example.com/calls/call-123.mp3",
"agentId": "6f6af4bb-4f23-4f3f-a87e-85f2f8322dc1",
"queueId": "7a7bf5cc-5e34-4f4g-b98f-96g3g9433ed2",
"externalId": "crm-call-123",
"idempotencyKey": "crm-call-123",
"metadata": {
"customerId": "cust_42",
"source": "crm"
}
}Respuesta
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"analysisId": "6f6af4bb-4f23-4f3f-a87e-85f2f8322dc1",
"status": "queued",
"externalId": "crm-call-123"
}fileUrlfileNameagentIdqueueIdlanguageexternalIdidempotencyKeymetadataRequisitos de URL de archivo
fileUrl debe usar HTTPS. Privados, localhost y rangos de IP internos se rechazan, incluidos redireccionamientos a redes privadas. Tamaño máximo del archivo: 20 MB. Los archivos se descargan con timeouts y comprobación de content-type antes del procesamiento.
Referencia de la API
Leer estado y resultados
Use este endpoint cuando su sistema necesite reconciliar estado o recuperarse tras entregas de webhook perdidas.
Obtener análisis
Devuelve el estado más reciente del trabajo y los campos de resultado disponibles.
/api/v1/analyses/{analysisId}{
"analysisId": "6f6af4bb-4f23-4f3f-a87e-85f2f8322dc1",
"status": "completed",
"externalId": "crm-call-123",
"call": {
"durationSeconds": 184,
"agentId": "agent-uuid",
"queueId": "queue-uuid"
},
"evaluation": {
"score": 82,
"summary": "The agent followed the script and resolved the main request.",
"emotion": {
"label": "neutral",
"score": 55,
"comment": "The caller stayed calm throughout the conversation."
},
"criteria": [
{ "name": "Greeting", "score": 10, "maxScore": 10 },
{ "name": "Need discovery", "score": 18, "maxScore": 20 }
]
},
"transcript": {
"language": "en",
"segments": [
{ "speaker": "agent", "text": "Good afternoon, how can I help?" }
]
},
"metadata": {
"customerId": "cust_42"
},
"error": null
}queuedLa solicitud fue aceptada y espera procesamiento.
processingEl archivo se está descargando, transcribiendo y evaluando.
completedLa evaluación, transcripción y resumen de la llamada están disponibles.
failedEl procesamiento falló tras reintentos. Los detalles se devuelven en error.
Referencia de la API
Listar análisis
Busque por status, externalId, agent, queue o rango de fechas. Úselo para reconciliación back-office y herramientas de soporte.
Listar análisis
Devuelve análisis paginados de la empresa de integración.
/api/v1/analysesGET /api/v1/analyses?status=completed&externalId=crm-call-123
Authorization: Bearer ct_live_...Webhooks
Payload de webhook
Configure endpoints de webhook en Admin > Integraciones. Los payloads incluyen la información necesaria para almacenar el resultado de la evaluación en su sistema.
{
"deliveryId": "whd_01jz8n0f8ck2bk0smq7h2x1t0r",
"event": "analysis.completed",
"occurredAt": "2026-06-19T12:00:00.000Z",
"analysisId": "6f6af4bb-4f23-4f3f-a87e-85f2f8322dc1",
"externalId": "crm-call-123",
"call": {
"status": "completed",
"durationSeconds": 184,
"recordingUrl": "https://storage.example.com/audio/call-123.mp3"
},
"evaluation": {
"score": 82,
"summary": "The agent followed the script and resolved the main request.",
"emotion": {
"label": "neutral",
"score": 55,
"comment": "The caller stayed calm throughout the conversation."
},
"criteria": [
{ "name": "Greeting", "score": 10, "maxScore": 10 }
]
},
"transcript": {
"language": "en",
"segments": [
{ "speaker": "agent", "text": "Good afternoon, how can I help?" }
]
},
"metadata": {
"customerId": "cust_42"
},
"error": null
}El texto del script no se incluye por defecto. Use deliveryId para deduplicación y analysisId más event al almacenar transiciones de estado.
Webhooks
Entrega y reintentos
Call Trace almacena cada intento de entrega y reintenta entregas fallidas para que los resultados no se pierdan por timeout o indisponibilidad temporal del cliente.
Éxito
Cualquier respuesta 2xx marca la entrega como completada.
Política de reintentos
Intento inicial más 3 reintentos con backoff, por ejemplo 10 segundos, 1 minuto y 5 minutos.
Historial
Cada intento almacena estado, código de respuesta, mensaje de error, marcas de tiempo y snapshot del payload.
Webhooks
Webhook secret
Cada webhook endpoint recibe un secret. Call Trace lo envía en cada entrega para que pueda rechazar solicitudes de fuentes desconocidas.
Por qué verificar el secret
La URL del webhook es accesible desde internet. Compare el encabezado X-CallTrace-Secret con el secret guardado al crear el endpoint. Si no coincide, devuelva 401 e ignore el payload.
Qué llega en cada entrega
POST /your/webhook-handler
X-CallTrace-Secret: whsec_8Lk3...your-endpoint-secret
X-CallTrace-Delivery: whd_01jz8n0f8ck2bk0smq7h2x1t0r
X-CallTrace-Event: analysis.completed
X-CallTrace-Timestamp: 2026-06-19T12:00:00.000Z
{ "event": "analysis.completed", "analysisId": "6f6af4bb-..." }
X-CallTrace-SecretEl secret del endpoint. Compare este valor con CALL_TRACE_WEBHOOK_SECRET en su servidor.
X-CallTrace-DeliveryID único de entrega. Úselo para ignorar reintentos duplicados del mismo evento.
X-CallTrace-EventTipo de evento, por ejemplo analysis.completed.
X-CallTrace-TimestampCuándo Call Trace envió la solicitud. Útil para logs y soporte.
Cómo verificar
Lea X-CallTrace-Secret de los encabezados de la solicitud y compárelo con el secret mostrado una vez en Admin > Integraciones al crear el webhook. Guarde el secret en una variable de entorno y rechace discrepancias antes de procesar el JSON.
Ejemplo en Node.js
const secret = request.headers.get("x-calltrace-secret");
if (secret !== process.env.CALL_TRACE_WEBHOOK_SECRET) {
return new Response("Unauthorized", { status: 401 });
}
const payload = await request.json();Ejemplos
Crear un análisis desde su lenguaje
Todos los ejemplos usan el mismo endpoint estable y esperan la clave API en CALL_TRACE_API_KEY.
const response = await fetch("https://your-domain.com/api/v1/analyses", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.CALL_TRACE_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
fileUrl: "https://example.com/calls/call-123.mp3",
fileName: "call-123.mp3",
language: "auto",
externalId: "crm-call-123",
idempotencyKey: "crm-call-123"
})
});
const analysis = await response.json();
console.log(analysis.analysisId);Errores
Manejo de errores
Use idempotency keys para reintentos seguros. Los errores de validación se devuelven de forma síncrona. Los errores de procesamiento se devuelven por el endpoint de estado y webhooks analysis.failed.
400JSON inválido, fileUrl ausente, content type no soportado o metadata inválida.
401Clave API ausente, expirada, revocada o malformada.
403La clave API no incluye el alcance requerido.
409La misma idempotency key ya se usó para otro payload.
422La URL del archivo está bloqueada, es privada, no es HTTPS, es demasiado grande o inaccesible.
500Error temporal del servidor. Reintente con la misma idempotency key.