# Event Types

Learn the different event types.

The following event types are available. Please note that some event types are restricted to certain types of webhook
subscription.

| Event type | Profile subscriptions | Application subscriptions |
|  --- | --- | --- |
| [transfers#state-change](#transfer-state-change) | supported | supported |
| [transfers#active-cases](#transfer-active-cases) | supported | supported |
| [account-details-payment#state-change](#account-details-payment-state-change) | supported | supported |
| [balances#credit](#balance-credit-event) | supported | not supported |
| [balances#update](#balance-update-event) | supported | supported |
| [balances#account-state-change](#balance-account-state-change-event) | not supported | supported |
| [profiles#verification-state-change](#verification-state-change-event) | not supported | supported |
| [batch-payment-initiations#state-change](#batch-payment-initiations-state-change-event) | not supported | supported |
| [transfers#payout-failure](#transfer-payout-failure) | supported | supported |
| [transfers#refund](#transfer-refund) | supported | supported |
| [swift-in#credit](#swift-in-credit) | supported | supported |
| [swift#message-received](#swift-message-received) | supported | supported |
| [cards#transaction-state-change](#cards-transaction-state-change) | not supported | supported |
| [profiles#cdd-check-state-change](#cdd-check-state-change) | not supported | supported |
| [cards#card-status-change](#cards-card-status-change) | not supported | supported |
| [cards#card-order-status-change](#cards-card-order-status-change) | not supported | supported |
| [cards#card-production-status-change](#cards-card-production-status-change) | not supported | supported |
| [cards#manual-provisioning-verification](#cards-manual-provisioning-verification) | not supported | supported |
| [partner-support#case-changed](#partner-support-case-changed) | not supported | supported |
| [transaction-disputes#update](#transaction-disputes-update) | not supported | supported |
| [bulk-settlement#payment-received](#bulk-settlement-payment-received) | not supported | supported |
| [users#state-change](#user-state-change) | not supported | supported |
| [kyc-reviews#state-change](#kyc-review-state-change) | not supported | supported |
| [cards#3ds-challenge](#3ds-challenge) | not supported | supported |
| [profiles#overdraft-limit-threshold](#overdraft-limit-threshold) | not supported | supported |
| [account-details-order#order-state-change](#account-details-order-state-change) | not supported | supported |
| [profiles#state-change](#profiles-state-change) | not supported | supported |
| [hold-limit-breach#update](#hold-limit-breach-update) | supported | supported |


## Transfer state change event 

* Event type: `transfers#state-change`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


Triggered every time a transfer's status is updated.

Note that for topup-to-balance transfers, `transfers#state-change` events will not be triggered. To listen to these, subscribe to `balances#update`.

For the full schema and examples, see the [Transfer state change](/api-reference/webhook-event/eventtransfersstatechange) API reference.

## Transfer active cases event 

* Event type: `transfers#active-cases`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


Triggered every time a transfer's list of active cases is updated.
Active cases indicate potential problems with transfer processing.

For the full schema and examples, see the [Transfer active cases](/api-reference/webhook-event/eventtransfersactivecases) API reference.

## Transfer payout failure events  

* Event type: `transfers#payout-failure`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


This event will be triggered every time a payout fails. The event can be used to get further information about a failed payment.

`transfers#state-change` event provides high level information about the state of transfers. But it doesn't provide details about payout failures.

While the `transfers#state-change` event is in `outgoing_payment_sent` state, the payout could fail for certain reasons listed below.

Using this event, you can understand the reason behind the failure and even ask your customers to fix the problem by themselves. If the failure reason code is `WRONG_ACCOUNT_NUMBER` for example.

Please note that not every payout failure will trigger a `transfers#state-change`. For example a payout might fail with `MANDATE_NOT_FILLED_IN` code but the corresponding transfer might stay in the same state.

We recommend to process both event types(`transfers#payout-failure` and `transfers#state-change`) separate from each other.

If you would like to subscribe to payout failure events, please use `transfers#payout-failure`
when creating your subscription.

### Table of available failure reason codes and descriptions

| Code | Description |
|  --- | --- |
| ACCOUNT_CLOSED | The recipient details are correct, but beneficiary account is closed |
| ACCOUNT_FROZEN | The recipient details are correct, but beneficiary account is frozen |
| ACCOUNT_BLOCKED | The recipient details are correct, but beneficiary account is blocked |
| ACCOUNT_LIMIT_REACHED | The recipient details are correct, but beneficiary account has a limit that can be unblocked by the recipient |
| WRONG_ACCOUNT_NUMBER | Invalid account number |
| WRONG_CARD_NUMBER | Invalid card number |
| WRONG_ACCOUNT_DETAILS | Invalid account number AND/OR invalid bank code |
| WRONG_ACCOUNT_TYPE | Incorrect account type |
| WRONG_BANK_CODE | Invalid sort/BIC/routing/etc number |
| WRONG_BRANCH_CODE | Invalid branch code |
| WRONG_NAME | Account number matches, but the name is not 100% correct |
| WRONG_PHONE_NUMBER | Recipient phone number is incorrect |
| WRONG_ID_NUMBER | Invalid recipient's ID document number |
| WRONG_RUT_NUMBER | Invalid recipient's RUT (Rol Unico Tributario) number |
| TAX_ID_NOT_MATCHING | Tax ID doesn't match recipient's name |
| TAX_ID_SUSPENDED | Tax ID is suspended |
| WRONG_REFERENCE | Invalid payment reference |
| WRONG_PAYMENT_PURPOSE | Invalid or not accepted payment purpose |
| ACCOUNT_DOES_NOT_EXIST | Format is correct but this account does not exist in recipient bank |
| WRONG_CURRENCY | Recipient account is in different currency |
| WRONG_CARD_TYPE | Recipient account doesn't support payments to this card type |
| CANNOT_ACCEPT_FROM_3RD_PARTY | Recipient bank can't accept the payments from 3rd party |
| CREDITING_ACCOUNT_FORBIDDEN | Terms and Conditions of Account do not permit crediting of these funds |
| DUPLICATE_ENTRY | Recipient bank informs that there has been another payment in the same amount |
| FUNDS_NOT_EXPECTED_RETURNED | Beneficiary not expecting funds/instructed return |
| MANDATE_NOT_FILLED_IN | Recipient didn't fill out the mandate form on time or the email address is incorrect |
| BUSINESS_PAYMENTS_FORBIDDEN | Payment to business accounts are not allowed |
| DUPLICATE_ENTRY | Recipient bank informs that there has been another payment in the same amount |
| SENDER_REQUESTED_TO_CANCEL | Sender requested cancellation |
| REQUEST_FOR_INFORMATION_EXPIRED | Request for information expired |
| RETURN_REQUESTED_BY_RECIPIENT | Recipient requested return |
| EXTERNAL_IDENTIFIER_DETAILS_HAVE_CHANGED | External identifier details have changed |
| REASON_NOT_SPECIFIED | Reason not specified |


Wise could add new failure codes to this list and your system should be able to handle the events even if the failure reason code is not recognised.

Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.transfer_id
ID of the transfer

data.profile_id
ID of the profile that initiated the transfer

data.failure_reason_code
Code of the failure error

data.failure_description
Description of the failure code

data.occurred_at
When the state change occurred

Example `transfers#payout-failure` event

```json
{
  "data": {
    "transfer_id": 111,
    "profile_id": 222,
    "failure_reason_code": "WRONG_ID_NUMBER",
    "failure_description": "Invalid recipient's ID document number",
    "occurred_at": "2023-08-10T10:17:23.000+00:00"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "transfers#payout-failure",
  "schema_version": "2.0.0",
  "sent_at": "2023-08-10T10:17:28Z"
}
```

Schema
data.transfer_id
ID of the transfer

data.profile_id
ID of the profile that initiated the transfer

data.failure_reason_code
Code of the failure error

data.failure_description
Description of the failure code

data.occurred_at
When the state change occurred

Example `transfers#payout-failure` event

```json
{
  "data": {
    "transfer_id": 111,
    "profile_id": 222,
    "failure_reason_code": "WRONG_ID_NUMBER",
    "failure_description": "Invalid recipient's ID document number",
    "occurred_at": "2023-08-10T10:17:23.123Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "transfers#payout-failure",
  "schema_version": "4.0.0",
  "sent_at": "2023-08-10T10:17:28.123Z"
}
```

## Transfer refund event  

* Event type: `transfers#refund`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


This event will be triggered every time a transfer's status becomes `funds_refunded`. Each event contains a timestamp.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

This event provides information about refund amount and currency.

If you would like to subscribe to transfer refund events, please use `transfers#refund`
when creating your subscription.

Schema
data.resource.type
Transfer resource type (always `transfer`)

data.resource.id
ID of the transfer

data.resource.profile_id
Identifies the Wise profile associated with this refund

data.resource.account_id
ID referring to the initial beneficiary of the payment. The ultimate beneficiary is the sender the funds are being refunded to.

data.resource.refund_amount
The total amount that was refunded to the customer. Includes any applicable fees.

data.resource.refund_currency
The three-letter ISO currency code representing the currency in which the refund was issued.

data.occurred_at
The date and time the refund was triggered

Example `transfers#refund` event

```json
{
  "data": {
    "resource": {
      "type": "transfer",
      "id": 111,
      "profile_id": 222,
      "account_id": 333,
      "refund_amount": 5000,
      "refund_currency": "EUR"
    },
    "occurred_at": "2024-01-01T12:34:56Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "transfers#refund",
  "schema_version": "2.0.0",
  "sent_at": "2024-01-01T12:34:56Z"
}
```

Schema
data.resource.type
Transfer resource type (always `transfer`)

data.resource.id
ID of the transfer

data.resource.profile_id
Identifies the Wise profile associated with this refund

data.resource.account_id
ID referring to the initial beneficiary of the payment. The ultimate beneficiary is the sender the funds are being refunded to.

data.resource.refund_amount
The total amount that was refunded to the customer. Includes any applicable fees.

data.resource.refund_currency
The three-letter ISO currency code representing the currency in which the refund was issued.

data.occurred_at
The date and time the refund was triggered

Example `transfers#refund` event

```json
{
  "data": {
    "resource": {
      "type": "transfer",
      "id": 111,
      "profile_id": 222,
      "account_id": 333,
      "refund_amount": 5000,
      "refund_currency": "EUR"
    },
    "occurred_at": "2024-01-01T12:34:56.789Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "transfers#refund",
  "schema_version": "4.0.0",
  "sent_at": "2024-01-01T12:34:56.123Z"
}
```

## Account details payment state change event 

* Event type: `account-details-payment#state-change`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


Triggered every time a pay-in is made into the specified account details.

Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

For the full schema and examples, see the [Account details payment state change](/api-reference/webhook-event/eventaccountdetailspaymentstatechange) API reference.

## Balance credit event  

New balance webhook is released. The new webhook is triggered every time a multi-currency account is credited or debited.
For more information: [Balance update event](/guides/developer/webhooks/event-types#balance-update-event).

* Event type: `balances#credit`
* Profile level subscriptions: Supported
* Application level subscriptions: Not Supported


This event will be triggered every time a multi-currency account is credited.

If you would like to subscribe to balance credit events, please use `balances#credit` when creating your subscription.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.type
Resource type (always `balance-account`)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.transaction_type
Always `credit`

data.amount
Deposited amount

data.currency
Currency code

data.post_transaction_balance_amount
Balance after the credit was applied

data.occurred_at
When the credit occurred

Example `balances#credit` event

```json
{
   "data":{
      "resource":{
         "type":"balance-account",
         "id":111,
         "profile_id":222
      },
      "transaction_type":"credit",
      "amount":1.23,
      "currency":"EUR",
      "post_transaction_balance_amount":2.34,
      "occurred_at":"2020-01-01T12:34:56Z"
   },
   "subscription_id":"01234567-89ab-cdef-0123-456789abcdef",
   "event_type":"balances#credit",
   "schema_version":"2.0.0",
   "sent_at":"2020-01-01T12:34:56Z"
}
```

Schema
data.resource.type
Resource type (always `balance-account`)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.transaction_type
Always `credit`

data.amount
Deposited amount

data.currency
Currency code

data.post_transaction_balance_amount
Balance after the credit was applied

data.occurred_at
When the credit occurred

Example `balances#credit` event

```json
{
   "data":{
      "resource":{
         "type":"balance-account",
         "id":111,
         "profile_id":222
      },
      "transaction_type":"credit",
      "amount":1.23,
      "currency":"EUR",
      "post_transaction_balance_amount":2.34,
      "occurred_at":"2020-01-01T12:34:56.789Z"
   },
   "subscription_id":"01234567-89ab-cdef-0123-456789abcdef",
   "event_type":"balances#credit",
   "schema_version":"4.0.0",
   "sent_at":"2020-01-01T12:34:56.123Z"
}
```

## Balance update event 

* Event type: `balances#update`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


This event will be triggered every time a multi-currency account is credited or debited.
If you would like to subscribe to balance update events, please use `balances#update` when creating your subscription.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order, and `data.step_id` to order events within a single transaction. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.type
Resource type (always balance-account)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.transaction_type
Either credit or debit

data.amount
Transaction amount

data.currency
Currency code

data.occurred_at
When the transaction occurred

data.transfer_reference
ID of the transfer

data.channel_name
transfer category

Example `balances#update event` credit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 70,
    "currency": "GBP",
    "transaction_type": "credit",
    "occurred_at": "2023-03-08T14:55:38Z",
    "transfer_reference": "BNK-1234567",
    "channel_name": "TRANSFER"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "2.1.0",
  "sent_at": "2023-03-08T14:55:39Z"
}
```

Example `balances#update event` debit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 9.6,
    "currency": "GBP",
    "transaction_type": "debit",
    "occurred_at": "2023-03-08T15:26:07Z",
    "transfer_reference": "47500002",
    "channel_name": "TRANSFER"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "2.1.0",
  "sent_at": "2023-03-08T15:26:07Z"
}
```

Schema
data.resource.type
Resource type (always balance-account)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.transaction_type
Either credit or debit

data.amount
Transaction amount

data.balance_id
ID of the balance credited or debited

data.currency
Currency code

data.occurred_at
When the transaction occurred

data.transfer_reference
ID of the transfer

data.channel_name
transfer category

Example `balances#update event` credit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 70,
    "balance_id": 111,
    "currency": "GBP",
    "transaction_type": "credit",
    "occurred_at": "2023-03-08T14:55:38Z",
    "transfer_reference": "BNK-1234567",
    "channel_name": "TRANSFER"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "2.2.0",
  "sent_at": "2023-03-08T14:55:39Z"
}
```

Example `balances#update event` debit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 9.6,
    "balance_id": 111,
    "currency": "GBP",
    "transaction_type": "debit",
    "occurred_at": "2023-03-08T15:26:07Z",
    "transfer_reference": "47500002",
    "channel_name": "TRANSFER"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "2.2.0",
  "sent_at": "2023-03-08T15:26:07Z"
}
```

For tracking events related to a single transaction such as a cancelled card transaction, please use `data.step_id` to reconcile the order.

Schema
data.resource.type
Resource type (always balance-account)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.amount
Transaction amount

data.balance_id
ID of the balance credited or debited

data.channel_name
Transfer category

data.currency
Currency code

data.occurred_at
When the transaction occurred

data.post_transaction_balance_amount
Available balance after current transaction

data.step_id
Unique identifier for tracking sequence of transaction events

data.transaction_type
Either credit or debit

data.transfer_reference
ID of the transfer

Example `balances#update event` credit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 70,
    "balance_id": 111,
    "channel_name": "TRANSFER",
    "currency": "GBP",
    "occurred_at": "2023-03-08T14:55:38Z",
    "post_transaction_balance_amount": 88.93,
    "step_id": 1234567,
    "transaction_type": "credit",
    "transfer_reference": "BNK-1234567"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "3.0.0",
  "sent_at": "2023-03-08T14:55:39Z"
}
```

Example `balances#update event` debit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 9.6,
    "balance_id": 111,
    "channel_name": "TRANSFER",
    "currency": "GBP",
    "occurred_at": "2023-03-08T15:26:07Z",
    "post_transaction_balance_amount": 106.93,
    "step_id": 1234567,
    "transaction_type": "debit",
    "transfer_reference": "47500002"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "3.0.0",
  "sent_at": "2023-03-08T15:26:07Z"
}
```

For tracking events related to a single transaction such as a cancelled card transaction, please use `data.step_id` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for more details.

Schema
data.resource.type
Resource type (always balance-account)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.amount
Transaction amount

data.balance_id
ID of the balance credited or debited

data.channel_name
Transfer category

data.currency
Currency code

data.occurred_at
When the transaction occurred

data.post_transaction_balance_amount
Available balance after current transaction

data.step_id
Unique identifier for tracking sequence of transaction events

data.transaction_type
Either credit or debit

data.transfer_reference
ID of the transfer

Example `balances#update event` credit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 70,
    "balance_id": 111,
    "channel_name": "TRANSFER",
    "currency": "GBP",
    "occurred_at": "2023-03-08T14:55:38.123Z",
    "post_transaction_balance_amount": 88.93,
    "step_id": 1234567,
    "transaction_type": "credit",
    "transfer_reference": "BNK-1234567"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "4.0.0",
  "sent_at": "2023-03-08T14:55:39.456Z"
}
```

Example `balances#update event` debit notification

```json
{
  "data": {
    "resource": {
      "id": 2,
      "profile_id": 2,
      "type": "balance-account"
    },
    "amount": 9.6,
    "balance_id": 111,
    "channel_name": "TRANSFER",
    "currency": "GBP",
    "occurred_at": "2023-03-08T15:26:07.891Z",
    "post_transaction_balance_amount": 106.93,
    "step_id": 1234567,
    "transaction_type": "debit",
    "transfer_reference": "47500002"
  },
  "subscription_id": "f2264fe5-a0f5-4dab-a1b4-6faa87761425",
  "event_type": "balances#update",
  "schema_version": "4.0.0",
  "sent_at": "2023-03-08T15:26:07.234Z"
}
```

## Balance account state change event  

* Event type: `balances#account-state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered every time a balance account is activated or deactivated

If you would like to subscribe to balance account state change events, please use `balances#account-state-change` when creating your subscription.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.type
Resource type (always `balance-account`)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.resource.state
State of the account. 
Values:

* ACTIVE
* INACTIVE


data.occurred_at
Timestamp when the event occurred

Example `balances#account-state-change` event

```json
{
  "data":{
    "resource":{
      "type":"balance-account",
      "id": 123,
      "profile_id": 555,
      "state": "INACTIVE"
    },
    "occurred_at":"2020-01-01T12:34:56Z"
  },
  "subscription_id":"01234567-89ab-cdef-0123-456789abcdef",
  "event_type":"balances#account-state-change",
  "schema_version":"2.0.0",
  "sent_at":"2020-01-01T12:34:56Z"
}
```

Schema
data.resource.type
Resource type (always `balance-account`)

data.resource.id
ID of the account

data.resource.profile_id
ID of the profile that owns the account

data.resource.state
State of the account. 
Values:

* ACTIVE
* INACTIVE


data.occurred_at
Timestamp when the event occurred

Example `balances#account-state-change` event

```json
{
  "data":{
    "resource":{
      "type":"balance-account",
      "id": 123,
      "profile_id": 555,
      "state": "INACTIVE"
    },
    "occurred_at":"2020-01-01T12:34:56.789Z"
  },
  "subscription_id":"01234567-89ab-cdef-0123-456789abcdef",
  "event_type":"balances#account-state-change",
  "schema_version":"4.0.0",
  "sent_at":"2020-01-01T12:34:56.123Z"
}
```

## Verification state change event  

* Event type: `profiles#verification-state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered when the verification state of a connected profile changes.

A profile's *verification state* can be `verified` or `not_verified`.
If the state is `verified`, then the user is ready to make payments using Wise.
If the state is `not_verified`, then we advise not to initiate any transfers with the user's access token as the
payments will not be processed until the verification is completed.

If you would like to subscribe to verification state change events, please use `profiles#verification-state-change`
when [creating your subscription](#application-webhooks-create).
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.type
Profile resource type (always `profile`)

data.resource.id
ID of the profile

data.current_state
Current verification state of the profile (see discussion above)

data.occurred_at
When the verification state change occurred

Example `profiles#verification-state-change` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "current_state": "verified",
    "occurred_at": "2020-01-01T12:34:56Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#verification-state-change",
  "schema_version": "2.0.0",
  "sent_at": "2020-01-01T12:34:56Z"
}
```

Schema
data.resource.type
Profile resource type (always `profile`)

data.resource.id
ID of the profile

data.current_state
Current verification state of the profile (see discussion above)

data.occurred_at
When the verification state change occurred

Example `profiles#verification-state-change` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "current_state": "verified",
    "occurred_at": "2020-01-01T12:34:56.789Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#verification-state-change",
  "schema_version": "4.0.0",
  "sent_at": "2020-01-01T12:34:56.123Z"
}
```

## Batch Payment Initiations state change event  

* Event type: `batch-payment-initiations#state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered when the payment initiation state of a batch group payment changes.

The expected state of a batch payment initiation can be one of: `NEW`, `PROCESSING`, `COMPLETED`, `FAILED`, `CHARGED_BACK`.

If you would like to subscribe to batch payment initiation state change events, please use `batch-payment-initiations#state-change`
when [creating your subscription](#application-webhooks-create).
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.id
Payment initiation ID

data.resource.batchGroupId
Batch group ID

data.resource.profileId
The ID of the profile this payment belongs to

data.previousStatus
Previous payment initiation state

data.currentStatus
Current payment initiation state

data.occurredAt
When the payment initiation state change occurred

data.returnCode
Return code of the underlying payment system

Example `batch-payment-initiations#state-change` event

```json
{
  "data": {
    "resource": {
      "id": 12345,
      "batchGroupId": "068e186d-9632-4937-b753-af3e53f4d0b0",
      "profileId": 2
    },
    "previousStatus": "NEW",
    "newStatus": "PROCESSING",
    "occurredAt": "2021-04-13T19:51:41.423404Z" ,
    "returnCode": "200"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "batch-payment-initiations#state-change",
  "schema_version": "2.0.0",
  "sent_at": "2020-01-01T12:34:56Z"
}
```

Schema
data.resource.id
Payment initiation ID

data.resource.batch_group_id
Batch group ID

data.resource.profile_id
The ID of the profile this payment belongs to

data.previous_status
Previous payment initiation state

data.current_status
Current payment initiation state

data.occurred_at
When the payment initiation state change occurred

data.return_code
Return code of the underlying payment system

Example `batch-payment-initiations#state-change` event

```json
{
  "data": {
    "resource": {
      "id": 12345,
      "batch_group_id": "068e186d-9632-4937-b753-af3e53f4d0b0",
      "profile_id": 2
    },
    "previous_status": "NEW",
    "current_status": "PROCESSING",
    "occurred_at": "2021-04-13T19:51:41.423Z",
    "return_code": "200"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "batch-payment-initiations#state-change",
  "schema_version": "4.0.0",
  "sent_at": "2020-01-01T12:34:56.123Z"
}
```

## Swift receive credit events  

* Triggering event type: `swift-in#credit`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


This webhook will be sent every time a Swift message is received and a credit is deposited into a balance account.

If you also subscribe to `balances#credit` or `transfers#state-change` on the same profile or application you may experience some duplication of webhook events. You should make allowances for this and handle it in your implementation.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

### Version 3.0.0 

Schema
data.action.type
Type of action.
*Mandatory*
*Format:* always `credit`

data.action.id
TransferID of the credit.
*Mandatory*

data.action.profile_id
ProfileID for the transfer.
*Mandatory*

data.action.account_id
AccountID for the transfer.
*Mandatory*

data.resource.id
ID of the webhook.
*Mandatory*

data.resource.uetr
Unique identifier created by the scheme for each payment and passed through the scheme to Wise.
*Mandatory*
*Length:* 36 Characters

data.resource.reference
Reference provided by the ultimate sender for the payment.
*Optional*
*Length:* Min 0 Max 140 Characters

data.resource.recipient.name
Name of the ultimate recipient.
*Optional*
*Length:* Min 1 Max 140 Characters

data.resource.recipient.address
Address of the ultimate recipient.
*Optional*
*Length:* Min 1 Max 140 Characters

data.resource.recipient.account
This can be either an IBAN, BBAN, AccountId or a Descriptor (another kind of identifier).
*Optional*
*Length:* Min 1 Max 36 Characters

data.resource.recipient.bank_details
Recipient bank details.
*Optional*

data.resource.recipient.bank_details.bic
Recipient bank BIC.
*Optional*

data.resource.recipient.bank_details.name
Recipient bank name.
*Optional*

data.resource.recipient.bank_details.address
Recipient bank address.
*Optional*

data.resource.sender.name
Name of the ultimate sender.
*Optional*
*Length:* Min 1 Max 140 Characters

data.resource.sender.address
Address of the ultimate sender.
*Optional*
*Length:* Min 1 Max 140 Characters

data.resource.sender.account
This can be either an IBAN, BBAN, AccountId or a Descriptor (another kind of identifier).
*Optional*
*Length:* Min 1 Max 36 Characters

data.resource.sender.bank_details
Sender bank details.
*Optional*

data.resource.sender.bank_details.bic
Sender bank BIC.
*Optional*

data.resource.sender.bank_details.name
Sender bank name.
*Optional*

data.resource.sender.bank_details.address
Sender bank address.
*Optional*

data.resource.sender.bank_code.value
Value of the ultimate sender's bank code. This can be either a BIC code, bank institution name, clearing system member code or LEI.
*Optional*

data.resource.sender.bank_code.type
Type of the ultimate sender's bank code. This can be either `BIC`, `BANK_CODE` or `BANK_NAME`.
*Optional*

data.resource.exchange_rate
In case the originally instructed amount was converted by Wise or any other intermediary agent, this field contains the exchange rate used. If no conversion took place,
the exchange rate will be `1.0`.
*Mandatory*

data.resource.instructed_amount
Amount originally instructed by the ultimate sender.
*Optional*

data.resource.instructed_amount.value
Value of the amount originally instructed by the ultimate sender.
*Mandatory*

data.resource.instructed_amount.currency
Currency of the amount originally instructed by the ultimate sender.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.settled_amount.value
Value of the amount settled to the balance account.
*Mandatory*

data.resource.settled_amount.currency
Currency of the amount settled to the balance account.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.fee.wise[]
List of fees applied by Wise (e.g., conversion fee). If this list is empty, no fees were applied by Wise.
*Optional*

data.resource.fee.wise[].type
Type of fee.
*Mandatory*
*Format:* `conversion`,

data.resource.fee.wise[].value
Value of fee.
*Mandatory*

data.resource.fee.wise[].currency
Currency of fee.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.fee.correspondent[]
List of fees declared by correspondents (e.g., handling fee). If this list is empty, no fees were declared by correspondents.
*Optional*

data.resource.fee.correspondent[].value
Value of fee.
*Mandatory*

data.resource.fee.correspondent[].currency
Currency of fee.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.transaction_time
Date and time at which the associated transaction was created. Time in UTC.
*Mandatory*
*Length:* Exactly 20 Characters
*Format:* `YYYY`-`MM`-`DD`T`HH`:`MM`:`SS`Z

data.occurred_at
Date and time at which the amount was credited to the balance account. Time in UTC.
*Mandatory*
*Length:* Exactly 20 Characters
*Format:* `YYYY`-`MM`-`DD`T`HH`:`MM`:`SS`Z

Example `swift-in#credit` event (JSON format)

```json
{
  "data": {
    "action": {
      "type": "credit",
      "id": 12345,
      "profile_id": 222,
      "account_id": 333
    },
    "resource": {
      "id": "55555",
      "uetr": "f875814b-7d44-4d1b-a499-123456789abcde",
      "reference": "/RFB/BET072",
      "recipient": {
        "name": "JOHN SMITH",
        "address": "EVERGREEN AVE, 6, BRUSSELS, BE",
        "account": "BE1234567891234",
        "bank_details": {
          "bic": "EXMPBEBB",
          "name": "EXAMPLE BANK BELGIUM",
          "address": "Rue de l'Exemple, BRUSSELS"
        }
      },
      "sender": {
        "name": "GEORGE SMITH",
        "address": "EVERGREEN STREET, 10, BRUSSELS, BE",
        "account": "EE947700771111111111",
        "bank_code": {
          "value": "ABNABE2AIDJ",
          "type": "BIC"
        },
        "bank_details": {
          "bic": "TESTDEFF",
          "name": "TEST BANK AG",
          "address": "Musterstrasse, FRANKFURT"
        }
      },
      "exchange_rate": 0.8,
      "instructed_amount": {
        "value": 1000,
        "currency": "USD"
      },
      "settled_amount": {
        "value": 786.54,
        "currency": "GBP"
      },
      "fee": {
        "wise": [
          {
              "type": "conversion",
              "value": 2.76,
              "currency": "GBP"
          }
        ],
        "correspondent": [
          {
            "value": 4.5,
            "currency": "USD"
          },
          {
            "value": 2.1,
            "currency": "GBP"
          },
          {
            "value": 5,
            "currency": "GBP"
          }
        ]
      },
      "transaction_time": "2023-08-21T12:34:56Z"
    },
    "occurred_at": "2023-08-21T12:34:56Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "swift-in#credit",
  "schema_version": "3.0.0",
  "sent_at": "2023-08-21T12:34:58Z"
}
```

### Version 4.0.0 

Schema
data.action.type
Type of action.
*Mandatory*
*Format:* always `credit`

data.action.id
TransferID of the credit.
*Mandatory*

data.action.profile_id
ProfileID for the transfer.
*Mandatory*

data.action.account_id
AccountID for the transfer.
*Mandatory*

data.resource.id
ID of the webhook.
*Mandatory*

data.resource.uetr
Unique identifier created by the scheme for each payment and passed through the scheme to Wise.
*Mandatory*
*Length:* 36 Characters

data.resource.reference
Reference provided by the ultimate sender for the payment.
*Optional*
*Length:* Min 0 Max 140 Characters

data.resource.recipient.name
Name of the ultimate recipient.
*Optional*
*Length:* Min 1 Max 140 Characters

data.resource.recipient.address
Structured address of the ultimate recipient.
*Optional*

data.resource.recipient.address.first_line
Address first line.
*Optional*

data.resource.recipient.address.street_name
Street name.
*Optional*

data.resource.recipient.address.building_number
Building number.
*Optional*

data.resource.recipient.address.town_name
Town (city) name.
*Optional*

data.resource.recipient.address.postal_code
Postal code.
*Optional*

data.resource.recipient.address.country_sub_division
Country subdivision such as a state, province, or region.
*Optional*

data.resource.recipient.address.country_code
Country code.
*Optional*
*Length:* Exactly 2 Characters
*Format:* 2-letter ISO country code

data.resource.recipient.account
This can be either an IBAN, BBAN, AccountId or a Descriptor (another kind of identifier).
*Optional*
*Length:* Min 1 Max 36 Characters

data.resource.recipient.bank_details
Recipient bank details.
*Optional*

data.resource.recipient.bank_details.bic
Recipient bank BIC.
*Optional*

data.resource.recipient.bank_details.name
Recipient bank name.
*Optional*

data.resource.recipient.bank_details.address
Recipient bank address (same structure as `recipient.address`).
*Optional*

data.resource.sender.name
Name of the ultimate sender.
*Optional*
*Length:* Min 1 Max 140 Characters

data.resource.sender.address
Structured address of the ultimate sender.
*Optional*

data.resource.sender.address.first_line
Address first line.
*Optional*

data.resource.sender.address.street_name
Street name.
*Optional*

data.resource.sender.address.building_number
Building number.
*Optional*

data.resource.sender.address.town_name
Town (city) name.
*Optional*

data.resource.sender.address.postal_code
Postal code.
*Optional*

data.resource.sender.address.country_sub_division
Country subdivision such as a state, province, or region.
*Optional*

data.resource.sender.address.country_code
Country code.
*Optional*
*Length:* Exactly 2 Characters
*Format:* 2-letter ISO country code

data.resource.sender.account
This can be either an IBAN, BBAN, AccountId or a Descriptor (another kind of identifier).
*Optional*
*Length:* Min 1 Max 36 Characters

data.resource.sender.bank_details
Sender bank details.
*Optional*

data.resource.sender.bank_details.bic
Sender bank BIC.
*Optional*

data.resource.sender.bank_details.name
Sender bank name.
*Optional*

data.resource.sender.bank_details.address
Sender bank address (same structure as `recipient.address`)
*Optional*

data.resource.exchange_rate
In case the originally instructed amount was converted by Wise or any other intermediary agent, this field contains the exchange rate used. If no conversion took place,
the exchange rate will be `1.0`.
*Mandatory*

data.resource.instructed_amount
Amount originally instructed by the ultimate sender.
*Optional*

data.resource.instructed_amount.value
Value of the amount originally instructed by the ultimate sender.
*Mandatory*

data.resource.instructed_amount.currency
Currency of the amount originally instructed by the ultimate sender.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.settled_amount.value
Value of the amount settled to the balance account.
*Mandatory*

data.resource.settled_amount.currency
Currency of the amount settled to the balance account.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.fee.wise[]
List of fees applied by Wise (e.g., conversion fee). If this list is empty, no fees were applied by Wise.
*Optional*

data.resource.fee.wise[].type
Type of fee.
*Mandatory*
*Format:* `conversion`,

data.resource.fee.wise[].value
Value of fee.
*Mandatory*

data.resource.fee.wise[].currency
Currency of fee.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.fee.correspondent[]
List of fees declared by correspondents (e.g., handling fee). If this list is empty, no fees were declared by correspondents.
*Optional*

data.resource.fee.correspondent[].value
Value of fee.
*Mandatory*

data.resource.fee.correspondent[].currency
Currency of fee.
*Mandatory*
*Length:* Exactly 3 Characters
*Format:* 3-letter ISO currency code

data.resource.transaction_time
Date and time at which the associated transaction was created. Time in UTC.
*Mandatory*
*Length:* Exactly 24 Characters
*Format:* `YYYY`-`MM`-`DD`T`HH`:`MM`:`SS`.`mmm`Z

data.resource.previous_instructing_agents[]
List of previous instructing agents in the payment chain (ordered from first to last).
*Optional*

data.resource.previous_instructing_agents[].bic
Previous instructing agent BIC.
*Optional*

data.resource.previous_instructing_agents[].name
Previous instructing agent bank name.
*Optional*

data.resource.previous_instructing_agents[].address
Previous instructing agent bank address (same structure as `recipient.address`).
*Optional*

data.occurred_at
Date and time at which the amount was credited to the balance account. Time in UTC.
*Mandatory*
*Length:* Exactly 24 Characters
*Format:* `YYYY`-`MM`-`DD`T`HH`:`MM`:`SS`.`mmm`Z

Example `swift-in#credit` event (JSON format)

```json
{
  "data": {
    "action": {
      "type": "credit",
      "id": 12345,
      "profile_id": 222,
      "account_id": 333
    },
    "resource": {
      "id": "55555",
      "uetr": "f875814b-7d44-4d1b-a499-123456789abcde",
      "reference": "/RFB/BET072",
      "recipient": {
        "name": "JOHN SMITH",
        "address": {
          "first_line": null,
          "street_name": "Evergreen Ave",
          "building_number": "6",
          "town_name": "BRUSSELS",
          "postal_code": "1000",
          "country_sub_division": null,
          "country_code": "BE"
        },
        "account": "BE1234567891234",
        "bank_details": {
          "bic": "EXMPBEBB",
          "name": "EXAMPLE BANK BELGIUM",
          "address": {
            "first_line": null,
            "street_name": "Rue de l'Exemple",
            "building_number": "1",
            "town_name": "BRUSSELS",
            "postal_code": "1000",
            "country_sub_division": null,
            "country_code": "BE"
          }
        }
      },
      "sender": {
        "name": "GEORGE SMITH",
        "address": {
          "first_line": null,
          "street_name": "Evergreen Street",
          "building_number": "10",
          "town_name": "BRUSSELS",
          "postal_code": "1000",
          "country_sub_division": null,
          "country_code": "BE"
        },
        "account": "EE947700771111111111",
        "bank_details": {
          "bic": "TESTDEFF",
          "name": "TEST BANK AG",
          "address": {
            "first_line": null,
            "street_name": "Musterstrasse",
            "building_number": "99",
            "town_name": "FRANKFURT",
            "postal_code": "60311",
            "country_sub_division": null,
            "country_code": "DE"
          }
        }
      },
      "exchange_rate": 0.8,
      "instructed_amount": {
        "value": 1000,
        "currency": "USD"
      },
      "settled_amount": {
        "value": 786.54,
        "currency": "GBP"
      },
      "fee": {
        "wise": [
          {
            "type": "conversion",
            "value": 2.76,
            "currency": "GBP"
          }
        ],
        "correspondent": [
          {
            "value": 4.5,
            "currency": "USD"
          },
          {
            "value": 2.1,
            "currency": "GBP"
          },
          {
            "value": 5,
            "currency": "GBP"
          }
        ]
      },
      "transaction_time": "2023-08-21T12:34:56.456Z",
      "previous_instructing_agents": [
        {
          "bic": "SAMPUS33",
          "name": "SAMPLE BANK USA",
          "address": {
            "first_line": null,
            "street_name": "Fictional Avenue",
            "building_number": "100",
            "town_name": "NEW YORK",
            "postal_code": "10001",
            "country_sub_division": "NY",
            "country_code": "US"
          }
        },
        {
          "bic": "MOCKDEFF",
          "name": "MOCK BANK AG",
          "address": {
            "first_line": null,
            "street_name": "Beispielweg",
            "building_number": "42",
            "town_name": "FRANKFURT",
            "postal_code": "60313",
            "country_sub_division": null,
            "country_code": "DE"
          }
        }
      ]
    },
    "occurred_at": "2023-08-21T12:34:56.789Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "swift-in#credit",
  "schema_version": "4.0.0",
  "sent_at": "2023-08-21T12:34:58.123Z"
}
```

## Swift message received 

Triggered when a Swift message (e.g. pacs.008) is received and processed by Wise on behalf of a partner.

### Version 4.0.0 

Schema
data.action.id
The transfer ID of the incoming payment.
*Mandatory*

data.action.profile_id
The profile ID of the incoming payment.
*Mandatory*

data.action.account_id
The balance account ID where funds will be deposited.
*Mandatory*

data.occurred_at
Date and time at which the Swift message was processed by Wise. Time in UTC.
*Mandatory*
*Length:* Exactly 24 Characters
*Format:* `YYYY`-`MM`-`DD`T`HH`:`MM`:`SS`.`mmm`Z

data.resource.id
Identifier of the Swift message.
*Mandatory*

data.resource.message_type
Type of Swift message contained in the content field (e.g. `pacs.008.001.08`). Extensible for future message types.
*Mandatory*

data.resource.content
The raw Swift message data, encoded as specified by `content_encoding`.
*Mandatory*

data.resource.content_encoding
The encoding applied to the content field.
*Mandatory*
*Format:* always `base64`

Example `swift#message-received` event (JSON format)

```json
{
    "data": {
        "action": {
            "id": 12345,
            "profile_id": 222,
            "account_id": 333
        },
        "occurred_at": "2025-10-21T12:34:56.789Z",
        "resource": {
            "id": "a1b2c3d4e5f6",
            "message_type": "pacs.008.001.08",
            "content": "PD94bWwgdmVyc2lvbj0iMS4wIj8+...",
            "content_encoding": "base64"
        }
    },
    "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
    "event_type": "swift#message-received",
    "schema_version": "4.0.0",
    "sent_at": "2025-10-21T12:34:58.123Z"
}
```

## Card transaction state change events  

* Event type: `cards#transaction-state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered whenever a new card transaction occurs or is modified.

Transactions can be categorized based on the guidelines below, though the results may not always be consistent.

* **Active card check** – `transaction_amount` is 0 or 1 and `merchant.category.code` not equals `6011`
* **ATM balance check** – `transaction_amount` is 0 and `merchant.category.code` equals `6011`
* **Pre-Authorisation** – `is_amount_confirmed` is false and `transaction_state` equals `IN_PROGRESS`


Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.client_id
Your api_client_id

data.resource.card_token
Unique identifier of the card

data.resource.card_last_digits
Last 4 digits of the card

data.resource.type
Resource type (always `card`)

data.transaction_id
ID of the transaction

data.transaction_type
Type of the transaction. Please refer to the table below for the available transaction types.

data.is_debit (Deprecated)
Indicates whether the transaction type is a debit. This field is deprecated, use `data.transaction_amount.value` to determine
if the transaction is a debit (positive) or a credit into the balance (negative).

data.transaction_step_type
Step type of the transaction. Please refer to the table below for the available transaction step types.

data.decline_reason
Code of the decline reason if applicable

data.detailed_decline_reason
Code of the detailed decline reason if applicable. List of available options is available [here](/api-reference/card-transaction#card-transaction-detailed-decline-reasons).

data.transaction_state
The current state of the transaction. Please refer to the table below for the available transaction states.

data.transaction_amount.value
Transaction amount, excluding all embedded fees such as ATM fees that are not applied by Wise

data.transaction_amount.currency
Currency code

data.is_amount_confirmed
Whether the transaction amount is confirmed

data.fees[0].amount
Fee amount

data.fees[0].currency
Currency code

data.fees[0].fee_type
Fee type. Please refer to the table below for the available transaction fee types.

data.transaction_amount_with_fees.value
Transaction amount including fees

data.transaction_amount_with_fees.currency
Currency code

data.billing_amount.value
Billing amount

data.billing_amount.currency
Currency code

data.authorisation_method
Authorisation method

data.pin_validation_result
PIN validation result. Possible values: `ONLINE_PIN_VALIDATED`, `ONLINE_PIN_INVALID`, `OFFLINE_PIN_VALIDATED`, `OFFLINE_PIN_INVALID`, `NOT_RECEIVED`

data.approval_code
Also called authorization code. This can be used to prove ownership of a customer's card/account to a merchant

data.purge_time
Time at which reserved funds will be released after the authorisation hold expires

data.balance_transaction_id
Associated balance transaction id if applicable

data.balance_movements[0].creation_time
When the balance movement occurred

data.balance_movements[0].balance_id
ID of the balance credited or debited

data.balance_movements[0].type
`credit` or `debit`

data.balance_movements[0].amount.value
Credited or debited amount

data.balance_movements[0].amount.currency
Currency code

data.debits[0].balance_id
Balance ID

data.debits[0].debited_amount.value
Amount taken from the balance

data.debits[0].debited_amount.currency
Currency code

data.debits[0].for_amount.value
Amount converted to

data.debits[0].for_amount.currency
Currency code

data.debits[0].rate
Exchange rate

data.debits[0].fee.value
Conversion fee amount

data.debits[0].fee.currency
Currency code

data.credit.balance_id
Balance ID

data.credit.credited_amount.value
Amount credited to the balance

data.credit.credited_amount.currency
Currency code

data.merchant.name
Name of the merchant

data.merchant.location.country
Country where merchant is located

data.merchant.location.city
City where merchant is located

data.merchant.location.postCode
Post code where merchant is located

data.merchant.location.state
State where merchant is located

data.merchant.category.code
Merchant category code

data.merchant.category.description
Merchant category description

data.arn
Acquirer reference number

data.creation_time
When transaction was created

data.occurred_at
When transaction or transaction state change occurred

data.relay_authorisation_data.response_code
Relayed authorisation [response code](/guides/product/issue-cards/relayed-authorisation#authorisation-response)

data.relay_authorisation_data.fallback
Whether there was a fallback applied by Wise

### Table of available transaction state and descriptions

| Code | Description |
|  --- | --- |
| IN_PROGRESS | The transaction is still in progress |
| COMPLETED | The transaction is completed |
| DECLINED | The transaction has been declined |
| CANCELLED | The transaction has been cancelled |
| UNKNOWN | Default fallback status |


### Table of available transaction type and descriptions

| Code | Description |
|  --- | --- |
| ACCOUNT_CREDIT | Receiving money on the card, excluding Visa OCT or Mastercard MoneySend |
| ACCOUNT_FUNDING | Sending money to another card or e-wallet |
| CASH_ADVANCE | Cash disbursement |
| CASH_WITHDRAWAL | ATM withdrawal |
| CHARGEBACK | Currently unused. Reserved for future use. |
| CREDIT_TRANSACTION | Visa OCT and Mastercard MoneySend |
| ECOM_PURCHASE | Online purchase |
| POS_PURCHASE | Purchase via a POS Terminal |
| REFUND | Partial or full refund of an existing card transaction |


### Table of available transaction step type and descriptions

| Code | Description |
|  --- | --- |
| AUTH | Transaction authorization which is usually the first step |
| PARTIAL_REVERSAL | Transaction has been partially reversed |
| FULL_REVERSAL | Transaction has been fully reversed |
| CAPTURE | Transaction has been caputured |
| SETTLE | Currently unused. Reserved for future use. |
| REFUND | Currently unused. Reserved for future use. |
| RECONCILIATION | Currently unused. Reserved for future use. |


### Table of available fee type and descriptions

| Code | Description |
|  --- | --- |
| ATM_WITHDRAWAL | Fee charged by Wise |
| ATM_MACHINE | Fee charged by the ATM owner |


Example `cards#transaction-state-change` event, completed transaction

```json
{
  "data": {
    "resource": {
      "profile_id": 123456,
      "client_id": "your-bank",
      "card_token": "136b29e4-7eab-4dac-a017-438d494ef6cb",
      "card_last_digits": "1234",
      "type": "card"
    },
    "transaction_id": 12345,
    "transaction_type": "CASH_WITHDRAWAL",
    "is_debit": true,
    "transaction_step_type": "CAPTURE",
    "decline_reason": null,
    "detailed_decline_reason": null,
    "transaction_state": "COMPLETED",
    "transaction_amount": {
      "value": 100.00,
      "currency": "EUR"
    },
    "is_amount_confirmed": true,
    "fees": [
      {
        "amount": 1.00,
        "currency": "EUR",
        "fee_type": "ATM_WITHDRAWAL"
      }
    ],
    "transaction_amount_with_fees": {
      "value": 101.00,
      "currency": "EUR"
    },
    "billing_amount": {
      "value": 100.00,
      "currency": "EUR"
    },
    "authorisation_method": "CHIP_AND_PIN",
    "pin_validation_result": "ONLINE_PIN_VALIDATED",
    "approval_code": "913647",
    "purge_time": "2022-08-22T11:10:41Z",
    "balance_transaction_id": 12345,
    "balance_movements": [
      {
        "creation_time": "2024-12-02T04:17:40Z",
        "balance_id": 123,
        "type": "debit",
        "amount": {
          "currency": "AUD",
          "value": 165.96
        }
      }
    ],
    "debits": [
      {
        "balance_id": 123,
        "debited_amount": {
          "value": 165.96,
          "currency": "AUD"
        },
        "for_amount": {
          "value": 101.00,
          "currency": "EUR"
        },
        "rate": 0.61223252,
        "fee": {
          "value": 0.99,
          "currency": "AUD"
        }
      }
    ],
    "credit": null,
    "merchant": {
      "name": "Test Payment",
      "location": {
        "country": "France",
        "city": "Rouen",
        "postCode": "00000",
        "state": null
      },
      "category": {
        "code": "6011",
        "description": "6011 Z Member Financial Institution"
      }
    },
    "arn": "04300014127798385983852",
    "creation_time": "2022-08-15T11:10:41Z",
    "occurred_at": "2022-08-15T11:10:41Z",
    "relay_authorisation_data": {
      "response_code": "APPROVED",
      "fallback": true
    }
  },
  "subscription_id": "568da36b-7335-4608-ad1b-e5c2d32273b6",
  "event_type": "cards#transaction-state-change",
  "schema_version": "2.0.0",
  "sent_at": "2022-08-15T11:10:46Z"
}
```

Example cards#transaction-state-change event, cancelled transaction

```json
{
  "data": {
    "arn": null,
    "authorisation_method": "CHIP_AND_PIN",
    "pin_validation_result": "ONLINE_PIN_VALIDATED",
    "purge_timestamp": "2024-11-13T06:40:49Z",
    "purge_time": "2024-11-13T06:40:49Z",
    "approval_code": "913647",
    "balance_transaction_id": 5543970,
    "balance_movements": [
      {
        "creation_time": "2024-11-13T06:41:20Z",
        "balance_id": 124741,
        "type": "debit",
        "amount": {
          "currency": "SGD",
          "value": 10
        }
      },
      {
        "creation_time": "2024-11-13T06:41:48Z",
        "balance_id": 124741,
        "type": "credit",
        "amount": {
          "currency": "SGD",
          "value": 10
        }
      }
    ],
    "billing_amount": {
      "currency": "SGD",
      "value": 10
    },
    "creation_time": "2024-11-13T06:41:20Z",
    "credit": null,
    "debits": [
      {
        "balance_id": 124741,
        "debited_amount": {
          "currency": "SGD",
          "value": 0
        },
        "fee": {
          "currency": "SGD",
          "value": 0
        },
        "for_amount": {
          "currency": "SGD",
          "value": 0
        },
        "rate": 1
      }
    ],
    "decline_reason": null,
    "fees": [],
    "is_amount_confirmed": true,
    "is_debit": true,
    "merchant": {
      "category": {
        "code": "5912",
        "description": "Drug Stores, Pharmacies"
      }
    },
    "occurred_at": "2024-11-13T06:41:49Z",
    "resource": {
      "card_last_digits": "7223",
      "card_token": "495980f9-719e-4e60-0d3b-812ab0c5c5a4",
      "client_id": "tw-test-connected-apps",
      "profile_id": 16605997,
      "type": "card"
    },
    "transaction_amount": {
      "currency": "SGD",
      "value": 10
    },
    "transaction_amount_with_fees": {
      "currency": "SGD",
      "value": 10
    },
    "transaction_id": 5255,
    "transaction_state": "CANCELLED",
    "transaction_step_type": "FULL_REVERSAL",
    "transaction_type": "POS_PURCHASE"
  },
  "event_type": "cards#transaction-state-change",
  "schema_version": "2.0.0",
  "sent_at": "2024-11-13T06:41:49Z",
  "subscription_id": "568da36b-7335-4608-ad1b-e5c2d32273b6"
}
```

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.client_id
Your api_client_id

data.resource.card_token
Unique identifier of the card

data.resource.card_last_digits
Last 4 digits of the card

data.resource.type
Resource type (always `card`)

data.transaction_id
ID of the transaction

data.transaction_type
Type of the transaction. Please refer to the table below for the available transaction types.

data.transaction_step_type
Step type of the transaction. Please refer to the table below for the available transaction step types.

data.transaction_state
The current state of the transaction. Please refer to the table below for the available transaction states.

data.decline_reason
Code of the decline reason if applicable

data.detailed_decline_reason
Code of the detailed decline reason if applicable. List of available options is available [here](/api-reference/card-transaction#card-transaction-detailed-decline-reasons).

data.creation_time
When the transaction was created

data.occurred_at
When the transaction state change occurred

data.purge_time
Time at which reserved funds will be released after the authorisation hold expires

data.transaction_amount.value
Transaction amount, excluding all embedded fees such as ATM fees that are not applied by Wise

data.transaction_amount.currency
Currency code

data.fees
Array of fees

data.fees[0].amount
Fee amount

data.fees[0].currency
Currency code

data.fees[0].fee_type
Fee type. Please refer to the table below for the available transaction fee types.

data.transaction_amount_with_fees.value
Transaction amount including all fees

data.transaction_amount_with_fees.currency
Currency code

data.billing_amount.value
Billing amount

data.billing_amount.currency
Currency code

data.merchant.name
Name of the merchant

data.merchant.location.country
Country where merchant is located

data.merchant.location.city
City where merchant is located

data.merchant.location.postCode
Post code where merchant is located

data.merchant.location.state
State where merchant is located

data.merchant.category.code
Merchant category code

data.merchant.category.description
Merchant category description

data.authorisation_method
Authorisation method

data.approval_code
Also called authorization code. This can be used to prove ownership of a customer's card/account to a merchant

data.arn
Acquirer reference number

data.pin_validation_result
PIN validation result. Possible values: `ONLINE_PIN_VALIDATED`, `ONLINE_PIN_INVALID`, `OFFLINE_PIN_VALIDATED`, `OFFLINE_PIN_INVALID`, `NOT_RECEIVED`

data.balance_channel_reference_id
Balance channel reference ID associated with the card transaction

data.debits
Array of debits. Note that the debits list is a non-aggregated list of debit movements, meaning that the `balance_id` is not unique in the list. For example, a cancelled transaction may have a list of 2 debits where the absolute values of `debited_amount.value`, `for_amount.value` and `fee.value` are the same, but one is the negation of the other due to a reservation (first debit) which was then released (second debit with negated amounts). In this case, you can choose to perform the aggregation in your system or display the full list of debits to the end customer.

data.debits[0].balance_id
Balance ID

data.debits[0].debited_amount.value
Amount taken from the balance

data.debits[0].debited_amount.currency
Currency code

data.debits[0].for_amount.value
Amount converted to

data.debits[0].for_amount.currency
Currency code

data.debits[0].rate
Exchange rate

data.debits[0].fee.value
Conversion fee amount

data.debits[0].fee.currency
Currency code

data.debits[0].creation_time
Time of balance debit creation

data.credits
Array of credits

data.credits[0].balance_id
Balance ID

data.credits[0].credited_amount.value
Amount credited to the balance

data.credits[0].credited_amount.currency
Currency code

data.relay_authorisation_data.response_code
Relayed authorisation [response code](/guides/product/issue-cards/relayed-authorisation#authorisation-response)

data.relay_authorisation_data.fallback
Whether there was a fallback applied by Wise

### Table of available transaction state and descriptions

| Code | Description |
|  --- | --- |
| IN_PROGRESS | The transaction is still in progress |
| COMPLETED | The transaction is completed |
| DECLINED | The transaction has been declined |
| CANCELLED | The transaction has been cancelled |
| UNKNOWN | Default fallback status |


### Table of available transaction type and descriptions

| Code | Description |
|  --- | --- |
| ACCOUNT_CREDIT | Receiving money on the card, excluding Visa OCT or Mastercard MoneySend |
| ACCOUNT_FUNDING | Sending money to another card or e-wallet |
| CASH_ADVANCE | Cash disbursement |
| CASH_WITHDRAWAL | ATM withdrawal |
| CHARGEBACK | Currently unused. Reserved for future use. |
| CREDIT_TRANSACTION | Visa OCT and Mastercard MoneySend |
| ECOM_PURCHASE | Online purchase |
| POS_PURCHASE | Purchase via a POS Terminal |
| REFUND | Partial or full refund of an existing card transaction |


### Table of available transaction step type and descriptions

| Code | Description |
|  --- | --- |
| AUTH | Transaction authorization which is usually the first step |
| PARTIAL_REVERSAL | Transaction has been partially reversed |
| FULL_REVERSAL | Transaction has been fully reversed |
| CAPTURE | Transaction has been caputured |
| SETTLE | Currently unused. Reserved for future use. |
| REFUND | Currently unused. Reserved for future use. |
| RECONCILIATION | Currently unused. Reserved for future use. |


### Table of available fee type and descriptions

| Code | Description |
|  --- | --- |
| ATM_WITHDRAWAL | Fee charged by Wise |
| ATM_MACHINE | Fee charged by the ATM owner |


Example `cards#transaction-state-change` event, completed transaction

```json
{
  "data": {
    "resource": {
      "profile_id": 123456,
      "client_id": "your-bank",
      "card_token": "136b29e4-7eab-4dac-a017-438d494ef6cb",
      "card_last_digits": "1234",
      "type": "card"
    },
    "transaction_id": 12345,
    "transaction_type": "CASH_WITHDRAWAL",
    "transaction_step_type": "CAPTURE",
    "transaction_state": "COMPLETED",
    "decline_reason": null,
    "detailed_decline_reason": null,
    "transaction_amount": {
      "value": 100.00,
      "currency": "EUR"
    },
    "fees": [
      {
        "amount": 1.00,
        "currency": "EUR",
        "fee_type": "ATM_WITHDRAWAL"
      }
    ],
    "transaction_amount_with_fees": {
      "value": 101.00,
      "currency": "EUR"
    },
    "billing_amount": {
      "value": 100.00,
      "currency": "EUR"
    },
    "merchant": {
      "name": "Test Payment",
      "location": {
        "country": "France",
        "city": "Rouen",
        "zipCode": "00000",
        "region": null,
        "state": null
      },
      "category": {
        "name": "MISCELLANEOUS_FOOD_STORES_CONVEN",
        "code": "5999",
        "description": "5999 R Miscellaneous and Special"
      }
    },
    "authorisationMethod": "MANUAL_ENTRY",
    "arn": "04300014127798385983852",
    "approvalCode": "913647",
    "pinValidationResult": "ONLINE_PIN_VALIDATED",
    "balanceChannelReferenceId": "6e71018d-2f4d-4fc3-6711-f517f4664712",
    "debits": [
      {
        "balance_id": 123,
        "debited_amount": {
          "value": 165.96,
          "currency": "AUD"
        },
        "for_amount": {
          "value": 101.00,
          "currency": "EUR"
        },
        "rate": 0.61223252,
        "fee": {
          "value": 0.99,
          "currency": "AUD"
        }
      }
    ],
    "credits": [],
    "creation_time": "2022-08-15T11:10:41Z",
    "occurred_at": "2022-08-15T11:10:41Z",
    "purge_time": "2022-08-22T11:10:41Z",
    "relay_authorisation_data": {
      "response_code": "APPROVED",
      "fallback": true
    }
  },
  "subscription_id": "568da36b-7335-4608-ad1b-e5c2d32273b6",
  "event_type": "cards#transaction-state-change",
  "schema_version": "2.1.0",
  "sent_at": "2022-08-15T11:10:46Z"
}
```

Example cards#transaction-state-change event, cancelled transaction

```json
{
  "data": {
      "resource": {
        "profile_id": 123456,
        "client_id": "your-bank",
        "card_token": "136b29e4-7eab-4dac-a017-438d494ef6cb",
        "card_last_digits": "1234",
        "type": "card"
      },
      "transaction_id": 712893,
      "transaction_type": "POS_PURCHASE",
      "transaction_step_type": "FULL_REVERSAL",
      "decline_reason": null,
      "transaction_state": "CANCELLED",
      "transaction_amount": {
          "value": 10.00,
          "currency": "EUR"
      },
      "fees": [],
      "transaction_amount_with_fees": {
          "value": 10.00,
          "currency": "EUR"
      },
      "billing_amount": {
          "value": 10.00,
          "currency": "EUR"
      },
      "approval_code": "723647",
      "authorisation_method": "CONTACTLESS",
      "balance_channel_reference_id": "70781abe-9098-42f0-fb1f-6cf428b5068e",
      "debits": [
          {
              "balance_id": 4176832,
              "debited_amount": {
                  "value": -10.00,
                  "currency": "EUR"
              },
              "for_amount": {
                  "value": -10.00,
                  "currency": "EUR"
              },
              "rate": 1.0000000000000000,
              "fee": {
                  "value": 0.00,
                  "currency": "EUR"
              },
              "creation_time": "2026-02-02T11:05:19.211686Z"
          },
          {
              "balance_id": 4176832,
              "debited_amount": {
                  "value": 10.00,
                  "currency": "EUR"
              },
              "for_amount": {
                  "value": 10.00,
                  "currency": "EUR"
              },
              "rate": 1.0000000000000000,
              "fee": {
                  "value": 0.00,
                  "currency": "EUR"
              },
              "creation_time": "2026-02-02T11:04:41.295825Z"
          }
      ],
      "credits": [],
      "merchant": {
          "merchantName": "Acquirer Name",
          "category": {
              "code": "5499",
              "description": "Miscellaneous Food Stores Conven"
          },
          "location": {
              "country": "GB",
              "city": "CITY NAME",
              "zipCode": "00000",
              "state": null
          }
      },
      "arn": null,
      "pin_validation_result": "NOT_RECEIVED",
      "purge_time": null,
      "creation_time": "2026-02-02T11:04:41Z",
      "occurred_at": "2026-02-02T11:05:19Z"
  },
  "subscription_id": "655a929b-c61d-47bb-ad05-9ba085f80f0f",
  "event_type": "cards#transaction-state-change",
  "schema_version": "2.1.0",
  "sent_at": "2026-02-02T11:05:20Z"
}
```

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.client_id
Your api_client_id

data.resource.card_token
Unique identifier of the card

data.resource.card_last_digits
Last 4 digits of the card

data.resource.type
Resource type (always `card`)

data.transaction_id
ID of the transaction

data.transaction_type
Type of the transaction. Please refer to the table below for the available transaction types.

data.transaction_step_type
Step type of the transaction. Please refer to the table below for the available transaction step types.

data.transaction_state
The current state of the transaction. Please refer to the table below for the available transaction states.

data.decline_reason
Code of the decline reason if applicable

data.detailed_decline_reason
Code of the detailed decline reason if applicable. List of available options is available [here](/api-reference/card-transaction#card-transaction-detailed-decline-reasons).

data.creation_time
When the transaction was created

data.occurred_at
When the transaction state change occurred

data.purge_time
Time at which reserved funds will be released after the authorisation hold expires

data.transaction_amount.value
Transaction amount, excluding all embedded fees such as ATM fees that are not applied by Wise

data.transaction_amount.currency
Currency code

data.fees
Array of fees

data.fees[0].amount
Fee amount

data.fees[0].currency
Currency code

data.fees[0].fee_type
Fee type. Please refer to the table below for the available transaction fee types.

data.transaction_amount_with_fees.value
Transaction amount including all fees

data.transaction_amount_with_fees.currency
Currency code

data.billing_amount.value
Billing amount

data.billing_amount.currency
Currency code

data.merchant.name
Name of the merchant

data.merchant.location.country
Country where merchant is located

data.merchant.location.city
City where merchant is located

data.merchant.location.postCode
Post code where merchant is located

data.merchant.location.state
State where merchant is located

data.merchant.category.code
Merchant category code

data.merchant.category.description
Merchant category description

data.authorisation_method
Authorisation method

data.approval_code
Also called authorization code. This can be used to prove ownership of a customer's card/account to a merchant

data.arn
Acquirer reference number

data.pin_validation_result
PIN validation result. Possible values: `ONLINE_PIN_VALIDATED`, `ONLINE_PIN_INVALID`, `OFFLINE_PIN_VALIDATED`, `OFFLINE_PIN_INVALID`, `NOT_RECEIVED`

data.balance_channel_reference_id
Balance channel reference ID associated with the card transaction

data.debits
Array of debits. Note that the debits list is a non-aggregated list of debit movements, meaning that the `balance_id` is not unique in the list. For example, a cancelled transaction may have a list of 2 debits where the absolute values of `debited_amount.value`, `for_amount.value` and `fee.value` are the same, but one is the negation of the other due to a reservation (first debit) which was then released (second debit with negated amounts). In this case, you can choose to perform the aggregation in your system or display the full list of debits to the end customer.

data.debits[0].balance_id
Balance ID

data.debits[0].debited_amount.value
Amount taken from the balance

data.debits[0].debited_amount.currency
Currency code

data.debits[0].for_amount.value
Amount converted to

data.debits[0].for_amount.currency
Currency code

data.debits[0].rate
Exchange rate

data.debits[0].fee.value
Conversion fee amount

data.debits[0].fee.currency
Currency code

data.debits[0].creation_time
Time of balance debit creation

data.credits
Array of credits

data.credits[0].balance_id
Balance ID

data.credits[0].credited_amount.value
Amount credited to the balance

data.credits[0].credited_amount.currency
Currency code

data.relay_authorisation_data.response_code
Relayed authorisation [response code](/guides/product/issue-cards/relayed-authorisation#authorisation-response)

data.relay_authorisation_data.fallback
Whether there was a fallback applied by Wise

### Table of available transaction state and descriptions

| Code | Description |
|  --- | --- |
| IN_PROGRESS | The transaction is still in progress |
| COMPLETED | The transaction is completed |
| DECLINED | The transaction has been declined |
| CANCELLED | The transaction has been cancelled |
| UNKNOWN | Default fallback status |


### Table of available transaction type and descriptions

| Code | Description |
|  --- | --- |
| ACCOUNT_CREDIT | Receiving money on the card, excluding Visa OCT or Mastercard MoneySend |
| ACCOUNT_FUNDING | Sending money to another card or e-wallet |
| CASH_ADVANCE | Cash disbursement |
| CASH_WITHDRAWAL | ATM withdrawal |
| CHARGEBACK | Currently unused. Reserved for future use. |
| CREDIT_TRANSACTION | Visa OCT and Mastercard MoneySend |
| ECOM_PURCHASE | Online purchase |
| POS_PURCHASE | Purchase via a POS Terminal |
| REFUND | Partial or full refund of an existing card transaction |


### Table of available transaction step type and descriptions

| Code | Description |
|  --- | --- |
| AUTH | Transaction authorization which is usually the first step |
| PARTIAL_REVERSAL | Transaction has been partially reversed |
| FULL_REVERSAL | Transaction has been fully reversed |
| CAPTURE | Transaction has been caputured |
| SETTLE | Currently unused. Reserved for future use. |
| REFUND | Currently unused. Reserved for future use. |
| RECONCILIATION | Currently unused. Reserved for future use. |


### Table of available fee type and descriptions

| Code | Description |
|  --- | --- |
| ATM_WITHDRAWAL | Fee charged by Wise |
| ATM_MACHINE | Fee charged by the ATM owner |


Example `cards#transaction-state-change` event, completed transaction

```json
{
  "data": {
    "resource": {
      "profile_id": 123456,
      "client_id": "your-bank",
      "card_token": "136b29e4-7eab-4dac-a017-438d494ef6cb",
      "card_last_digits": "1234",
      "type": "card"
    },
    "transaction_id": 12345,
    "transaction_type": "CASH_WITHDRAWAL",
    "transaction_step_type": "CAPTURE",
    "transaction_state": "COMPLETED",
    "decline_reason": null,
    "detailed_decline_reason": null,
    "transaction_amount": {
      "value": 100.00,
      "currency": "EUR"
    },
    "fees": [
      {
        "amount": 1.00,
        "currency": "EUR",
        "fee_type": "ATM_WITHDRAWAL"
      }
    ],
    "transaction_amount_with_fees": {
      "value": 101.00,
      "currency": "EUR"
    },
    "billing_amount": {
      "value": 100.00,
      "currency": "EUR"
    },
    "merchant": {
      "name": "Test Payment",
      "location": {
        "country": "France",
        "city": "Rouen",
        "zipCode": "00000",
        "region": null,
        "state": null
      },
      "category": {
        "name": "MISCELLANEOUS_FOOD_STORES_CONVEN",
        "code": "5999",
        "description": "5999 R Miscellaneous and Special"
      }
    },
    "authorisationMethod": "MANUAL_ENTRY",
    "arn": "04300014127798385983852",
    "approvalCode": "913647",
    "pinValidationResult": "ONLINE_PIN_VALIDATED",
    "balanceChannelReferenceId": "6e71018d-2f4d-4fc3-6711-f517f4664712",
    "debits": [
      {
        "balance_id": 123,
        "debited_amount": {
          "value": 165.96,
          "currency": "AUD"
        },
        "for_amount": {
          "value": 101.00,
          "currency": "EUR"
        },
        "rate": 0.61223252,
        "fee": {
          "value": 0.99,
          "currency": "AUD"
        }
      }
    ],
    "credits": [],
    "creation_time": "2022-08-15T11:10:41.456Z",
    "occurred_at": "2022-08-15T11:10:41.789Z",
    "purge_time": "2022-08-22T11:10:41.123Z",
    "relay_authorisation_data": {
      "response_code": "APPROVED",
      "fallback": true
    }
  },
  "subscription_id": "568da36b-7335-4608-ad1b-e5c2d32273b6",
  "event_type": "cards#transaction-state-change",
  "schema_version": "4.0.0",
  "sent_at": "2022-08-15T11:10:46.123Z"
}
```

Example cards#transaction-state-change event, cancelled transaction

```json
{
  "data": {
      "resource": {
        "profile_id": 123456,
        "client_id": "your-bank",
        "card_token": "136b29e4-7eab-4dac-a017-438d494ef6cb",
        "card_last_digits": "1234",
        "type": "card"
      },
      "transaction_id": 712893,
      "transaction_type": "POS_PURCHASE",
      "transaction_step_type": "FULL_REVERSAL",
      "decline_reason": null,
      "transaction_state": "CANCELLED",
      "transaction_amount": {
          "value": 10.00,
          "currency": "EUR"
      },
      "fees": [],
      "transaction_amount_with_fees": {
          "value": 10.00,
          "currency": "EUR"
      },
      "billing_amount": {
          "value": 10.00,
          "currency": "EUR"
      },
      "approval_code": "723647",
      "authorisation_method": "CONTACTLESS",
      "balance_channel_reference_id": "70781abe-9098-42f0-fb1f-6cf428b5068e",
      "debits": [
          {
              "balance_id": 4176832,
              "debited_amount": {
                  "value": -10.00,
                  "currency": "EUR"
              },
              "for_amount": {
                  "value": -10.00,
                  "currency": "EUR"
              },
              "rate": 1.0000000000000000,
              "fee": {
                  "value": 0.00,
                  "currency": "EUR"
              },
              "creation_time": "2026-02-02T11:05:19.211Z"
          },
          {
              "balance_id": 4176832,
              "debited_amount": {
                  "value": 10.00,
                  "currency": "EUR"
              },
              "for_amount": {
                  "value": 10.00,
                  "currency": "EUR"
              },
              "rate": 1.0000000000000000,
              "fee": {
                  "value": 0.00,
                  "currency": "EUR"
              },
              "creation_time": "2026-02-02T11:04:41.295Z"
          }
      ],
      "credits": [],
      "merchant": {
          "merchantName": "Acquirer Name",
          "category": {
              "code": "5499",
              "description": "Miscellaneous Food Stores Conven"
          },
          "location": {
              "country": "GB",
              "city": "CITY NAME",
              "zipCode": "00000",
              "state": null
          }
      },
      "arn": null,
      "pin_validation_result": "NOT_RECEIVED",
      "purge_time": null,
      "creation_time": "2026-02-02T11:04:41.789Z",
      "occurred_at": "2026-02-02T11:05:19.456Z"
  },
  "subscription_id": "655a929b-c61d-47bb-ad05-9ba085f80f0f",
  "event_type": "cards#transaction-state-change",
  "schema_version": "4.0.0",
  "sent_at": "2026-02-02T11:05:20.123Z"
}
```

## Additional verification state change event  

* Event type: `profiles#cdd-check-state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event pushes updates for [Additional Customer Verification](/guides/product/kyc/partner-kyc/additional-verification) process.

### Verification state values

| Code | Description |
|  --- | --- |
| VERIFIED | Additional verification check has passed |
| EVIDENCE_REQUIRED | Additional verification check has failed, evidences are required |


### Review outcome values 

| Code | Description |
|  --- | --- |
| DOCUMENT_POOR_QUALITY | Document quality poor |
| DOCUMENT_OUT_OF_DATE | Document out of date |
| DOCUMENT_NAME_MISMATCH | Name on document does not match records |
| DOCUMENT_MISSING_NAME | Name on document missing |
| DOCUMENT_MISSING_ISSUE_DATE | Document issue date missing |
| DOCUMENT_MISSING_COMPANY_LOGO_LETTERHEAD | Company logo or letterhead missing from document |
| DOCUMENT_NOT_COMPLETE | Document is partially cut-off and does not contain full information |
| DOCUMENT_MISSING_SIGNATURE | Document missing signature |
| DOCUMENT_MISSING_INCOME | Document missing income information or income is not clear from the document |
| DOCUMENT_TYPE_UNACCEPTABLE | Submitted document type is not acceptable |
| INVOICE_UNACCEPTABLE | Invoice is not an accepted document |
| PHOTO_ID_UNACCEPTABLE | Photo ID is not an accepted document |
| TRANSACTION_UNACCEPTABLE | Transaction (or a screenshot of a transaction) is not accepted |
| PHOTO_UNACCEPTABLE | Photos (or computer screenshots) are not acceptable |
| OTHER | Reason unknown |


### Required evidence values 

Go to the [list of evidences](/api-reference/verification#supported-evidences) to find all possible values.

Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.type
Profile resource type (always set to `profile`)

data.resource.id
ID of the profile

data.current_state
Current verification state of the profile (see table below)

data.review_outcome
*Optional*

Reason the verification review did not pass.

Refer to the table below for description on these reasons.

data.required_evidences
List of required evidences for verification.

Refer to the table below for description on how to provide the missing evidence.

data.occurred_at
When the CDD check state change occurred

data.source_of_income
*Optional*

Source of income for a personal profile submitted via the /upload-evidences API.

Use this to upload the correct Source of Wealth document.

data.source_of_funding
*Optional*

Source of funding for a business profile submitted via the /upload-evidences API.

Use this to upload the correct Source of Wealth document.

Example `profiles#cdd-check-state-change` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "current_state": "VERIFIED",
    "required_evidences": [],
    "occurred_at": "2020-01-01T12:34:56Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#cdd-check-state-change",
  "schema_version": "2.0.0",
  "sent_at": "2020-01-01T12:34:56Z"
}
```

Another example `profiles#cdd-check-state-change` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "current_state": "EVIDENCE_REQUIRED",
    "review_outcome": "Document is not acceptable",
    "required_evidences": [
      "SOURCE_OF_INCOME"
    ],
    "source_of_income": "INVESTMENTS",
    "occurred_at": "2020-01-01T12:34:56Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#cdd-check-state-change",
  "schema_version": "2.0.0",
  "sent_at": "2020-01-01T12:34:56Z"
}
```

Schema
data.resource.type
Profile resource type (always set to `profile`)

data.resource.id
ID of the profile

data.current_state
Current verification state of the profile (see table below)

data.review_outcome
*Optional*

Reason the verification review did not pass.

Refer to the table below for description on these reasons.

data.required_evidences
List of required evidences for verification.

Refer to the table below for description on how to provide the missing evidence.

data.occurred_at
When the CDD check state change occurred

data.source_of_income
*Optional*

Source of income for a personal profile submitted via the /upload-evidences API.

Use this to upload the correct Source of Wealth document.

data.source_of_funding
*Optional*

Source of funding for a business profile submitted via the /upload-evidences API.

Use this to upload the correct Source of Wealth document.

Example `profiles#cdd-check-state-change` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "current_state": "VERIFIED",
    "required_evidences": [],
    "occurred_at": "2020-01-01T12:34:56.789Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#cdd-check-state-change",
  "schema_version": "4.0.0",
  "sent_at": "2020-01-01T12:34:56.123Z"
}
```

Another example `profiles#cdd-check-state-change` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "current_state": "EVIDENCE_REQUIRED",
    "review_outcome": "Document is not acceptable",
    "required_evidences": [
      "SOURCE_OF_INCOME"
    ],
    "source_of_income": "INVESTMENTS",
    "occurred_at": "2020-01-01T12:34:56.789Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#cdd-check-state-change",
  "schema_version": "4.0.0",
  "sent_at": "2020-01-01T12:34:56.123Z"
}
```

## Card status change events  

* Event type: `cards#card-status-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event is triggered for the initial card status as well as any subsequent updates.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.client_id
Your api_client_id

data.resource.card_token
Unique identifier of the card

data.resource.type
Resource type (always `card`)

data.card_status
The updated card status

data.changed_by
The identifier of the entity that updated the card status. If changed by Wise, the value is set to `internal_system`,
otherwise, it is set to your api_client_id

data.occurred_at
When the card status change occurred

### Table of available card status and descriptions

| Code | Description |
|  --- | --- |
| ACTIVE | Card is active and can be used |
| INACTIVE | Card is inactive and all transactions will be declined |
| BLOCKED | Card is blocked and cannot be reversed back to any state |
| FROZEN | Card is "blocked" but temporarily |
| PARTNER_SUSPENDED | Card is suspended by Wise temporarily due to e.g. fraud reasons |
| EXPIRED | Card is expired |
| PURGED | The cardhoder data (e.g. PAN, PIN) have been purged after exceeds the retention period (555 days after the card's expiry date) |


Example `cards#card-status-change` event

```json
{
  "data": {
    "resource": {
      "profile_id": 123456,
      "client_id": "your-bank",
      "card_token": "ABCD-1234-ABCD-1234-ABCD",
      "type": "card"
    },
    "card_status": "FROZEN",
    "changed_by": "internal_system",
    "occurred_at": "2022-08-22T07:49:50Z"
  },
  "subscription_id": "ABCD-1234-ABCD-1234-ABCD",
  "event_type": "cards#card-status-change",
  "schema_version": "2.0.0",
  "sent_at": "2022-08-22T07:59:50Z"
}
```

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.client_id
Your api_client_id

data.resource.card_token
Unique identifier of the card

data.resource.type
Resource type (always `card`)

data.card_status
The updated card status

data.changed_by
The identifier of the entity that updated the card status. If changed by Wise, the value is set to `internal_system`,
otherwise, it is set to your api_client_id

data.occurred_at
When the card status change occurred

### Table of available card status and descriptions

| Code | Description |
|  --- | --- |
| ACTIVE | Card is active and can be used |
| INACTIVE | Card is inactive and all transactions will be declined |
| BLOCKED | Card is blocked and cannot be reversed back to any state |
| FROZEN | Card is "blocked" but temporarily |
| PARTNER_SUSPENDED | Card is suspended by Wise temporarily due to e.g. fraud reasons |
| EXPIRED | Card is expired |
| PURGED | The cardhoder data (e.g. PAN, PIN) have been purged after exceeds the retention period (555 days after the card's expiry date) |


Example `cards#card-status-change` event

```json
{
  "data": {
    "resource": {
      "profile_id": 123456,
      "client_id": "your-bank",
      "card_token": "ABCD-1234-ABCD-1234-ABCD",
      "type": "card"
    },
    "card_status": "FROZEN",
    "changed_by": "internal_system",
    "occurred_at": "2022-08-22T07:49:50.789Z"
  },
  "subscription_id": "ABCD-1234-ABCD-1234-ABCD",
  "event_type": "cards#card-status-change",
  "schema_version": "4.0.0",
  "sent_at": "2022-08-22T07:59:50.123Z"
}
```

## Card order status change events  

* Event type: `cards#card-order-status-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered every time a card order status is updated.
Please note that statuses depend on the type of card (virtual/physical). Additional statuses related to delivery exist for physical cards.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.type
Webhook notification of type 'card'

data.resource.client_id
Api client_id

data.resource.card_token
Unique identifier of the card

data.order_id
Card order ID associated with the status change

data.order_status
Updated card order status

data.delivery_vendor
Delivery vendor used to dispatch the order (physical card only)

data.occurred_at
When the card order status change occurred

Example `cards#card-order-status-change` event

```json
{
   "data":{
      "resource":{
        "type": "card",
        "profile_id": "123456",
        "client_id": "your-bank",
        "card_token": "35050a4a-9521-426e-8109-1396e3687a3e",
        "card_program": "VISA_DEBIT_CONSUMER_UK_1_PHYSICAL_CARDS_API"
      },
      "order_id" : "1001L",
      "order_status": "PRODUCED",
      "delivery_vendor": "DHL",
      "occurred_at":"2023-01-01T12:24:56Z"
   },
   "subscription_id":"01234567-89ab-cdef-0123-456789abcdef",
   "event_type":"cards#card-order-status-change",
   "schema_version":"2.0.0",
   "sent_at":"2023-01-01T12:34:56Z"
}
```

### Table of available card order status and description

The initial status is `PLACED` or `REQUIREMENT_FULFILLED` depending on the requirement fulfillment state.

The possible values are shown in the table below:

| **Status** | **Definition** |
|  --- | --- |
| `PLACED` | The card order is created. The card will be generated once it has fulfilled all the requirements |
| `REQUIREMENTS_FULFILLED` | The card order has fulfilled all the requirements and the card should be generated in a short while |
| `CARD_DETAILS_CREATED` | The card has been generated |
| `PRODUCED` | The physical card has been produced and waiting to be picked up by delivery vendor (physical card only) |
| `COMPLETED` | The card has been activated and is ready to use. The card order is completed |
| `CANCELLED` | The card order has been cancelled. This can happen if you reach out to Wise Support to cancel a card order |
| `RETURNED` | Delivery failed, the physical card has been returned and will be blocked (physical card only) |


Card order status transitions
Create card order statuses transition diagram
Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.type
Webhook notification of type 'card'

data.resource.client_id
Api client_id

data.resource.card_token
Unique identifier of the card

data.order_id
Card order ID associated with the status change

data.order_status
Updated card order status

data.delivery_vendor
Delivery vendor used to dispatch the order (physical card only)

data.occurred_at
When the card order status change occurred

Example `cards#card-order-status-change` event

```json
{
   "data":{
      "resource":{
        "type": "card",
        "profile_id": "123456",
        "client_id": "your-bank",
        "card_token": "35050a4a-9521-426e-8109-1396e3687a3e",
        "card_program": "VISA_DEBIT_CONSUMER_UK_1_PHYSICAL_CARDS_API"
      },
      "order_id" : "1001L",
      "order_status": "PRODUCED",
      "delivery_vendor": "DHL",
      "occurred_at":"2023-01-01T12:24:56.789Z"
   },
   "subscription_id":"01234567-89ab-cdef-0123-456789abcdef",
   "event_type":"cards#card-order-status-change",
   "schema_version":"4.0.0",
   "sent_at":"2023-01-01T12:34:56.123Z"
}
```

### Table of available card order status and description

The initial status is `PLACED` or `REQUIREMENT_FULFILLED` depending on the requirement fulfillment state.

The possible values are shown in the table below:

| **Status** | **Definition** |
|  --- | --- |
| `PLACED` | The card order is created. The card will be generated once it has fulfilled all the requirements |
| `REQUIREMENTS_FULFILLED` | The card order has fulfilled all the requirements and the card should be generated in a short while |
| `CARD_DETAILS_CREATED` | The card has been generated |
| `PRODUCED` | The physical card has been produced and waiting to be picked up by delivery vendor (physical card only) |
| `COMPLETED` | The card has been activated and is ready to use. The card order is completed |
| `CANCELLED` | The card order has been cancelled. This can happen if you reach out to Wise Support to cancel a card order |
| `RETURNED` | Delivery failed, the physical card has been returned and will be blocked (physical card only) |


Card order status transitions
Create card order statuses transition diagram
## Card production status change events  

- Event type: `cards#card-production-status-change`
- Profile level subscriptions: Not Supported
- Application level subscriptions: Supported


This event will be triggered every time a card production status is updated.
Please note that this webhook is solely used for physical card with `KIOSK_COLLECTION` delivery method.

Refer back to the [Card kiosk collection guide](/guides/product/issue-cards/card-kiosk-collection) for more details.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.type
Webhook notification of type 'card'

data.resource.client_id
API client_id

data.resource.card_token
Unique identifier of the card

data.status
Current production status. The possible values can be found in the [production status flow diagram](/api-reference/card-kiosk-collection#production-status-flow).

data.kiosk_id
Identifier that specifies which kiosk machine is producing the card.

data.occurred_at
Time when the card production request has been sent to the kiosk machine.

data.error_code
Code returned when card production is not successful. The possible values can be found in [production errors](/api-reference/card-kiosk-collection/cardkioskcollectionproduce).

data.description
Detailed description of the error code.

Example `cards#card-production-status-change` event

```json
{
  "data": {
    "resource": {
      "type": "card",
      "profile_id": "123456",
      "client_id": "your-bank",
      "card_token": "35050a4a-9521-426e-8109-1396e3687a3e"
    },
    "status": "PRODUCED",
    "kiosk_id": "WIS00001",
    "error_code": null,
    "description": "Card produced",
    "occurred_at": "2024-01-01T12:24:56Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "cards#card-production-status-change",
  "schema_version": "2.0.0",
  "sent_at": "2024-01-01T12:34:56Z"
}
```

Schema
data.resource.profile_id
ID of the profile that owns the card

data.resource.type
Webhook notification of type 'card'

data.resource.client_id
API client_id

data.resource.card_token
Unique identifier of the card

data.status
Current production status. The possible values can be found in the [production status flow diagram](/api-reference/card-kiosk-collection#production-status-flow).

data.kiosk_id
Identifier that specifies which kiosk machine is producing the card.

data.occurred_at
Time when the card production request has been sent to the kiosk machine.

data.error_code
Code returned when card production is not successful. The possible values can be found in [production errors](/api-reference/card-kiosk-collection/cardkioskcollectionproduce).

data.description
Detailed description of the error code.

Example `cards#card-production-status-change` event

```json
{
  "data": {
    "resource": {
      "type": "card",
      "profile_id": "123456",
      "client_id": "your-bank",
      "card_token": "35050a4a-9521-426e-8109-1396e3687a3e"
    },
    "status": "PRODUCED",
    "kiosk_id": "WIS00001",
    "error_code": null,
    "description": "Card produced",
    "occurred_at": "2024-01-01T12:24:56.789Z"
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "cards#card-production-status-change",
  "schema_version": "4.0.0",
  "sent_at": "2024-01-01T12:34:56.123Z"
}
```

## Cards manual provisioning verification events 

* Event type: `cards#manual-provisioning-verification`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event is triggered when a card is manually added to a wallet provider, and the verification methods required to complete the wallet provisioning are returned.

For the full schema and examples, see the [Cards manual provisioning verification](/api-reference/webhook-event/eventcardsmanualprovisioningverification) API reference.

## Partner Support Case Changed  

* Event type: `partner-support#case-changed`
* Profile level subscriptions: Not supported
* Application level subscriptions: Supported


This event will be triggered every time a partner case is updated, including if commented on or if the status is changed.

Note that you will also receive a webhook response when you have created a new case or updated a case.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.type
Type of the partner case. Value must be `GENERAL_ENQUIRY`. More case types will be added in the future.

data.resource.case_id
ID of the partner case

data.resource.details.transfer_id
ID of the transfer that is associated with the partner case. This can be `null`.

data.resource.details.profile_id
ID of the profile that is associated with the partner case.

data.resource.details.user_id
ID of the user account that is associated with the partner case.

status
Status of the case. Can include `OPEN`, `PENDING`, `SOLVED` and `CLOSED`.

data.resource.type
Type of resource for webhook. Will always be `partner-support-case`

data.type
The type of the webhook being sent. Will be `STATUS_UPDATED` , `NEW_COMMENT` , or `NEW_CASE`

data.occurred_at
When the partner case update occurred.

Example `partner-support#case-changed` event

```json
{
  "data": {
    "resource": {
      "case_id": 136,
      "case_type": "GENERAL_ENQUIRY",
      "details": {
        "transfer_id": 12345678,
        "user_id": 12345678,
        "profile_id": 12345678
      },
      "status": "PENDING",
      "type": "partner-support-case"
    },
    "type": "NEW_CASE",
    "occurred_at": "2023-06-23T09:45:34Z"
  },
  "subscription_id": "017631af-326c-4a69-93f3-bd1ce987a743",
  "event_type": "partner-support#case-changed",
  "schema_version": "2.0.0",
  "sent_at": "2023-06-23T09:45:36Z"
}
```

Schema
data.resource.type
Type of the partner case. Value must be `GENERAL_ENQUIRY`. More case types will be added in the future.

data.resource.case_id
ID of the partner case

data.resource.details.transfer_id
ID of the transfer that is associated with the partner case. This can be `null`.

data.resource.details.profile_id
ID of the profile that is associated with the partner case.

data.resource.details.user_id
ID of the user account that is associated with the partner case.

status
Status of the case. Can include `OPEN`, `PENDING`, `SOLVED` and `CLOSED`.

data.resource.type
Type of resource for webhook. Will always be `partner-support-case`

data.type
The type of the webhook being sent. Will be `STATUS_UPDATED` , `NEW_COMMENT` , or `NEW_CASE`

data.occurred_at
When the partner case update occurred.

Example `partner-support#case-changed` event

```json
{
  "data": {
    "resource": {
      "case_id": 136,
      "case_type": "GENERAL_ENQUIRY",
      "details": {
        "transfer_id": 12345678,
        "user_id": 12345678,
        "profile_id": 12345678
      },
      "status": "PENDING",
      "type": "partner-support-case"
    },
    "type": "NEW_CASE",
    "occurred_at": "2023-06-23T09:45:34.789Z"
  },
  "subscription_id": "017631af-326c-4a69-93f3-bd1ce987a743",
  "event_type": "partner-support#case-changed",
  "schema_version": "4.0.0",
  "sent_at": "2023-06-23T09:45:36.123Z"
}
```

## Transaction disputes update events  

* Event type: `transaction-disputes#update`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered every time a transaction dispute is submitted or updated.

Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.id
Unique ID of the dispute

data.resource.profile_id
ID of the profile that owns the card

data.resource.transaction_id
ID of the card transaction

data.resource.type
Resource type (always `transaction-dispute`)

data.reason
Dispute reason, you can find all the possible values [here](/api-reference/disputes/disputereasonsget)

data.status
Dispute overall status, it is either ACTIVE or CLOSED

data.sub_status
Dispute detailed status, you can find all the possible values [here](/api-reference/disputes#dispute-sub-status)

data.status_message
Explanation for subStatus

data.created_at
Time when the dispute was created

data.created_by
Creator of the dispute, it is currently set to the user id

data.can_withdraw
Whether the dispute can be withdrawn

data.occurred_at
When the dispute updates occurred

Example `transaction-disputes#update` event

```json
{
  "data": {
    "resource": {
      "id": "39f893e3-4b0c-4850-9c5c-8cb8f4798a43",
      "profile_id": 16605997,
      "transaction_id": 4337,
      "type": "transaction-dispute"
    },
    "reason": "WRONG_AMOUNT",
    "status": "CLOSED",
    "sub_status": "WITHDRAWN",
    "status_message": "Withdrawn",
    "created_at": "2024-04-18T06:17:12Z",
    "created_by": "6097861",
    "can_withdraw": false,
    "occurred_at": "2024-04-18T06:36:15Z"
  },
  "event_type": "transaction-disputes#update",
  "schema_version": "2.0.0",
  "sent_at": "2024-04-18T06:36:17Z",
  "subscription_id": "7bb32a11-74ad-43b6-9505-3f5facbc87ed"
}
```

Schema
data.resource.id
Unique ID of the dispute

data.resource.profile_id
ID of the profile that owns the card

data.resource.transaction_id
ID of the card transaction

data.resource.type
Resource type (always `transaction-dispute`)

data.reason
Dispute reason, you can find all the possible values [here](/api-reference/disputes/disputereasonsget)

data.status
Dispute overall status, it is either ACTIVE or CLOSED

data.sub_status
Dispute detailed status, you can find all the possible values [here](/api-reference/disputes#dispute-sub-status)

data.status_message
Explanation for subStatus

data.created_at
Time when the dispute was created

data.created_by
Creator of the dispute, it is currently set to the user id

data.can_withdraw
Whether the dispute can be withdrawn

data.occurred_at
When the dispute updates occurred

Example `transaction-disputes#update` event

```json
{
  "data": {
    "resource": {
      "id": "39f893e3-4b0c-4850-9c5c-8cb8f4798a43",
      "profile_id": 16605997,
      "transaction_id": 4337,
      "type": "transaction-dispute"
    },
    "reason": "WRONG_AMOUNT",
    "status": "CLOSED",
    "sub_status": "WITHDRAWN",
    "status_message": "Withdrawn",
    "created_at": "2024-04-18T06:17:12.456Z",
    "created_by": "6097861",
    "can_withdraw": false,
    "occurred_at": "2024-04-18T06:36:15.789Z"
  },
  "event_type": "transaction-disputes#update",
  "schema_version": "4.0.0",
  "sent_at": "2024-04-18T06:36:17.123Z",
  "subscription_id": "7bb32a11-74ad-43b6-9505-3f5facbc87ed"
}
```

## Bulk settlement payment received events  

* Event type: `bulk-settlement#payment-received`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered when a bulk settlement fund is received. Once there is a match, meaning the amount for this settlement journal is fully settled, the `amount_matched` will be set to true. If it is not matched, check the difference between `source_amount` and `target_amount` to determine how much more needs to be paid.
Please note that this event can also be triggered when our operations team reallocates funds between settlements. Therefore, the `received_amount` in version 2.0.0 of the webhook is inaccurate. Please use the latest version, 3.0.0.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.settlement_reference
Reference on settlement journal

data.resource.source_currency
Settlement currency

data.resource.received_amount
Please be aware that this field is unreliable. Always refer to the `target_amount` field for the total amount paid, and check the difference between `source_amount` and `target_amount` to see how much more needs to be paid.

data.resource.source_amount
The amount Wise paid out on behalf of partner

data.resource.target_amount
Total settlement fund received for this settlement journal

data.resource.amount_matched
Whether amount received matchs what is expected

data.occurred_at
When the settlement fund was received

Example `bulk-settlement#payment-received` event, version 2.0.0 which is now deprecated

```json
{
  "data": {
    "resource": {
      "settlement_reference": "TPFB1111111",
      "source_currency": "GBP",
      "received_amount": 10.1,
      "source_amount": -100.1,
      "target_amount": 100.1,
      "amount_matched": true
    },
    "occurred_at": "2024-04-18T06:36:15Z"
  },
  "event_type": "bulk-settlement#payment-received",
  "schema_version": "2.0.0",
  "sent_at": "2024-04-18T06:36:17Z",
  "subscription_id": "f5b51f77-e14a-433b-9f7c-fc2834ffcff5"
}
```

Schema
data.resource.settlement_reference
Reference on settlement journal

data.resource.source_currency
Settlement currency

data.resource.source_amount
The amount Wise paid out on behalf of partner

data.resource.target_amount
Total settlement fund received for this settlement journal

data.resource.amount_matched
Whether amount received matchs what is expected

data.occurred_at
When the settlement fund was received

Example `bulk-settlement#payment-received` event, version 3.0.0

```json
{
  "data": {
    "resource": {
      "settlement_reference": "TPFB1111111",
      "source_currency": "GBP",
      "source_amount": -100.1,
      "target_amount": 100.1,
      "amount_matched": true
    },
    "occurred_at": "2024-04-18T06:36:15Z"
  },
  "event_type": "bulk-settlement#payment-received",
  "schema_version": "3.0.0",
  "sent_at": "2024-04-18T06:36:17Z",
  "subscription_id": "f5b51f77-e14a-433b-9f7c-fc2834ffcff5"
}
```

Schema
data.resource.settlement_reference
Reference on settlement journal

data.resource.source_currency
Settlement currency

data.resource.source_amount
The amount Wise paid out on behalf of partner

data.resource.target_amount
Total settlement fund received for this settlement journal

data.resource.amount_matched
Whether amount received matches what is expected

data.occurred_at
When the settlement fund was received

Example `bulk-settlement#payment-received` event, version 4.0.0

```json
{
  "data": {
    "resource": {
      "settlement_reference": "TPFB1111111",
      "source_currency": "GBP",
      "source_amount": -100.1,
      "target_amount": 100.1,
      "amount_matched": true
    },
    "occurred_at": "2024-04-18T06:36:15.789Z"
  },
  "event_type": "bulk-settlement#payment-received",
  "schema_version": "4.0.0",
  "sent_at": "2024-04-18T06:36:17.123Z",
  "subscription_id": "f5b51f77-e14a-433b-9f7c-fc2834ffcff5"
}
```

## User state change events  

* Event type: `users#state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered every time a user state is updated.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.id
ID of the user

data.resource.type
Resource type (always `user`)

data.previous_state
The previous state of the user

data.current_state
The current state of the user

data.deactivation_type (optional)
The type of deactivation, `ACCOUNT_SUSPENSION` or `ACCOUNT_CLOSURE`. If the type is `ACCOUNT_SUSPENSION`, it is possible for your customer support teams to appeal the deactivation by reaching out to Wise.

data.deactivation_reason (optional)
The reason for deactivation

data.occurred_at
When the user state change occurred

Example `users#state-change` event

```json
{
  "data": {
    "resource": {
      "id": 1234,
      "type": "user"
    },
    "previous_state": "ACTIVE",
    "current_state": "WITHDRAW_ONLY",
    "deactivation_type": "ACCOUNT_SUSPENSION",
    "deactivation_reason": "REQUESTED_BY_CUSTOMER_CS",
    "occurred_at": "2020-01-01T12:34:56Z"
  },
  "event_type": "users#state-change",
  "schema_version": "2.0.0",
  "sent_at": "2020-01-01T12:34:56Z",
  "subscription_id": "f5b51f77-e14a-433b-9f7c-fc2834ffcff5"
}
```

The possible `previous_state` and `current_state` values are:

- `ACTIVE` - The user's account is active.
- `WITHDRAW_ONLY` - The user has 90 calendar days to remove their money from their balance before we fully close their account. This can be done through sending from their balance to themselves and others or spending with their card. The user will still be able to order new cards, convert between balances, open and close balances, and download balance statements. After 90 calendar days, the account will move into a `DEACTIVATED` state.
- `DEACTIVATED` - The user's account is deactivated and they will not be able to perform any actions on their account. The end-user tokens will be revoked and you will receive a `401 Unauthorized` response for API calls.


User state change transitions
User state change flow diagram
Schema
data.resource.id
ID of the user

data.resource.type
Resource type (always `user`)

data.previous_state
The previous state of the user

data.current_state
The current state of the user

data.deactivation_type (optional)
The type of deactivation, `ACCOUNT_SUSPENSION` or `ACCOUNT_CLOSURE`. If the type is `ACCOUNT_SUSPENSION`, it is possible for your customer support teams to appeal the deactivation by reaching out to Wise.

data.deactivation_reason (optional)
The reason for deactivation

data.occurred_at
When the user state change occurred

Example `users#state-change` event

```json
{
  "data": {
    "resource": {
      "id": 1234,
      "type": "user"
    },
    "previous_state": "ACTIVE",
    "current_state": "WITHDRAW_ONLY",
    "deactivation_type": "ACCOUNT_SUSPENSION",
    "deactivation_reason": "REQUESTED_BY_CUSTOMER_CS",
    "occurred_at": "2020-01-01T12:34:56.789Z"
  },
  "event_type": "users#state-change",
  "schema_version": "4.0.0",
  "sent_at": "2020-01-01T12:34:56.123Z",
  "subscription_id": "f5b51f77-e14a-433b-9f7c-fc2834ffcff5"
}
```

The possible `previous_state` and `current_state` values are:

- `ACTIVE` - The user's account is active.
- `WITHDRAW_ONLY` - The user has 90 calendar days to remove their money from their balance before we fully close their account. This can be done through sending from their balance to themselves and others or spending with their card. The user will still be able to order new cards, convert between balances, open and close balances, and download balance statements. After 90 calendar days, the account will move into a `DEACTIVATED` state.
- `DEACTIVATED` - The user's account is deactivated and they will not be able to perform any actions on their account. The end-user tokens will be revoked and you will receive a `401 Unauthorized` response for API calls.


User state change transitions
User state change flow diagram
## KYC review state change event  

* Event type: `kyc-reviews#state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event is triggered when a KYC Review state has changed.
Events may not be delivered in the order they occurred. Use `data.resource.updatedAt` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.id
ID of the KYC Review.

data.resource.state
Status of the KYC Review. See [KYC Review Status](/guides/product/kyc/wise-kyc/hosted-kyc) for
possible values and state diagram.

data.resource.profileId
ID of the profile KYC Review belongs to.

data.resource.requiredBy
Timestamp by which the underlying requirement set needs to be verified to not block the customer.
Only relevant if the status is `PASSED_WITH_REQUIREMENTS`.

data.resource.createdAt
Timestamp marking the creation of the KYC Review.

data.resource.updatedAt
Timestamp marking the last update of the KYC Review.

data.resource.triggerReference[n].type
Type of the underlying action/process this KYC Review is for. Usually a reference to which product
this KYC Review is for (like `QUOTE` or `TRANSFER`) or a reference to a KYC process on the profile
that isn't related to a specific product (like `REFRESH_CYCLE` or `REPAPERING`).

Currently supported types are:

- `"QUOTE"`
- `"TRANSFER"`
- `"PROACTIVE_SEND_MONEY"`
- `"ADD_MONEY"`
- `"CARD"`
- `"BANK_ACCOUNT_DETAILS"`


data.resource.triggerReference[n].triggerData
Key-value Object containing metadata of the underlying product object that triggered the KYC Review.
For `"QUOTE"`, `"TRANSFER"` and `"ADD_MONEY"` types, triggerData contains an`"id"` field that refers to their respective IDs.
For `"BANK_ACCOUNT_DETAILS"`, triggerData has a field called `"currencies"` which contains a list of currencies (i.e USD, SGD, EUR) that
the bank details have been created for.

Table below shows the fields and their data type for each triggerReference type:

| triggerReference.type | field | type |
|  --- | --- | --- |
| QUOTE | id | uuid |
| TRANSFER | id | long |
| ADD_MONEY | id | long |
| BANK_ACCOUNT_DETAILS | currencies | list of string |


This ID might be null if underlying action is a process like `REPAPERING`.

data.resource.requirements[n].key
The unique identifier of the KYC requirement

data.resource.requirements[n].state
The status of the KYC requirement. Either

`NOT_PROVIDED`: requires information

`IN_REVIEW`: requires internal review of the requirement

data.resource.requirements[n].apiCollectionSupported
A boolean value to indicate if the API collection available for this evidence. To submit the evidence refer to
[KYC Requirement Submit endpoint](/api-reference/kyc-review/kycreviewrequirementsubmit)

data.resource.requirements[n].versions[n]
Available versions to be submitted for the requirement

data.resource.requirements[n].versions[n].version
Available version identifier to be submitted for the requirement

data.resource.requirements[n].versions[n].validUntil
An optional field that indicates a valid until date.

Example `kyc-reviews#state-change` event

```json
{
  "data": {
    "resource": {
      "id": "46e1a5c4-4a9b-4563-39d3-18174d3ac0f8",
      "state": "WAITING_CUSTOMER_INPUT",
      "profileId": 22016766,
      "requiredBy": "2024-09-03T16:22:02.257725",
      "createdAt": "2024-09-03T16:22:02.257725",
      "updatedAt": "2024-09-03T16:29:41.147522",
      "triggerReferences": [
        {
          "type": "QUOTE",
          "triggerData": {
            "id": "ba83s43a-f623-46f0-956d-196c13e2ab01"
          }
        }
      ],
      "requirements": [
        [
          {
            "key": "BUSINESS_USE_CASES",
            "state": "NOT_PROVIDED",
            "apiCollectionSupported": true,
            "versions": [
              {
                "version": "V1"
              }
            ]
          }
        ],
        [
          {
            "key": "ID_DOCUMENT",
            "state": "IN_REVIEW",
            "apiCollectionSupported": true,
            "versions": [
              {
                "version": "V1"
              }
            ]
          }
        ]
      ]
    }
  },
  "subscription_id": "8df95817-8085-40aa-9bda-e3bf46e7a21a",
  "event_type": "kyc-reviews#state-change",
  "schema_version": "2.0.0",
  "sent_at": "2024-09-03T16:29:42Z"
}
```

This event is triggered when a KYC Review state has changed.
Events may not be delivered in the order they occurred. Use `data.resource.updatedAt` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.id
ID of the KYC Review.

data.resource.state
Status of the KYC Review. See [KYC Review Status](/guides/product/kyc/wise-kyc/hosted-kyc) for
possible values and state diagram.

data.resource.profileId
ID of the profile KYC Review belongs to.

data.resource.requiredBy
Timestamp by which the underlying requirement set needs to be verified to not block the customer.
Only relevant if the status is `PASSED_WITH_REQUIREMENTS`.

data.resource.createdAt
Timestamp marking the creation of the KYC Review.

data.resource.updatedAt
Timestamp marking the last update of the KYC Review.

data.resource.triggerReference[n].type
Type of the underlying action/process this KYC Review is for. Usually a reference to which product
this KYC Review is for (like `QUOTE` or `TRANSFER`) or a reference to a KYC process on the profile
that isn't related to a specific product (like `REFRESH_CYCLE` or `REPAPERING`).

Currently supported types are:

- `"QUOTE"`
- `"TRANSFER"`
- `"PROACTIVE_SEND_MONEY"`
- `"ADD_MONEY"`
- `"CARD"`
- `"BANK_ACCOUNT_DETAILS"`


data.resource.triggerReference[n].triggerData
Key-value Object containing metadata of the underlying product object that triggered the KYC Review.
For `"QUOTE"`, `"TRANSFER"` and `"ADD_MONEY"` types, triggerData contains an`"id"` field that refers to their respective IDs.
For `"BANK_ACCOUNT_DETAILS"`, triggerData has a field called `"currencies"` which contains a list of currencies (i.e USD, SGD, EUR) that
the bank details have been created for.

Table below shows the fields and their data type for each triggerReference type:

| triggerReference.type | field | type |
|  --- | --- | --- |
| QUOTE | id | uuid |
| TRANSFER | id | long |
| ADD_MONEY | id | long |
| BANK_ACCOUNT_DETAILS | currencies | list of string |


This ID might be null if underlying action is a process like `REPAPERING`.

data.resource.requirements[n].key
The unique identifier of the KYC requirement

data.resource.requirements[n].state
The status of the KYC requirement. Either

`NOT_PROVIDED`: requires information

`IN_REVIEW`: requires internal review of the requirement

data.resource.requirements[n].apiCollectionSupported
A boolean value to indicate if the API collection available for this evidence. To submit the evidence refer to
[KYC Requirement Submit endpoint](/api-reference/kyc-review/kycreviewrequirementsubmit)

data.resource.requirements[n].versions[n]
Available versions to be submitted for the requirement

data.resource.requirements[n].versions[n].version
Available version identifier to be submitted for the requirement

data.resource.requirements[n].versions[n].validUntil
An optional field that indicates a valid until date.

Example `kyc-reviews#state-change` event

```json
{
  "data": {
    "resource": {
      "id": "46e1a5c4-4a9b-4563-39d3-18174d3ac0f8",
      "state": "WAITING_CUSTOMER_INPUT",
      "profileId": 22016766,
      "requiredBy": "2024-09-03T16:22:02.258Z",
      "createdAt": "2024-09-03T16:22:02.258Z",
      "updatedAt": "2024-09-03T16:29:41.148Z",
      "triggerReferences": [
        {
          "type": "QUOTE",
          "triggerData": {
            "id": "ba83s43a-f623-46f0-956d-196c13e2ab01"
          }
        }
      ],
      "requirements": [
        [
          {
            "key": "BUSINESS_USE_CASES",
            "state": "NOT_PROVIDED",
            "apiCollectionSupported": true,
            "versions": [
              {
                "version": "V1"
              }
            ]
          }
        ],
        [
          {
            "key": "ID_DOCUMENT",
            "state": "IN_REVIEW",
            "apiCollectionSupported": true,
            "versions": [
              {
                "version": "V1"
              }
            ]
          }
        ]
      ]
    }
  },
  "subscription_id": "8df95817-8085-40aa-9bda-e3bf46e7a21a",
  "event_type": "kyc-reviews#state-change",
  "schema_version": "4.0.0",
  "sent_at": "2024-09-03T16:29:42.123Z"
}
```

This event is triggered when a KYC Review requirement or additional requirement state changes. Events may not be delivered in the order they occurred. Use `data.resource.updatedAt` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

**Behavioural change:** In previous versions, this event fired only when the overall KYC Review state changed. In v5.0.0, it fires on every requirement or additional requirement state change, which may result in more events being received. See `data.resource.prevState` and `data.resource.requirementChanges` for details on what changed.

Schema
data.resource.id
ID of the KYC Review.

data.resource.state
Status of the KYC Review. See [KYC Review Status](/guides/product/kyc/wise-kyc/hosted-kyc) for
possible values and state diagram.

data.resource.prevState
Previous status of the KYC Review. See [KYC Review Status](/guides/product/kyc/wise-kyc/hosted-kyc) for
possible values and state diagram.

data.resource.profileId
ID of the profile KYC Review belongs to.

data.resource.requiredBy
Timestamp by which the underlying requirement set needs to be verified to not block the customer.
Only relevant if the status is `PASSED_WITH_REQUIREMENTS`.

data.resource.createdAt
Timestamp marking the creation of the KYC Review.

data.resource.updatedAt
Timestamp marking the last update of the KYC Review.

data.resource.triggerReference[n].type
Type of the underlying action/process this KYC Review is for. Usually a reference to which product
this KYC Review is for (like `QUOTE` or `TRANSFER`) or a reference to a KYC process on the profile
that isn't related to a specific product (like `REFRESH_CYCLE` or `REPAPERING`).

Currently supported types are:

- `"QUOTE"`
- `"TRANSFER"`
- `"PROACTIVE_SEND_MONEY"`
- `"ADD_MONEY"`
- `"CARD"`
- `"BANK_ACCOUNT_DETAILS"`
- `"INFO_REQUEST"`


data.resource.triggerReference[n].triggerData
Key-value Object containing metadata of the underlying product object that triggered the KYC Review.
For `"QUOTE"`, `"TRANSFER"` and `"ADD_MONEY"` types, triggerData contains an`"id"` field that refers to their respective IDs.
For `"BANK_ACCOUNT_DETAILS"`, triggerData has a field called `"currencies"` which contains a list of currencies (i.e USD, SGD, EUR) that
the bank details have been created for.

Table below shows the fields and their data type for each triggerReference type:

| triggerReference.type | field | type |
|  --- | --- | --- |
| QUOTE | id | uuid |
| TRANSFER | id | long |
| ADD_MONEY | id | long |
| BANK_ACCOUNT_DETAILS | currencies | list of string |


This ID might be null if underlying action is a process like `REPAPERING`.

data.resource.requirements
Nested list of [KYC Requirement](/api-reference/kyc-review/kyc-requirement) objects in `[[Requirement]]` format, where each inner list represents a combination of possible requirements to be provided. To fulfil the whole KYC Review, at least one item from each inner list should be provided.

For example, if the requirements are `[[a, b], [c, d]]` then it should be read as `(a or b) and (c or d)`.


For a full breakdown of the structure, please refer to the API Documentation for the [KYC Requirement](/api-reference/kyc-review/kyc-requirement) object.

data.resource.requirementChanges[n].key
The [key](/api-reference/kyc-review/kyc-requirement#path=key) of the requirement which has changed.

data.resource.requirementChanges[n].newState
The new [state](/api-reference/kyc-review/kyc-requirement#path=state) of the requirement which has changed. Can additionally have value `VERIFIED`.

data.resource.requirementChanges[n].prevState
*Not provided when requirement is new.*
The previous [state](/api-reference/kyc-review/kyc-requirement#path=state) of the requirement which has changed. Can additionally have value `VERIFIED`. In case only an [additional requirement](/api-reference/kyc-review#path=additionalrequirements) has changed, this state can be equal to `data.resource.requirementChanges[n].newState`.

data.resource.requirementChanges[n].additionalRequirements
A list of additional requirements that have changed. Not shown if empty.

data.resource.requirementChanges[n].additionalRequirements[n].additionalRequirementId
The [UUID](/api-reference/kyc-review/kyc-requirement#path=state) of the additional requirement which has changed.

data.resource.requirementChanges[n].additionalRequirements[n].newState
The new [state](/api-reference/kyc-review#path=additionalrequirements/state) of the additional requirement which has changed. Can additionally have value `VERIFIED`.

data.resource.requirementChanges[n].additionalRequirements[n].prevState
*Not provided when additional requirement is new.*
The previous [state](/api-reference/kyc-review#path=additionalrequirements/state) of the additional requirement which has changed. Can additionally have value `VERIFIED`.

Example `kyc-reviews#state-change` event

```json
{
  "data": {
    "resource": {
      "id": "46e1a5c4-4a9b-4563-39d3-18174d3ac0f8",
      "state": "WAITING_CUSTOMER_INPUT",
      "prevState": "WAITING_CUSTOMER_INPUT",
      "profileId": 22016766,
      "requiredBy": "2024-09-03T16:22:02.258Z",
      "createdAt": "2024-09-03T16:22:02.258Z",
      "updatedAt": "2024-09-03T16:29:41.148Z",
      "triggerReferences": [
        {
          "type": "QUOTE",
          "triggerData": {
            "id": "ba83s43a-f623-46f0-956d-196c13e2ab01"
          }
        }
      ],
      "requirements": [
        [
          {
            "key": "BUSINESS_USE_CASES",
            "state": "NOT_PROVIDED",
            "apiCollectionSupported": true,
            "versions": [
              {
                "version": "V1"
              }
            ]
          }
        ],
        [
          {
            "key": "USE_CASE_COUNTRIES",
            "state": "NOT_PROVIDED",
            "apiCollectionSupported": true,
            "versions": [
              {
                "version": "V1"
              }
            ]
          }
        ],
        [
          {
            "key": "ID_DOCUMENT",
            "state": "IN_REVIEW",
            "apiCollectionSupported": true,
            "additionalRequirements": [
              {
                "additionalRequirementId": "8b789c45-60ae-475d-b667-c8714db9a6a4",
                "key": "DOCUMENT_OR_WRITTEN_ANSWER",
                "state": "NOT_PROVIDED",
                "reasons": {
                  "errorCode": "EXPIRED",
                  "description": "The provided document or information has expired. A valid document is required.",
                  "dateTime": "2026-04-13T10:54:21.929314"
                },
                "attributes": {
                  "fields": {
                    "name": "John Smith"
                  }
                }
              }
            ],
            "versions": [
              {
                "version": "V1"
              }
            ]
          }
        ]
      ],
      "requirementChanges": [
        {
          "key": "ID_DOCUMENT",
          "newState": "IN_REVIEW",
          "prevState": "NOT_PROVIDED",
          "additionalRequirements": [
            {
              "additionalRequirementId": "8b789c45-60ae-475d-b667-c8714db9a6a4",
              "newState": "NOT_PROVIDED"
            }
          ]
        },
        {
          "key": "BUSINESS_USE_CASE",
          "newState": "NOT_PROVIDED"
        }
      ]
    }
  },
  "subscription_id": "8df95817-8085-40aa-9bda-e3bf46e7a21a",
  "event_type": "kyc-reviews#state-change",
  "schema_version": "5.0.0",
  "sent_at": "2024-09-03T16:29:42.123Z"
}
```

## 3DS challenge events  

* Event type: `cards#3ds-challenge`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event is triggered when a customer initiates a push notification for 3DS. The provided information can be used to send a push notification to the customer's mobile app.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.client_id
Your api_client_id

data.resource.card_token
Card token

data.resource.profile_id
Profile ID

data.resource.type
Resource type (always `card`)

data.challenge_expires_after
The number of seconds before the challenge expires

data.occurred_at
When the challenge is triggered

data.challenge_method
The challenge method chosen by customer (always `PUSH`)

data.transaction.reference
Transaction reference, you should use this field when notifying us of the challenge result.

data.transaction.channel
User agent (usually `browser` or `app`)

data.transaction.merchant.category
Merchant category code, this field could be null

data.transaction.merchant.country
Merchant country, it follows ISO 3166-1 alpha-2 standard

data.transaction.merchant.name
Merchant name

data.transaction.merchant.url
Merchant url, this field could be null

data.transaction.money_value.value
Transaction amount

data.transaction.money_value.currency
Currency code

Example `cards#3ds-challenge` event

```json
{
  "data": {
    "challenge_expires_after": 300,
    "challenge_method": "PUSH",
    "occurred_at": "2024-09-05T06:47:15Z",
    "resource": {
      "card_token": "3ab81206-d258-4caf-cea5-60067ba82404",
      "client_id": "tw-test-card-issuance",
      "profile_id": 29751964,
      "type": "card"
    },
    "transaction": {
      "channel": "browser",
      "merchant": {
        "category": null,
        "country": "AD",
        "name": "Cards API BBT",
        "url": "http://intrepid-fav.net"
      },
      "money_value": {
        "currency": "EUR",
        "value": 100
      },
      "reference": "148990660"
    }
  },
  "event_type": "cards#3ds-challenge",
  "schema_version": "2.0.0",
  "sent_at": "2024-09-05T06:47:15Z",
  "subscription_id": "ec6d37c2-4611-457a-b210-d1a5f4e354c7"
}
```

Schema
data.resource.client_id
Your api_client_id

data.resource.card_token
Card token

data.resource.profile_id
Profile ID

data.resource.type
Resource type (always `card`)

data.challenge_expires_after
The number of seconds before the challenge expires

data.occurred_at
When the challenge is triggered

data.challenge_method
The challenge method chosen by customer (always `PUSH`)

data.transaction.reference
Transaction reference, you should use this field when notifying us of the challenge result.

data.transaction.channel
User agent (usually `browser` or `app`)

data.transaction.merchant.category
Merchant category code, this field could be null

data.transaction.merchant.country
Merchant country, it follows ISO 3166-1 alpha-2 standard

data.transaction.merchant.name
Merchant name

data.transaction.merchant.url
Merchant url, this field could be null

data.transaction.money_value.value
Transaction amount

data.transaction.money_value.currency
Currency code

Example `cards#3ds-challenge` event

```json
{
  "data": {
    "challenge_expires_after": 300,
    "challenge_method": "PUSH",
    "occurred_at": "2024-09-05T06:47:15.789Z",
    "resource": {
      "card_token": "3ab81206-d258-4caf-cea5-60067ba82404",
      "client_id": "tw-test-card-issuance",
      "profile_id": 29751964,
      "type": "card"
    },
    "transaction": {
      "channel": "browser",
      "merchant": {
        "category": null,
        "country": "AD",
        "name": "Cards API BBT",
        "url": "http://intrepid-fav.net"
      },
      "money_value": {
        "currency": "EUR",
        "value": 100
      },
      "reference": "148990660"
    }
  },
  "event_type": "cards#3ds-challenge",
  "schema_version": "4.0.0",
  "sent_at": "2024-09-05T06:47:15.123Z",
  "subscription_id": "ec6d37c2-4611-457a-b210-d1a5f4e354c7"
}
```

## Overdraft limit threshold event  

* Event type: `profiles#overdraft-limit-threshold`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event is triggered when the overdraft limit usage has reached 70% threshold.
The event at each threshold is triggered maximum once per hour.

Schema
data.resource.type
Profile resource type (always `profile`)

data.resource.id
ID of the profile.

data.overdraft.used
Overdraft limit used.

data.overdraft.limit
Overdraft limit approved.

data.overdraft.currency
Currency in which the amounts are expressed in.

Example `profiles#overdraft-limit-threshold` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "overdraft": {
        "used": 12000,
        "limit": 20000,
        "currency": "EUR"
    }
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#overdraft-limit-threshold",
  "schema_version": "2.0.0",
  "sent_at": "2020-01-01T12:34:56Z"
}
```

Schema
data.resource.type
Profile resource type (always `profile`)

data.resource.id
ID of the profile.

data.overdraft.used
Overdraft limit used.

data.overdraft.limit
Overdraft limit approved.

data.overdraft.currency
Currency in which the amounts are expressed in.

Example `profiles#overdraft-limit-threshold` event

```json
{
  "data": {
    "resource": {
      "type": "profile",
      "id": 111
    },
    "overdraft": {
        "used": 12000,
        "limit": 20000,
        "currency": "EUR"
    }
  },
  "subscription_id": "01234567-89ab-cdef-0123-456789abcdef",
  "event_type": "profiles#overdraft-limit-threshold",
  "schema_version": "4.0.0",
  "sent_at": "2020-01-01T12:34:56.123Z"
}
```

## Account details order state change event  

* Event type: `account-details-order#order-state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event is triggered when there is a change in the state of an account details order. The event contains information about the order state and requirement state.

The possible values for an order are:

- `PENDING_USER`: One or more requirements has some pending action from the user.
- `PENDING_TW`: One or more requirements has some pending action from Wise.
- `REQUIREMENTS_FULFILLED`: All requirements are completed and pending account details to be created.
- `DONE`: All requirements are completed and account details has also been created.


The more common requirements are:

- `VERIFICATION`: The user needs to be fully verified before completing this requirement.


Events may not be delivered in the order they occurred. Use `data.modification_time` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.creation_time
When the order was created

data.currency
Currency code for the account details order

data.is_account_details_issued
Whether account details have been issued for this order

data.modification_time
When the order was last modified

data.order_id
Unique identifier for the account details order

data.order_status
Current status of the order (PENDING_USER, PENDING_TW, REQUIREMENTS_FULFILLED, DONE)

data.profile_id
ID of the profile associated with this order

data.requirements
List of requirements for this order

data.requirements[].status
Status of the individual requirement (DONE, PENDING, etc.)

data.requirements[].type
Type of requirement (VERIFICATION)

Example `account-details-order#order-state-change` event

```json
{
  "data": {
    "creation_time": "2025-08-08T07:49:27Z",
    "currency": "CAD",
    "is_account_details_issued": false,
    "modification_time": "2025-08-08T07:49:30Z",
    "order_id": "01989c58-45e4-71dd-9373-7d999e992f99",
    "order_status": "REQUIREMENTS_FULFILLED",
    "profile_id": 28835473,
    "requirements": [
      {
        "status": "DONE",
        "type": "VERIFICATION"
      }
    ]
  },
  "event_type": "account-details-order#order-state-change",
  "schema_version": "2.0.0",
  "sent_at": "2025-08-08T07:49:31Z",
  "subscription_id": "01989c58-7171-7276-9a4c-c9b4cefc0897"
}
```

Account details order status transitions
Create account details order statuses transition diagram
Schema
data.creation_time
When the order was created

data.currency
Currency code for the account details order

data.is_account_details_issued
Whether account details have been issued for this order

data.modification_time
When the order was last modified

data.order_id
Unique identifier for the account details order

data.order_status
Current status of the order (PENDING_USER, PENDING_TW, REQUIREMENTS_FULFILLED, DONE)

data.profile_id
ID of the profile associated with this order

data.requirements
List of requirements for this order

data.requirements[].status
Status of the individual requirement (DONE, PENDING, etc.)

data.requirements[].type
Type of requirement (VERIFICATION)

Example `account-details-order#order-state-change` event

```json
{
  "data": {
    "creation_time": "2025-08-08T07:49:27.456Z",
    "currency": "CAD",
    "is_account_details_issued": false,
    "modification_time": "2025-08-08T07:49:30.789Z",
    "order_id": "01989c58-45e4-71dd-9373-7d999e992f99",
    "order_status": "REQUIREMENTS_FULFILLED",
    "profile_id": 28835473,
    "requirements": [
      {
        "status": "DONE",
        "type": "VERIFICATION"
      }
    ]
  },
  "event_type": "account-details-order#order-state-change",
  "schema_version": "4.0.0",
  "sent_at": "2025-08-08T07:49:31.123Z",
  "subscription_id": "01989c58-7171-7276-9a4c-c9b4cefc0897"
}
```

Account details order status transitions
Create account details order statuses transition diagram
## Profile state change event  

* Event type: `profiles#state-change`
* Profile level subscriptions: Not Supported
* Application level subscriptions: Supported


This event will be triggered every time a profile state is updated.
Events may not be delivered in the order they occurred. Use `data.occurred_at` to reconcile the order. See the [Event Ordering](/guides/developer/webhooks/event-ordering) guide for details.

Schema
data.resource.id
ID of the profile

data.resource.type
Resource type (always `profile`)

data.current_state
The current state of the profile

data.occurred_at
When the profile state change occurred

data.requested_by_customer
Whether the state change was requested by the customer. Not applicable for `current_state` in `ACTIVE`.

Example `profiles#state-change` event

```json
{
  "data": {
    "resource": {
      "id": 1234,
      "type": "profile"
    },
    "current_state": "WITHDRAW_ONLY",
    "occurred_at": "2020-01-01T12:34:567890Z",
    "requested_by_customer": false
  },
  "event_type": "profiles#state-change",
  "schema_version": "2.0.0",
  "sent_at": "2020-01-01T12:34:56Z",
  "subscription_id": "f5b51f77-e14a-433b-9f7c-fc2834ffcff5"
}
```

The possible `current_state` values are:

- `ACTIVE` - The profile is active.
- `WITHDRAW_ONLY` - The profile has 90 calendar days to remove their money from their balance before Wise fully deactivates their account. This can be done through sending from their balance to themselves and others or spending with their card. They will not be able to receive money to their balances and fund transfers from external bank accounts. They will still be able to order new cards, convert between balances, open and close balances, and download balance statements. After 90 calendar days, the profile will move into a `DEACTIVATED` state.
- `VIEW_ONLY` - The profile is able to access and view balances and account activities such as transfer history and balance statements. However, they can no longer perform actions such as moving money with Wise in any way. All transfers sent to the account after it is set to `VIEW_ONLY` mode will also bounce back to the sender. Cards will also be suspended.
- `DEACTIVATED` - The profile's account is deactivated and no actions can be performed on the account. The end-user tokens will be revoked and you will receive a `401 Unauthorized` response for API calls.


Schema
data.resource.id
ID of the profile

data.resource.type
Resource type (always `profile`)

data.current_state
The current state of the profile

data.occurred_at
When the profile state change occurred

data.requested_by_customer
Whether the state change was requested by the customer. Not applicable for `current_state` in `ACTIVE`.

Example `profiles#state-change` event

```json
{
  "data": {
    "resource": {
      "id": 1234,
      "type": "profile"
    },
    "current_state": "WITHDRAW_ONLY",
    "occurred_at": "2020-01-01T12:34:56.789Z",
    "requested_by_customer": false
  },
  "event_type": "profiles#state-change",
  "schema_version": "4.0.0",
  "sent_at": "2020-01-01T12:34:56.123Z",
  "subscription_id": "f5b51f77-e14a-433b-9f7c-fc2834ffcff5"
}
```

The possible `current_state` values are:

- `ACTIVE` - The profile is active.
- `WITHDRAW_ONLY` - The profile has 90 calendar days to remove their money from their balance before Wise fully deactivates their account. This can be done through sending from their balance to themselves and others or spending with their card. They will not be able to receive money to their balances and fund transfers from external bank accounts. They will still be able to order new cards, convert between balances, open and close balances, and download balance statements. After 90 calendar days, the profile will move into a `DEACTIVATED` state.
- `VIEW_ONLY` - The profile is able to access and view balances and account activities such as transfer history and balance statements. However, they can no longer perform actions such as moving money with Wise in any way. All transfers sent to the account after it is set to `VIEW_ONLY` mode will also bounce back to the sender. Cards will also be suspended.
- `DEACTIVATED` - The profile's account is deactivated and no actions can be performed on the account. The end-user tokens will be revoked and you will receive a `401 Unauthorized` for API calls.


## Hold limit breach update event 

* Event type: `hold-limit-breach#update`
* Profile level subscriptions: Supported
* Application level subscriptions: Supported


Triggered whenever a hold limit breach is opened or closed for a profile. A hold limit breach occurs when a balance exceeds the regulatory hold limit (applicable in countries such as Singapore and Malaysia).

Use `data.state` to determine whether the breach has been opened or closed, and `data.closing_reason` to understand how it was resolved.

For the full schema and examples, see the [Hold limit breach update](/api-reference/webhook-event/eventholdlimitbreachupdate) API reference.