# Webhook event reference

63 event types published by this platform, 60 of them with a settled payload contract.

## How to read this page

The envelope around every event is settled: see the webhook delivery guide for its fields, the signature scheme and the delivery semantics. What varies is the data body, and each event below says which of two kinds it sends. [Receiving webhooks](https://devportal-simpay-sbx.winkpg.io/docs/webhooks.md)

- **documented**: The body is a curated shape whose every field is deliberate. Fields are added only additively within envelope version 1, so you can bind to it.
- **contract pending**: The body isn't fixed yet. It's either the event's flat filter attributes or a projection of an internal record whose fields follow that record rather than a published contract. The event fires and the envelope holds, so treat the body as informational for now.

## API Keys

### `ApiKey.Expiring`

API Key Expiring (documented, any scope)

Published when an active API key is within the configured number of days of expiring (default 30), and again at each closer reminder threshold as expiry approaches (default 7 days and 1 day). The key's owner is also warned directly in their notifications.

| Field | Type | Nullable |
| --- | --- | --- |
| ApiKeyId | string | no |
| Name | string | no |
| OwnerUserId | string | no |
| ExpiresAtUtc | datetime | no |
| DaysRemaining | integer | no |
| ThresholdDays | integer | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "ApiKey.Expiring",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ApiKeyId": "11111111-1111-1111-1111-111111111111",
    "Name": "string",
    "OwnerUserId": "11111111-1111-1111-1111-111111111111",
    "ExpiresAtUtc": "2026-01-01T00:00:00Z",
    "DaysRemaining": 0,
    "ThresholdDays": 0
  }
}
```

## Campaigns

### `Campaign.Ended`

Campaign Ended (documented, merchant scope)

Published once when a campaign ends: because it reached its maximum number of payments or its maximum amount, or because a merchant user ended it. The reason rides on the event. A campaign whose scheduled window closes is not written to and does not publish this.

| Field | Type | Nullable |
| --- | --- | --- |
| CampaignId | string | no |
| CampaignName | string | yes |
| ExternalReference | string | yes |
| Kind | string | no |
| CompletedCount | integer | no |
| ApprovedTotal | number | no |
| RefundedTotal | number | no |
| NetTotal | number | no |
| GoalAmount | number | yes |
| MaxCompletions | integer | yes |
| MaxTotalAmount | number | yes |
| MilestonePercent | integer | yes |
| EndedReason | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Campaign.Ended",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "CampaignId": "11111111-1111-1111-1111-111111111111",
    "CampaignName": "string",
    "ExternalReference": "string",
    "Kind": "string",
    "CompletedCount": 0,
    "ApprovedTotal": 0,
    "RefundedTotal": 0,
    "NetTotal": 0,
    "GoalAmount": 0,
    "MaxCompletions": 0,
    "MaxTotalAmount": 0,
    "MilestonePercent": 0,
    "EndedReason": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Campaign.GoalReached`

Campaign Goal Reached (documented, merchant scope)

Published once per campaign when its net collected total reaches the goal amount. Reaching the goal never ends the campaign; subscribe to Campaign Ended for that.

| Field | Type | Nullable |
| --- | --- | --- |
| CampaignId | string | no |
| CampaignName | string | yes |
| ExternalReference | string | yes |
| Kind | string | no |
| CompletedCount | integer | no |
| ApprovedTotal | number | no |
| RefundedTotal | number | no |
| NetTotal | number | no |
| GoalAmount | number | yes |
| MaxCompletions | integer | yes |
| MaxTotalAmount | number | yes |
| MilestonePercent | integer | yes |
| EndedReason | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Campaign.GoalReached",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "CampaignId": "11111111-1111-1111-1111-111111111111",
    "CampaignName": "string",
    "ExternalReference": "string",
    "Kind": "string",
    "CompletedCount": 0,
    "ApprovedTotal": 0,
    "RefundedTotal": 0,
    "NetTotal": 0,
    "GoalAmount": 0,
    "MaxCompletions": 0,
    "MaxTotalAmount": 0,
    "MilestonePercent": 0,
    "EndedReason": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Campaign.Milestone`

Campaign Milestone Reached (documented, merchant scope)

Published once per campaign for each quarter of its goal amount (25, 50 and 75 percent) as the net collected total passes it. The goal itself is announced as Campaign Goal Reached. A campaign with no goal amount never publishes this.

| Field | Type | Nullable |
| --- | --- | --- |
| CampaignId | string | no |
| CampaignName | string | yes |
| ExternalReference | string | yes |
| Kind | string | no |
| CompletedCount | integer | no |
| ApprovedTotal | number | no |
| RefundedTotal | number | no |
| NetTotal | number | no |
| GoalAmount | number | yes |
| MaxCompletions | integer | yes |
| MaxTotalAmount | number | yes |
| MilestonePercent | integer | yes |
| EndedReason | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Campaign.Milestone",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "CampaignId": "11111111-1111-1111-1111-111111111111",
    "CampaignName": "string",
    "ExternalReference": "string",
    "Kind": "string",
    "CompletedCount": 0,
    "ApprovedTotal": 0,
    "RefundedTotal": 0,
    "NetTotal": 0,
    "GoalAmount": 0,
    "MaxCompletions": 0,
    "MaxTotalAmount": 0,
    "MilestonePercent": 0,
    "EndedReason": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Compliance

### `AchReturnRate.ThresholdApproaching`

ACH Return Rate Approaching Threshold (documented, merchant scope)

Published when a merchant's ACH return rate over the rolling window has reached the early-warning level for one of the three NACHA measures but is still at or below the cap. The merchant is inside the rule and trending at it. Subscribe to ACH Return Rate Threshold Breached for the point at which the rule is actually exceeded.

| Field | Type | Nullable |
| --- | --- | --- |
| MerchantId | string | no |
| ResellerId | string | no |
| Measure | string | no |
| Level | string | no |
| RatePercent | number | no |
| CapPercent | number | no |
| ReturnCount | integer | no |
| OriginatedDebitCount | integer | no |
| WindowStartDate | string | no |
| WindowEndDate | string | no |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "AchReturnRate.ThresholdApproaching",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Measure": "string",
    "Level": "string",
    "RatePercent": 0,
    "CapPercent": 0,
    "ReturnCount": 0,
    "OriginatedDebitCount": 0,
    "WindowStartDate": "string",
    "WindowEndDate": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `AchReturnRate.ThresholdBreached`

ACH Return Rate Threshold Breached (documented, merchant scope)

Published when a merchant's ACH return rate over the rolling window has gone above the cap in force for one of the three NACHA measures: unauthorized, administrative or overall. The cap defaults to the NACHA figure and can be set lower per merchant, so the payload carries the cap this evaluation actually measured against. Raised once per merchant, measure and window; a merchant that recovers and breaches again inside the same window is told a second time.

| Field | Type | Nullable |
| --- | --- | --- |
| MerchantId | string | no |
| ResellerId | string | no |
| Measure | string | no |
| Level | string | no |
| RatePercent | number | no |
| CapPercent | number | no |
| ReturnCount | integer | no |
| OriginatedDebitCount | integer | no |
| WindowStartDate | string | no |
| WindowEndDate | string | no |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "AchReturnRate.ThresholdBreached",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Measure": "string",
    "Level": "string",
    "RatePercent": 0,
    "CapPercent": 0,
    "ReturnCount": 0,
    "OriginatedDebitCount": 0,
    "WindowStartDate": "string",
    "WindowEndDate": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Hosted Payment Page

### `HostedPaymentPage.AchSaved`

HPP ACH Saved (documented, merchant scope)

Published when a payer saves a bank account on a Hosted Payment Page without being charged (the save-only ACH flow). Carries the chargeable payment token public reference and bank display data (account type, last four); never the internal vault id and never the full routing or account number.

| Field | Type | Nullable |
| --- | --- | --- |
| MethodType | string | no |
| PaymentTokenPublicReference | string | yes |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| SessionId | string | yes |
| VerificationTransactionId | string | yes |
| CustomerId | string | yes |
| StoredCredentialConsentId | string | yes |
| CardLast4 | string | yes |
| CardBrand | string | yes |
| CardBin | string | yes |
| CardFundingSource | string | yes |
| CardExpirationMonth | integer | yes |
| CardExpirationYear | integer | yes |
| BankAccountLast4 | string | yes |
| BankAccountType | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.AchSaved",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "MethodType": "string",
    "PaymentTokenPublicReference": "string",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "SessionId": "string",
    "VerificationTransactionId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "StoredCredentialConsentId": "11111111-1111-1111-1111-111111111111",
    "CardLast4": "string",
    "CardBrand": "string",
    "CardBin": "string",
    "CardFundingSource": "string",
    "CardExpirationMonth": 0,
    "CardExpirationYear": 0,
    "BankAccountLast4": "string",
    "BankAccountType": "string"
  }
}
```

### `HostedPaymentPage.CardSaved`

HPP Card Saved (documented, merchant scope)

Published when a cardholder saves a card on a Hosted Payment Page without being charged (the save-card-only flow). Carries the chargeable payment token public reference, the card display data (brand, last four, leading digits, funding source) and the card's expiration month and year; never the full card number and never the internal vault id.

| Field | Type | Nullable |
| --- | --- | --- |
| MethodType | string | no |
| PaymentTokenPublicReference | string | yes |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| SessionId | string | yes |
| VerificationTransactionId | string | yes |
| CustomerId | string | yes |
| StoredCredentialConsentId | string | yes |
| CardLast4 | string | yes |
| CardBrand | string | yes |
| CardBin | string | yes |
| CardFundingSource | string | yes |
| CardExpirationMonth | integer | yes |
| CardExpirationYear | integer | yes |
| BankAccountLast4 | string | yes |
| BankAccountType | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.CardSaved",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "MethodType": "string",
    "PaymentTokenPublicReference": "string",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "SessionId": "string",
    "VerificationTransactionId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "StoredCredentialConsentId": "11111111-1111-1111-1111-111111111111",
    "CardLast4": "string",
    "CardBrand": "string",
    "CardBin": "string",
    "CardFundingSource": "string",
    "CardExpirationMonth": 0,
    "CardExpirationYear": 0,
    "BankAccountLast4": "string",
    "BankAccountType": "string"
  }
}
```

### `HostedPaymentPage.ConsentCaptureFailed`

HPP Consent Capture Failed (documented, merchant scope)

Published when an HPP session's stored-credential consent capture fails after the CIT was approved. The cardholder was charged, but the consent record / token / customer linkage did not land; operator reconciliation is required before a follow-up MIT can run.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| SessionId | string | no |
| HostedPageId | string | yes |
| HostedPageName | string | yes |
| WasConsentRequired | boolean | no |
| FailureCategory | string | no |
| ExceptionTypeName | string | yes |
| FailedAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.ConsentCaptureFailed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "WasConsentRequired": false,
    "FailureCategory": "string",
    "ExceptionTypeName": "string",
    "FailedAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `HostedPaymentPage.ContractCreationFailed`

HPP Recurring Contract Creation Failed (documented, merchant scope)

Published when a Save-Card-with-Initial-Charge HPP page charged the initial payment and vaulted the card, but creating the recurring contract from the referenced plan failed. The cardholder was charged and the card stored, but the recurring schedule does not exist; operator reconciliation is required.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| SessionId | string | no |
| HostedPageId | string | yes |
| CustomerId | string | no |
| FailureCategory | string | no |
| ExceptionTypeName | string | yes |
| FailedAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.ContractCreationFailed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "FailureCategory": "string",
    "ExceptionTypeName": "string",
    "FailedAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `HostedPaymentPage.EmbeddingViolation`

HPP Embedding Violation (documented, merchant scope)

Published when an HPP allowlist violation is detected. Server-side path (Source=SessionApi) is deterministic. Browser-side path (Source=BrowserCsp) is best-effort: not all browsers report.

| Field | Type | Nullable |
| --- | --- | --- |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| AttemptedHost | string | no |
| Source | string | no |
| AllowedDomains | array | no |
| DetectedAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.EmbeddingViolation",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "AttemptedHost": "string",
    "Source": "string",
    "AllowedDomains": [
      "string"
    ],
    "DetectedAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `HostedPaymentPage.FinalizationFailed`

HPP Finalization Failed (documented, merchant scope)

Published when a hosted page authorized a payment and then failed in the gateway's post-authorization finalization stage. The cardholder was charged and the authorization is not reversed, but the payer was shown a generic failure screen; reconcile the charge and decide whether to keep or reverse it.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | yes |
| SubmittedTransactionId | string | no |
| SessionId | string | no |
| HostedPageId | string | yes |
| StageName | string | no |
| FailureCategory | string | no |
| ExceptionTypeName | string | yes |
| FailedAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.FinalizationFailed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "SubmittedTransactionId": "11111111-1111-1111-1111-111111111111",
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "StageName": "string",
    "FailureCategory": "string",
    "ExceptionTypeName": "string",
    "FailedAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `HostedPaymentPage.Session.Cancelled`

HPP Payment Link Cancelled (documented, merchant scope)

Published when the page embedding a hosted payment form cancels its own checkout over the two-way command channel. On a reusable link this closes one payer's visit rather than the shared link itself.

| Field | Type | Nullable |
| --- | --- | --- |
| SessionId | string | no |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| Label | string | yes |
| CorrelationId | string | yes |
| LinkLifetime | string | yes |
| ExpiresAt | datetime | yes |
| Reusable | boolean | no |
| MaxCompletions | integer | yes |
| CompletionCount | integer | no |
| OccurredAtUtc | datetime | no |
| InactiveMessage | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.Session.Cancelled",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "Label": "string",
    "CorrelationId": "string",
    "LinkLifetime": "string",
    "ExpiresAt": "2026-01-01T00:00:00Z",
    "Reusable": false,
    "MaxCompletions": 0,
    "CompletionCount": 0,
    "OccurredAtUtc": "2026-01-01T00:00:00Z",
    "InactiveMessage": "string"
  }
}
```

### `HostedPaymentPage.Session.Expired`

HPP Payment Link Expired (documented, merchant scope)

Published when a payment link reaches its expiry instant without being paid, revoked or cancelled. The signal an abandoned-cart recovery integration keys on. Emitted by a periodic sweep rather than at the expiry instant, because nothing writes when a link expires, so it arrives shortly after the link stopped being payable.

| Field | Type | Nullable |
| --- | --- | --- |
| SessionId | string | no |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| Label | string | yes |
| CorrelationId | string | yes |
| LinkLifetime | string | yes |
| ExpiresAt | datetime | yes |
| Reusable | boolean | no |
| MaxCompletions | integer | yes |
| CompletionCount | integer | no |
| OccurredAtUtc | datetime | no |
| InactiveMessage | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.Session.Expired",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "Label": "string",
    "CorrelationId": "string",
    "LinkLifetime": "string",
    "ExpiresAt": "2026-01-01T00:00:00Z",
    "Reusable": false,
    "MaxCompletions": 0,
    "CompletionCount": 0,
    "OccurredAtUtc": "2026-01-01T00:00:00Z",
    "InactiveMessage": "string"
  }
}
```

### `HostedPaymentPage.Session.Paused`

HPP Payment Link Paused (documented, merchant scope)

Published when a merchant pauses a payment link. Reversible: the link stays intact and stops being payable until it is resumed, so treat it as a hold rather than as an ending.

| Field | Type | Nullable |
| --- | --- | --- |
| SessionId | string | no |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| Label | string | yes |
| CorrelationId | string | yes |
| LinkLifetime | string | yes |
| ExpiresAt | datetime | yes |
| Reusable | boolean | no |
| MaxCompletions | integer | yes |
| CompletionCount | integer | no |
| OccurredAtUtc | datetime | no |
| InactiveMessage | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.Session.Paused",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "Label": "string",
    "CorrelationId": "string",
    "LinkLifetime": "string",
    "ExpiresAt": "2026-01-01T00:00:00Z",
    "Reusable": false,
    "MaxCompletions": 0,
    "CompletionCount": 0,
    "OccurredAtUtc": "2026-01-01T00:00:00Z",
    "InactiveMessage": "string"
  }
}
```

### `HostedPaymentPage.Session.Resumed`

HPP Payment Link Resumed (documented, merchant scope)

Published when a merchant resumes a paused payment link. Resuming extends nothing, so a link resumed after its expiry instant has passed is still expired.

| Field | Type | Nullable |
| --- | --- | --- |
| SessionId | string | no |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| Label | string | yes |
| CorrelationId | string | yes |
| LinkLifetime | string | yes |
| ExpiresAt | datetime | yes |
| Reusable | boolean | no |
| MaxCompletions | integer | yes |
| CompletionCount | integer | no |
| OccurredAtUtc | datetime | no |
| InactiveMessage | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.Session.Resumed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "Label": "string",
    "CorrelationId": "string",
    "LinkLifetime": "string",
    "ExpiresAt": "2026-01-01T00:00:00Z",
    "Reusable": false,
    "MaxCompletions": 0,
    "CompletionCount": 0,
    "OccurredAtUtc": "2026-01-01T00:00:00Z",
    "InactiveMessage": "string"
  }
}
```

### `HostedPaymentPage.Session.Revoked`

HPP Payment Link Revoked (documented, merchant scope)

Published when a merchant or administrator revokes a payment link, ending it for good. A revoked link is not payable again and cannot be resumed.

| Field | Type | Nullable |
| --- | --- | --- |
| SessionId | string | no |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| Label | string | yes |
| CorrelationId | string | yes |
| LinkLifetime | string | yes |
| ExpiresAt | datetime | yes |
| Reusable | boolean | no |
| MaxCompletions | integer | yes |
| CompletionCount | integer | no |
| OccurredAtUtc | datetime | no |
| InactiveMessage | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.Session.Revoked",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "SessionId": "11111111-1111-1111-1111-111111111111",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "Label": "string",
    "CorrelationId": "string",
    "LinkLifetime": "string",
    "ExpiresAt": "2026-01-01T00:00:00Z",
    "Reusable": false,
    "MaxCompletions": 0,
    "CompletionCount": 0,
    "OccurredAtUtc": "2026-01-01T00:00:00Z",
    "InactiveMessage": "string"
  }
}
```

### `HostedPaymentPage.Transaction.Completed`

HPP Transaction Completed (contract pending, merchant scope)

Published when a transaction is completed on a Hosted Payment Page (any outcome: approved, declined, or failed).

## Invoicing

### `Invoice.Cancelled`

Invoice Cancelled (documented, merchant scope)

Published when a draft invoice is cancelled.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Cancelled",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Closed`

Invoice Closed (documented, merchant scope)

Published when an invoice is closed: a manual write-off or the dunning end action.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Closed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Issued`

Invoice Issued (documented, merchant scope)

Published when a draft invoice is issued: locked, assigned an invoice number, and given a due date.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Issued",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Paid`

Invoice Paid (documented, merchant scope)

Published when the invoice balance reaches zero (within the configured tolerance).

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Paid",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.PartiallyPaid`

Invoice Partially Paid (documented, merchant scope)

Published when a partial payment is applied and a balance remains due.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.PartiallyPaid",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.PastDue`

Invoice Past Due (documented, merchant scope)

Published when the reminder sweep transitions an overdue invoice to past due.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.PastDue",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.PaymentFailed`

Invoice Payment Failed (documented, merchant scope)

Published when a payment attempt against an invoice is declined: auto-collect, smart retry, installment collection, or a pay-by-link decline.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.PaymentFailed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Sent`

Invoice Sent (documented, merchant scope)

Published when an invoice is sent (or marked sent) to the recipient.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Sent",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Uncollectible`

Invoice Uncollectible (documented, merchant scope)

Published when dunning is exhausted and the invoice is marked uncollectible.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Uncollectible",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Viewed`

Invoice Viewed (documented, merchant scope)

Published on the recipient's first view of the invoice (hosted page or API).

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Viewed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Merchants

### `Merchant.Activated`

Merchant Activated (documented, merchant scope)

Published when a merchant is activated for transaction processing.

| Field | Type | Nullable |
| --- | --- | --- |
| Id | string | no |
| ResellerId | string | no |
| Name | string | yes |
| Dba | string | yes |
| IsActive | boolean | no |
| IsTest | boolean | no |
| Environment | integer | no |
| CreationTime | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Merchant.Activated",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "Id": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Name": "string",
    "Dba": "string",
    "IsActive": false,
    "IsTest": false,
    "Environment": 0,
    "CreationTime": "2026-01-01T00:00:00Z"
  }
}
```

### `Merchant.Created`

Merchant Created (documented, merchant scope)

Published when a new merchant is created in the system.

| Field | Type | Nullable |
| --- | --- | --- |
| Id | string | no |
| ResellerId | string | no |
| Name | string | yes |
| Dba | string | yes |
| IsActive | boolean | no |
| IsTest | boolean | no |
| Environment | integer | no |
| CreationTime | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Merchant.Created",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "Id": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Name": "string",
    "Dba": "string",
    "IsActive": false,
    "IsTest": false,
    "Environment": 0,
    "CreationTime": "2026-01-01T00:00:00Z"
  }
}
```

### `Merchant.Deactivated`

Merchant Deactivated (documented, merchant scope)

Published when a merchant is deactivated and can no longer process transactions.

| Field | Type | Nullable |
| --- | --- | --- |
| Id | string | no |
| ResellerId | string | no |
| Name | string | yes |
| Dba | string | yes |
| IsActive | boolean | no |
| IsTest | boolean | no |
| Environment | integer | no |
| CreationTime | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Merchant.Deactivated",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "Id": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Name": "string",
    "Dba": "string",
    "IsActive": false,
    "IsTest": false,
    "Environment": 0,
    "CreationTime": "2026-01-01T00:00:00Z"
  }
}
```

### `Merchant.Updated`

Merchant Updated (documented, merchant scope)

Published when a merchant's profile or configuration is updated.

| Field | Type | Nullable |
| --- | --- | --- |
| Id | string | no |
| ResellerId | string | no |
| Name | string | yes |
| Dba | string | yes |
| IsActive | boolean | no |
| IsTest | boolean | no |
| Environment | integer | no |
| CreationTime | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Merchant.Updated",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "Id": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Name": "string",
    "Dba": "string",
    "IsActive": false,
    "IsTest": false,
    "Environment": 0,
    "CreationTime": "2026-01-01T00:00:00Z"
  }
}
```

## Notifications

### `Notification.DestinationSuppressed`

Destination Suppressed (documented, any scope)

Published when a notification destination endpoint is automatically suppressed after sustained delivery failures.

| Field | Type | Nullable |
| --- | --- | --- |
| SuppressionId | string | no |
| DestinationId | string | yes |
| DestinationName | string | yes |
| DestinationType | string | no |
| RedactedEndpoint | string | no |
| Reason | string | no |
| Scope | string | no |
| SuppressionsUrl | string | no |
| SuppressedAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Notification.DestinationSuppressed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "SuppressionId": "11111111-1111-1111-1111-111111111111",
    "DestinationId": "11111111-1111-1111-1111-111111111111",
    "DestinationName": "string",
    "DestinationType": "string",
    "RedactedEndpoint": "string",
    "Reason": "string",
    "Scope": "string",
    "SuppressionsUrl": "string",
    "SuppressedAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Payment Encryption

### `PaymentEncryption.HealthAlert`

Payment Encryption Health Alert (documented, any scope)

Published by the scheduled payment encryption liveness probe when a provider endpoint stops answering or becomes too slow, when it recovers, and when the client certificate used to reach it expires within 30 days. Raised once per transition, not once per probe.

| Field | Type | Nullable |
| --- | --- | --- |
| ProviderName | string | no |
| EndpointHost | string | no |
| Region | string | no |
| Kind | string | no |
| Reason | string | no |
| ObservedAtUtc | datetime | no |
| ConsecutiveFailures | integer | no |
| LastRoundTripMilliseconds | number | yes |
| P90RoundTripMilliseconds | number | yes |
| LatencyThresholdMilliseconds | integer | no |
| LastSuccessUtc | datetime | yes |
| CertificateNotAfterUtc | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "PaymentEncryption.HealthAlert",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ProviderName": "string",
    "EndpointHost": "string",
    "Region": "string",
    "Kind": "string",
    "Reason": "string",
    "ObservedAtUtc": "2026-01-01T00:00:00Z",
    "ConsecutiveFailures": 0,
    "LastRoundTripMilliseconds": 0,
    "P90RoundTripMilliseconds": 0,
    "LatencyThresholdMilliseconds": 0,
    "LastSuccessUtc": "2026-01-01T00:00:00Z",
    "CertificateNotAfterUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Platform status

### `PlatformStatus.IncidentCleared`

Platform Incident Cleared (documented, any scope)

Published when an operator takes the incident notice down, which is the platform's resolution signal. The body carries the severity the notice was cleared from, so a subscriber can close out the incident it opened without holding its own state.

| Field | Type | Nullable |
| --- | --- | --- |
| Change | string | no |
| Title | string | yes |
| Message | string | yes |
| Severity | string | yes |
| PreviousSeverity | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "PlatformStatus.IncidentCleared",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": null,
  "resellerId": null,
  "merchantId": null,
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "Change": "string",
    "Title": "string",
    "Message": "string",
    "Severity": "string",
    "PreviousSeverity": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `PlatformStatus.IncidentPosted`

Platform Incident Posted (documented, any scope)

Published when an operator posts an incident notice on the public status page where none was up. The notice's severity is the level the operator is asserting for the platform, which can only escalate the reading the automated component checks produce, never soften it.

| Field | Type | Nullable |
| --- | --- | --- |
| Change | string | no |
| Title | string | yes |
| Message | string | yes |
| Severity | string | yes |
| PreviousSeverity | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "PlatformStatus.IncidentPosted",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": null,
  "resellerId": null,
  "merchantId": null,
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "Change": "string",
    "Title": "string",
    "Message": "string",
    "Severity": "string",
    "PreviousSeverity": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `PlatformStatus.IncidentUpdated`

Platform Incident Updated (documented, any scope)

Published when an operator changes the incident notice that is already posted: its message, its title, or its severity. Subscribe to this to follow an incident as it develops; subscribe to the posted and cleared events alone for just the bookends.

| Field | Type | Nullable |
| --- | --- | --- |
| Change | string | no |
| Title | string | yes |
| Message | string | yes |
| Severity | string | yes |
| PreviousSeverity | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "PlatformStatus.IncidentUpdated",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": null,
  "resellerId": null,
  "merchantId": null,
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "Change": "string",
    "Title": "string",
    "Message": "string",
    "Severity": "string",
    "PreviousSeverity": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Recurring Billing

### `RecurringBilling.ChargeFailed`

Recurring Charge Failed (documented, merchant scope)

Published when a scheduled recurring charge is declined or errors during processing. Carries the failure reason and the processor's stable response code.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ChargeFailed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

### `RecurringBilling.ChargeSucceeded`

Recurring Charge Succeeded (documented, merchant scope)

Published when a scheduled recurring charge is approved by the payment processor. Fires for every real charge (a transaction was created), independent of the contract's approval-email toggles.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ChargeSucceeded",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

### `RecurringBilling.ContractEnded`

Recurring Contract Ended (documented, merchant scope)

Published when a recurring contract reaches its natural end (schedule or threshold rules) and will no longer bill.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ContractEnded",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

### `RecurringBilling.ContractSuspended`

Recurring Contract Suspended (documented, merchant scope)

Published when a recurring contract is suspended after repeated failures (or manual intervention) and billing is paused.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ContractSuspended",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

## Surcharging

### `Surcharging.Configuration.Activated`

Surcharging Activated (documented, reseller scope and above)

Published when a merchant's surcharging goes live: the daily waiting-period sweep promotes it, or it is enabled, re-enabled, or force-enabled. The activation source says which. It can repeat for a merchant that stayed live, because filing a new notice starts a fresh waiting period and the sweep promotes the merchant again when it ends, so treat it as the current state rather than a one-time transition. A reseller-scope subscription receives it only for a merchant whose surcharge configuration carries its reseller. A configuration that has not been saved since that value was recorded delivers to merchant-scope and tenant-wide subscriptions only.

| Field | Type | Nullable |
| --- | --- | --- |
| ConfigurationId | string | no |
| MerchantId | string | no |
| ResellerId | string | yes |
| Status | string | no |
| IsEnabled | boolean | no |
| DefaultRate | number | yes |
| WaitingPeriodExpiresAt | datetime | yes |
| IsPromotionHeld | boolean | no |
| PromotionHeldAt | datetime | yes |
| ActivationSource | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Surcharging.Configuration.Activated",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ConfigurationId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "IsEnabled": false,
    "DefaultRate": 0,
    "WaitingPeriodExpiresAt": "2026-01-01T00:00:00Z",
    "IsPromotionHeld": false,
    "PromotionHeldAt": "2026-01-01T00:00:00Z",
    "ActivationSource": "string"
  }
}
```

### `Surcharging.Configuration.Deactivated`

Surcharging Deactivated (documented, reseller scope and above)

Published when a merchant's surcharging is disabled. Turning it back on needs a re-enable, which requires a fresh notice if the processor changed. A reseller-scope subscription receives it only for a merchant whose surcharge configuration carries its reseller. A configuration that has not been saved since that value was recorded delivers to merchant-scope and tenant-wide subscriptions only.

| Field | Type | Nullable |
| --- | --- | --- |
| ConfigurationId | string | no |
| MerchantId | string | no |
| ResellerId | string | yes |
| Status | string | no |
| IsEnabled | boolean | no |
| DefaultRate | number | yes |
| WaitingPeriodExpiresAt | datetime | yes |
| IsPromotionHeld | boolean | no |
| PromotionHeldAt | datetime | yes |
| ActivationSource | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Surcharging.Configuration.Deactivated",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ConfigurationId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "IsEnabled": false,
    "DefaultRate": 0,
    "WaitingPeriodExpiresAt": "2026-01-01T00:00:00Z",
    "IsPromotionHeld": false,
    "PromotionHeldAt": "2026-01-01T00:00:00Z",
    "ActivationSource": "string"
  }
}
```

### `Surcharging.Configuration.PromotionHoldPlaced`

Surcharging Promotion Hold Placed (documented, reseller scope and above)

Published when a promotion hold is placed on a merchant, withholding it from activation until the hold is released. The waiting period keeps running underneath the hold. Placing a hold on a merchant that is already held publishes nothing. A reseller-scope subscription receives it only for a merchant whose surcharge configuration carries its reseller. A configuration that has not been saved since that value was recorded delivers to merchant-scope and tenant-wide subscriptions only.

| Field | Type | Nullable |
| --- | --- | --- |
| ConfigurationId | string | no |
| MerchantId | string | no |
| ResellerId | string | yes |
| Status | string | no |
| IsEnabled | boolean | no |
| DefaultRate | number | yes |
| WaitingPeriodExpiresAt | datetime | yes |
| IsPromotionHeld | boolean | no |
| PromotionHeldAt | datetime | yes |
| ActivationSource | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Surcharging.Configuration.PromotionHoldPlaced",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ConfigurationId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "IsEnabled": false,
    "DefaultRate": 0,
    "WaitingPeriodExpiresAt": "2026-01-01T00:00:00Z",
    "IsPromotionHeld": false,
    "PromotionHeldAt": "2026-01-01T00:00:00Z",
    "ActivationSource": "string"
  }
}
```

### `Surcharging.Configuration.PromotionHoldReleased`

Surcharging Promotion Hold Released (documented, reseller scope and above)

Published when the promotion hold on a merchant is released. If its waiting period has already ended, the next daily sweep activates it. Releasing a merchant that is not held publishes nothing. A reseller-scope subscription receives it only for a merchant whose surcharge configuration carries its reseller. A configuration that has not been saved since that value was recorded delivers to merchant-scope and tenant-wide subscriptions only.

| Field | Type | Nullable |
| --- | --- | --- |
| ConfigurationId | string | no |
| MerchantId | string | no |
| ResellerId | string | yes |
| Status | string | no |
| IsEnabled | boolean | no |
| DefaultRate | number | yes |
| WaitingPeriodExpiresAt | datetime | yes |
| IsPromotionHeld | boolean | no |
| PromotionHeldAt | datetime | yes |
| ActivationSource | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Surcharging.Configuration.PromotionHoldReleased",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ConfigurationId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "IsEnabled": false,
    "DefaultRate": 0,
    "WaitingPeriodExpiresAt": "2026-01-01T00:00:00Z",
    "IsPromotionHeld": false,
    "PromotionHeldAt": "2026-01-01T00:00:00Z",
    "ActivationSource": "string"
  }
}
```

### `Surcharging.Configuration.WaitingPeriodStarted`

Surcharging Waiting Period Started (documented, reseller scope and above)

Published when a surcharge notice is filed for a merchant, which starts the notice waiting period. Filing a notice for a merchant that is already surcharging takes it off surcharging until the new period ends. A reseller-scope subscription receives it only for a merchant whose surcharge configuration carries its reseller. A configuration that has not been saved since that value was recorded delivers to merchant-scope and tenant-wide subscriptions only.

| Field | Type | Nullable |
| --- | --- | --- |
| ConfigurationId | string | no |
| MerchantId | string | no |
| ResellerId | string | yes |
| Status | string | no |
| IsEnabled | boolean | no |
| DefaultRate | number | yes |
| WaitingPeriodExpiresAt | datetime | yes |
| IsPromotionHeld | boolean | no |
| PromotionHeldAt | datetime | yes |
| ActivationSource | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Surcharging.Configuration.WaitingPeriodStarted",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ConfigurationId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ResellerId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "IsEnabled": false,
    "DefaultRate": 0,
    "WaitingPeriodExpiresAt": "2026-01-01T00:00:00Z",
    "IsPromotionHeld": false,
    "PromotionHeldAt": "2026-01-01T00:00:00Z",
    "ActivationSource": "string"
  }
}
```

## Transactions

### `Transaction.AchStatusChanged`

ACH Status Changed (documented, merchant scope)

Published on each ACH settlement-status change (settled, returned, voided, or failed).

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| PreviousStatus | string | yes |
| NewStatus | string | no |
| ReturnCode | string | yes |
| ReturnReason | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.AchStatusChanged",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "PreviousStatus": "string",
    "NewStatus": "string",
    "ReturnCode": "string",
    "ReturnReason": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Authorized`

Transaction Authorized (documented, merchant scope)

Published when a payment authorization is approved by the processor or issuer.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Authorized",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Captured`

Transaction Captured (documented, merchant scope)

Published when an authorized transaction is captured for settlement. This is gateway bookkeeping, not money movement: no shipped card processor has an online capture message, and funds move at batch settlement. Subscribe to Transaction.Settled for the funds signal.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Captured",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Declined`

Transaction Declined (documented, merchant scope)

Published when the issuer, the processor, or a fraud or policy rule refused the payment. Distinct from Transaction.Failed, which means the gateway could not process the request at all: a decline will not succeed on a retry of the same card unchanged.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Declined",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.DisputeOpened`

Transaction Dispute Opened (documented, merchant scope)

Published when a payer opens a dispute on an alternative payment (PayPal or Afterpay), with the provider's case id, the reason, the disputed amount and the response due date when the provider reports them.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| ProviderKey | string | no |
| ProviderCaseId | string | yes |
| Reason | string | yes |
| DisputedAmount | number | yes |
| Currency | string | yes |
| ResponseDueAtUtc | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.DisputeOpened",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "ProviderKey": "string",
    "ProviderCaseId": "string",
    "Reason": "string",
    "DisputedAmount": 0,
    "Currency": "string",
    "ResponseDueAtUtc": "2026-01-01T00:00:00Z",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Failed`

Transaction Failed (documented, merchant scope)

Published when the gateway could not process the transaction (a processor timeout, an unreachable host, a configuration gap, or invalid request data). Distinct from Transaction.Declined, which means the payment was refused.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Failed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.PartiallyApproved`

Transaction Partially Approved (documented, merchant scope)

Published when the issuer approves less than the requested amount. The payload carries the requested and authorized amounts, the balance still due, and the disposition the gateway resolved: Accepted (the reduced amount stands), Voided (the authorization is being released), or Pending (an operator must accept the reduced amount before a deadline). This event is not sent again when a Pending disposition moves. A void, including the automatic void when the deadline passes, arrives as Transaction.Voided with a VoidReasonCode that names the partial-approval reason.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| RequestedAmount | number | yes |
| AuthorizedAmount | number | yes |
| BalanceDue | number | yes |
| Disposition | string | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.PartiallyApproved",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "RequestedAmount": 0,
    "AuthorizedAmount": 0,
    "BalanceDue": 0,
    "Disposition": "string"
  }
}
```

### `Transaction.Returned`

Transaction Returned (ACH) (documented, merchant scope)

Published when an ACH transaction is returned by the receiving bank (NACHA return code), including a late return after settlement.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| SettlementStatus | string | no |
| ReturnCode | string | yes |
| ReturnReason | string | yes |
| EffectiveEntryDate | string | yes |
| IsLateReturn | boolean | no |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Returned",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "SettlementStatus": "string",
    "ReturnCode": "string",
    "ReturnReason": "string",
    "EffectiveEntryDate": "string",
    "IsLateReturn": false,
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Reversed`

Transaction Reversed (documented, merchant scope)

Published when an authorization is reversed online, in full or in part. A partial reversal leaves a live authorization for the remaining amount: compare the payload's AuthorizedAmount and CumulativeReversedAmount, or read IsPartialReversal.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Reversed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.ReviewApproved`

Transaction Review Approved (documented, merchant scope)

Published when a reviewer releases a held transaction, or when the hold deadline elapsed and the merchant configured an approve on expiry (ReviewExpired tells the two apart). This means the hold was lifted, not that the payment succeeded: authorization runs next and can still be declined, so wait for Transaction.Authorized before fulfilling. Approve on expiry is best effort. When no orchestration survives to run the authorization, the backstop sweep reclaims the hold and can only decline it, which delivers Transaction.ReviewDeclined instead.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.ReviewApproved",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.ReviewDeclined`

Transaction Review Declined (documented, merchant scope)

Published when a reviewer rejects a held transaction, when the deadline elapsed under a decline on expiry, or when the backstop sweep reclaims a hold nobody answered (ReviewExpired is true for both expiry cases). This arrives alongside the existing Transaction.Declined, which is published for the same refusal: subscribe to both and you receive two events for one declined review, which is intended. DeclineReasonCode is REVIEW_DECLINED for a reviewer decision and REVIEW_EXPIRED for an expiry.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.ReviewDeclined",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.ReviewHeld`

Transaction Held for Review (documented, merchant scope)

Published when fraud screening parks a transaction for manual review instead of authorizing it. The payment has not been approved or refused yet: it is waiting for a person, and the payload carries the review deadline, the screening provider that triggered the hold, and the risk score behind it. A hold always resolves, either through Transaction.ReviewApproved or through Transaction.ReviewDeclined.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.ReviewHeld",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Settled`

Transaction Settled (documented, merchant scope)

Published when a captured card transaction completes settlement and the funds move. This is the funds signal, arriving hours after Transaction.Captured, and it carries the settled-at timestamp plus the gateway, processor and closed settlement batch identifiers. ClosedSettlementBatchId is the per-batch grouping key, because one settlement run can close a batch per processor; it is null on the single-shot settle path, where the gateway and processor batch identifiers are the fallback. An operator rollback followed by a re-settle delivers a second event. ACH transactions do not settle through this pipeline: subscribe to Transaction.AchStatusChanged for those.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Settled",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Voided`

Transaction Voided (documented, merchant scope)

Published when an authorization is cancelled in full before capture.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| VoidReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| ClosedSettlementBatchId | string | yes |
| ReviewHeldAtUtc | datetime | yes |
| ReviewDeadlineUtc | datetime | yes |
| ReviewExpired | boolean | yes |
| ReviewProviderId | string | yes |
| ReviewProviderName | string | yes |
| ReviewScore | number | yes |
| EnhancedDataQualification | object | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Voided",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "VoidReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "ClosedSettlementBatchId": "11111111-1111-1111-1111-111111111111",
    "ReviewHeldAtUtc": "2026-01-01T00:00:00Z",
    "ReviewDeadlineUtc": "2026-01-01T00:00:00Z",
    "ReviewExpired": false,
    "ReviewProviderId": "string",
    "ReviewProviderName": "string",
    "ReviewScore": 0,
    "EnhancedDataQualification": {
      "AttemptedLevel": "string",
      "EmittedLevel": "string",
      "GateReason": "string",
      "Findings": [
        {
          "Code": "string",
          "LineIndex": 0
        }
      ],
      "FindingCount": 0,
      "Processor": "string",
      "EvaluatorVersion": 0,
      "EvaluatedAt": "2026-01-01T00:00:00Z"
    },
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Trials

### `Trial.Expired`

Trial Expired (contract pending, merchant scope)

Published when a merchant's time-limited plan reaches its deadline and the merchant is suspended. Its API keys stay valid and are refused until the trial is extended. Raised once per trial, not once per sweep.

### `Trial.ExpiryApproaching`

Trial Expiry Approaching (contract pending, merchant scope)

Published when a merchant on a time-limited plan comes within a configured number of days of its deadline (default 7 days and 1 day). Raised at most once per threshold per trial, and a merchant already inside several thresholds raises one reminder at the most urgent of them.

## Usage

### `Usage.Threshold.Reached`

Usage Threshold Reached (documented, merchant scope)

Published when a merchant's usage of a metered SKU crosses a configured percentage of the entitlement's included quantity (default 80% and 100%).

| Field | Type | Nullable |
| --- | --- | --- |
| SkuCode | string | no |
| PeriodKey | string | no |
| ThresholdPercent | integer | no |
| UsedQuantity | integer | no |
| IncludedQuantity | integer | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Usage.Threshold.Reached",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": null,
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "SkuCode": "string",
    "PeriodKey": "string",
    "ThresholdPercent": 0,
    "UsedQuantity": 0,
    "IncludedQuantity": 0
  }
}
```

## Events whose body isn't settled yet

These events deliver, and their envelope is the same as any other. Their data body isn't contractual, so no example is published for them: a made-up one would read as a promise.

- `HostedPaymentPage.Transaction.Completed` (HPP Transaction Completed)
- `Trial.Expired` (Trial Expired)
- `Trial.ExpiryApproaching` (Trial Expiry Approaching)

- [Receiving webhooks](https://devportal-simpay-sbx.winkpg.io/docs/webhooks.md): the envelope, signature verification, idempotency, retries and suppression.

## See also

- [All documentation](https://devportal-simpay-sbx.winkpg.io/llms.txt): the machine-readable index of every public page on this site.
