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:
| statusDetails | Description | |
|---|---|---|
| cancelled_by_user_before_funding | This payment was cancelled while in awaiting_approval or awaiting_funds status. | |
| cancelled_by_user_after_funding | The 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_expired | The 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_rejected | This payment cannot be processed by Reap. The funds have been returned, please refer to Reap's communication for more details. | |
| payment_returned | The 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:
| Status | Description |
|---|---|
| En route - trackable | The 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 trackable | The 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 recipient | The 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
funding_address_status_updateThe 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:
| Status | Description |
|---|---|
active | The funding address is live and can receive funds. accountNo holds the account number to share with payers. |
rejected | The 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
collection_status_updateThe 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:
| Status | Description |
|---|---|
under_review | Your 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_funds | The collection passed review and can now be paid. paymentLink and transferReference are now filled in. Share them with your payer. |
partially_received | A 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. |
completed | The total received has reached the invoice amount. This is a final status. |
cancelled | The collection was cancelled. This is a final status. Payments sent after cancellation are not credited to the collection. |
expired | The 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
withdrawal_status_updateUse 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:
| Field | Type | Description |
|---|---|---|
withdrawalId | string | The withdrawal this event is about. |
accountId | string | The account debited for the withdrawal. |
status | string | completed means the withdrawal settled. failed means the debit is reversed. Both are final statuses. |
currency | string | The cryptocurrency debited: USDC or USDT. |
amount | string | The amount of cryptocurrency debited. |
receivingCurrency | string or null | The fiat currency delivered. null for crypto transfers. |
receivingAmount | string or null | The fiat amount delivered. null for crypto transfers. |
settlement | object or null | Normally populated when the status is completed. Contains trackingReference and settledAt, as shown in the sample. |
failureReason | string or null | Normally populated when the status is failed. Possible values: compliance_rejected, invalid_beneficiary, provider_rejected, returned, insufficient_balance, quote_expired, or unknown. |
reference | string or null | The reference you supplied when you created the withdrawal, or null. |

