Skip to main content
Matcher emits domain events as CloudEvents 1.0 messages in binary content mode over Kafka, published through lib-streaming. Every event travels in the shared envelope: ce-type names the event as studio.lerian.<resource>.<event>, ce-subject carries the aggregate id, ce-tenantid the owning tenant, and ce-schemaversion the payload version — 1.0.0 for every event below. ce-source comes from STREAMING_CLOUDEVENTS_SOURCE and is required when streaming is enabled; deployments conventionally set matcher, so topics land on matcher.<resource>.<event> (see Topic naming). Money amounts — fee values, adjustment amounts — cross the wire as decimal strings, never floats. Matcher serves its full event catalog at GET /system/matcher/streaming/manifest. This page covers the Kafka streaming plane. Matcher’s exception webhook dispatch — HTTP callbacks for exception routing — is a separate surface, documented in Webhooks and callbacks.

Delivery policies

Matcher’s catalog uses two delivery policies:
  • Outbox-backed events are written to the outbox in the same database transaction as the state change; a relay publishes committed rows and retries through broker outages. These are the audit-grade facts (matching outcomes, exception resolutions, disputes, governance). This policy cannot be weakened per deployment.
  • Direct events publish after the transaction commits, best-effort, falling back to the outbox only when the broker circuit is open. These are configuration and operational lifecycle signals.
Each table below states the policy for its events.

Matching events

Outbox-backed: transaction.matched, transaction.pending_review. Direct: the rest.

Exception and dispute events

Outbox-backed except exception.assigned and the comment events, which are direct.

Configuration and data-intake events

All direct.

Governance and reporting events

Outbox-backed except the export-job family, which is direct.

Declared but not yet emitted

The catalog and manifest declare seven additional events that no code path emits today: reconciliation_context.deleted and the extraction_request lifecycle family (submitted, completed, failed, cancelled, bridged, bridge_failed). They are contract reservations — do not build consumers that depend on receiving them.

Events consumed

Matcher consumes no Kafka streaming events. Its integration inputs arrive over HTTP: file uploads, Fetcher extractions, and — when enabled — Streaming Hub webhook deliveries on POST /v1/discovery/hub/events (HMAC-signed, deduplicated by event id, disabled by default).