Escolha um idioma

Webhooks

Receba eventos de ativação no seu servidor em tempo real, verifique o cabeçalho SmsGrab-Signature e entenda novas tentativas, entregas de teste e desativação automática.

Nesta página
  1. Eventos
  2. Criar um webhook
  3. Como é uma entrega
  4. Verifique a assinatura
  5. Responda rápido
  6. Novas tentativas
  7. Desativação automática
  8. Testar e reenviar

Os webhooks enviam eventos para o seu servidor no momento em que acontecem, então você não precisa ficar consultando. Um webhook pertence a uma chave de API. Ele recebe os eventos dos números comprados com essa chave, além dos alertas de saldo baixo da sua conta.

Eventos

Evento Quando
activation.created Um número foi comprado
activation.code_received Cada novo SMS, com todas as mensagens até agora
activation.completed Finalizado por você, ou quando o tempo acabou depois de um código
activation.cancelled Cancelado antes de um código, reembolsado
activation.expired Nenhum código a tempo, reembolsado
activation.refunded Qualquer reembolso da cobrança
balance.low Seu saldo ficou abaixo do limite que você definiu
webhook.test Uma entrega de teste que você iniciou

Criar um webhook

Em Conta > Desenvolvedores, abra uma chave e adicione um webhook com a URL, os eventos desejados e uma descrição opcional. Cada chave pode ter até 3 webhooks.

A URL precisa:

  • começar com https://;
  • usar um nome de host, não um endereço IP;
  • levar a um endereço público. Redes privadas, localhost e faixas parecidas são recusadas.

Você recebe um segredo de assinatura que começa com whsec_. Assim como uma chave de API, ele é mostrado só uma vez. Você pode trocá-lo depois, o que também pede sua senha.

Como é uma entrega

HTTP
POST /your/endpoint HTTP/1.1
Content-Type: application/json
User-Agent: SmsGrab-Webhooks/1.0
SmsGrab-Event: activation.code_received
SmsGrab-Delivery: 9f7d6c1e-2b44-4c1a-8f0e-6a3d2c1b0e9f
SmsGrab-Signature: t=1790503200,v1=3b9a0c…

{ "id": "evt_4e1f…", "type": "activation.code_received", "created_at": "2026-09-27T10:06:12.004Z",
  "api_version": "2026-09-27", "data": { "activation": { "id": "5c1d0c2e-…", "status": "CODE_RECEIVED" } } }

Verifique a assinatura

SmsGrab-Signature contém um carimbo de tempo t e v1, o HMAC-SHA256 de t, um ponto e o corpo bruto da requisição, usando seu segredo como chave. Rejeite entregas cujo carimbo de tempo esteja a mais de 300 segundos do seu relógio e compare as assinaturas em tempo constante.

PHP
[$t, $v1] = (function (string $h): array {
    parse_str(str_replace(',', '&', $h), $p);
    return [(int) ($p['t'] ?? 0), (string) ($p['v1'] ?? '')];
})($_SERVER['HTTP_SMSGRAB_SIGNATURE'] ?? '');
$body = file_get_contents('php://input');
$expected = hash_hmac('sha256', $t.'.'.$body, getenv('SMSGRAB_WEBHOOK_SECRET'));
$ok = abs(time() - $t) <= 300 && hash_equals($expected, $v1);
Python
import hmac, hashlib, time

def verify(header: str, body: bytes, secret: str) -> bool:
    parts = dict(p.split("=", 1) for p in header.split(","))
    t = int(parts.get("t", "0"))
    expected = hmac.new(secret.encode(), f"{t}.".encode() + body, hashlib.sha256).hexdigest()
    return abs(time.time() - t) <= 300 and hmac.compare_digest(expected, parts.get("v1", ""))
JavaScript
import crypto from 'node:crypto';

export function verify(header, rawBody, secret) {
  const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
  const t = Number(parts.t ?? 0);
  const expected = crypto.createHmac('sha256', secret).update(`${t}.`).update(rawBody).digest('hex');
  const given = Buffer.from(parts.v1 ?? '', 'utf8');
  return Math.abs(Date.now() / 1000 - t) <= 300 && given.length === expected.length
    && crypto.timingSafeEqual(Buffer.from(expected, 'utf8'), given);
}

Sempre verifique o corpo bruto exatamente como você o recebeu, antes de interpretar o JSON.

Responda rápido

Responda com qualquer status 2xx em até 10 segundos e faça o trabalho demorado depois, por exemplo em uma fila. Redirecionamentos não são seguidos.

Novas tentativas

Uma entrega que falhou é tentada de novo depois de 1 minuto, 5 minutos, 15 minutos, 1 hora, 3 horas, 6 horas, 12 horas e 24 horas. Uma nova tentativa repete o mesmo id do evento, então guarde os ids já processados e ignore duplicados. Os eventos de uma ativação chegam em ordem.

Desativação automática

  • Responder 410 Gone desativa o webhook na hora.
  • Depois de 50 tentativas seguidas que falharam ao longo de pelo menos 24 horas, o webhook é desativado e você recebe uma notificação. Corrija seu endpoint e depois ative o webhook de novo.
  • Revogar uma chave desativa os webhooks dela.

Testar e reenviar

Envie um evento webhook.test pela página do webhook para ver na hora o código de status, o tempo de resposta e qualquer erro. A lista de entregas guarda cada entrega por 30 dias, e você pode reenviar qualquer uma delas.

Este artigo foi útil?

Ainda precisa de ajuda?

Escreva para nós. Respondemos a todas as mensagens, geralmente em poucas horas.

Ou envie um e-mail para support@smsgrab.com