API - VoIP Webhook
Rota pública usada por centrais/provedores de telefonia externos para enviar chamadas já finalizadas ao SprintHub.
A cada evento recebido, o SprintHub:
identifica o lead pelo telefone (ou cria um novo lead, se o número for desconhecido);
registra a chamada no histórico de chamadas (
voip_history), visível no CRM;registra o evento na linha do tempo do lead (
voip.call_incomingouvoip.call_outgoing).

Endpoint
Substitua NOME_DO_CLIENTE pelo nome da instância (ex: meucliente). O parâmetro ?i= é o que identifica a base de dados do cliente e deve estar sempre presente na URL configurada no provedor.
Autenticação
A autenticação é opcional e definida por instância:
Cliente sem segredo configurado
O endpoint aceita a requisição sem validação adicional
Cliente com segredo configurado
É obrigatório enviar o segredo, senão a resposta é 401 unauthorized
Quando o segredo estiver ativo, envie-o de uma das duas formas:
ou
A configuração do segredo (
voip_webhook_secret) é feita pela equipe SprintHub na instância do cliente.
Corpo da requisição
O corpo é um envelope com dois campos: event e data.
event
string
sim
Único valor aceito hoje: "call"
data
object
sim
Dados da chamada finalizada (tabela a seguir)
Campos de data
user
number
sim
ID do usuário SprintHub que fez/recebeu a chamada. Precisa existir na instância
leadPhone
string
sim
Telefone do contato, com DDI. Caracteres não numéricos são removidos
type
string
sim
INCOMING (recebida) ou OUTGOING (realizada)
status
string
sim
COMPLETE (atendida) ou INCOMPLETE (não atendida)
duration
number
sim
Duração em segundos. Use 0 para chamadas não atendidas
record
boolean
sim
Indica se a chamada foi gravada na central
service
string
sim
Identificador do provedor/central (até 32 caracteres). Ex: "twilio"
lead
number
não
ID do lead, se já conhecido. Se omitido, o lead é resolvido pelo telefone
leadName
string
não
Nome do contato (até 64 caracteres)
userName
string
não
Nome do operador (até 64 caracteres)
callId
string
não
ID da chamada no provedor (até 64 caracteres). Usado para conciliação
description
string
não
Observação livre sobre a chamada (até 1000 caracteres)
Campos não listados acima são rejeitados: qualquer propriedade extra resulta em
400 invalid_body.
Exemplo — chamada recebida e atendida
Exemplo — chamada realizada e não atendida
Exemplo com cURL
Collection do Postman
Arquivo: voip_webhook_postman_collection.json — importe no Postman em Import > File.
Antes de rodar, ajuste as variáveis da collection:
baseUrl
URL da API (ex: https://api.sprinthub.app)
instance
Nome da instância, usado no ?i=
secret
Segredo do webhook. Deixe vazio se a instância não usa segredo
userId
ID de um usuário existente na instância
leadPhone
Telefone usado nos testes
service
Identificador do provedor enviado em service
leadId
Preencha apenas para a requisição "com lead informado"
A collection tem duas pastas:
Sucesso — chamada recebida atendida, realizada não atendida, payload mínimo, com lead informado e com telefone mascarado. Cada requisição valida
201/msg: createde guarda o ID retornado na variávelhistoryId.Erros — os casos de
400(campo obrigatório ausente,eventinválido, enum inválido, campo extra) e o401de segredo inválido.
As requisições da pasta Sucesso criam registros reais no histórico de chamadas e podem criar o lead pelo telefone informado. Use uma instância de teste. O
callIdé gerado com{{$timestamp}}para cada envio ser único.
O que o SprintHub faz com o evento
Valida o corpo — formato, tipos e campos obrigatórios.
Normaliza o telefone — remove tudo que não é dígito de
leadPhone.Resolve o lead:
se
leadfoi enviado, ele é usado direto;senão, procura um lead existente pelos campos telefone, celular e WhatsApp (com tratamento do 9º dígito em números brasileiros);
se não encontrar, cria um novo lead com origem VoIP, usando o nome e a foto do WhatsApp quando o número tiver conta ativa, ou o próprio telefone como nome.
Registra a chamada no histórico de chamadas e retorna o ID gerado.
Registra na linha do tempo do lead o evento
voip.call_incomingouvoip.call_outgoing, com operador, telefone, status, duração,callIdeservice.
Se a etapa de resolução/criação do lead falhar, a chamada ainda é registrada — apenas sem vínculo com lead (e, nesse caso, sem evento na linha do tempo).
Respostas
201
{ "msg": "created", "id": 123 }
Chamada registrada. id é o identificador no histórico de chamadas
400
{ "msg": "invalid_body", "err": { ... } }
Corpo inválido: campo obrigatório ausente, tipo errado ou campo extra
401
{ "msg": "unauthorized" }
Segredo configurado na instância e não enviado (ou enviado incorreto)
500
{ "msg": "failed_voip_webhook", "err": "..." }
Falha ao gravar a chamada. Pode ser reenviado
O campo err do 400 traz o detalhe da validação, útil para depurar a integração:
Boas práticas
Envie um evento por chamada finalizada, após o encerramento — o webhook não trata eventos de progresso (ringing, answered, etc.).
Não há deduplicação por
callId: reenviar o mesmo evento cria um novo registro no histórico. Envie semprecallIdpara permitir conciliação e evite reenvios desnecessários.Reenvie apenas em erro
500ou timeout, com espera progressiva entre tentativas. Como a falha pode ocorrer após a gravação da chamada, um reenvio pode gerar registro duplicado — use ocallIdpara identificar.durationem segundos, sempre número inteiro.record: trueapenas sinaliza que existe gravação na central; o áudio não é enviado nem anexado por este endpoint.Respeite os limites de tamanho dos campos de texto (
userName,leadNameecallIdaté 64;serviceaté 32;descriptionaté 1000). Valores maiores podem ser truncados ou causar erro500.Automação: o gatilho "recebeu ligação" (
leadPhoneCall, eventoreceived) reconhece as chamadasINCOMINGrecebidas por este webhook. O filtro por número do operador não se aplica, pois o webhook não envia esse número.Este endpoint não gera consumo de créditos nem transcrição automática — ele apenas registra o histórico da chamada e o evento no lead.
Atualizado
Isto foi útil?