📤Ligações - Broadcasts
Um Broadcast de Voz disca para todos os leads de uma lista, toca um áudio gravado e reporta o desfecho de cada ligação — atendeu, escutou até o fim, digitou uma tecla, não atendeu.
É o equivalente exato dos Broadcasts de SMS — mesmo nome e mesmo formato — e o mesmo recurso da tela Broadcasts de Voz do painel: o disparo criado pela API aparece lá, e vice-versa.
A URL de base de todos os endpoints é: https://web.smsfunnel.com.br/api/parceiros/v1
Fluxo completo
1. POST /calls/audios → cria o áudio (audio_id)
2. POST /lists → cria a lista (list_id)
3. POST /lists/{id}/leads → insere os telefones
4. POST /calls/broadcasts → cria e dispara (broadcast_id)
5. GET /calls/broadcasts/{id}/contacts → desfecho de cada ligaçãoOs telefones sempre vêm de uma Lista — não há inserção de números no corpo do disparo. O caminho da lista já normaliza o telefone, aplica a blacklist e é idempotente por Idempotency-Key, e a mesma lista pode alimentar uma campanha de SMS e um disparo de voz.
Status possíveis
Status do broadcast: pending (criado, importando os contatos), processing (discando), paused (pausado), completed (encerrado), cancelled (cancelado).
Desfecho de cada ligação: waiting, no_answer, answered_hangup, answered_listened, answered_dtmf, cancelled e error — a tabela completa está mais abaixo.
Janela de silêncio: 23:00–07:30 (America/Sao_Paulo). Nada é discado nesse intervalo. Um scheduled_date que caia dentro dele é reagendado para 07:30, e não recusado — o valor devolvido na resposta é o horário efetivo.
Créditos
O custo é de 1 crédito de ligação a cada 30 segundos de áudio, arredondado para cima, por ligação atendida. O valor por ligação é o credits_per_call do áudio.
Endpoints
POST /calls/broadcasts
Função: Cria o disparo e inicia a importação dos telefones da lista.
Corpo de envio:
Corpo de resposta — 201 Created:
As validações são checadas antes de qualquer coisa ser gravada, nesta ordem:
Lista inexistente ou de outra conta →
404 NOT_FOUNDÁudio inexistente ou de outra conta →
404 NOT_FOUNDÁudio ainda em processamento →
422 AUDIO_NOT_READY(comdetails.audio_status)Lista sem nenhum lead →
422 EMPTY_LEAD_LISTSaldo de ligação zerado →
402 INSUFFICIENT_CREDITS
GET /calls/broadcasts
Função: Lista os seus broadcasts de voz, do mais recente para o mais antigo.
Parâmetros de query (opcionais):
Corpo de resposta — 200 OK:
GET /calls/broadcasts/{id}
Função: Detalhe do broadcast, acrescido do bloco report — o mesmo recorte da tela de acompanhamento do painel.
Corpo de resposta — 200 OK:
PUT /calls/broadcasts/{id}
Função: Atualização parcial do broadcast. Envie apenas os campos que deseja alterar.
Corpo de envio:
Corpo de resposta — 200 OK: o broadcast atualizado, no mesmo formato da listagem (sem o bloco report).
lead_list_id é proibido neste endpoint (422). A lista já foi copiada para os contatos durante a importação, e trocá-la deixaria o broadcast apontando para uma lista que não corresponde ao que foi discado. Para outra lista, crie outro broadcast.
A rediscagem só vale para importações futuras. max_attempts e retry_interval_minutes são copiados para cada contato no momento da importação. Alterá-los depois que a importação terminou não reescreve os contatos já criados. É o mesmo comportamento do painel.
Broadcast já encerrado (completed ou cancelled) não pode ser editado → 409 INVALID_STATUS_TRANSITION, com o status atual em details.current_status.
PUT /calls/broadcasts/{id}/cancel
Função: Cancela o broadcast. Permitido nos status pending, processing e paused — nos demais, 409 INVALID_STATUS_TRANSITION.
Corpo de resposta:
200 OK— broadcastpendingoupaused: cancelamento completo ("cancellation": "complete"), nada estava no ar.202 Accepted— broadcastprocessing: cancelamento parcial ("cancellation": "partial"); ligações já publicadas no discador ainda podem completar.
Os contatos ainda não discados recebem o desfecho cancelled; quem já foi discado mantém o desfecho original.
PUT /calls/broadcasts/{id}/pause
PUT /calls/broadcasts/{id}/resume
Função: Interrompe e retoma a discagem.
pauseaceitapendingeprocessing→ passa parapaused.resumeaceita apenaspaused→ volta paraprocessing. Fora dessas transições,409 INVALID_STATUS_TRANSITIONcom o status atual emdetails.current_status.
Corpo de resposta — 200 OK: o broadcast atualizado, no mesmo formato da listagem.
GET /calls/broadcasts/{id}/contacts
Função: Lista os contatos do broadcast com o desfecho individual de cada ligação.
Parâmetros de query (opcionais):
Corpo de resposta — 200 OK:
Desfecho de cada ligação (status)
status
Significado
waiting
Ainda não discado, ou aguardando a próxima tentativa
no_answer
Não atendeu, ocupado, congestionado ou número indisponível
answered_hangup
Atendeu e desligou antes do fim do áudio (ouviu menos de 95%)
answered_listened
Atendeu e escutou 95% ou mais do áudio
answered_dtmf
Atendeu e digitou uma tecla — a tecla está em dtmf_response
cancelled
O broadcast foi cancelado antes deste contato ser discado
error
Falhou antes de chegar ao discador (telefone fora do formato brasileiro, p. ex.)
Use status para programar em cima do retorno. O status_label é o texto em português que o painel exibe e pode mudar.
answered_at é o momento em que o desfecho voltou do discador — não é o horário exato do atendimento.
Código de Erros Comuns
401 Unauthorized(UNAUTHORIZED): Não foi possível identificar o parceiro a partir da Chave de API.402 Payment Required(INSUFFICIENT_CREDITS): Saldo de créditos de ligação zerado. Vêm emdetailsoestimated_creditse oavailable_credits.404 Not Found(NOT_FOUND): O broadcast, a lista ou o áudio não foi encontrado ou não pertence à sua conta.409 Conflict(INVALID_STATUS_TRANSITION): O broadcast não aceita a operação no status atual (editar encerrado, cancelar encerrado, pausar pausado, retomar o que não está pausado). O status atual vem emdetails.current_status.422 Unprocessable Entity(AUDIO_NOT_READY): O áudio ainda não terminou de ser processado. O status dele vem emdetails.audio_status; aguardeready: trueemGET /calls/audios/{id}.422 Unprocessable Entity(EMPTY_LEAD_LIST): A lista informada não tem nenhum lead. Insira leads antes de criar o disparo.422 Unprocessable Entity(EMPTY_LEAD_LIST): A lista informada não tem nenhum lead. Insira leads antes de criar o disparo.422 Unprocessable Entity(VALIDATION_ERROR): Algum campo do corpo é inválido — incluilead_list_idnoPUT,scheduled_dateno passado,scheduled_end_dateanterior ao início efetivo epostback_urlapontando para endereço privado ou interno.429 Too Many Requests(RATE_LIMIT_EXCEEDED): Limite de 60 requisições por minuto excedido. Consulte o headerRetry-After.
Corpo de resposta de erro:
Dúvidas?
Em caso de dúvidas, entre em contato com nosso suporte.
Last updated