webhook, sqs, rabbitmq, eventbridge) enviam cada evento que deu match a um destino de sua propriedade. Um sink pull mantém os eventos em um cursor do lado do servidor que o seu consumidor lê no seu próprio ritmo. Esta página cobre o que o seu consumidor precisa fazer em cada caso.
Verificando uma assinatura de webhook
Toda entrega de webhook é assinada com um HMAC sobre o timestamp da requisição e o corpo exato da requisição, para que você possa provar que a requisição veio do Streaming Hub e não foi adulterada nem sofreu replay. Dois cabeçalhos carregam a assinatura:
A assinatura é computada como:
- Leia o corpo bruto e o timestamp — verifique antes de fazer o parse do corpo, sobre os bytes exatos recebidos. Qualquer re-serialização muda os bytes e quebra a assinatura.
- Cheque a atualidade — rejeite a requisição se o
X-Webhook-Timestampestiver a mais de 5 minutos do momento atual. Esta é a janela de proteção contra replay. - Recompute a assinatura — construa o
signature_inputcomo acima com o seu segredo de assinatura e codifique em hex o HMAC-SHA256. - Compare em tempo constante — compare o seu
v1,sha256=<hex>contra oX-Webhook-Signaturerecebido com uma comparação em tempo constante (timing-safe). Rejeite em caso de divergência. - Responda — retorne
2xxsomente depois que a assinatura e a atualidade passarem.
Lidando com duas assinaturas durante a rotação
Quando você rotaciona um segredo de assinatura, o hub executa uma sobreposição de assinatura dupla de 24 horas. Durante a sobreposição, cada entrega carrega dois cabeçalhos
X-Webhook-Signature — um assinado com o novo segredo e um com o segredo anterior — enviados como cabeçalhos repetidos, para que você possa migrar para o novo segredo sem perder nenhuma entrega.
Verifique contra os dois: recompute a assinatura esperada com cada segredo que você tem no momento, e aceite a requisição se qualquer uma das assinaturas recebidas der match. Uma vez que você tenha feito o deploy e confirmado o novo segredo, aposente o antigo.
Cabeçalhos de correlação
Toda entrega de webhook também carrega um conjunto de cabeçalhos de contexto
X-Lerian-*:
Deduplicando entregas
A entrega é at-least-once: o hub pode entregar o mesmo evento mais de uma vez, através de retentativas ou de uma re-entrega após o reinício de um worker. Deduplique por
X-Lerian-Event-Id — ele é estável entre toda re-entrega do mesmo evento, enquanto o X-Lerian-Delivery-Id difere por tentativa. Trate um X-Lerian-Event-Id que você já processou como uma duplicata: confirme-o com um 2xx e não o reprocesse. Mantenha o seu handler idempotente.
Respondendo rapidamente
Retorne um
2xx assim que você tiver verificado e aceito o evento de forma durável — então faça o trabalho de verdade de forma assíncrona. Uma resposta lenta ou que falha é tratada como uma entrega falha, o que dispara a curva de retentativa e, se o destino permanecer quebrado por tempo suficiente, eventualmente desativa automaticamente a assinatura. Confirme rápido, processe fora de banda.
Consumindo eventos por pull
Uma assinatura
pull não recebe push. Em vez disso, o seu consumidor lê uma página dos seus eventos com:
seq, o seu ceId (para dedup), o seu tipo e o seu payload. A resposta inclui um next_cursor.
A leitura é a confirmação (cursor-as-ack). Buscar uma página avança o cursor durável da assinatura até o maior seq retornado. Não há uma chamada de ack separada — ler uma página a confirma. Isso é monotônico, então nunca anda para trás.
Para paginar normalmente, retome a partir do next_cursor do servidor e pare quando uma página curta (com menos itens do que o seu limit) retornar null. Dois comportamentos a ter em mente:
- Um seek
?after=para frente abre mão da lacuna. Passar?after=Nmaior do que o seu cursor atual avança o cursor para além de tudo atéN— os eventos pulados nunca são re-entregues. Pedir eventos apósNdeclara tudo atéNcomo consumido. Isso só pode acontecer com um seek para frente feito à mão, nunca através da paginação normal pornext_cursor. - Um seek
?after=para trás nunca rebobina. Um?after=obsoleto ou menor que lê uma página mais antiga não move o cursor para trás, porque o cursor só avança.
429 rate_limited — faça back-off e tente de novo. Deduplique os eventos consumidos por pull pelo ceId, exatamente como um consumidor de webhook deduplica pelo X-Lerian-Event-Id.
Próximos passos
Gerenciando assinaturas
Crie assinaturas, rotacione segredos e recupere destinos desativados.
Operando o Streaming Hub
Faça o deploy, configure e observe o hub.

