---
updatedAt: 2026-08-06T19:16:00.000Z
agentTools:
  projectIndex: https://developer.eftcorp.com/llms.txt
---

# Event Dictionary

This document describes all events published by the system.

This dictionary lists all events published by the Eclipse platform. Events are used by the [Event-Driven Notifications](https://developer.eftcorp.com/docs/eclipse-initiated-notifications-webhooks) framework and can be subscribed to via `eventPublishers` tenant config or streamed to external systems via `eventWebhookUrl`.

## Quick Reference

| Event Type                              | Service           | Trigger                                            |
| :-------------------------------------- | :---------------- | :------------------------------------------------- |
| `wallet.wallet.create`                  | wallet-service    | A new wallet is created                            |
| `wallet.wallet.update`                  | wallet-service    | A wallet's status or details change                |
| `wallet.transfer.create`                | wallet-service    | A wallet-to-wallet transfer completes              |
| `wallet.history.create`                 | wallet-service    | A wallet history record is written                 |
| `wallet.history.fraud`                  | wallet-service    | A fraud reference is set on a history record       |
| `wallet.transaction.failure`            | wallet-service    | A transaction fails before committing              |
| `wallet.reservation.create`             | wallet-service    | A funds reservation is created                     |
| `wallet.reservation.delete`             | wallet-service    | A funds reservation is released                    |
| `wallet.charge.create`                  | wallet-service    | A fee charge is applied to a wallet                |
| `wallet.mapping.create`                 | wallet-service    | A wallet mapping (e.g. QR or card link) is created |
| `wallet.mapping.delete`                 | wallet-service    | A wallet mapping is removed                        |
| `wallet.transfer.fraud`                 | wallet-service    | A transfer is flagged as potential fraud           |
| `wallet.dormant.cancel`                 | wallet-service    | A dormant wallet flag is cancelled                 |
| `wallet.walletType.create`              | wallet-service    | A wallet type is created                           |
| `wallet.walletType.update`              | wallet-service    | A wallet type configuration changes                |
| `payment.payment.create`                | payment-service   | A payment is initiated                             |
| `payment.payment.complete`              | payment-service   | A payment reaches a terminal state                 |
| `payment.withdrawal.create`             | payment-service   | A withdrawal is initiated                          |
| `payment.withdrawal.complete`           | payment-service   | A withdrawal reaches a terminal state              |
| `user.user.create`                      | user-service      | A user is registered                               |
| `user.user.update`                      | user-service      | A user's details change                            |
| `user.user.delete`                      | user-service      | A user is deleted                                  |
| `user.user.ratify`                      | user-service      | A user is KYC-ratified                             |
| `user.organisation.create`              | user-service      | An organisation is created                         |
| `user.organisation.update`              | user-service      | An organisation's details change                   |
| `user.organisation.delete`              | user-service      | An organisation is deleted                         |
| `user.organisation.ratify`              | user-service      | An organisation is KYC-ratified                    |
| `user.ratify.create`                    | user-service      | A ratification record is created                   |
| `user.ratify.compliance.*`              | user-service      | A compliance check result is recorded              |
| `user.identity.create`                  | user-service      | A user identity (login credential) is added        |
| `user.identity.delete`                  | user-service      | A user identity is removed                         |
| `user.identities.reset`                 | user-service      | All identities for a user are reset                |
| `user.auth.success`                     | user-service      | A user successfully authenticates                  |
| `user.auth.failure`                     | user-service      | A user authentication attempt fails                |
| `user.address.create`                   | user-service      | An address is added to a user or organisation      |
| `user.address.update`                   | user-service      | An address is updated                              |
| `user.address.delete`                   | user-service      | An address is removed                              |
| `user.contact.create`                   | user-service      | A contact record is created                        |
| `user.contact.update`                   | user-service      | A contact record is updated                        |
| `user.contact.delete`                   | user-service      | A contact record is removed                        |
| `user.document.create`                  | user-service      | A KYC document is uploaded                         |
| `user.document.update`                  | user-service      | A KYC document is updated                          |
| `user.document.delete`                  | user-service      | A KYC document is removed                          |
| `user.role.create`                      | user-service      | A role is assigned to a user                       |
| `user.role.delete`                      | user-service      | A role is removed from a user                      |
| `user.position.create`                  | user-service      | A user is given a position in an organisation      |
| `user.position.delete`                  | user-service      | A user's position in an organisation is removed    |
| `user.tenant.create`                    | user-service      | A tenant is created                                |
| `user.tenant.update`                    | user-service      | A tenant is updated                                |
| `user.manual.ratify.create`             | user-service      | A manual ratification is triggered                 |
| `user.replycomply.response`             | user-service      | A RelyComply KYC response is received              |
| `tenant.config.create`                  | eclipse-java      | A tenant config key is created                     |
| `tenant.config.update`                  | eclipse-java      | A tenant config key is updated                     |
| `tenant.config.delete`                  | eclipse-java      | A tenant config key is deleted                     |
| `postilion.card.create`                 | eclipse-java      | A Postilion card is created                        |
| `postilion.card.update`                 | eclipse-java      | A Postilion card is updated                        |
| `postilion.card.register`               | eclipse-java      | A Postilion card is registered                     |
| `postilion.card.standard.limits.update` | eclipse-java      | Standard card limits are updated                   |
| `postilion.card.advanced.limits.update` | eclipse-java      | Advanced card limits are updated                   |
| `postilion.stip.transaction.successful` | eclipse-java      | A STIP card transaction succeeds                   |
| `postilion.stip.transaction.declined`   | eclipse-java      | A STIP card transaction is declined                |
| `postilion.*`                           | eclipse-java      | Dynamic ISO 8583 card transaction events           |
| `reward.create`                         | reward-service    | A reward is created                                |
| `reward.complete`                       | reward-service    | A reward is completed                              |
| `fraud.trigger`                         | fraud-service     | A fraud rule is matched                            |
| `card.cardonfile.decrypt`               | card-service      | A card-on-file record is decrypted                 |
| `aws.liveness.session`                  | eclipse-java      | An AWS Face Liveness session is initiated          |
| `email.send.success`                    | messaging-library | An email is sent successfully                      |
| `email.send.failure`                    | messaging-library | An email fails to send                             |
| `sms.send.success`                      | messaging-library | An SMS is sent successfully                        |
| `sms.send.failure`                      | messaging-library | An SMS fails to send                               |
| `telegram.send`                         | messaging-library | A Telegram message is sent                         |
| `telegram.receive`                      | messaging-library | A Telegram message is received                     |
| `telegram.start`                        | messaging-library | A Telegram conversation is started                 |

***

## eclipse-java/conductor

### aws.liveness.session

This event is published when an AWS Face Liveness session is initiated.

**Event Type:** `aws.liveness.session`

**JSON Event Layout:**

```json
{
  "user": "string",
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `user`: The ID of the customer initiating the liveness check.
* `tenantId`: The ID of the tenant the user belongs to.
* `associatedEntity`:
  * `user`: The ID of the customer initiating the liveness check.

### tenant.config.update

This event is published when a tenant's configuration is updated.

**Event Type:** `tenant.config.update`

**JSON Event Layout:**

```json
{
  "property": {
    "att": "string",
    "val": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "tenantId": "string"
  }
}
```

**Field Descriptions:**

* `property`: The configuration property that was updated.
  * `att`: The name of the property.
  * `val`: The new value of the property.
* `tenantId`: The ID of the tenant whose configuration was updated.
* `associatedEntity`:
  * `tenantId`: The ID of the tenant whose configuration was updated.

### tenant.config.create

This event is published when a new configuration is created for a tenant.

**Event Type:** `tenant.config.create`

**JSON Event Layout:**

```json
{
  "property": {
    "att": "string",
    "val": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "tenantId": "string"
  }
}
```

**Field Descriptions:**

* `property`: The configuration property that was created.
  * `att`: The name of the property.
  * `val`: The value of the property.
* `tenantId`: The ID of the tenant for whom the configuration was created.
* `associatedEntity`:
  * `tenantId`: The ID of the tenant for whom the configuration was created.

### tenant.config.delete

This event is published when a tenant's configuration is deleted.

**Event Type:** `tenant.config.delete`

**JSON Event Layout:**

```json
{
  "property": "string",
  "tenantId": "string",
  "associatedEntity": {
    "tenantId": "string"
  }
}
```

**Field Descriptions:**

* `property`: The name of the configuration property that was deleted.
* `tenantId`: The ID of the tenant whose configuration was deleted.
* `associatedEntity`:
  * `tenantId`: The ID of the tenant whose configuration was deleted.

### public.tenant.config.create

This event is published when a public tenant configuration is created.

**Event Type:** `public.tenant.config.create`

**JSON Event Layout:**

```json
{
  "property": {
    "att": "string",
    "val": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "tenantId": "string"
  }
}
```

**Field Descriptions:**

* `property`: The configuration property that was created.
  * `att`: The name of the property.
  * `val`: The value of the property.
* `tenantId`: The ID of the tenant for whom the configuration was created.
* `associatedEntity`:
  * `tenantId`: The ID of the tenant for whom the configuration was created.

### user.identities.reset

This event is published when a user's identities are reset.

**Event Type:** `user.identities.reset`

**JSON Event Layout:**

```json
{
  "tenantId": "string",
  "associatedEntity": {
    "userId": "string"
  }
}
```

**Field Descriptions:**

* `tenantId`: The ID of the tenant the user belongs to.
* `associatedEntity`:
  * `userId`: The ID of the user whose identities were reset.

## messaging-library

### email.send.success

This event is published when an email is sent successfully.

**Event Type:** `email.send.success`

**JSON Event Layout:**

```json
{
  "to": [
    "string"
  ],
  "from": "string",
  "subject": "string",
  "body": "string",
  "associatedEntity": {
    "emailTo": "string"
  }
}
```

**Field Descriptions:**

* `to`: A list of recipient email addresses.
* `from`: The sender's email address.
* `subject`: The subject of the email.
* `body`: The body of the email (obfuscated).
* `associatedEntity`:
  * `emailTo`: The recipient's email address.

### email.send.failure

This event is published when an email fails to send.

**Event Type:** `email.send.failure`

**JSON Event Layout:**

```json
{
  "to": [
    "string"
  ],
  "from": "string",
  "subject": "string",
  "body": "string",
  "error": "string",
  "associatedEntity": {
    "emailTo": "string"
  }
}
```

**Field Descriptions:**

* `to`: A list of recipient email addresses.
* `from`: The sender's email address.
* `subject`: The subject of the email.
* `body`: The body of the email (obfuscated).
* `error`: The error message.
* `associatedEntity`:
  * `emailTo`: The recipient's email address.

### sms.send.success

This event is published when an SMS is sent successfully.

**Event Type:** `sms.send.success`

**JSON Event Layout:**

```json
{
  "phone": "string",
  "message": "string",
  "senderId": "string",
  "tenantId": "string",
  "associatedEntity": {
    "msisdn": "string"
  }
}
```

**Field Descriptions:**

* `phone`: The recipient's phone number.
* `message`: The message that was sent (potentially obfuscated).
* `senderId`: The ID of the sender.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `msisdn`: The recipient's phone number.

### sms.send.failure

This event is published when an SMS fails to send.

**Event Type:** `sms.send.failure`

**JSON Event Layout:**

```json
{
  "phone": "string",
  "message": "string",
  "error": "string",
  "senderId": "string",
  "tenantId": "string",
  "associatedEntity": {
    "msisdn": "string"
  }
}
```

**Field Descriptions:**

* `phone`: The recipient's phone number.
* `message`: The message that was sent (potentially obfuscated).
* `error`: The error message.
* `senderId`: The ID of the sender.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `msisdn`: The recipient's phone number.

### whatsapp.start

This event is published when a WhatsApp conversation is started.

**Event Type:** `whatsapp.start`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

### whatsapp.receive

This event is published when a WhatsApp message is received.

**Event Type:** `whatsapp.receive`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

### whatsapp.send

This event is published when a WhatsApp message is sent.

**Event Type:** `whatsapp.send`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

### telegram.send

This event is published when a Telegram message is sent.

**Event Type:** `telegram.send`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

### telegram.start

This event is published when a Telegram conversation is started.

**Event Type:** `telegram.start`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

### telegram.receive

This event is published when a Telegram message is received.

**Event Type:** `telegram.receive`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

## property-service

### property.property.create

This event is published when a property is created.

**Event Type:** `property.property.create`

**JSON Event Layout:**

```json
{
  "property": {
    "name": "string",
    "value": "string"
  },
  "associatedEntity": {
    "property": "string"
  }
}
```

**Field Descriptions:**

* `property`: The property that was created.
  * `name`: The name of the property.
  * `value`: The value of the property.
* `associatedEntity`:
  * `property`: The name of the property.

### property.property.update

This event is published when a property is updated.

**Event Type:** `property.property.update`

**JSON Event Layout:**

```json
{
  "property": {
    "name": "string",
    "value": "string"
  },
  "associatedEntity": {
    "property": "string"
  }
}
```

**Field Descriptions:**

* `property`: The property that was updated.
  * `name`: The name of the property.
  * `value`: The new value of the property.
* `associatedEntity`:
  * `property`: The name of the property.

### property.property.delete

This event is published when a property is deleted.

**Event Type:** `property.property.delete`

**JSON Event Layout:**

```json
{
  "property": {
    "name": "string"
  },
  "associatedEntity": {
    "property": "string"
  }
}
```

**Field Descriptions:**

* `property`: The property that was deleted.
  * `name`: The name of the property.
* `associatedEntity`:
  * `property`: The name of the property.

## accounting-service

### sme.event.\*

This event is published when a sale event occurs.

**Event Type:** `sme.event.*`

**Possible Event Types:**

* `sme.event.EDIT`
* `sme.event.QUOTE_REQUESTED`
* `sme.event.CANCEL`
* `sme.event.QUOTE_ACCEPTED`
* `sme.event.PAYMENT`
* `sme.event.FULFIL`
* `sme.event.DEALLOCATE_PAYMENT`
* `sme.event.DELETE_PAYMENT`
* `sme.event.ALLOCATE_PAYMENT`

**JSON Event Layout:**

```json
{
  "sale": "string",
  "tenantId": "string",
  "associatedEntity": {
    "accountId": "string"
  }
}
```

**Field Descriptions:**

* `sale`: The ID of the sale.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `accountId`: The ID of the account.

## telco-library

### ussd.start

This event is published when a USSD session is started.

**Event Type:** `ussd.start`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

### ussd.receive

This event is published when a USSD message is received.

**Event Type:** `ussd.receive`

**JSON Event Layout:**

```json
{
  "phone": "string"
}
```

**Field Descriptions:**

* `phone`: The user's phone number.

## eclipse-java/services/postilion

### postilion.card.register

This event is published when a Postilion card is registered.

**Event Type:** `postilion.card.register`

**JSON Event Layout:**

```json
{
  "postilionCard": {
    "pan": "string",
    "expiry": "string",
    "accountNumber": "string",
    "sequenceNumber": "string",
    "deviceType": "string",
    "cardRules": {
      "ecommerceTransactionsEnabled": "boolean",
      "internationalTransactionsEnabled": "boolean"
    },
    "tenantId": "string",
    "userId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `postilionCard`: The Postilion card that was registered.
  * `pan`: The card's Primary Account Number.
  * `expiry`: The card's expiration date.
  * `accountNumber`: The account number associated with the card.
  * `sequenceNumber`: The card's sequence number.
  * `deviceType`: The type of device.
  * `cardRules`:
    * `ecommerceTransactionsEnabled`: Whether or not e-commerce transactions are enabled.
    * `internationalTransactionsEnabled`: Whether or not international transactions are enabled.
  * `tenantId`: The ID of the tenant.
  * `userId`: The ID of the user.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### postilion.card.create

This event is published when a Postilion card is created.

**Event Type:** `postilion.card.create`

**JSON Event Layout:**

```json
{
  "card": {
    "cardId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "postilionCard": "string"
  }
}
```

**Field Descriptions:**

* `card`: The card that was created.
  * `cardId`: The ID of the card.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `postilionCard`: The ID of the Postilion card.

### postilion.card.update

This event is published when a Postilion card is updated.

**Event Type:** `postilion.card.update`

**JSON Event Layout:**

```json
{
  "card": {
    "cardId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "postilionCard": "string"
  }
}
```

**Field Descriptions:**

* `card`: The card that was updated.
  * `cardId`: The ID of the card.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `postilionCard`: The ID of the Postilion card.

### postilion.card.standard.limits.update

This event is published when the standard limits for a Postilion card are updated.

**Event Type:** `postilion.card.standard.limits.update`

**JSON Event Layout:**

```json
{
  "limits": {
    "cardId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "postilionCard": "string"
  }
}
```

**Field Descriptions:**

* `limits`: The standard limits that were updated.
  * `cardId`: The ID of the card.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `postilionCard`: The ID of the Postilion card.

### postilion.card.advanced.limits.update

This event is published when the advanced limits for a Postilion card are updated.

**Event Type:** `postilion.card.advanced.limits.update`

**JSON Event Layout:**

```json
{
  "limits": {
    "cardId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "postilionCard": "string"
  }
}
```

**Field Descriptions:**

* `limits`: The advanced limits that were updated.
  * `cardId`: The ID of the card.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `postilionCard`: The ID of the Postilion card.

### postilion.stip.transaction.declined

This event is published when a STIP (Stand-In Processing) transaction is declined.

**Event Type:** `postilion.stip.transaction.declined`

**JSON Event Layout:**

```json
{
  "cardTransaction": "string",
  "tenantId": "string",
  "associatedEntity": {
    "card": "string"
  }
}
```

**Field Descriptions:**

* `cardTransaction`: The details of the card transaction (sanitised JSON string).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `card`: The ID of the card.

### postilion.settlement.request

This event is published when a settlement request is made.

**Event Type:** `postilion.settlement.request`

**JSON Event Layout:**

```json
{
  "cardTransaction": "string",
  "tenantId": "string",
  "associatedEntity": {
    "postilionCard": "string"
  }
}
```

**Field Descriptions:**

* `cardTransaction`: The details of the card transaction (sanitised JSON string).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `postilionCard`: The ID of the Postilion card.

### postilion.stip.transaction.successful

This event is published when a STIP (Stand-In Processing) transaction is successful.

**Event Type:** `postilion.stip.transaction.successful`

**JSON Event Layout:**

```json
{
  "cardTransaction": "string",
  "tenantId": "string",
  "associatedEntity": {
    "card": "string"
  }
}
```

**Field Descriptions:**

* `cardTransaction`: The details of the card transaction (sanitised JSON string).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `card`: The ID of the card.

### postilion.\*

This is a dynamic event that is published for various Postilion transactions.

The event name is constructed as `postilion.{MTI}-{message-type-name}-{direction}.{processing-scope}.{transaction-type}.{channel}.{region}`.

<Table align={["left","left","left"]}>
  <thead>
    <tr>
      <th>
        Component
      </th>

      <th>
        Definition
      </th>

      <th>
        Sample
      </th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>
        MTI
      </td>

      <td>
        ISO8583 Message Type Indicator
      </td>

      <td>
        0110
      </td>
    </tr>

    <tr>
      <td>
        message-type-name
      </td>

      <td>
        Human-readable description of the MTI (e.g. "authorization-response")
      </td>

      <td>
        authorization
      </td>
    </tr>

    <tr>
      <td>
        direction
      </td>

      <td>
        Indicates message direction.  
        Values = request/response
      </td>

      <td>
        request
      </td>
    </tr>

    <tr>
      <td>
        processing-scope
      </td>

      <td>
        Specifies whether the transaction is on-us or off-us.  This is determined based on the configuration of the Postilion source node that received the request.  
        Values = onus/offus
      </td>

      <td>
        offus
      </td>
    </tr>

    <tr>
      <td>
        transaction-type
      </td>

      <td>
        Abbreviated transaction category code.

        pur = purchase  
        bai = Balance Inquiry  
        asi = Account Status Inquiry  
        mst = Mini Statement  
        ref = Refund  
        pra = Pre-Authorisation  
        msd = Merchant Statement Download  
        pac = Purchase Completion  
        chb = Cash at Branch
        cwd = Cash Withdrawal
        pwc = Purchase with Cashback
        aft = Account Fund Transfer
        qch = Quasi-Cash
        dpt = Deposit
        oct = Original Credit Transaction
      </td>

      <td>
        asi
      </td>
    </tr>

    <tr>
      <td>
        channel
      </td>

      <td>
        Indicates the channel through which the transaction originated. Derived from ISO Field 123 (Terminal Type)  
        Values = ecom/pos/atm
      </td>

      <td>
        ecom
      </td>
    </tr>

    <tr>
      <td>
        region
      </td>

      <td>
        Indicates whether the transaction is domestic or international. Derived from ISO Field 43 (Card Acceptor Name/Location)  
        Values = domestic/international
      </td>

      <td>
        domestic
      </td>
    </tr>
  </tbody>
</Table>

**Event Type:** `postilion.*`

**JSON Event Layout:**

```json
{
  "cardTransaction": "string",
  "transactionSummary": "string",
  "tenantId": "string",
  "associatedEntity": {
    "walletId": "string"
  }
}
```

**Field Descriptions:**

* `cardTransaction`: The details of the card transaction (sanitised JSON string).
* `transactionSummary`: A summary of the transaction.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `walletId`: The ID of the wallet.

### postilion.\*.isomessage

This is a dynamic event that is published for various Postilion transactions, containing the raw ISO8583 message. The event name is constructed as `postilion.<mti>.<transaction-type>.isomessage`, where `<mti>` is the Message Type Indicator (e.g., `0100-authorization-request`) and `<transaction-type>` is the type of transaction.

**Event Type:** `postilion.*.isomessage`

**JSON Event Layout:**

```json
{
  "isoMessage": "string",
  "tenantId": "string",
  "associatedEntity": {
    "walletId": "string"
  }
}
```

**Field Descriptions:**

* `isoMessage`: The raw ISO8583 message (sanitised JSON string).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `walletId`: The ID of the wallet.

## card-service

### card.cardonfile.decrypt

This event is published when a card on file is decrypted.

**Event Type:** `card.cardonfile.decrypt`

**JSON Event Layout:**

```json
{
  "cardOnFile": {
    "pan": "string",
    "cardholderName": "string",
    "expiry": "string",
    "cvv": "string",
    "accountType": "string",
    "dob": "string",
    "userId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `cardOnFile`: The decrypted card on file data (desensitised).
  * `pan`: The card's Primary Account Number.
  * `cardholderName`: The name of the cardholder.
  * `expiry`: The card's expiration date.
  * `cvv`: The card's CVV.
  * `accountType`: The account type.
  * `dob`: The cardholder's date of birth.
  * `userId`: The ID of the user.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

## fraud-service

### fraud.trigger

This event is published when a fraud rule is triggered.

**Event Type:** `fraud.trigger`

**JSON Event Layout:**

```json
{
  "fraudResult": {
    "allow": "boolean",
    "overallDescription": "string",
    "lockMinutes": "number",
    "matchedRules": [
      {
        "action": "string",
        "notificationTemplateName": "string",
        "description": "string"
      }
    ]
  },
  "event": {
    "key": "value"
  },
  "tenantId": "string",
  "associatedEntity": {
    "walletId": "string"
  }
}
```

**Field Descriptions:**

* `fraudResult`: The result of the fraud check.
  * `allow`: Whether or not the transaction is allowed.
  * `overallDescription`: A description of the overall fraud check result.
  * `lockMinutes`: The number of minutes to lock the account.
  * `matchedRules`: A list of the fraud rules that were matched.
    * `action`: The action to take.
    * `notificationTemplateName`: The name of the notification template to use.
    * `description`: A description of the rule.
* `event`: The event data that triggered the fraud check.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `walletId`: The ID of the wallet.

## user-service

### sbsa.user.identity.inconclusive

This event is published when a user's identity is inconclusive after a RelyComply assessment.

**Event Type:** `sbsa.user.identity.inconclusive`

**JSON Event Layout:**

```json
{
  "RelyComplyAssessmentResponse": {
    "assessments": {
      "edges": [
        {
          "node": {
            "id": "string",
            "complete": true,
            "status": "string",
            "webhookUrl": "string",
            "created": "string",
            "updated": "string",
            "assessmentConfig": { "name": "string", "assessmentType": "string" },
            "customer": { "id": "string" },
            "screenings": {
              "edges": [
                {
                  "node": {
                    "id": "string",
                    "outcome": "string",
                    "screeningConfig": { "name": "string", "screeningType": "string" },
                    "hasError": false,
                    "errorHeading": "string",
                    "errorMessage": "string",
                    "cases": {
                      "edges": [
                        { "node": { "id": "string", "closed": true, "state": "string", "outcome": "string", "events": { "edges": [ { "node": { "note": "string" } } ] } } }
                      ]
                    },
                    "resultContext": "string"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  },
  "Message": "Identity was inconclusive, additional information is required.",
  "assessmentNotes": null,
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `RelyComplyAssessmentResponse`: The full assessment/screening result re-queried from RelyComply's GraphQL API — one or more `assessments`, each with one or more `screenings`, each with any related `cases` and case `events` (the `note` on a case event is where RelyComply explains what's missing or inconclusive).
* `Message`: A fixed, human-readable description of why this event fired.
* `assessmentNotes`: Not populated for this event (always `null`).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### sbsa.user.additional.docs.required

This event is published when additional documentation is required from a user after a RelyComply assessment.

**Event Type:** `sbsa.user.additional.docs.required`

**JSON Event Layout:**

```json
{
  "RelyComplyAssessmentResponse": {
    "assessments": {
      "edges": [
        {
          "node": {
            "id": "string",
            "complete": true,
            "status": "string",
            "webhookUrl": "string",
            "created": "string",
            "updated": "string",
            "assessmentConfig": { "name": "string", "assessmentType": "string" },
            "customer": { "id": "string" },
            "screenings": {
              "edges": [
                {
                  "node": {
                    "id": "string",
                    "outcome": "string",
                    "screeningConfig": { "name": "string", "screeningType": "string" },
                    "hasError": false,
                    "errorHeading": "string",
                    "errorMessage": "string",
                    "cases": {
                      "edges": [
                        { "node": { "id": "string", "closed": true, "state": "string", "outcome": "string", "events": { "edges": [ { "node": { "note": "string" } } ] } } }
                      ]
                    },
                    "resultContext": "string"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  },
  "Message": "Additional Documentation is required, ie. high risk customers",
  "assessmentNotes": "string",
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `RelyComplyAssessmentResponse`: The full assessment/screening result re-queried from RelyComply's GraphQL API — one or more `assessments`, each with one or more `screenings`, each with any related `cases` and case `events`.
* `Message`: A fixed, human-readable description of why this event fired.
* `assessmentNotes`: The matched RelyComply case note(s) identifying which document type is required (for example proof of address, proof of funds, or a source-of-wealth document) — use this to tell the customer what to upload.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### sbsa.user.assessment.unacceptablerisk

This event is published when a user's assessment is determined to be an unacceptable risk after a RelyComply assessment.

**Event Type:** `sbsa.user.assessment.unacceptablerisk`

**JSON Event Layout:**

```json
{
  "RelyComplyAssessmentResponse": {
    "assessments": {
      "edges": [
        {
          "node": {
            "id": "string",
            "complete": true,
            "status": "string",
            "webhookUrl": "string",
            "created": "string",
            "updated": "string",
            "assessmentConfig": { "name": "string", "assessmentType": "string" },
            "customer": { "id": "string" },
            "screenings": {
              "edges": [
                {
                  "node": {
                    "id": "string",
                    "outcome": "string",
                    "screeningConfig": { "name": "string", "screeningType": "string" },
                    "hasError": false,
                    "errorHeading": "string",
                    "errorMessage": "string",
                    "cases": {
                      "edges": [
                        { "node": { "id": "string", "closed": true, "state": "string", "outcome": "string", "events": { "edges": [ { "node": { "note": "string" } } ] } } }
                      ]
                    },
                    "resultContext": "string"
                  }
                }
              ]
            }
          }
        }
      ]
    }
  },
  "Message": "Customer risk unacceptable. Customer and associated wallets have been barred. Reason: Risk",
  "assessmentNotes": null,
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `RelyComplyAssessmentResponse`: The full assessment/screening result re-queried from RelyComply's GraphQL API — one or more `assessments`, each with one or more `screenings`, each with any related `cases` and case `events`.
* `Message`: A human-readable description of why this event fired. The trailing reason is one of `Risk`, `Fraud`, or `Regulatory`, matched from which screening failed.
* `assessmentNotes`: Not populated for this event (always `null`).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

<Callout icon="📘" theme="info">
  ### Note

  The customer and all associated wallets are barred when this event fires. Do not retry ratification automatically — this requires manual compliance review.
</Callout>

### user.replycomply.response

This event is published after every successful call Eclipse makes to the RelyComply API (customer create/update, document upload, assessment creation) — not only on a resolved assessment outcome. For the specific assessment-outcome events, see `sbsa.user.identity.inconclusive`, `sbsa.user.additional.docs.required`, and `sbsa.user.assessment.unacceptablerisk` above.

**Event Type:** `user.replycomply.response`

<Callout icon="📘" theme="info">
  ### Note

  The event type is spelled `replycomply`, not `relycomply` — this is how it is published in code. Match on this exact string.
</Callout>

**JSON Event Layout:**

```json
{
  "relyComplyResponse": "string",
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `relyComplyResponse`: The raw, unparsed JSON response body returned by the RelyComply API call — a string, not a typed object.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.user.delete

This event is published when a user is deleted.

**Event Type:** `user.user.delete`

**JSON Event Layout:**

```json
{
  "user": {
    "userId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `user`: The user that was deleted.
  * `userId`: The ID of the user.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.organisation.update

This event is published when an organisation is updated.

**Event Type:** `user.organisation.update`

**JSON Event Layout:**

```json
{
  "organisation": {
    "organisationId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "organisation": "string"
  }
}
```

**Field Descriptions:**

* `organisation`: The organisation that was updated.
  * `organisationId`: The ID of the organisation.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `organisation`: The ID of the organisation.

### user.organisation.delete

This event is published when an organisation is deleted.

**Event Type:** `user.organisation.delete`

**JSON Event Layout:**

```json
{
  "organisation": {
    "organisationId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "organisation": "string"
  }
}
```

**Field Descriptions:**

* `organisation`: The organisation that was deleted.
  * `organisationId`: The ID of the organisation.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `organisation`: The ID of the organisation.

### user.identity.create

This event is published when a user identity is created.

**Event Type:** `user.identity.create`

**JSON Event Layout:**

```json
{
  "userIdentity": {
    "userId": "string",
    "identity": "string",
    "identityType": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userIdentity`: The user identity that was created.
  * `userId`: The ID of the user.
  * `identity`: The identity string.
  * `identityType`: The type of identity.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.identity.delete

This event is published when a user identity is deleted.

**Event Type:** `user.identity.delete`

**JSON Event Layout:**

```json
{
  "userIdentity": {
    "userId": "string",
    "identity": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userIdentity`: The user identity that was deleted.
  * `userId`: The ID of the user.
  * `identity`: The identity string.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.auth.success

This event is published when a user successfully authenticates.

**Event Type:** `user.auth.success`

**JSON Event Layout:**

```json
{
  "authCredentials": {
    "identity": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `authCredentials`: The authentication credentials.
  * `identity`: The identity string.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.auth.failure

This event is published when a user authentication fails.

**Event Type:** `user.auth.failure`

**JSON Event Layout:**

```json
{
  "authCredentials": {
    "identity": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `authCredentials`: The authentication credentials.
  * `identity`: The identity string.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.address.create

This event is published when an address is created.

**Event Type:** `user.address.create`

**JSON Event Layout:**

```json
{
  "address": {
    "addressId": "string",
    "userId": "string",
    "organisationId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "organisation": "string",
    "user": "string"
  }
}
```

**Field Descriptions:**

* `address`: The address that was created.
  * `addressId`: The ID of the address.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `organisation`: The ID of the organisation.
  * `user`: The ID of the user.

### user.address.update

This event is published when an address is updated.

**Event Type:** `user.address.update`

**JSON Event Layout:**

```json
{
  "address": {
    "addressId": "string",
    "userId": "string",
    "organisationId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "organisation": "string",
    "user": "string"
  }
}
```

**Field Descriptions:**

* `address`: The address that was updated.
  * `addressId`: The ID of the address.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `organisation`: The ID of the organisation.
  * `user`: The ID of the user.

### user.address.delete

This event is published when an address is deleted.

**Event Type:** `user.address.delete`

**JSON Event Layout:**

```json
{
  "address": {
    "addressId": "string",
    "userId": "string",
    "organisationId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "organisation": "string",
    "user": "string"
  }
}
```

**Field Descriptions:**

* `address`: The address that was deleted.
  * `addressId`: The ID of the address.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `organisation`: The ID of the organisation.
  * `user`: The ID of the user.

### user.contact.create

This event is published when a user contact is created.

**Event Type:** `user.contact.create`

**JSON Event Layout:**

```json
{
  "userContact": {
    "userContactId": "string",
    "userId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userContact`: The user contact that was created.
  * `userContactId`: The ID of the user contact.
  * `userId`: The ID of the user.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.contact.update

This event is published when a user contact is updated.

**Event Type:** `user.contact.update`

**JSON Event Layout:**

```json
{
  "userContact": {
    "userContactId": "string",
    "userId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userContact`: The user contact that was updated.
  * `userContactId`: The ID of the user contact.
  * `userId`: The ID of the user.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.contact.delete

This event is published when a user contact is deleted.

**Event Type:** `user.contact.delete`

**JSON Event Layout:**

```json
{
  "userContact": {
    "userContactId": "string",
    "userId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userContact`: The user contact that was deleted.
  * `userContactId`: The ID of the user contact.
  * `userId`: The ID of the user.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.position.create

This event is published when a user position is created.

**Event Type:** `user.position.create`

**JSON Event Layout:**

```json
{
  "userPosition": {
    "userId": "string",
    "organisationId": "string",
    "position": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userPosition`: The user position that was created.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
  * `position`: The position.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.position.delete

This event is published when a user position is deleted.

**Event Type:** `user.position.delete`

**JSON Event Layout:**

```json
{
  "userPosition": {
    "userId": "string",
    "organisationId": "string",
    "position": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userPosition`: The user position that was deleted.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
  * `position`: The position.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.role.create

This event is published when a user role is created.

**Event Type:** `user.role.create`

**JSON Event Layout:**

```json
{
  "userRole": {
    "userId": "string",
    "role": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userRole`: The user role that was created.
  * `userId`: The ID of the user.
  * `role`: The role.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.role.delete

This event is published when a user role is deleted.

**Event Type:** `user.role.delete`

**JSON Event Layout:**

```json
{
  "userRole": {
    "userId": "string",
    "role": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `userRole`: The user role that was deleted.
  * `userId`: The ID of the user.
  * `role`: The role.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.user.create

This event is published when a user is created.

**Event Type:** `user.user.create`

**JSON Event Layout:**

```json
{
  "user": {
    "userId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `user`: The user that was created.
  * `userId`: The ID of the user.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.user.update

This event is published when a user is updated.

**Event Type:** `user.user.update`

**JSON Event Layout:**

```json
{
  "user": {
    "userId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `user`: The user that was updated.
  * `userId`: The ID of the user.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.organisation.create

This event is published when an organisation is created.

**Event Type:** `user.organisation.create`

**JSON Event Layout:**

```json
{
  "organisation": {
    "organisationId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "organisation": "string"
  }
}
```

**Field Descriptions:**

* `organisation`: The organisation that was created.
  * `organisationId`: The ID of the organisation.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `organisation`: The ID of the organisation.

### user.organisation.ratify

This event is published when an organisation is ratified.

**Event Type:** `user.organisation.ratify`

**JSON Event Layout:**

```json
{
  "organisation": "string",
  "tenantId": "string",
  "associatedEntity": {
    "organisation": "string"
  }
}
```

**Field Descriptions:**

* `organisation`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `organisation`: The ID of the organisation.

### user.user.ratify

This event is published when a user is ratified.

**Event Type:** `user.user.ratify`

**JSON Event Layout:**

```json
{
  "user": "string",
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `user`: The ID of the user.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.ratify.create

This event is published when a ratification is created.

**Event Type:** `user.ratify.create`

**JSON Event Layout:**

```json
{
  "ratifyResult": {
    "userId": "string",
    "organisationId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `ratifyResult`: The result of the ratification.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.document.delete

This event is published when a document is deleted.

**Event Type:** `user.document.delete`

**JSON Event Layout:**

```json
{
  "document": {
    "documentId": "string",
    "userId": "string",
    "organisationId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "document": "string"
  }
}
```

**Field Descriptions:**

* `document`: The document that was deleted.
  * `documentId`: The ID of the document.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `document`: The ID of the document.

### user.document.update

This event is published when a document is updated.

**Event Type:** `user.document.update`

**JSON Event Layout:**

```json
{
  "document": {
    "documentId": "string",
    "userId": "string",
    "organisationId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "document": "string"
  }
}
```

**Field Descriptions:**

* `document`: The document that was updated.
  * `documentId`: The ID of the document.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `document`: The ID of the document.

### user.document.create

This event is published when a document is created.

**Event Type:** `user.document.create`

**JSON Event Layout:**

```json
{
  "document": {
    "documentId": "string",
    "userId": "string",
    "organisationId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "document": "string"
  }
}
```

**Field Descriptions:**

* `document`: The document that was created.
  * `documentId`: The ID of the document.
  * `userId`: The ID of the user.
  * `organisationId`: The ID of the organisation.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `document`: The ID of the document.

### user.tenant.create

This event is published when a tenant is created.

**Event Type:** `user.tenant.create`

**JSON Event Layout:**

```json
{
  "tenant": {
    "organisationId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "tenant": "string"
  }
}
```

**Field Descriptions:**

* `tenant`: The tenant that was created.
  * `organisationId`: The ID of the organisation.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `tenant`: The ID of the tenant.

### user.tenant.update

This event is published when a tenant is updated.

**Event Type:** `user.tenant.update`

**JSON Event Layout:**

```json
{
  "tenant": {
    "organisationId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "tenant": "string"
  }
}
```

**Field Descriptions:**

* `tenant`: The tenant that was updated.
  * `organisationId`: The ID of the organisation.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `tenant`: The ID of the tenant.

### user.manual.ratify.create

This event is published when a manual KYC ratification is explicitly triggered for a user (as opposed to the automated ratification flow).

**Event Type:** `user.manual.ratify.create`

**JSON Event Layout:**

```json
{
  "user": {
    "userId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `user`: The user for whom manual ratification was triggered.
  * `userId`: The ID of the user.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

### user.ratify.compliance.\*

This event is published when a user is ratified against a compliance agency.

**Event Type:** `user.ratify.compliance.*`

**Possible Event Types:**

* `user.ratify.compliance.ofac`
* `user.ratify.compliance.un`
* `user.ratify.compliance.match`
* `user.ratify.compliance.pep`
* `user.ratify.compliance.uk`
* `user.ratify.compliance.custom-list-kyc-check`
* `user.ratify.compliance.iprs`
* `user.ratify.compliance.internal_blacklist`
* `user.ratify.compliance.securecitizen`
* `user.ratify.compliance.eu`
* `user.ratify.compliance.fic`
* `user.ratify.compliance.unsc`
* `user.ratify.compliance.french_list`
* `user.ratify.compliance.safps`
* `user.ratify.compliance.all`

**JSON Event Layout:**

```json
{
  "user": {
    "userId": "string",
    "tenantId": "string"
  },
  "result": {
    "key": "value"
  },
  "tenantId": "string",
  "associatedEntity": {
    "user": "string"
  }
}
```

**Field Descriptions:**

* `user`: The user that was ratified.
  * `userId`: The ID of the user.
  * `tenantId`: The ID of the tenant.
* `result`: The result of the ratification.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `user`: The ID of the user.

## payment-service

### payment.payment.create

This event is published when a payment is created.

**Event Type:** `payment.payment.create`

**JSON Event Layout:**

```json
{
  "payment": {
    "paymentId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "payment": "string"
  }
}
```

**Field Descriptions:**

* `payment`: The payment that was created.
  * `paymentId`: The ID of the payment.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `payment`: The ID of the payment.

### payment.withdrawal.create

This event is published when a withdrawal is created.

**Event Type:** `payment.withdrawal.create`

**JSON Event Layout:**

```json
{
  "withdrawal": {
    "withdrawalId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "withdrawal": "string"
  }
}
```

**Field Descriptions:**

* `withdrawal`: The withdrawal that was created.
  * `withdrawalId`: The ID of the withdrawal.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `withdrawal`: The ID of the withdrawal.

### payment.payment.complete

This event is published when a payment is completed.

**Event Type:** `payment.payment.complete`

**JSON Event Layout:**

```json
{
  "payment": {
    "paymentId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "payment": "string"
  }
}
```

**Field Descriptions:**

* `payment`: The payment that was completed.
  * `paymentId`: The ID of the payment.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `payment`: The ID of the payment.

### payment.withdrawal.complete

This event is published when a withdrawal is completed.

**Event Type:** `payment.withdrawal.complete`

**JSON Event Layout:**

```json
{
  "withdrawal": {
    "withdrawalId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "withdrawal": "string"
  }
}
```

**Field Descriptions:**

* `withdrawal`: The withdrawal that was completed.
  * `withdrawalId`: The ID of the withdrawal.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `withdrawal`: The ID of the withdrawal.

## wallet-service

### wallet.walletType.update

This event is published when a wallet type is updated.

**Event Type:** `wallet.walletType.update`

**JSON Event Layout:**

```json
{
  "walletType": {
    "walletTypeId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "walletType": "string"
  }
}
```

**Field Descriptions:**

* `walletType`: The wallet type that was updated.
  * `walletTypeId`: The ID of the wallet type.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `walletType`: The ID of the wallet type.

### wallet.walletType.create

This event is published when a wallet type is created.

**Event Type:** `wallet.walletType.create`

**JSON Event Layout:**

```json
{
  "walletType": {
    "walletTypeId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "walletType": "string"
  }
}
```

**Field Descriptions:**

* `walletType`: The wallet type that was created.
  * `walletTypeId`: The ID of the wallet type.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `walletType`: The ID of the wallet type.

### wallet.history.create

This event is published when a wallet history record is created.

**Event Type:** `wallet.history.create`

**JSON Event Layout:**

```json
{
  "walletHistory": [
    {
      "walletId": "string",
      "balanceChange": "number"
    }
  ],
  "tenantId": "string"
}
```

**Field Descriptions:**

* `walletHistory`: A list of wallet history records.
  * `walletId`: The ID of the wallet.
  * `balanceChange`: The change in balance.
* `tenantId`: The ID of the tenant.

### wallet.transfer.create

This event is published when a transfer is created.

**Event Type:** `wallet.transfer.create`

**JSON Event Layout:**

```json
{
  "transfer": {
    "fromWalletId": "string",
    "toWalletId": "string",
    "amount": "number"
  },
  "walletHistory": [
    {
      "walletId": "string",
      "balanceChange": "number"
    }
  ],
  "fromWallet": {
    "walletId": "string"
  },
  "toWallet": {
    "walletId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `transfer`: The transfer that was created.
  * `fromWalletId`: The ID of the source wallet.
  * `toWalletId`: The ID of the destination wallet.
  * `amount`: The amount of the transfer.
* `walletHistory`: A list of wallet history records.
  * `walletId`: The ID of the wallet.
  * `balanceChange`: The change in balance.
* `fromWallet`: The source wallet.
  * `walletId`: The ID of the source wallet.
* `toWallet`: The destination wallet.
  * `walletId`: The ID of the destination wallet.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the source wallet.

### wallet.reservation.create

This event is published when a reservation is created.

**Event Type:** `wallet.reservation.create`

**JSON Event Layout:**

```json
{
  "reservation": {
    "reservationId": "string",
    "walletId": "string",
    "amount": "number"
  },
  "wallet": {
    "walletId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `reservation`: The reservation that was created.
  * `reservationId`: The ID of the reservation.
  * `walletId`: The ID of the wallet.
  * `amount`: The amount of the reservation.
* `wallet`: The wallet.
  * `walletId`: The ID of the wallet.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.charge.create

This event is published when a charge is created.

**Event Type:** `wallet.charge.create`

**JSON Event Layout:**

```json
{
  "charge": {
    "chargeRequestId": "string",
    "walletId": "string",
    "amount": "number"
  },
  "wallet": {
    "walletId": "string"
  },
  "walletHistory": {
    "walletHistoryId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `charge`: The charge request.
  * `chargeRequestId`: The ID of the charge request.
  * `walletId`: The ID of the wallet.
  * `amount`: The amount of the charge.
* `wallet`: The wallet.
  * `walletId`: The ID of the wallet.
* `walletHistory`: The wallet history record.
  * `walletHistoryId`: The ID of the wallet history record.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.wallet.update

This event is published when a wallet is updated.

**Event Type:** `wallet.wallet.update`

**JSON Event Layout:**

```json
{
  "wallet": {
    "walletId": "string",
    "status": "number"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `wallet`: The wallet that was updated.
  * `walletId`: The ID of the wallet.
  * `status`: The new status of the wallet.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.wallet.create

This event is published when a wallet is created.

**Event Type:** `wallet.wallet.create`

**JSON Event Layout:**

```json
{
  "wallet": {
    "walletId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `wallet`: The wallet that was created.
  * `walletId`: The ID of the wallet.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.mapping.create

This event is published when a wallet mapping is created.

**Event Type:** `wallet.mapping.create`

**JSON Event Layout:**

```json
{
  "walletMapping": {
    "walletId": "string",
    "mappingId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `walletMapping`: The wallet mapping that was created.
  * `walletId`: The ID of the wallet.
  * `mappingId`: The ID of the mapping.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.reservation.delete

This event is published when a wallet reservation is deleted.

**Event Type:** `wallet.reservation.delete`

**JSON Event Layout:**

```json
{
  "reservation": {
    "reservationId": "string",
    "walletId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `reservation`: The reservation that was deleted.
  * `reservationId`: The ID of the reservation.
  * `walletId`: The ID of the wallet.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.transfer.fraud

This event is published when a wallet transfer is flagged as potential fraud.

**Event Type:** `wallet.transfer.fraud`

**JSON Event Layout:**

```json
{
  "debitRow": {
    "key": "value"
  },
  "creditRow": {
    "key": "value"
  },
  "debitWallet": {
    "key": "value"
  },
  "creditWallet": {
    "key": "value"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `debitRow`: Snippet of the debit wallet history row.
* `creditRow`: Snippet of the credit wallet history row.
* `debitWallet`: Snippet of the debit wallet.
* `creditWallet`: Snippet of the credit wallet.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the debit wallet.

### wallet.transaction.failure

This event is published when a wallet transaction (transfer, reservation, or charge) fails before the transaction commits to the ledger. Because failed transactions are rolled back, this event is published immediately (not after commit).

**Event Type:** `wallet.transaction.failure`

**JSON Event Layout:**

```json
{
  "wallet": 51588,
  "otherWallet": 51200,
  "amount": -250.00,
  "sessionId": "e69a8767-ab47-44f3-8cdc-e168c41b0a31",
  "uniqueId": "FAIL-20240315-0042",
  "description": "Insufficient funds",
  "errorDescription": "Wallet balance 100.00 ZAR is less than requested debit 250.00 ZAR",
  "errorCode": "INSUFFICIENT_FUNDS",
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string",
    "otherWallet": "string"
  }
}
```

**Field Descriptions:**

* `wallet`: The ID of the wallet on which the transaction was attempted.
* `otherWallet`: The ID of the counterpart wallet (if applicable).
* `amount`: The attempted transaction amount (negative for debits).
* `sessionId`: The session identifier for the request.
* `uniqueId`: The unique identifier provided for the failed transaction.
* `description`: A human-readable description of the failure reason.
* `errorDescription`: Detailed error message from the system.
* `errorCode`: Machine-readable error code (e.g. `INSUFFICIENT_FUNDS`, `WALLET_BARRED`).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the primary wallet.
  * `otherWallet`: The ID of the counterpart wallet.

### wallet.history.fraud

This event is published when a fraud reference is set on a wallet history record — i.e. a completed transaction is subsequently flagged as fraudulent.

**Event Type:** `wallet.history.fraud`

**JSON Event Layout:**

```json
{
  "walletHistory": {
    "walletHistoryId": 99021,
    "walletId": 51588,
    "fraudReference": "FRAUD-REF-20240315-001"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `walletHistory`: The wallet history record that was flagged.
  * `walletHistoryId`: The ID of the wallet history record.
  * `walletId`: The ID of the wallet.
  * `fraudReference`: The fraud case reference number.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.mapping.delete

This event is published when a wallet mapping (e.g. a QR code or card linkage) is removed from a wallet.

**Event Type:** `wallet.mapping.delete`

**JSON Event Layout:**

```json
{
  "walletMapping": {
    "walletId": 51588,
    "mappingId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `walletMapping`: The wallet mapping that was deleted.
  * `walletId`: The ID of the wallet.
  * `mappingId`: The identifier of the mapping that was removed.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

### wallet.dormant.cancel

This event is published when a dormancy flag on a wallet is cancelled (i.e. the wallet becomes active again after a period of inactivity triggered dormancy).

**Event Type:** `wallet.dormant.cancel`

**JSON Event Layout:**

```json
{
  "wallet": {
    "walletId": 51588,
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "wallet": "string"
  }
}
```

**Field Descriptions:**

* `wallet`: The wallet whose dormant status was cancelled.
  * `walletId`: The ID of the wallet.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `wallet`: The ID of the wallet.

## eclipse-java/conductor

### proxy.card.movement

This event is published when a card movement occurs.

**Event Type:** `proxy.card.movement`

**JSON Event Layout (CardManagementPayload):**

```json
{
  "CardManagementPayload": "string",
  "tenantId": "string",
  "associatedEntity": {
    "card": "string"
  }
}
```

**JSON Event Layout (PostilionServiceRequest):**

```json
{
  "PostilionServiceRequest": "string",
  "tenantId": "string",
  "associatedEntity": {
    "card": "string"
  }
}
```

**Field Descriptions:**

* `CardManagementPayload`: The card management payload (sanitised JSON string).
* `PostilionServiceRequest`: The Postilion service request (sanitised JSON string).
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `card`: The ID of the card.

## reward-service

### reward.create

This event is published when a reward is created.

**Event Type:** `reward.create`

**JSON Event Layout:**

```json
{
  "reward": {
    "rewardId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "reward": "string"
  }
}
```

**Field Descriptions:**

* `reward`: The reward that was created.
  * `rewardId`: The ID of the reward.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `reward`: The ID of the reward.

### reward.complete

This event is published when a reward is completed.

**Event Type:** `reward.complete`

**JSON Event Layout:**

```json
{
  "reward": {
    "rewardId": "string",
    "tenantId": "string"
  },
  "tenantId": "string",
  "associatedEntity": {
    "reward": "string"
  }
}
```

**Field Descriptions:**

* `reward`: The reward that was completed.
  * `rewardId`: The ID of the reward.
  * `tenantId`: The ID of the tenant.
* `tenantId`: The ID of the tenant.
* `associatedEntity`:
  * `reward`: The ID of the reward.