← Hoppa developer guide
Hoppa → your server

Webhook events and payloads.

All 70 documented outbound events are listed below. Expand an event for its payload example and link to the full request schema.

The /webhooks/outbound/… paths are documentation identifiers. Hoppa sends these POST requests to your configured webhook URL; do not call these paths on the Hoppa API.

Receive and acknowledge an event

Verify X-Hoppacard-Signature as lowercase-hex HMAC-SHA256 over the exact raw request body using your webhook secret. Deduplicate event IDs, accept events durably, then return a 2xx response. No response body is required. Process events idempotently and allow out-of-order delivery.

Network failures, timeouts, 408, 429 and 5xx responses are retried up to fifteen times after the initial delivery over approximately 76 hours. Other 4xx responses are permanent failures.

Download the complete documentation schema · Transaction reconciliation guide

account.activated

Sent when a Banking account is activated.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.activated",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountActivated",
    "id": "acc_eq_123",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "ACTIVE",
    "type": "INDIVIDUAL",
    "primaryOwnerPersonaId": "persona_123",
    "details": {
      "accountId": "acc_eq_123",
      "name": "Example Trading Account"
    },
    "settlementDetails": [
      {
        "currency": "GBP",
        "sortCode": "040075",
        "accountNumber": "12345678",
        "ibans": [
          {
            "iban": "GB29NWBK60161331926819",
            "bic": "NWBKGB2L"
          }
        ],
        "accountName": "Example Trading Account",
        "bankName": "Equals Money",
        "bankAddress": "London, United Kingdom",
        "balanceReference": "BAL-123"
      }
    ]
  }
}

Open headers and full payload contract →

account.created

Sent when a Banking account is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.created",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountCreated",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "PENDING",
    "type": "INDIVIDUAL"
  }
}

Open headers and full payload contract →

account.deposit.address

Sent when deposit addresses are created for a user's account.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.deposit.address",
  "domain": "account",
  "provider": "bank",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "status": "created"
  }
}

Open headers and full payload contract →

account.status_updated

Sent when a Banking account status changes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "account.status_updated",
  "domain": "account",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "AccountStatusUpdated",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "SUSPENDED",
    "type": "INDIVIDUAL"
  }
}

Open headers and full payload contract →

bank_account.status

Sent when a business bank account status changes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "bank_account.status",
  "domain": "account",
  "provider": "bank",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "bankAccountId": "ba_123",
    "iban": "GB00HOPP00000000000000",
    "currency": "GBP",
    "status": "active"
  }
}

Open headers and full payload contract →

budget.created

Sent when a budget is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.created",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "active"
  }
}

Open headers and full payload contract →

budget.credit_pending

Sent when a Banking budget credit is pending settlement.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.credit_pending",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "BoxCreditPending",
    "budgetId": "budget_123",
    "budgetName": "Operations Budget",
    "settlementPriceAmount": 1200,
    "settlementPriceCurrency": "GBP",
    "valueDateTime": "2026-04-29T00:00:00Z"
  }
}

Open headers and full payload contract →

budget.credited

Sent when a Banking budget receives funds.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.credited",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "budgetId": "budget_123",
    "amount": 75,
    "currency": "EUR",
    "source": "BANK_TRANSFER",
    "reference": "Invoice 123",
    "remitterName": "Example Ltd"
  }
}

Open headers and full payload contract →

budget.debited

Sent when a Banking budget is debited.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.debited",
  "domain": "budget",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": 1002,
    "externalTransactionId": "ext_tx_456",
    "userId": 12345,
    "budgetId": "budget_123",
    "amount": 25,
    "currency": "EUR",
    "source": "CARD_PAYMENT"
  }
}

Open headers and full payload contract →

budget.deleted

Sent when a budget is deleted.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.deleted",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "deleted"
  }
}

Open headers and full payload contract →

budget.transaction.closed

Sent when a budget transaction is closed.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.transaction.closed",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": "1001",
    "userId": "12345",
    "budgetId": "budget_123",
    "amount": "15.00",
    "currency": "EUR",
    "status": "closed",
    "type": "DEBIT"
  }
}

Open headers and full payload contract →

budget.updated

Sent when a budget is updated.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "budget.updated",
  "domain": "budget",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "budgetId": "budget_123",
    "name": "Main EUR Budget",
    "currency": "EUR",
    "amount": "1000.00",
    "spent": "125.00",
    "remaining": "875.00",
    "period": "monthly",
    "status": "active"
  }
}

Open headers and full payload contract →

business_account.transaction

Sent when a business account transaction is processed.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "business_account.transaction",
  "domain": "business_account",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "accountId": 321,
    "transactionType": "payout_payment",
    "amount": 100,
    "currency": "EUR",
    "status": "completed",
    "fee": 1.25
  }
}

Open headers and full payload contract →

card.3ds_auth_request

Sent when a Banking card 3DS authentication request requires OTP handling.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.3ds_auth_request",
  "domain": "card",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "merchantName": "Example Merchant",
    "amount": 42.5,
    "currency": "EUR",
    "transactionId": "txn_123",
    "otp": "123456"
  }
}

Open headers and full payload contract →

card.3ds.otp

Sent when a card 3DS OTP is received from Crypto cards.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.3ds.otp",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "otp": "123456",
    "expiresAt": "2026-04-28T10:20:30Z"
  }
}

Open headers and full payload contract →

card.activated

Sent when a card is activated. Virtual cards may emit this immediately after creation.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.activated",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardId": 555
  }
}

Open headers and full payload contract →

card.created

Sent when a card is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.created",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "cardNumber": "****-****-****-4242",
    "lastFour": "4242",
    "status": "active",
    "currency": "EUR"
  }
}

Open headers and full payload contract →

card.deleted

Sent when a card is deleted or cancelled.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.deleted",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "previousStatus": "ACTIVE",
    "newStatus": "CANCELLED"
  }
}

Open headers and full payload contract →

card.shipped

Sent when a physical card is shipped.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.shipped",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "trackingNumber": "TRACK123",
    "shippingCarrier": "DHL",
    "shippedAt": "2026-04-28T10:15:30Z"
  }
}

Open headers and full payload contract →

card.state_updated

Sent when a Banking card state changes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.state_updated",
  "domain": "card",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "userId": 12345,
    "previousState": "ACTIVE",
    "currentState": "SUSPENDED",
    "status": "blocked"
  }
}

Open headers and full payload contract →

card.topup

Sent when value is loaded onto a card.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.topup",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_topup",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28T10:15:30Z",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}

Open headers and full payload contract →

card.transaction

Sent for card purchases, refunds, reversals, fee transactions, freezes, and unfreezes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.transaction",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_payment",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28T10:15:30Z",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}

Open headers and full payload contract →

card.unload

Sent when value is unloaded from a card.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.unload",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "card_tx_123",
    "userId": 12345,
    "accountId": 321,
    "cardId": 555,
    "externalCardId": "card_ext_123",
    "transactionType": "card_unload",
    "amount": 42.5,
    "currency": "EUR",
    "status": "completed",
    "description": "CARD PAYMENT: Example Merchant",
    "transactionDate": "2026-04-28T10:15:30Z",
    "merchantName": "Example Merchant",
    "merchantMid": "merchant_mid_123",
    "merchantCity": "London",
    "merchantCountry": "GB",
    "merchantState": "ENG",
    "merchantZipcode": "EC1A1BB",
    "mcc": "5812",
    "mccCategory": "Restaurants",
    "fee": 0.35,
    "transactionCurrency": "GBP",
    "transactionAmount": "36.25",
    "clientTransactionId": "client_tx_123",
    "cardTransactionId": "card_trace_123",
    "relatedCardTransactionId": "card_trace_parent_123",
    "remark": "Approved",
    "detail": "Card transaction processed",
    "type": "CONSUMPTION"
  }
}

Open headers and full payload contract →

card.updated

Sent when a card status changes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "card.updated",
  "domain": "card",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardId": 555,
    "previousStatus": "PENDING",
    "newStatus": "ACTIVE",
    "lastFour": "4242"
  }
}

Open headers and full payload contract →

cardholder.approved

Sent when a cardholder is approved by the banking provider.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.approved",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "status": "Active"
  }
}

Open headers and full payload contract →

cardholder.created

Sent when a cardholder is created by the banking provider.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.created",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "status": "Active",
    "cardholderId": "cardholder_123"
  }
}

Open headers and full payload contract →

cardholder.deleted

Sent when a cardholder is deleted by the banking provider.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.deleted",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "cardholderId": "cardholder_123"
  }
}

Open headers and full payload contract →

cardholder.status

Sent whenever a cardholder status update is processed.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "cardholder.status",
  "domain": "cardholder",
  "provider": "bank",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "status": "Active"
  }
}

Open headers and full payload contract →

digitalwallet.token_transition

Sent when a Banking digital wallet token changes state.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "digitalwallet.token_transition",
  "domain": "digitalwallet",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "DigitalWalletTokenTransition",
    "cardId": "card_ext_123",
    "tokenId": "token_123",
    "walletType": "APPLE_PAY",
    "eventTime": "2026-04-28T10:15:30Z",
    "previousState": "INACTIVE",
    "currentState": "ACTIVE"
  }
}

Open headers and full payload contract →

fee.charged

Sent when a Crypto cards tier_fee_charged or card_issuance_fee customer transaction completes. Amount is the signed ledger amount; transactionId is the local reference and externalTransactionId is the provider transfer ID. Deduplicate retries by event id.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "fee.charged",
  "domain": "transaction",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": "8178",
    "externalTransactionId": "2100585559431249922",
    "userId": "12345",
    "transactionType": "fees",
    "feeType": "tier_fee_charged",
    "amount": -10,
    "currency": "USD",
    "status": "completed",
    "description": "fees: tier_fee_charged",
    "transactionTime": "2026-09-17T13:59:00Z"
  }
}

Open headers and full payload contract →

fee.created

Sent when a Banking fee is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "fee.created",
  "domain": "fee",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "FeeCreated",
    "feeId": "fee_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "feeType": "payment_fee",
    "amount": 2.5,
    "currency": "GBP"
  }
}

Open headers and full payload contract →

kyc.information_request

Sent when Banking requests additional KYC documents.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.information_request",
  "domain": "kyc",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "KycInformationRequest",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "requiredDocuments": [
      "proof_of_address",
      "source_of_funds"
    ]
  }
}

Open headers and full payload contract →

kyc.interlace_submission_failed

Sent when SumSub approval could not be submitted to Crypto cards.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.interlace_submission_failed",
  "domain": "kyc",
  "provider": "interlace",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "error": "Interlace submission failed",
    "accountId": "acc_123",
    "applicantId": "applicant_123"
  }
}

Open headers and full payload contract →

kyc.resubmission_required

Sent when Crypto cards rejects a Sumsub-approved verification and the user has to act: RESUBMIT_DOCUMENTS (the listed Sumsub doc sets were reset, re-open the verification flow), RESUBMIT_DATA (Hoppa resubmits corrected data) or CONTACT_SUPPORT.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.resubmission_required",
  "domain": "kyc",
  "provider": "interlace",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "applicantId": "applicant_123",
    "reason": "Your identity document could not be accepted by the card issuer. Please upload a new, clear photo of your document.",
    "providerReason": "Applicant uploaded a bad ID document.",
    "requiredAction": "RESUBMIT_DOCUMENTS",
    "docSets": [
      "IDENTITY"
    ],
    "attempts": 1,
    "maxAttempts": 3,
    "caseId": "cdd_123",
    "type": "KYC"
  }
}

Open headers and full payload contract →

kyc.update

Sent when Banking updates a user's KYC review status.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.update",
  "domain": "kyc",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "KycUpdate",
    "correlationId": "corr_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "PENDING_DOCUMENTS",
    "personId": "person_123",
    "requiredAction": "upload_bank_statement",
    "actionUrl": "https://app.equalsmoney.com/kyc/upload"
  }
}

Open headers and full payload contract →

kyc.verified

Sent when a Crypto cards or SumSub KYC review is processed. For the Crypto cards (card issuer) verdict provider is "bank", status is approved | rejected | action_required | pending and, for a rejection, reason / requiredAction / caseId are set.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "kyc.verified",
  "domain": "kyc",
  "provider": "sumsub",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "kycLevel": "hoppacard-stagging",
    "status": "approved",
    "type": "KYC",
    "reason": null,
    "requiredAction": null,
    "caseId": "cdd_123"
  }
}

Open headers and full payload contract →

mor.card.assigned

A merchant card's assignment changed. Durable, at-least-once delivery; deduplicate by event id and read current state after out-of-order delivery.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "mor.card.assigned",
  "domain": "mor",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "companyId": 42,
    "cardId": 123,
    "assignedUserId": 456,
    "previousAssignedUserId": null
  }
}

Open headers and full payload contract →

mor.card.load_request.updated

A load request was created, changed, completed or cancelled. This event does not itself move funds. Read current state by cardId. Deduplicate by event id.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "mor.card.load_request.updated",
  "domain": "mor",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "companyId": 42,
    "cardId": 123,
    "requestedByUserId": 456,
    "amount": 50,
    "currency": "USD",
    "status": "pending"
  }
}

Open headers and full payload contract →

mor.card.unassigned

A merchant card was unassigned. Ownership and funds stay with the merchant. Deduplicate by event id.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "mor.card.unassigned",
  "domain": "mor",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "companyId": 42,
    "cardId": 123,
    "previousAssignedUserId": 456
  }
}

Open headers and full payload contract →

mor.kyb.updated

A current merchant-company KYB status was persisted through submission, provider webhook or polling. Deduplicate by event id.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "mor.kyb.updated",
  "domain": "mor",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "companyId": 42,
    "profileId": "profile_123",
    "status": "PASSED",
    "previousStatus": "PROCESSING"
  }
}

Open headers and full payload contract →

order.cancelled

Sent when a Banking FX order is cancelled.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.cancelled",
  "domain": "order",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "OrderCancelled",
    "orderId": "order_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "CANCELLED"
  }
}

Open headers and full payload contract →

order.completed

Sent when a Banking payment order completes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.completed",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "orderId": "order_123",
    "accountId": "account_123"
  }
}

Open headers and full payload contract →

order.created

Sent when a Banking FX order is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "order.created",
  "domain": "order",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "OrderCreated",
    "orderId": "order_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "CREATED",
    "buyCurrency": "EUR",
    "sellCurrency": "GBP",
    "buyAmount": 1000,
    "sellAmount": 850,
    "rate": 0.85,
    "payments": [
      {
        "settlementDate": "2026-04-29T00:00:00Z",
        "rate": 0.85,
        "inverseRate": 1.1765,
        "internalReference": "INT-123",
        "externalReference": "EXT-123",
        "from": {
          "amount": 850,
          "currency": "GBP"
        },
        "to": {
          "amount": 1000,
          "currency": "EUR"
        },
        "recipient": {
          "id": "recipient_123",
          "name": "Example Supplier Ltd"
        }
      }
    ]
  }
}

Open headers and full payload contract →

payment.completed

Sent after a payment completes successfully.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.completed",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "paymentId": 987,
    "amount": 25.5,
    "currency": "EUR"
  }
}

Open headers and full payload contract →

payment.created

Sent when a Banking payment is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.created",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentCreated",
    "paymentId": "payment_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "PROCESSING",
    "amount": 250,
    "currency": "GBP",
    "recipientId": "recipient_123",
    "reference": "Invoice 123"
  }
}

Open headers and full payload contract →

payment.mandate.cancelled

Sent after a payment mandate is cancelled.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.mandate.cancelled",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "paymentMandateId": 456
  }
}

Open headers and full payload contract →

payment.mandate.created

Sent after a payment mandate is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.mandate.created",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "paymentMandateId": 456,
    "maxAmount": 250,
    "currency": "EUR",
    "frequency": "monthly"
  }
}

Open headers and full payload contract →

payment.request.cancelled

Sent after a payment request is cancelled.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.cancelled",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "amount": 19.99,
    "currency": "EUR"
  }
}

Open headers and full payload contract →

payment.request.confirmed.direct

Sent after a payment request is confirmed by direct payment.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.confirmed.direct",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "paymentMandateId": 456,
    "amount": 19.99,
    "currency": "EUR",
    "transferId": "tr_123"
  }
}

Open headers and full payload contract →

payment.request.confirmed.with.exchange

Sent after a payment request is confirmed using crypto exchange.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.confirmed.with.exchange",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "paymentMandateId": 456,
    "amount": 19.99,
    "currency": "EUR",
    "transferId": "tr_123"
  }
}

Open headers and full payload contract →

payment.request.created

Sent after a payment request is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.request.created",
  "domain": "payment",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "paymentRequestId": 789,
    "amount": 19.99,
    "currency": "EUR"
  }
}

Open headers and full payload contract →

payment.returned

Sent when a Banking payment is returned.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payment.returned",
  "domain": "payment",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentReturned",
    "paymentId": "payment_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "RETURNED",
    "returnReason": "Beneficiary account closed"
  }
}

Open headers and full payload contract →

paymentbatch.cancelled

Sent when a Banking payment batch is cancelled.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.cancelled",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCancelled",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "CANCELLED"
  }
}

Open headers and full payload contract →

paymentbatch.completed

Sent when a Banking payment batch completes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.completed",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCompleted",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "COMPLETED",
    "successCount": 2,
    "failureCount": 1
  }
}

Open headers and full payload contract →

paymentbatch.created

Sent when a Banking payment batch is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.created",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchCreated",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "CREATED",
    "totalAmount": 1500,
    "currency": "GBP",
    "paymentCount": 3
  }
}

Open headers and full payload contract →

paymentbatch.processing

Sent when a Banking payment batch enters processing.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.processing",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchProcessing",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "PROCESSING"
  }
}

Open headers and full payload contract →

paymentbatch.validation_error

Sent when a Banking payment batch fails validation.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatch.validation_error",
  "domain": "paymentbatch",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchValidationError",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "errors": [
      "Recipient account number is invalid",
      "Payment amount exceeds limit"
    ]
  }
}

Open headers and full payload contract →

paymentbatchorder.cancelled

Sent when a Banking payment batch FX order is cancelled.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.cancelled",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCancelled",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "CANCELLED"
  }
}

Open headers and full payload contract →

paymentbatchorder.completed

Sent when a Banking payment batch FX order completes.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.completed",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCompleted",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "COMPLETED"
  }
}

Open headers and full payload contract →

paymentbatchorder.created

Sent when a Banking payment batch FX order is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "paymentbatchorder.created",
  "domain": "paymentbatchorder",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PaymentBatchOrderCreated",
    "orderId": "order_123",
    "batchId": "batch_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "status": "CREATED"
  }
}

Open headers and full payload contract →

payout.payment

Sent when a business payout payment update is processed.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "payout.payment",
  "domain": "payout",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": 1001,
    "externalTransactionId": "ext_tx_123",
    "userId": 12345,
    "accountId": 321,
    "amount": 100,
    "currency": "EUR",
    "status": "completed",
    "transferId": "transfer_123",
    "type": "PAYOUT.PAYMENT"
  }
}

Open headers and full payload contract →

person.created

Sent when a Banking associated person is created. `data.personId` is the canonical person identifier; `data.email` is the canonical person email when available. Provider aliases `data.id` and `data.primaryEmailAddress` may also be included. Nonblank canonical fields take precedence when both forms are supplied. The flat data object includes user/account context and the current `associatedPeople` list.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "person.created",
  "domain": "person",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "PersonCreated",
    "userId": 12345,
    "companyId": 42,
    "userEmail": "user@example.com",
    "accountType": "personal",
    "equalsAccountId": "acc_eq_123",
    "equalsApplicationId": "app_eq_123",
    "personId": "person_123",
    "id": "person_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "firstName": "Jane",
    "lastName": "Doe",
    "email": "jane.doe@example.com",
    "primaryEmailAddress": "jane.doe@example.com",
    "associatedPeople": [
      {
        "id": 456,
        "externalId": "person_123",
        "firstName": "Jane",
        "lastName": "Doe",
        "email": "jane.doe@example.com",
        "associationType": ""
      }
    ]
  }
}

Open headers and full payload contract →

recipient.created

Sent when a Banking recipient is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "recipient.created",
  "domain": "recipient",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "RecipientCreated",
    "recipientId": "recipient_123",
    "eventTime": "2026-04-28T10:15:30Z",
    "name": "Example Supplier Ltd"
  }
}

Open headers and full payload contract →

recipient.deleted

Sent when a Banking recipient is deleted.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "recipient.deleted",
  "domain": "recipient",
  "provider": "equalsmoney",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "accountId": "acc_eq_123",
    "messageId": "msg_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
    "webhookEventTypeName": "RecipientDeleted",
    "recipientId": "recipient_123",
    "eventTime": "2026-04-28T10:15:30Z"
  }
}

Open headers and full payload contract →

user.kyc.updated

Sent when a user's KYC status changes during verification submission or provider processing.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "user.kyc.updated",
  "domain": "user",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "status": "pending"
  }
}

Open headers and full payload contract →

user.registered

Sent after a user is created.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "user.registered",
  "domain": "user",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "userId": 12345,
    "email": "user@example.com"
  }
}

Open headers and full payload contract →

wallet.refund

Sent when a crypto refund is processed.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.refund",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": "1001",
    "userId": "12345",
    "amount": "10.00",
    "currency": "USDT",
    "chain": "TRON",
    "address": "TXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "status": "completed",
    "transferId": "transfer_123",
    "transactionHash": "0x1234567890abcdef",
    "provider": "hoppacard"
  }
}

Open headers and full payload contract →

wallet.topped_up

Sent when a wallet, budget, or card funding transaction credits value.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.topped_up",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": "1001",
    "walletId": "wallet_123",
    "userId": "12345",
    "amount": "100.00",
    "currency": "EUR",
    "status": "completed",
    "provider": "hoppacard"
  }
}

Open headers and full payload contract →

wallet.withdrawal

Sent when a wallet withdrawal or debit transaction is processed.

Example request body

{
  "id": "evt_01HX7B7MZ4Q4Y9R1H2J3K4L5M6",
  "type": "wallet.withdrawal",
  "domain": "wallet",
  "provider": "hoppacard",
  "timestamp": "2026-04-28T10:15:30Z",
  "data": {
    "transactionId": "1002",
    "walletId": "wallet_123",
    "userId": "12345",
    "amount": "50.00",
    "currency": "EUR",
    "status": "completed",
    "provider": "hoppacard"
  }
}

Open headers and full payload contract →

HOPPA DEVELOPER ASSISTANT

What are you building?

From a question to an implementation.

Get a step-by-step flow, example code and the docs behind it. Choose a starting point or describe your feature.

Answers use the public API guide and example app code. Check the linked reference before shipping. Explore code sources ↗

Your question and recent conversation are sent to our AI provider. Don’t include API keys, personal data or card details.