webhook, porque es el camino más corto: cuatro llamadas al hub y una solicitud HTTP que llega a tu endpoint.
Cada llamada /v1 envía Authorization: Bearer <token> y application/json. El hub lee tu tenant del token. Nunca lee un tenant de un cuerpo, una ruta o una query.
Antes de empezar
Necesitas cuatro cosas.
- Un hub en ejecución y un token. El plano de control
/v1autentica cada ruta con un JWT de plugin-auth. La lectura del catálogo de abajo también pidecatalogget. Consulta Operación de Streaming Hub para el despliegue. STREAMING_HUB_MANIFEST_SOURCESdefinido en el hub, si quieres que la lectura del catálogo liste tus productores. Viene vacío por defecto, y una lista vacía deja el catálogo solo con las entradashub.*del propio hub. Consulta Operación de Streaming Hub.- Un endpoint
https://público que controles. El hub valida el destino antes de escribir cualquier fila y rechaza direcciones privadas, de loopback y de metadatos de nube. Un endpointlocalhostno se puede almacenar. - Un productor en el mismo stream, con la publicación encendida. La publicación viene apagada por defecto del lado del productor. En Midaz, define
STREAMING_ENABLED=true, apuntaSTREAMING_BROKERSa los mismos brokers queSTREAMING_HUB_KAFKA_BROKERS, y defineSTREAMING_CLOUDEVENTS_SOURCE. Consulta Streaming y outbox. Elce-tenantidque emite el productor también debe ser igual alSTREAMING_HUB_TENANT_IDdel hub. Una discrepancia descarta cada evento sin error. Operación de Streaming Hub enuncia esa regla.
Las cinco llamadas
1. Obtén la clave de coincidencia
GET /v1/catalog
El catálogo lista lo que declaran los manifiestos de productor en STREAMING_HUB_MANIFEST_SOURCES. Cada entrada da un eventType y un topic.
El catálogo no lleva la clave de coincidencia. eventType es solo el segmento de evento. El topic pliega el nombre del servicio del productor en su segmento de recurso. Así que lerian.streaming.ledger_organization.created tiene eventType created, y la clave que necesitas es organization.created. Toma la clave de las páginas por producto en Streaming de eventos. El propio /streaming/manifest del productor también reporta resourceType junto a eventType.
El hub acepta cualquier clave bien formada en event_types. Una clave que ningún productor emite no coincide con nada, y la suscripción no recibe ningún evento.
2. Crea la suscripción
POST /v1/subscriptions
Envía el header X-Idempotency con un valor único. El hub rechaza un create que lo omite, antes de cualquier escritura.
event_types contiene claves de coincidencia, no tipos CloudEvents completos. Una clave de coincidencia es la cola <recurso>.<evento> — organization.created, y nunca el tipo completo studio.lerian.organization.created. Envía la clave que armaste en el paso 1. Omite event_types para recibir cada evento que el hub ve.
Las páginas por producto bajo Streaming de eventos describen cada tipo en detalle — empieza por el catálogo de eventos de Midaz.
plan_tier toma standard por defecto. schema_major es opcional: déjalo fuera para seguir la versión base.
La respuesta 201 trae el id de la suscripción y el signingSecret en texto plano. Guarda el secreto ahora. Ninguna ruta de lectura lo devuelve, y si lo pierdes tu única salida es la rotación.
3. Activa el destino
POST /v1/subscriptions/{id}/ping
Una suscripción de webhook nueva nace en pending_verification. El hub solo le entrega después de que un sondeo pruebe que el destino responde, así que esta llamada es obligatoria. Envía una solicitud sintética y firmada por el camino de entrega de producción, y luego informa el resultado:
outcome: "ok" mueve la suscripción a active, que es el estado que la hace entregable. Tu endpoint debe responder con un 2xx para que eso ocurra, así que despliégalo antes del ping.
Un sondeo que corrió y falló sigue siendo un 200: lee outcome, no el estado HTTP. outcome: "failed" deja la suscripción sin verificar y nombra la causa en errorClass. Corrige el endpoint y repite el ping. La llamada es segura de repetir y no necesita clave de idempotencia.
La entrega requiere enabled y verification_state = active. Gestión de suscripciones explica por qué los dos campos se mantienen separados.
4. Dispara un evento
Haz algo en un producto Lerian que emita el tipo al que te suscribiste. En Midaz, crear una organización emite el evento de arriba.
POST /v1/organizations
5. Confirma la entrega
Tu endpoint recibe un
POST que trae el payload del evento, una firma HMAC y los headers de contexto del hub, entre ellos X-Lerian-Event-Id, X-Lerian-Event-Type y X-Lerian-Delivery-Id. Verifica la firma antes de confiar en el cuerpo: una solicitud sin verificar no prueba nada. Consumo de eventos tiene los pasos de verificación, la lista completa de headers y la regla de deduplicación.
Después pregúntale al hub qué registró.
GET /v1/subscriptions/{id}/health
Un éxito en
delivery_outcomes y un last_success_at reciente significan que el camino funciona de punta a punta. Si no llegó nada, status y delivery_outcomes te dicen si el hub intentó y falló, o si nunca hizo match con el evento.
¿Prefieres hacer pull?
Una suscripción
pull no necesita endpoint ni sondeo. Créala con sink_kind: "pull" y sin endpoint: el hub sintetiza uno, y la suscripción nace active. Lee páginas de eventos con GET /v1/events?subscription_id=<id>. La lectura es el acuse, así que lee las reglas del cursor en Consumo de eventos antes de tu primera llamada.
Próximos pasos
Gestión de suscripciones
Sinks de cola, grants delegados de AWS, rotación de secretos y recuperación.
Consumo de eventos
Verifica firmas, deduplica entregas y haz pull con un cursor.
Cómo funciona Streaming Hub
Matching, despacho, la curva de reintentos y el auto-disable.
Operación de Streaming Hub
Despliega el hub, configúralo y obsérvalo funcionar.

