Webhook Events

Reap's Payments API provides webhooks to allow you to receive real-time notifications of events that occur in your Reap account. When you subscribe to our webhooks, you can choose which event type goes to your designated URL.

Events

Event Type: Account Information

Event Name: account_status_update

Theaccount_status_update webhook is triggered whenever there has been a change to the account status of one of your Managed Accounts. It is particularly useful for determining when a Managed Account has reached the "active" status, which indicates actions like creating payments are now viable through that account (by using the BUUID in the header for API requests).

Sample Webhook

{
  "eventType": "account_information",
  "eventName": "account_status_update",
  "data": {
    "businessId": "22c60904-b90e-4557-ab84-c4af4ae976af", // Business UUID for the Managed Account
    "accountStatus": "under_review | active | rejected", // Possible account statuses
    "reason": "string" // Explanation for the status change
  }
}

Event Type: Account Balance

Event Name: balance_movement

Thebalance_movement webhook is triggered whenever Reap's system detects that there was a balance change. This webhook applies to all accounts, whether Manager or Managed.

Sample Webhook

{
  "eventType": "account_balance",
  "eventName": "balance_movement",
  "eventDate":"2025-05-09 08:43:19",
  "data": {
	  "action": "payment" | "refund" | "fund_in" | "withdrawal" | "adjustment" | "internal_transfer" ,
    "businessID": "22c60904-b90e-4557-ab84-c4af4ae976af",
    "currency": "USDC",
    "amount":"2000.00000000", // negative when there is a decrease of balance
    "referenceID":"pid_jsdhasjhd", // optional; can be null depending on the action
  }
}

Event Name: balance_update_fund_in

Thebalance_update_fund_in webhook is triggered whenever Reap's system detects that funds have been sent and attributed (after our automated Chainanalysis KYT review) to an account, increasing the balance. This webhook applies to all accounts, whether Manager or Managed.

Please note this only applies for fund-ins, and this webhook will not be triggered when the balance is reduced (whether due to funds being used for a payment or there being a withdrawal from the account).

Sample Webhook

{
  "eventType": "account_balance",
  "eventName": "balance_update_fund_in",
  "data": {
    "organisationId": "z8f738fa-4f1d-47ce-a865-130af7df5576",
    "businessId": "22c60904-b90e-4557-ab84-c4af4ae976af",
    "currency": "USDC",
    "amountReceived": "2000.00000000",
    "networkReceivedOn": "POLYGON_POS",
    "networkTransactionReference": "0x7b618c262e5fb7a1a5a4651f7814b2fz59e3567b32260a0e2db5d6bdc0953efb",
    "updatedBalance": [
      {
        "currency": "USDC",
        "amount": "3000.00000000"
      },
      {
        "currency": "USDT",
        "amount": "100.00000000"
      }
    ]
  }
}

Event Type: Payment

Event Name: payment_status_update

The payment_status_update webhook is triggered when the status of transaction changes (e.g. when the transaction is approved by Reap's Compliance system). This will send the transaction details along with the new status to your designated webhook URL.

Sample Webhook

{
  "eventType": "payment",
  "eventName": "payment_status_update",
  "data": {
    "paymentId": "pid_01hvr989b8ksnwvp5y8ywcdxk0",
    "status": "under_review",
    "statusDetails": null,
    "fxInfo": {
      "clientRate": 1,
      "baseSenderAmount": 30
    },
    "feeInfo": {
      "fixedFee": 25,
      "totalFee": 25.48,
      "specialFee": 0,
      "variableFee": 0.48,
      "variableFeePercentage": 0
    },
    "paymentInfo": {
      "receivingAmount": 30,
      "receivingCurrency": "USD",
      "senderAmount": 55.48,
      "senderCurrency": "USDC",
      "description": "Goods purchased from supplier",
      "purposeOfPayment": "payment_for_goods",
      "sourceOfFunds": null,
      "metadata": {
        "payment_id": "a8f738fb-4f1d-47ce-9365-620afadf4083"
      }
    }
  }
}

The status can be one of the following:

Status Description

awaiting_approval

The payment is awaiting for explicit approval to continue being processed.

awaiting_funds

The payment is awaiting the required funds as indicated in the quote.

Please note that this webhook will be provided for all payments, even if there are sufficient funds, because our system always does a "funds check" with this status. When there is sufficient funding, this webhook will be received first and then shortly thereafter the "under_review" webhook.

under_review

The payment has been funded and is going through compliance review.

requires_action

Reap's payments compliance team has indicated that additional information is needed in order to continue processing the payment.

payout_completed

The payment has been sent by Reap to its designated recipient.

cancelled

The payment has been cancelled (whether by user request or Reap admin)

failed

The payment has encountered a failure (Reap team will reach out to help fix the issue)

The statusDetails field shares why the payment status has changed. Currently this field is only populated for payments where the status is cancelled. For cancelled payments, the status detail will be one of the following statuses below:

statusDetailsDescription
cancelled_by_user_before_fundingThis payment was cancelled while in awaiting_approval or awaiting_funds status.
cancelled_by_user_after_fundingThe payment was cancelled after the payment reached under_review or a later status. Currently there is no endpoint that can initiate this cancellation- this request must be communicated through communication channels with Reap Support who would initiate this cancellation.
payment_request_expiredThe payment has been cancelled automatically by our system as the quote has expired. Refer to payment lifecycle for details on how long Reap will hold the quote for a payment.
payment_rejectedThis payment cannot be processed by Reap. The funds have been returned, please refer to Reap's communication for more details.
payment_returnedThe payment was processed by Reap but the funds have been returned, please refer to Reap's communication for more details.

Event Type: Tracking

Event Name: payment_tracking_update

This webhook event is triggered when Reap receives an update on the tracking status of the payment. A new webhook is triggered each time the tracking status changes, proactively keeping you updated with the latest information. This webhook will eventually cover all payments, but to start with it is being offered for payments made on SWIFT, CHATS and FPS network.

For payments with tracking enabled, the webhooks will be triggered after the payment has reached the payment status payout_completed. The webhook will contain the following:

  • The network the payment was made on.
  • The network identifier of the intermediary if it was specified when the payment was created.
  • The unique identifier on that network (e.g. the UETR for SWIFT payments).
  • Tracking Status (dynamic status that updates as the tracking status changes over time).
  • The sender name and the address that is placed on the payment- and that would be seen by the recipient bank.
  • The Ordering institution that was used to payout this payment.

This information is also available on the payment dashboard and is a downloadable via a Proof of Payment PDF containing additional key payment information. This information will also be included in the GET Payment and GET Payments endpoints.

Sample Webhook

{
  "eventType": "tracking",
  "eventName": "payment_tracking_update",
  "data": {
    "paymentId": "pid_01jgn629bsz5x0s4vaqqjn3gvd",
    "status": "payout_completed",
    "paymentTrackingInfo": {
      "network": "SWIFT",
      "networkIntermediateIdentifier": "CHASUS33XXX",
      "networkPaymentIdentifier": "c7619029-a06e-420f-93d5-0d026a531bdb",
      "trackingStatus": "Arrived at recipient",
      "senderName": "Reap (Remit) Limited",
      "senderAddress": "25E 23/F ONE TAIKOO PLACE 979 KING'S RD QUARRY BAY HONG KONG",
      "orderingInstitution": "Reap (Remit) Limited 25E 23/F ONE TAIKOO PLACE 979 KING'S RD QUARRY BAY HONG KONG"
    }
  }
}

The tracking status will be one of the following:

StatusDescription
En route - trackableThe payment is on the way and has reached an intermediary that has tracking capabilities (e.g. for a SWIFT payment, it means the intermediary is able to share payment info via the SWIFT GPI system). This is a temporary status.
En route - no longer trackableThe payment is on the way and has reached an intermediary that does not have tracking capabilities (e.g. their systems can't relay updates to the SWIFT GPI system). This does not mean there is an issue with the payment, it just means there won't be additional tracking updates. This is a final status - there won't be additional webhooks, and successful completion of payment can only be confirmed by the recipient.
Arrived at recipientThe payment has been received by the recipient's bank and should be credited. There is a chance that the payment is at the recipient bank but not yet credited if the bank requires documentation (e.g. invoice) from the recipient to credit the funds (e.g. not uncommon situation for exporters with China-based banks). This is a final status - there won't be additional webhooks.

Event Type: Funding Address

Event Name: funding_address_status_update

The funding_address_status_update webhook is triggered when a funding address you created with Create a funding address reaches a final result. Use it to find out when a funding address is active. Only then can payers send funds to it, and only then can you use it for fiat collections.

A new funding address starts as pending. You get the pending status in the API response, not by webhook. A business can have several funding addresses (for example, one per currency). Each one sends its own webhook.

Sample Webhook

{
  "eventType": "funding_address",
  "eventName": "funding_address_status_update",
  "data": {
    "fundingAddressUuid": "ea4f0ae0-1ba4-4cfa-8d53-e1f38c193781",
    "currency": "HKD",
    "network": "FPS",
    "accountNo": "7985600000001234", // only present when status is "active"; null otherwise
    "status": "active",
    "activatedAt": "2026-10-21T02:15:43.000Z", // only sent when status is "active"
    "failureReason": "string" // only sent when status is "rejected", if the bank gave a reason
  }
}

The status can be one of the following:

StatusDescription
activeThe funding address is live and can receive funds. accountNo holds the account number to share with payers.
rejectedThe bank rejected the funding address. This is a final status. Calling Create a funding address again will not help. Contact Reap Support to resolve the account details.

If provisioning fails while the request is being made (for example, the bank is briefly unavailable), Create a funding address returns an error instead of a webhook. Call it again to retry. A funding address that is still pending cannot receive funds yet.

Event Type: Collection

Event Name: collection_status_update

The collection_status_update webhook is triggered whenever a collection created with Create a collection changes status, and each time a payment against it is credited. Every collection update uses this one event name. Read the status field to see which stage the collection has reached.

Sample Webhook

{
  "eventType": "collection",
  "eventName": "collection_status_update",
  "data": {
    "collectionUuid": "col_01k6f2p9wq8z3v7m4n0hb2ycrt",
    "businessUuid": "b1f3c9a0-5d6e-4c21-9a77-0e8b41d2f5aa", // Business UUID that owns the collection
    "status": "partially_received",
    "transferReference": "RC7QK3ZB9MXA", // reference the payer must quote in the transfer; null until "awaiting_funds"
    "paymentLink": "https://pay.reap.global/c/H3K9QZ7M2XBA", // link to send to the payer; null until "awaiting_funds" and after "cancelled"
    "payerSnapshot": {
      "name": "Lianhe Trading Co., Ltd.",
      "referenceId": "SUP-2291"
    },
    "invoiceAmount": "128500.0000000000",
    "invoiceCurrency": "HKD",
    "balanceCurrency": "HKD", // currency your balance is credited in
    "receivedSummary": {
      "totalReceived": "74000.0000", // total received so far, in invoice currency
      "invoiceCurrency": "HKD",
      "invoiceRemainingAmount": "54500.0000" // never below 0
    }
  }
}

The status can be one of the following:

StatusDescription
under_reviewYour invoice document has been uploaded and the collection is going through compliance review. It cannot receive payments yet, and paymentLink and transferReference are null.
awaiting_fundsThe collection passed review and can now be paid. paymentLink and transferReference are now filled in. Share them with your payer.
partially_receivedA payment was received and credited, but the total is still below the invoice amount. This webhook is sent again for every further partial payment, with the same status. Use receivedSummary for the latest totals.
completedThe total received has reached the invoice amount. This is a final status.
cancelledThe collection was cancelled. This is a final status. Payments sent after cancellation are not credited to the collection.
expiredThe collection passed its expiry date before being fully paid. This is not final: if a payment still arrives, it is credited and the collection moves to partially_received or completed.

A new collection starts in draft. No webhook is sent for draft, and no webhook is sent when a draft collection is cancelled or expires.

Several partially_received webhooks for the same collection are not duplicates. Each one is a new payment. To de-duplicate, compare receivedSummary.totalReceived, not collectionUuid + status.

receivedSummary amounts are strings in the invoice currency with 4 decimal places, and usually include only payments already credited to your balance. This webhook carries no fee details. The fee rates for a collection are in feeSnapshot on Get a collection.


Event Type: Withdrawal

Event Name: withdrawal_status_update

Use the withdrawal_status_update webhook to receive a notification when a withdrawal reaches a final status: completed or failed.

Sample Webhook

{
  "eventType": "withdrawal",
  "eventName": "withdrawal_status_update",
  "data": {
    "withdrawalId": "wd_01JB2K3G4H5J6K7M8N9P0Q1R2S",
    "accountId": "23e93ca7-77aa-4f6b-b98d-9f31a2f2c8d1",
    "status": "completed",
    "currency": "USDC",
    "amount": "252.41",
    "receivingCurrency": "MXN",
    "receivingAmount": "5000.00",
    "settlement": {
      "trackingReference": null,
      "settledAt": "2026-10-29T06:42:10.000Z"
    },
    "failureReason": null,
    "reference": "INV-2026-1042"
  }
}

Webhook Fields

The following fields appear in data:

FieldTypeDescription
withdrawalIdstringThe withdrawal this event is about.
accountIdstringThe account debited for the withdrawal.
statusstringcompleted means the withdrawal settled. failed means the debit is reversed. Both are final statuses.
currencystringThe cryptocurrency debited: USDC or USDT.
amountstringThe amount of cryptocurrency debited.
receivingCurrencystring or nullThe fiat currency delivered. null for crypto transfers.
receivingAmountstring or nullThe fiat amount delivered. null for crypto transfers.
settlementobject or nullNormally populated when the status is completed. Contains trackingReference and settledAt, as shown in the sample.
failureReasonstring or nullNormally populated when the status is failed. Possible values: compliance_rejected, invalid_beneficiary, provider_rejected, returned, insufficient_balance, quote_expired, or unknown.
referencestring or nullThe reference you supplied when you created the withdrawal, or null.