Skip to main content
Midaz 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 (absent in single-tenant scope), and ce-schemaversion the payload version — 1.0.0 for every event below. ce-source is deployment-configured through the STREAMING_CLOUDEVENTS_SOURCE environment variable. The ledger defaults to lerian.midaz.ledger and the CRM capability to lerian.midaz.crm. Money amounts — balances, transaction and operation amounts — cross the wire as decimal strings, never floats.

Ledger events

Facts the ledger emits as organizations, accounts, balances, and transactions change.

Organization

Event (ce-type)TopicFires whenKey payload
studio.lerian.organization.createdlerian.streaming.organization.createdAn organization is created.id, legalName, doingBusinessAs, legalDocument, address, status, createdAt
studio.lerian.organization.updatedlerian.streaming.organization.updatedAn organization’s mutable fields change.id, parentOrganizationId, legalName, doingBusinessAs, address, status, updatedAt
studio.lerian.organization.deletedlerian.streaming.organization.deletedAn organization is deleted.id, deletedAt

Ledger

Event (ce-type)TopicFires whenKey payload
studio.lerian.ledger.createdlerian.streaming.ledger.createdA ledger is created within an organization.id, organizationId, name, status, createdAt
studio.lerian.ledger.updatedlerian.streaming.ledger.updatedA ledger’s name or status changes.id, organizationId, name, status, updatedAt
studio.lerian.ledger.deletedlerian.streaming.ledger.deletedA ledger is deleted.id, organizationId, deletedAt

Account

Event (ce-type)TopicFires whenKey payload
studio.lerian.account.createdlerian.streaming.account.createdAn account is opened in a ledger.id, organizationId, ledgerId, name, assetCode, type, alias, portfolioId, segmentId, status, createdAt
studio.lerian.account.updatedlerian.streaming.account.updatedAn account’s mutable fields change.id, organizationId, ledgerId, name, segmentId, entityId, status, blocked, updatedAt
studio.lerian.account.deletedlerian.streaming.account.deletedAn account is deleted.id, organizationId, ledgerId, portfolioId, deletedAt

Asset

Event (ce-type)TopicFires whenKey payload
studio.lerian.asset.createdlerian.streaming.asset.createdAn asset is registered in a ledger.id, organizationId, ledgerId, name, type, code, status, createdAt
studio.lerian.asset.updatedlerian.streaming.asset.updatedAn asset’s mutable fields change.id, organizationId, ledgerId, name, type, code, status, updatedAt
studio.lerian.asset.deletedlerian.streaming.asset.deletedAn asset is deleted.id, organizationId, ledgerId, deletedAt

Portfolio

Event (ce-type)TopicFires whenKey payload
studio.lerian.portfolio.createdlerian.streaming.portfolio.createdA portfolio is created.id, organizationId, ledgerId, name, entityId, status, createdAt
studio.lerian.portfolio.updatedlerian.streaming.portfolio.updatedA portfolio’s mutable fields change.id, organizationId, ledgerId, name, entityId, status, updatedAt
studio.lerian.portfolio.deletedlerian.streaming.portfolio.deletedA portfolio is deleted.id, organizationId, ledgerId, deletedAt

Segment

Event (ce-type)TopicFires whenKey payload
studio.lerian.segment.createdlerian.streaming.segment.createdA segment is created.id, organizationId, ledgerId, name, status, createdAt
studio.lerian.segment.updatedlerian.streaming.segment.updatedA segment’s mutable fields change.id, organizationId, ledgerId, name, status, updatedAt
studio.lerian.segment.deletedlerian.streaming.segment.deletedA segment is deleted.id, organizationId, ledgerId, deletedAt

Operation route

Event (ce-type)TopicFires whenKey payload
studio.lerian.operation-route.createdlerian.streaming.operation-route.createdAn operation route is created.id, organizationId, ledgerId, title, code, operationType, account, accountingEntries, createdAt
studio.lerian.operation-route.updatedlerian.streaming.operation-route.updatedAn operation route’s mutable fields change.id, organizationId, ledgerId, title, code, operationType, account, accountingEntries, updatedAt
studio.lerian.operation-route.deletedlerian.streaming.operation-route.deletedAn operation route is deleted.id, organizationId, ledgerId, deletedAt

Transaction route

Event (ce-type)TopicFires whenKey payload
studio.lerian.transaction-route.createdlerian.streaming.transaction-route.createdA transaction route is created.id, organizationId, ledgerId, title, operationRouteIds, createdAt
studio.lerian.transaction-route.updatedlerian.streaming.transaction-route.updatedA transaction route’s mutable fields change.id, organizationId, ledgerId, title, operationRouteIds, updatedAt
studio.lerian.transaction-route.deletedlerian.streaming.transaction-route.deletedA transaction route is deleted.id, organizationId, ledgerId, deletedAt

Balance

Event (ce-type)TopicFires whenKey payload
studio.lerian.balance.createdlerian.streaming.balance.createdA balance is created during account setup.id, organizationId, ledgerId, accountId, alias, key, assetCode, accountType, available, onHold, allowSending, allowReceiving, createdAt
studio.lerian.balance.changedlerian.streaming.balance.changedA committed transaction moves a balance — one event per balance-affecting operation; values reflect the state after the operation.organizationId, ledgerId, accountId, balanceId, assetCode, available, onHold, version, reason, direction, amount, transactionId, operationId, occurredAt
studio.lerian.balance.config-changedlerian.streaming.balance.config-changedA balance’s settings change, or overdraft is enabled (companion balance materialized). changeType discriminates settings_updated from overdraft_enabled.id, organizationId, ledgerId, accountId, allowSending, allowReceiving, direction, settings, changeType, updatedAt
studio.lerian.balance.deletedlerian.streaming.balance.deletedA balance is deleted.id, organizationId, ledgerId, accountId, deletedAt
studio.lerian.balance.overdraft-drawnlerian.streaming.balance.overdraft-drawnA debit consumes overdraft beyond available funds (action = drawn).balanceId, accountId, organizationId, ledgerId, assetCode, transactionId, operationId, action, amount, overdraftBalance, overdraftLimit, occurredAt
studio.lerian.balance.overdraft-repaidlerian.streaming.balance.overdraft-repaidOverdraft usage decreases but is not fully cleared (action = repaid).balanceId, accountId, organizationId, ledgerId, assetCode, transactionId, operationId, action, amount, overdraftBalance, overdraftLimit, occurredAt
studio.lerian.balance.overdraft-clearedlerian.streaming.balance.overdraft-clearedOverdraft is fully repaid — terminal signal (action = cleared).balanceId, accountId, organizationId, ledgerId, assetCode, transactionId, operationId, action, amount, overdraftBalance, overdraftLimit, occurredAt

Transaction

The four lifecycle events share one payload; only the routing type differs.
Event (ce-type)TopicFires whenKey payload
studio.lerian.transaction.postedlerian.streaming.transaction.postedA newly created transaction is committed to storage with all its operations persisted (no parent).id, organizationId, ledgerId, status, amount, assetCode, source, destination, route, operations, metadata, createdAt
studio.lerian.transaction.committedlerian.streaming.transaction.committedA pending transaction transitions from PENDING to APPROVED.id, organizationId, ledgerId, status, amount, assetCode, source, destination, operations, metadata
studio.lerian.transaction.canceledlerian.streaming.transaction.canceledA pending transaction transitions from PENDING to CANCELED.id, organizationId, ledgerId, status, amount, assetCode, source, destination, operations, metadata
studio.lerian.transaction.revertedlerian.streaming.transaction.revertedA revert flow creates a child transaction; parentTransactionId correlates it to the original.id, parentTransactionId, organizationId, ledgerId, status, amount, assetCode, source, destination, operations, metadata

CRM events

Midaz’s CRM capability manages account holders and their aliases. These events are emitted on the CRM source (lerian.midaz.crm by default), separate from the ledger, but follow the same envelope and versioning.

Holder

Event (ce-type)TopicFires whenKey payload
studio.lerian.holder.createdlerian.streaming.holder.createdA holder is created.id, organizationId, type, externalId, createdAt
studio.lerian.holder.updatedlerian.streaming.holder.updatedA holder’s mutable fields change.id, organizationId, type, externalId, updatedAt
studio.lerian.holder.deletedlerian.streaming.holder.deletedA holder is deleted.id, organizationId, deletionType, deletedAt

Alias

Event (ce-type)TopicFires whenKey payload
studio.lerian.alias.createdlerian.streaming.alias.createdAn alias is created for a holder and account.id, holderId, organizationId, ledgerId, accountId, type, relatedParties, createdAt
studio.lerian.alias.updatedlerian.streaming.alias.updatedAn alias’s mutable fields change.id, holderId, organizationId, ledgerId, accountId, type, relatedParties, updatedAt
studio.lerian.alias.deletedlerian.streaming.alias.deletedAn alias is deleted.id, holderId, organizationId, deletionType, deletedAt
studio.lerian.alias.related-party-deletedlerian.streaming.alias.related-party-deletedA single related party is removed from an alias.aliasId, holderId, organizationId, relatedPartyId, deletedAt