webhook, porque é o caminho mais curto: quatro chamadas ao hub e uma solicitação HTTP chegando ao seu endpoint.
Cada chamada /v1 envia Authorization: Bearer <token> e application/json. O hub lê o seu tenant do token. Ele nunca lê um tenant de um corpo, de uma rota ou de uma query.
Antes de começar
Você precisa de quatro coisas.
- Um hub em execução e um token. O plano de controle
/v1autentica cada rota com um JWT do plugin-auth. A leitura do catálogo abaixo também pedecatalogget. Veja Operando o Streaming Hub para o deploy. STREAMING_HUB_MANIFEST_SOURCESdefinido no hub, se você quiser que a leitura do catálogo liste os seus produtores. Ele vem vazio por padrão, e uma lista vazia deixa o catálogo apenas com as entradashub.*do próprio hub. Veja Operando o Streaming Hub.- Um endpoint
https://público que você controla. O hub valida o destino antes de gravar qualquer linha e rejeita endereços privados, de loopback e de metadados de nuvem. Um endpointlocalhostnão pode ser armazenado. - Um produtor no mesmo stream, com a publicação ligada. A publicação vem desligada por padrão do lado do produtor. No Midaz, defina
STREAMING_ENABLED=true, aponteSTREAMING_BROKERSpara os mesmos brokers queSTREAMING_HUB_KAFKA_BROKERS, e definaSTREAMING_CLOUDEVENTS_SOURCE. Veja Streaming e outbox. Oce-tenantidque o produtor emite também precisa ser igual aoSTREAMING_HUB_TENANT_IDdo hub. Uma divergência descarta cada evento sem erro. Operando o Streaming Hub enuncia essa regra.
As cinco chamadas
1. Obtenha a chave de correspondência
GET /v1/catalog
O catálogo lista o que os manifestos de produtor em STREAMING_HUB_MANIFEST_SOURCES declaram. Cada entrada dá um eventType e um topic.
O catálogo não carrega a chave de correspondência. eventType é apenas o segmento de evento. O topic dobra o nome do serviço do produtor no segmento de recurso. Então lerian.streaming.ledger_organization.created tem eventType created, e a chave que você precisa é organization.created. Pegue a chave nas páginas por produto em Streaming de eventos. O próprio /streaming/manifest do produtor também reporta resourceType ao lado de eventType.
O hub aceita qualquer chave bem formada em event_types. Uma chave que nenhum produtor emite não casa com nada, e a assinatura não recebe evento nenhum.
2. Crie a assinatura
POST /v1/subscriptions
Envie o cabeçalho X-Idempotency com um valor único. O hub rejeita um create que o omite, antes de qualquer gravação.
event_types guarda chaves de match, não tipos CloudEvents completos. Uma chave de match é a cauda <recurso>.<evento> — organization.created, e nunca o tipo completo studio.lerian.organization.created. Envie a chave que você montou no passo 1. Omita event_types para receber todo evento que o hub vê.
As páginas por produto em Streaming de eventos descrevem cada tipo em detalhe — comece pelo catálogo de eventos do Midaz.
plan_tier assume standard por padrão. schema_major é opcional — deixe-o de fora para seguir a versão base.
A resposta 201 traz o id da assinatura e o signingSecret em texto puro. Salve o segredo agora. Nenhuma rota de leitura o devolve, e se você o perder a sua única saída é a rotação.
3. Ative o destino
POST /v1/subscriptions/{id}/ping
Uma assinatura de webhook nova nasce em pending_verification. O hub só entrega para ela depois que uma sondagem provar que o destino responde, então esta chamada é obrigatória. Ela envia uma solicitação sintética e assinada pelo caminho de entrega de produção e depois reporta o resultado:
outcome: "ok" move a assinatura para active, que é o estado que a torna entregável. O seu endpoint precisa responder com um 2xx para isso acontecer, então faça o deploy dele antes do ping.
Uma sondagem que rodou e falhou ainda é um 200 — leia outcome, não o status HTTP. outcome: "failed" deixa a assinatura sem verificação e nomeia a causa em errorClass. Corrija o endpoint e repita o ping. A chamada é segura para repetir e não precisa de chave de idempotência.
A entrega exige enabled e verification_state = active. Gerenciando assinaturas explica por que os dois campos ficam separados.
4. Dispare um evento
Faça algo em um produto Lerian que emita o tipo que você assinou. No Midaz, criar uma organização emite o evento acima.
POST /v1/organizations
5. Confirme a entrega
O seu endpoint recebe um
POST que traz o payload do evento, uma assinatura HMAC e os cabeçalhos de contexto do hub, entre eles X-Lerian-Event-Id, X-Lerian-Event-Type e X-Lerian-Delivery-Id. Verifique a assinatura antes de confiar no corpo: uma solicitação sem verificação não prova nada. Consumindo eventos tem os passos de verificação, a lista completa de cabeçalhos e a regra de deduplicação.
Depois pergunte ao hub o que ele registrou.
GET /v1/subscriptions/{id}/health
Um sucesso em
delivery_outcomes e um last_success_at recente significam que o caminho funciona de ponta a ponta. Se nada chegou, status e delivery_outcomes dizem se o hub tentou e falhou, ou se nunca deu match no evento.
Prefere usar pull?
Uma assinatura
pull não precisa de endpoint nem de sondagem. Crie-a com sink_kind: "pull" e sem endpoint — o hub sintetiza um, e a assinatura nasce active. Leia páginas de eventos com GET /v1/events?subscription_id=<id>. A leitura é o reconhecimento, então leia as regras do cursor em Consumindo eventos antes da sua primeira chamada.
Próximos passos
Gerenciando assinaturas
Sinks de fila, grants delegados da AWS, rotação de segredos e recuperação.
Consumindo eventos
Verifique assinaturas, deduplique entregas e use pull com cursor.
Como o Streaming Hub funciona
Match, despacho, a curva de retentativas e o auto-disable.
Operando o Streaming Hub
Faça o deploy do hub, configure-o e observe-o funcionando.

