Comportamento de entrega
Leia primeiro a coluna de prazo de resposta. O remetente com o prazo mais curto entre os que enviam para você é sua restrição real, não o mais conhecido.
| Provedor | Prazo de resposta | Novas tentativas | Desiste / desativa |
|---|---|---|---|
| Slackfonte | 3 s | 3 novas tentativas: imediatamente, após 1 min, após 5 min | Inscrições de eventos desativadas se mais de 95% das tentativas falharem num intervalo de 60 min |
| LINEfonte | 2 s Conta como request_timeout quando o servidor do bot não responde em até 2 segundos | Reenvio de webhooks, desativado por padrão (ative nas configurações da Messaging API do canal); quantidade e intervalo não divulgados | Pode suspender o envio de webhooks se o servidor do bot continuar falhando em recebê-los; limite não publicado |
| Xerofonte | 5 s 200 em até 5 segundos, sem corpo e sem cookies; 401 quando a assinatura é inválida | não verificado | não verificado |
| Discordfonte | 3 s Endpoints de interação precisam enviar uma resposta inicial em até 3 segundos | não verificado | não verificado |
| Shopifyfonte | 5 s 1 segundo para conectar, 5 segundos para a requisição inteira | 8 novas tentativas ao longo de 4 horas | Inscrições criadas pela Admin API são excluídas após 8 falhas consecutivas, com um e-mail de aviso para o contato de emergência do desenvolvedor do app |
| Paddlefonte | 5 s | Produção: até 60 tentativas ao longo de cerca de 2 dias, cerca de 10 na primeira hora e cerca de 45 no primeiro dia. Sandbox: 3 tentativas em cerca de 2 min | não verificado |
| HubSpotfonte | 5 s Vale para o lote inteiro, que pode trazer até 100 notificações | Até 10 tentativas distribuídas ao longo de 24 horas | não verificado |
| GitHubfonte | 10 s | Nenhuma. O GitHub não reenvia automaticamente as entregas com falha | Sem desativação. As entregas podem ser reenviadas manualmente por 3 dias; depois disso, o registro desaparece |
| Meta (Instagram, Facebook, Threads)fonte | não publicado | Tenta de novo com frequência decrescente ao longo de 36 horas e depois descarta o evento. A WhatsApp Cloud API tenta de novo por até 7 dias | não verificado |
| Twiliofonte | 15 s Configurável. rt (timeout de leitura) padrão 15000 ms (máx. 15000), ct (conexão) padrão 5000 ms (máx. 10000), tt (total) padrão 15000 ms | Configurável: rc de 0 a 5, padrão 1. rp define quais falhas geram nova tentativa | não verificado |
| Stripefonte | não publicado A Stripe não publica um número. A documentação dela diz apenas para responder 2xx antes de qualquer lógica lenta. A comunidade trabalha com 20 s | Backoff exponencial por até 3 dias no modo de produção. Sandbox: 3 tentativas ao longo de algumas horas | Endpoint desativado após falhas contínuas, com aviso prévio por e-mail. Os eventos ficam na Events API por 30 dias |
| Svix (Clerk, Resend)fonte | não publicado | 8 tentativas: imediatamente, 5 s, 5 min, 30 min, 2 h, 5 h, 10 h, 10 h. Depois, um webhook operacional message.attempt.exhausted | Endpoint desativado quando todas as tentativas falham por 5 dias |
| WooCommercefonte | não publicado A entrega entra na fila do Action Scheduler e é disparada pelo WP-Cron, então sai quando a próxima página é carregada, não quando o evento acontece | não verificado | Webhook desativado após mais de cinco falhas de entrega consecutivas |
Duas linhas merecem uma segunda leitura. O GitHub não faz nenhuma nova tentativa, então uma entrega com falha se perde, a menos que alguém a reenvie em até três dias. A Paddle coloca cerca de 10 das suas 60 tentativas na primeira hora e cerca de 45 no primeiro dia, o que pune um handler apenas lento muito mais do que a curva da Stripe.
Esquemas de assinatura
A coluna de payload assinado é a que mais faz as pessoas perderem horas. Qualquer valor diferente de raw body significa que você não pode calcular o hash só do corpo da requisição.
| Provedor | Algoritmo | Payload assinado | Codificação | Cabeçalho | Tolerância |
|---|---|---|---|---|---|
| Slack | HMAC-SHA256 | v0:{timestamp}:{body} | hex | x-slack-signature = v0=hex | 5 min |
| LINE | HMAC-SHA256 | raw body | base64 | x-line-signature = base64 | nenhuma |
| Xero | HMAC-SHA256 | raw body | base64 | x-xero-signature = base64 | nenhuma |
| Discord | Ed25519 | {timestamp}{body} | hex | x-signature-ed25519 + x-signature-timestamp | nenhuma |
| Shopify | HMAC-SHA256 | raw body | base64 | x-shopify-hmac-sha256 | nenhuma |
| Paddle | HMAC-SHA256 | {timestamp}:{body} | hex | paddle-signature = ts=X;h1=hex | 5 s |
| HubSpot | HMAC-SHA256 | POST{decodedUrl}{body}{timestamp} | base64 | x-hubspot-signature-v3 | 5 min |
| GitHub | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | nenhuma |
| Meta (Instagram, Facebook, Threads) | HMAC-SHA256 | raw body | hex | x-hub-signature-256 = sha256=hex | nenhuma |
| Twilio | HMAC-SHA1 | full URL + form params sorted by key | base64 | x-twilio-signature | nenhuma |
| Stripe | HMAC-SHA256 | {timestamp}.{body} | hex | stripe-signature = t=X,v1=hex | 5 min |
| Svix (Clerk, Resend) | HMAC-SHA256 | {id}.{timestamp}.{body} | base64 | svix-signature = v1,base64 | 5 min |
| WooCommerce | HMAC-SHA256 | raw body | base64 | x-wc-webhook-signature | nenhuma |
| Lemon Squeezy | HMAC-SHA256 | raw body | hex | x-signature + x-event-name | nenhuma |
| PayPal | RSA-SHA256 | {txId}|{txTime}|{webhookId}|{crc32(body)} | base64 | paypal-transmission-sig + 4 more | nenhuma |
| SendGrid | ECDSA P-256 | {timestamp}{body} | base64 | x-twilio-email-event-webhook-signature | nenhuma |
| Linear | HMAC-SHA256 | raw body | hex | linear-signature | nenhuma |
| Sentry | HMAC-SHA256 | raw body, no timestamp | hex | sentry-hook-signature | nenhuma |
| Intercom | HMAC-SHA1 | raw body | hex | x-hub-signature = sha1=hex | nenhuma |
| Vercel | HMAC-SHA1 | raw body | hex | x-vercel-signature | nenhuma |
Use estes dados
A mesma tabela está disponível em JSON em /providers.json, sob a licença CC BY 4.0. Copie, incorpore, corrija. Se algum número aqui estiver errado ou um provedor tiver mudado algo, abra uma issue no repositório e corrigimos aqui.
Atribuição: AnyHook, Referência do comportamento de provedores de webhook, https://anyhook.net/pt/providers
Onde cada número apareceu
- O GitHub não tenta de novo, e o registro expira em três dias
- Os três segundos do Slack e o limite de desativação de 95%
- As 60 tentativas da Paddle contra a curva da Stripe
- Os timeouts configuráveis da Twilio e por que a nova tentativa padrão nunca acontece
- O eventId da HubSpot é documentado como sem garantia de ser único
- Verificação de assinaturas, provedor por provedor