Integrações

Envie respostas de formulário via webhooks

Webhooks são a forma geral do YeetForm de enviar dados de resposta para qualquer lugar: seu próprio backend, um job de sincronização com banco de dados, ou outra plataforma de integração. Adicione um endpoint HTTPS na aba Integrações de um formulário e o YeetForm envia um payload JSON assinado via POST a cada nova resposta, com um segredo que você pode verificar usando HMAC-SHA256. Envios que falham são tentados novamente automaticamente. Esta página cobre o formato exato da assinatura, a estrutura do payload e o cronograma de retentativas, para que você possa construir um receptor com confiança.

Configuração

1.

Adicione um endpoint

Na aba Integrações do formulário, cole a URL do seu endpoint HTTPS em Webhooks e clique em Add webhook. O YeetForm gera um segredo de assinatura (whsec_...) para esse endpoint.

2.

Verifique a assinatura

Cada envio traz um header X-YeetForm-Signature: t=<unix ts>,v1=<hex hmac-sha256 de `${t}.${body}`>. Verifique-o contra o corpo bruto da requisição antes de confiar no payload.

import { createHmac, timingSafeEqual } from "crypto";

function verify(secret, signatureHeader, rawBody) {
  const [tPart, v1Part] = signatureHeader.split(",");
  const timestamp = tPart.split("=")[1];
  const signature = v1Part.split("=")[1];

  const expected = createHmac("sha256", secret)
    .update(`${timestamp}.${rawBody}`)
    .digest("hex");

  const a = Buffer.from(signature, "hex");
  const b = Buffer.from(expected, "hex");
  if (a.length !== b.length) return false;
  return timingSafeEqual(a, b);
}
3.

Leia o payload

Os POSTs disparam em response.created (e webhook.test para o botão de teste manual), com o id do formulário, id da resposta, contagem de respostas e respostas indexadas pelo id do campo, além de um array fields com o rótulo de cada campo.

{
  "event": "response.created",
  "form_id": "<uuid>",
  "form_title": "Customer Feedback",
  "response_id": "<uuid>",
  "response_count": 42,
  "answers": { "fld_x": "..." },
  "fields": [{ "id": "fld_x", "label": "Your name", "type": "text" }],
  "submitted_at": "2026-09-13T12:00:00.000Z"
}
4.

Trate as retentativas

Uma resposta que não seja 2xx (ou um timeout) dispara uma nova tentativa: imediatamente, depois após 30 segundos, depois após 5 minutos - 3 tentativas no total antes de o YeetForm marcar o envio como falho. Redirecionamentos não são seguidos, então aponte a URL direto para o seu endpoint.

Dicas

  • →Os rótulos dos campos estão incluídos no array fields do payload (id, label, type), então você não precisa fixar ids de campo no seu sistema.
  • →Cada resposta traz um response_id estável, use-o como sua chave de idempotência, já que um envio reenviado reutiliza o mesmo id.
  • →Um envio que falha é tentado novamente até 3 vezes no total (imediatamente, 30s, 5 min) antes de ser marcado como falho - é preciso uma resposta 2xx para contar como sucesso, e redirecionamentos não são seguidos.

Monte seu formulário com IA em segundos

Comece grátis

Perguntas frequentes

O que dispara um webhook?+
response.created dispara a cada nova resposta; webhook.test dispara quando você clica no botão de teste da integração, para você verificar seu endpoint antes de colocar em produção.
Como sei que uma requisição realmente veio do YeetForm?+
Verifique o header X-YeetForm-Signature contra o segredo do seu endpoint usando HMAC-SHA256 sobre `${timestamp}.${rawBody}` - veja o trecho de verificação acima.
O que acontece se meu endpoint estiver fora do ar?+
O YeetForm tenta novamente até 3 vezes no total: imediatamente, após 30 segundos, depois após 5 minutos. Se as três falharem, o envio é marcado como falho e não é mais tentado.
Posso adicionar headers personalizados?+
Sim, ao configurar o webhook você pode definir headers personalizados - eles são mesclados, mas os headers próprios do YeetForm, Content-Type e X-YeetForm-*, sempre prevalecem em caso de conflito.