Documentação da API Call Trace
Envie gravações de chamadas do seu sistema, receba uma resposta 202 imediata e obtenha a transcrição e avaliação finais por webhooks.
Crie uma chave API
Abra Admin > Integrações e crie uma chave com o escopo analysis:write.
Envie uma URL de arquivo
Envie um fileUrl HTTPS para POST /api/v1/analyses. A API responde com 202 Accepted.
Receba o resultado
Inscreva-se em analysis.completed e analysis.failed para obter a avaliação final.
Verifique o secret
Compare X-CallTrace-Secret com o webhook secret salvo ao criar o endpoint.
Chaves API
Crie um token no painel admin
Apenas administradores podem criar chaves API de integração. As chaves têm escopos, podem expirar, ser revogadas e são independentes das sessões de funcionários.
- 01
Abra Integrações
Entre como administrador e abra Admin > Integrações > API Keys.
- 02
Nomeie a chave
Use um nome que identifique o sistema externo, ambiente e responsável.
- 03
Escolha os escopos
Selecione apenas as permissões necessárias. A maioria das integrações de upload precisa de analysis:write e analysis:read.
- 04
Defina a validade
Escolha uma data de expiração para acesso temporário ou deixe permanente para integrações de serviço de longa duração.
- 05
Copie uma vez
O token ct_live_ completo é exibido apenas uma vez. Após fechar o painel, apenas o prefixo permanece visível.
ct_live_••••••••
Formato do token
ct_live_8Lk3...full-secret-valueArmazene o token completo no gerenciador de segredos do seu sistema externo. O Call Trace armazena apenas um hash e mostra só o prefixo após a criação.
Autenticação
Use uma chave de integração com escopos
As chaves API de integração são separadas das sessões de funcionários. Envie a chave no cabeçalho Authorization e conceda apenas os escopos que seu sistema precisa.
Cabeçalho
Authorization: Bearer ct_live_...
Content-Type: application/jsonEscopos
analysis:write cria análises.
analysis:read lê status e resultados.
webhooks:write gerencia configurações de webhooks.
Permissões
O que cada escopo permite
Os escopos são cumulativos. Comece com o menor conjunto que suporta a integração e adicione mais apenas quando um endpoint específico exigir.
analysis:writeanalysis:readcalls:readstorage:writewebhooks:readwebhooks:writeMínimo recomendado
Para o fluxo padrão, crie um token com analysis:write e analysis:read. Webhooks são configurados por um admin na UI, então o remetente externo geralmente não precisa de webhooks:write.
Validade do token
Expiração, acesso permanente e rotação
Cada chave API tem sua própria validade. Um token pode ser permanente, expirar automaticamente ou ser revogado manualmente.
Token permanente
expiresAt está vazio. O token permanece ativo até um admin revogá-lo. Use apenas para integrações backend-to-backend confiáveis com processo de rotação.
Token com expiração
expiresAt está definido. Após essa data a API retorna 401 e novas requisições não são aceitas. Use para testes, contratados ou acesso temporário.
Token revogado
revokedAt é definido imediatamente quando um admin revoga a chave. A revogação é instantânea e irreversível; crie uma nova chave.
Rotação
Crie uma nova chave, implante no sistema externo, confirme que last used foi atualizado e então revogue a chave antiga. Isso evita downtime.
Referência da API
Criar uma análise
A requisição armazena o arquivo de origem e inicia o processamento em background. Seu cliente não deve esperar a transcrição ou avaliação terminar nesta requisição.
Criar análise
Retorna 202 Accepted e enfileira o processamento.
/api/v1/analysesRequisição
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"
}
}Resposta
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 arquivo
fileUrl deve usar HTTPS. Privados, localhost e faixas de IP internas são rejeitados, incluindo redirecionamentos para redes privadas. Tamanho máximo do arquivo: 20 MB. Os arquivos são baixados com timeouts e verificação de content-type antes do processamento.
Referência da API
Ler status e resultados
Use este endpoint quando seu sistema precisar reconciliar estado ou recuperar após entregas de webhook perdidas.
Obter análise
Retorna o status mais recente do job e os campos de resultado disponíveis.
/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
}queuedA requisição foi aceita e aguarda processamento.
processingO arquivo está sendo baixado, transcrito e avaliado.
completedA avaliação, transcrição e resumo da chamada estão disponíveis.
failedO processamento falhou após tentativas. Detalhes são retornados em error.
Referência da API
Listar análises
Pesquise por status, externalId, agent, queue ou intervalo de datas. Use para reconciliação back-office e ferramentas de suporte.
Listar análises
Retorna análises paginadas da empresa de integração.
/api/v1/analysesGET /api/v1/analyses?status=completed&externalId=crm-call-123
Authorization: Bearer ct_live_...Webhooks
Payload de webhook
Configure endpoints de webhook em Admin > Integrações. Os payloads incluem as informações necessárias para armazenar o resultado da avaliação no seu 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
}O texto do script não é incluído por padrão. Use deliveryId para deduplicação e analysisId mais event ao armazenar transições de estado.
Webhooks
Entrega e tentativas
O Call Trace armazena cada tentativa de entrega e repete entregas falhas para que resultados não se percam em timeout ou indisponibilidade temporária do cliente.
Sucesso
Qualquer resposta 2xx marca a entrega como concluída.
Política de tentativas
Tentativa inicial mais 3 repetições com backoff, por exemplo 10 segundos, 1 minuto e 5 minutos.
Histórico
Cada tentativa armazena status, código de resposta, mensagem de erro, timestamps e snapshot do payload.
Webhooks
Webhook secret
Cada webhook endpoint recebe um secret. O Call Trace o envia em cada entrega para que você rejeite solicitações de fontes desconhecidas.
Por que verificar o secret
A URL do webhook é acessível pela internet. Compare o cabeçalho X-CallTrace-Secret com o secret salvo ao criar o endpoint. Se não coincidir, retorne 401 e ignore o payload.
O que chega em 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-SecretO secret do endpoint. Compare este valor com CALL_TRACE_WEBHOOK_SECRET no seu servidor.
X-CallTrace-DeliveryID único da entrega. Use-o para ignorar retries duplicados do mesmo evento.
X-CallTrace-EventTipo de evento, por exemplo analysis.completed.
X-CallTrace-TimestampQuando o Call Trace enviou a solicitação. Útil para logs e suporte.
Como verificar
Leia X-CallTrace-Secret dos cabeçalhos da solicitação e compare com o secret exibido uma vez em Admin > Integrações ao criar o webhook. Armazene o secret em uma variável de ambiente e rejeite divergências antes de processar o JSON.
Exemplo em 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();Exemplos
Criar uma análise na sua linguagem
Todos os exemplos usam o mesmo endpoint estável e esperam a chave API em 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);Erros
Tratamento de erros
Use idempotency keys para tentativas seguras. Erros de validação são retornados de forma síncrona. Erros de processamento são retornados pelo endpoint de status e webhooks analysis.failed.
400JSON inválido, fileUrl ausente, content type não suportado ou metadata inválida.
401Chave API ausente, expirada, revogada ou malformada.
403A chave API não inclui o escopo necessário.
409A mesma idempotency key já foi usada para outro payload.
422A URL do arquivo está bloqueada, privada, não é HTTPS, é grande demais ou inacessível.
500Erro temporário do servidor. Tente novamente com a mesma idempotency key.