API de Ligações Invertus
Consulta das ligações atendidas e download das gravações, com metadados de agente, resultado e duração.
Visão geral
Uma API REST, respostas em JSON, autenticada por token. Cada ligação atendida e classificada por um de nossos agentes vira um registro aqui, junto com o áudio da conversa.
Há dois modos de trabalho, que podem ser usados juntos: consulta (você chama esta API quando quiser) e push (nós chamamos a sua API assim que a ligação fica pronta). Esta documentação cobre o modo de consulta; o push está descrito ao final.
Um segundo endereço deve ser ativado mais adiante para a mesma API. Nada além do host muda — token, endpoints e formato das respostas permanecem idênticos —, mas a troca fica mais simples se a URL base não estiver espalhada pelo código.
Autenticação
Todo pedido leva o token no cabeçalho Authorization, no esquema Bearer:
Authorization: Bearer <SEU_TOKEN>
O token é exclusivo da sua integração, entregue por canal separado desta documentação, e não expira. Ele dá acesso somente de leitura ao namespace /v1.
Use variável de ambiente ou cofre de segredos. Ele identifica sua integração: se vazar, avise-nos e emitimos outro na hora — o antigo é revogado no mesmo instante.
Sem token, com token inválido, ou com token de outro escopo, a resposta é 401:
{
"erro": "nao_autorizado",
"mensagem": "Envie o cabeçalho Authorization: Bearer <token>."
}
Convenções
Identificador da ligação
O campo id é o protocolo gerado pela nossa central. É único, imutável e nunca reaproveitado — use-o como chave de deduplicação do seu lado. Exemplo: 1780000000000001.
Datas e horários
Todos os horários vêm no formato AAAA-MM-DDTHH:MM:SS, sem indicador de fuso, sempre em horário de Brasília (UTC−3). Não há horário de verão no Brasil desde 2019, então o deslocamento é fixo.
Nos parâmetros de filtro (desde, ate) aceitamos ISO 8601 com ou sem fuso; sem fuso, assumimos Brasília.
Três horários diferentes
| Campo | Significa |
|---|---|
horario_inicio | Momento em que a chamada foi atendida e a gravação começou |
horario_fim | Fim da conversa — horario_inicio mais a duração |
datahistorico | Momento em que o agente registrou o resultado, alguns segundos após o fim |
Listar ligações
Devolve as ligações em ordem decrescente de datahistorico — mais recentes primeiro. Só entram ligações cuja gravação já está arquivada e pronta para download.
Parâmetros de consulta
| Parâmetro | Obrig. | Descrição |
|---|---|---|
limite | não | Itens por página. Padrão 50, máximo 200. |
cursor | não | Cursor da página seguinte, copiado de paginacao.proximo_cursor. |
desde | não | Só ligações a partir desta data/hora. Ex.: 2026-09-08T00:00:00. |
ate | não | Só ligações até esta data/hora. |
agente | não | Login do agente. Ex.: ana.ribeiro. |
fila | não | Nome exato da fila. Ex.: Vendas Ativo. |
resultado | não | Descrição exata do resultado. Ex.: Sem Interesse. |
Os filtros combinam entre si com e lógico. Comparações de texto são exatas, sem curinga.
Exemplo
curl -H "Authorization: Bearer <SEU_TOKEN>" \
"https://api.ipbox.corpdata.com.br/v1/ligacoes?limite=2"
Resposta 200
Os valores abaixo são fictícios, para ilustrar o formato.
{
"ligacoes": [
{
"metadata": {
"id": "1780000000000001",
"id_ocorrencia": "1780000000000001",
"funcionario_id": "42",
"funcionario_nome": "Ana Ribeiro",
"funcionario_email": null,
"url_gravacao": "https://api.ipbox.corpdata.com.br/gravacao/1780000000000001?t=a1b2c3d4…",
"datahistorico": "2026-09-08T17:48:11",
"horario_inicio": "2026-09-08T17:47:33",
"horario_fim": "2026-09-08T17:48:04",
"duracao_gravacao": 31,
"ocorrencia_codigo": "77",
"ocorrencia_descricao": "Sem Interesse"
}
}
],
"paginacao": {
"limite": 2,
"retornados": 2,
"proximo_cursor": "MjAyNi0wOS0wOFQyMDo0Nzo0OS4wMDBafDE3ODAwMDAwMDAwMDAwMDI"
},
"retencao_dias": 7
}
Buscar uma ligação
Devolve uma única ligação, no mesmo formato { "metadata": { … } } — sem o envelope de lista.
curl -H "Authorization: Bearer <SEU_TOKEN>" \
https://api.ipbox.corpdata.com.br/v1/ligacoes/1780000000000001
Responde 404 quando o id não existe ou já saiu da janela de 7 dias. Repare que a gravação continua acessível mesmo nesse caso — veja Gravações.
Baixar a gravação
Responde 302 com um Location temporário apontando para o arquivo. Seu cliente HTTP precisa seguir redirecionamentos — no curl, a opção -L.
curl -L -H "Authorization: Bearer <SEU_TOKEN>" \
https://api.ipbox.corpdata.com.br/v1/ligacoes/1780000000000001/audio \
-o gravacao.wav
A URL de destino vale 1 hora e é gerada nova a cada chamada. Não a armazene: guarde o id e peça de novo quando precisar.
A URL final é assinada e não deve receber o seu token. Algumas bibliotecas repassam cabeçalhos automaticamente ao seguir 302 — se a sua fizer isso, o armazenamento pode recusar a requisição. Configure para não propagar Authorization entre hosts diferentes.
O objeto ligação
| Campo | Tipo | Descrição |
|---|---|---|
id | string | Protocolo da ligação. Único e imutável — use como chave de deduplicação. |
id_ocorrencia | string | Identificador do atendimento. Hoje repete o id; pode ser reconfigurado para o código do cliente ou o número da ficha, se preferirem. |
funcionario_id | string · nulo | Id interno do agente. Nulo quando o agente já foi desligado e saiu do cadastro. |
funcionario_nome | string · nulo | Nome do agente. Ver ressalvas. |
funcionario_email | string · nulo | Hoje sempre nulo. Ver ressalvas. |
url_gravacao | string | Link direto e permanente para o áudio, já assinado. Equivale ao endpoint /audio e dispensa token. |
datahistorico | datetime | Momento do registro do resultado pelo agente. |
horario_inicio | datetime | Início da conversa (atendimento). |
horario_fim | datetime | Fim da conversa. |
duracao_gravacao | inteiro | Duração em segundos. |
ocorrencia_codigo | string · nulo | Código do resultado. Ver ressalvas. |
ocorrencia_descricao | string | Resultado registrado pelo agente. Ex.: Sem Interesse, Proposta Enviada. |
Campos podem ser acrescentados ao objeto sem aviso e sem mudança de versão. Ignore os que não conhecer, em vez de rejeitar a resposta inteira.
Paginação
A paginação é por cursor, não por página numerada. O motivo é prático: entram ligações novas a cada dois minutos, e no topo da lista. Com offset você pularia ou repetiria registros entre uma página e outra.
Cada resposta traz paginacao.proximo_cursor. Repasse-o como ?cursor= para pegar a página seguinte. Quando ele vier null, acabou.
# primeira página
GET /v1/ligacoes?limite=100
# seguintes, até proximo_cursor virar null
GET /v1/ligacoes?limite=100&cursor=MjAyNi0wOS0wOFQyMDo0Nzo0OS4wMDBafDE3ODAw…
Guarde o datahistorico mais recente que você já processou. A cada ciclo, chame ?desde=<esse valor> e percorra os cursores até o fim. Deduplique por id: uma ligação pode reaparecer se o agente corrigir a classificação dentro da janela.
Erros
Erros têm sempre a mesma forma, com um erro estável para tratamento programático e uma mensagem legível.
{ "erro": "nao_encontrada", "mensagem": "Ligação 000000 não está na janela de 7 dias." }
| HTTP | erro | Quando acontece | O que fazer |
|---|---|---|---|
401 | nao_autorizado | Token ausente, inválido ou de outro escopo | Conferir o cabeçalho. Não repetir sem corrigir. |
404 | nao_encontrada | Id inexistente ou fora da janela de 7 dias | Tratar como definitivo; não repetir. |
404 | rota_inexistente | Caminho ou método incorreto | Conferir a URL. |
409 | indisponivel | Gravação ainda em processo de arquivamento | Repetir em alguns minutos. |
5xx | — | Falha nossa, temporária | Repetir com espera progressiva. |
Gravações
É o áudio original da central telefônica, sem reprocessamento. A taxa de 8 kHz é o padrão da telefonia e serve bem para transcrição e análise de fala.
Os metadados ficam disponíveis por 7 dias; a gravação, por tempo indeterminado. Uma url_gravacao recebida hoje continua funcionando depois que a ligação sai da listagem — inclusive meses depois.
Na prática: GET /v1/ligacoes/{id} passa a responder 404 após 7 dias, mas GET /v1/ligacoes/{id}/audio continua entregando o arquivo.
Se precisarem de MP3 ou Opus em vez de WAV — o que reduz o tamanho em cerca de dez vezes — conseguimos converter na origem. É só pedir.
Retenção e limites
| Item | Valor | Observação |
|---|---|---|
| Janela de consulta | 7 dias | Além disso, só o áudio permanece |
| Itens por página | 200 | Padrão 50 |
| Validade do link de áudio | 1 hora | Gerado novo a cada chamada |
| Atualização dos dados | 2 minutos | Intervalo entre coletas na central |
| Limite de requisições | — | Sem limite fixo; avise-nos se for fazer volume alto |
O registro aparece aqui quando o agente conclui o atendimento e escolhe o resultado — não quando a chamada termina. Se o agente demora a classificar, a ligação demora a aparecer. Isso é característica da central, não atraso da API.
Modo push
Em vez de vocês consultarem, nós entregamos: assim que a ligação é classificada e a gravação arquivada, fazemos um POST na URL que vocês indicarem, com exatamente o mesmo objeto metadata desta documentação — um por requisição.
POST https://api-de-voces.com.br/ligacoes
Content-Type: application/json
Authorization: Bearer <token de vocês>
{ "metadata": { /* mesmos campos da seção "O objeto ligação" */ } }
Latência típica de dois a três minutos após a classificação. Consideramos entregue qualquer resposta 2xx; qualquer outra coisa vira nova tentativa, com espera progressiva, até seis vezes. Requisições repetidas para o mesmo id são possíveis — trate a recepção como idempotente.
Para ligar, precisamos de: a URL de destino, o cabeçalho e o token de autenticação, e o comportamento esperado em caso de reenvio.
Campos com ressalva
Três campos do contrato não têm equivalente direto na central telefônica. Estão documentados aqui em vez de mascarados, porque afetam o que vocês recebem.
O cadastro da central tem o campo, mas ele está vazio para todos os agentes. Enquanto não for preenchido, não há origem para o dado. Duas saídas: preenchermos o cadastro na central, ou mantermos uma tabela de correspondência do nosso lado. Digam qual preferem.
A central guarda apenas o login (ana.ribeiro), não o nome completo. Formatamos para Ana Ribeiro, o que funciona bem na maioria dos casos mas não recupera nomes compostos nem acentuação. Se precisarem do nome exato, vale a mesma tabela de correspondência do item anterior.
Na central, cada fila tem seu próprio catálogo de resultados. O mesmo resultado tem códigos diferentes conforme a fila: Caixa Postal, por exemplo, tem doze códigos distintos.
Hoje enviamos o código real da fila em que a ligação aconteceu — fiel à central. Se vocês esperam um catálogo estável, em que cada resultado tem um código só, conseguimos normalizar antes de enviar. É uma decisão de contrato e precisamos da resposta de vocês. Enquanto isso, ocorrencia_descricao é estável e serve como chave.
Aproximadamente 6% das ligações vêm com ocorrencia_codigo nulo — são as filas receptivas, que não expõem catálogo de resultados.
Suporte
Para dúvidas, mudança de contrato, rotação de token ou aumento de volume, falem com a equipe técnica da Invertus. Ao relatar um problema, incluam o id da ligação, o horário aproximado e a resposta completa que receberam — com isso rastreamos o caso ponta a ponta.