Voltar para o blog

Webhook ou consulta em laço: como esperar o SMS

Equipe AltiviaCloud · 2 de setembro de 2026 · 3 min de leitura

Trinta requisições para receber um código, e vinte e nove dizem 'ainda nada'. Por que o laço não escala e quando SSE vence o webhook.

Existe um trecho de código que quase toda integração de SMS tem na primeira versão, e que quase nenhuma mantém na terceira:

while (true) {
  const sms = await buscarSms(pedidoId);
  if (sms) break;
  await esperar(1000);
}

Funciona. Você testa com um pedido, o código chega, o laço sai. O problema aparece depois, e não aparece como erro.

Por que o laço não escala

Suponha trinta seguntos de espera média e um pedido. São trinta requisições, vinte e nove delas devolvendo "ainda nada".

Agora suponha trezentos pedidos ao mesmo tempo. São nove mil requisições em trinta segundos, quase todas inúteis. Você construiu um gerador de tráfego que só serve para perguntar.

Três consequências, na ordem em que costumam doer:

Limite de taxa. A API começa a recusar. E ela recusa tudo, inclusive a criação de pedidos novos — a espera de um cliente derruba a compra de outro.

Latência que piora sozinha. Com o intervalo de um segundo, o código pode ficar até um segundo parado depois de já ter chegado. Para reduzir isso você diminui o intervalo, o que multiplica as requisições, o que aproxima o limite.

Processo preso. Cada laço segura um processo ou uma conexão. Trezentos laços simultâneos consomem recursos que não estão fazendo trabalho nenhum.

Webhook inverte a pergunta

Em vez de você perguntar, o servidor avisa. Você registra uma URL, e quando o SMS chega, a plataforma faz um POST para ela.

Zero requisição desperdiçada. A latência é a da entrega, não a do seu intervalo. E nada fica preso esperando.

O custo é que você precisa de um endereço público que receba POST — o que é trivial em servidor e chato em máquina de desenvolvimento. Para desenvolver, um túnel local resolve.

Três coisas que quebram webhook, e como evitar

Responder devagar. Se o seu endpoint processa antes de responder, ele demora, e a plataforma trata como falha e reenvia. Responda 200 primeiro, processe depois, em fila.

Não tolerar repetição. Entrega é ao menos uma vez, não exatamente uma vez. O mesmo aviso pode chegar duas vezes por retentativa ou por rede instável. Se o seu código libera um cadastro a cada aviso, ele vai liberar dois. Guarde o identificador do evento e ignore o que já processou.

Confiar no corpo sem verificar. A URL é pública: qualquer um pode fazer POST nela. Valide a assinatura antes de agir. Um endpoint que aceita qualquer corpo é um endpoint que qualquer um usa para dizer que o SMS chegou.

Onde SSE entra

SSE é uma conexão aberta que recebe o evento assim que ele existe. Também não desperdiça requisição, mas segura uma conexão.

Ele é para quando existe uma pessoa esperando na tela. O usuário comprou um número, está olhando, quer ver o código aparecer. SSE entrega isso sem recarregar a página e sem intervalo.

O que não fazer: usar SSE em processo de servidor. Um cliente que abre trezentas conexões e as mantém pendentes tem o mesmo problema de recurso do laço, com mais complexidade.

A regra

SituaçãoUse
Pessoa esperando na telaSSE
Processo automático, servidorWebhook
Rascunho, teste manual, uma vezConsulta direta

Se você está em dúvida entre SSE e webhook, pergunte se alguém vai perceber a diferença de dois segundos. Se ninguém está olhando, é webhook.

Como fica na prática

Registre a URL em Webhooks, no painel. Ao criar o pedido, guarde o identificador. Quando o aviso chegar, confira a assinatura, responda 200 na hora, e trate o código na sua fila.

Para o passo a passo com os campos do evento, veja a documentação de webhooks. Para entender o produto por trás, a página de números virtuais.