Push vs poll: por que webhooks
Sem webhooks, para saber se um usuário recebeu um badge você teria que consultar a API repetidamente e comparar o resultado, um padrão chamado polling. Isso desperdiça requests, atrasa a reação e não escala. Com webhooks, a Cativa empurra o evento para você no instante em que ele acontece. Você reage na hora e só quando há de fato algo novo.Como funciona
Quando algo relevante acontece num tenant (usuário recebe badge, post é criado, pagamento é confirmado), a Cativa monta o payload do evento e fazPOST no seu endpoint público com Content-Type: application/json.
1
Uma ação acontece no tenant
Um usuário se cadastra, ganha um badge, publica um post ou conclui um pagamento.
2
A Cativa monta o payload
A plataforma enriquece o evento com os dados que você precisa para processá-lo isoladamente (usuário, badge, pagamento, etc.).
3
A Cativa assina e faz POST no seu endpoint
O disparo vai com os headers
X-Cativa-Signature, X-Cativa-Execution-Id e X-Cativa-Automation-Id.4
Seu endpoint verifica, enfileira e responde 200
Você confere a assinatura HMAC, deduplica pelo
X-Cativa-Execution-Id, enfileira o processamento e devolve 2xx rápido.secret próprio (formato whsec_ mais 64 caracteres hex), usado para assinar todo disparo daquele listener.
Headers de cada disparo
Garantias de entrega
At-least-once
Cada evento é entregue pelo menos uma vez. Sempre use o
X-Cativa-Execution-Id para idempotência no seu lado, evitando processar duas vezes em caso de duplicata.Ordem NÃO garantida
Eventos podem chegar fora da ordem em que aconteceram. Não escreva código que depende de receber
user_created antes de user_received_badge, eles podem inverter.Por que sem ordem
A Cativa entrega eventos em paralelo para chegar rápido ao seu endpoint. Forçar ordem reduziria o throughput em ordem de magnitude. Em vez disso, o payload de cada evento contém todos os dados que você precisa para processá-lo isoladamente.Assinatura HMAC (X-Cativa-Signature)
Todo disparo é assinado com HMAC-SHA256 usando osecret do listener. Você confere a assinatura antes de processar o evento, garantindo que o request veio mesmo da Cativa e que o body não foi adulterado em trânsito.
A assinatura chega no header:
té o timestamp Unix (em segundos) do momento do disparo.v1é a assinatura HMAC-SHA256 (hex) sobre a string"<t>.<rawBody>", usando osecretdo listener como chave.
Reentrega com backoff
Se seu endpoint não responder com2xx, a Cativa re-tenta de acordo com a curva:
Retry-After que você retornar (até o limite máximo da próxima janela do backoff).
Quando re-tenta vs falha permanente
Se todas as tentativas falharem, o disparo é registrado internamente como falho. A v1 ainda não tem painel no Console para inspecionar entregas falhas. Entre em contato com o suporte da Cativa para investigar.
Formato do payload
Exemplo (payload deuser_received_badge):
Catálogo de eventos
A Cativa expõe eventos para as ações principais da plataforma. Comece pelo evento canônico:user_received_badge
Disparado quando um badge é atribuído a um usuário. Página de referência completa com payload e receiver de exemplo.
user_created
Novo usuário cadastrado.
user_joined_group
Usuário entrou num grupo (manual ou via badge).
post_created
Novo post publicado num grupo.
paywall_payment_completed
Pagamento do paywall concluído com sucesso.
comment_created, course_completed, lesson_completed e user_received_private_message, com página de referência em breve) está em Cadastrando e verificando webhooks.
Antipattern: processar eventos de forma síncrona no endpoint
Idempotência no seu lado
Como a entrega é at-least-once, você precisa detectar duplicatas. Use o headerX-Cativa-Execution-Id (sempre enviado e estável entre retries do mesmo evento) como chave de deduplicação:
Próximos passos
Cadastrando e verificando webhooks
Como cadastrar listener, verificar HMAC e lidar com retries, com exemplos em Node, Python, Go e C#.
user_received_badge
Página de referência completa de um evento, com exemplo concreto de payload e receiver.
Erros e limites de taxa
A mesma curva de backoff, aplicada quando você chama a API e recebe
429 ou 5xx.Links de pagamento e assinaturas
De onde vem o evento
paywall_payment_completed e o que ele libera.