Sent when the status of a payment changes. Subscribe to the `PAYMENT STATUS` event type to receive these updates at your designated endpoint.
Implement idempotent processing and store each event keyed by `event_id` and `payment_id` to handle retries and out-of-order delivery.
## Status flows and reference
<Accordion title="Status Flows & Transitions">
Payment status updates follow different flows depending on whether currency conversion (FX) is required:
**Flow 1: Payments with FX Conversion (Different Currencies)**
```mermaid
graph TD;
AWAITING_FUNDS --> RECEIVED_FUNDS --> FX_COMPLETED --> PAYOUT_INITIATED --> PAYOUT_CREDITED --> PAYMENT_COMPLETED
AWAITING_FUNDS --> CANCELLED
RECEIVED_FUNDS --> REFUNDED
PAYOUT_INITIATED --> BOUNCED_BACK
BOUNCED_BACK --> REFUNDED
PAYOUT_INITIATED --> CANCELLED
```
**Flow 2: Same Currency Payments (No FX Conversion)**
```mermaid
graph TD;
PROCESSING --> PAYOUT_INITIATED --> PAYOUT_CREDITED --> PAYMENT_COMPLETED
PROCESSING --> CANCELLED
PAYOUT_INITIATED --> BOUNCED_BACK
BOUNCED_BACK --> REFUNDED
```
**Status Reference:**
| Status | Description | Applies To |
|--------|-------------|------------|
| PROCESSING | Same-currency payment accepted, processing started | Same currency only |
| AWAITING_FUNDS | Payment created, waiting for incoming funds | FX payments |
| RECEIVED_FUNDS | Funds received and credited to customer's Redpin wallet | FX payments |
| FX_COMPLETED | Currency conversion completed | FX payments only |
| PAYOUT_INITIATED | Transfer to recipient initiated | All payments |
| PAYOUT_CREDITED | Funds credited to recipient's account | All payments |
| CANCELLED | Payment cancelled (reason in `reason_description`) | All payments |
| BOUNCED_BACK | Recipient bank returned the funds (reason in `bounce_reason`) | All payments |
| REFUNDED | Payment refunded to customer (details in `refund_amount`) | All payments |
| PAYMENT_COMPLETED | All recipients paid; final status | All payments |
<Warning>If you receive a status not listed here, log the event and contact the Partner Integrations Team. Your integration should be resilient to new statuses being added.</Warning>
> All envelope fields (`event_id`, `event_type`, `version`, `event_timestamp`) are always present. Business fields (`payment_id`, `status`, `customer_id`, etc.) are inside the `data` object.
**PAYOUT_CREDITED vs PAYMENT_COMPLETED:**
For single-recipient payments, both events are delivered and are functionally equivalent. For multi-recipient payments, `PAYOUT_CREDITED` fires per recipient; `PAYMENT_COMPLETED` fires once when all recipients are credited. Treat `PAYMENT_COMPLETED` as the definitive settlement signal.
</Accordion>
<Accordion title="Field Availability Reference">
> **Payment types explained:**
> - **Third Party Payment (Session-Based)**: Payments created via [Hosted payment sessions API](/api-reference/customers/hosted-experience/sessions/create-payment-session)
> - **API Payment (Third Party)**: Payments created via [Payment API](/api-reference/customers/api-integration/payments/create-payment) with `is_third_party_payment: true`
> - **API Payment (Non Third Party)**: Payments created via [Payment API](/api-reference/customers/api-integration/payments/create-payment) with `is_third_party_payment: false`
| Field | Third Party Payment (Session-Based) | API Payment (Third Party) | API Payment (Non Third Party) |
|-------|--------------------------------------|--------------------------|-------------------------------|
| `data.session_id` | ✅ Always present | ❌ Not present | ❌ Not present |
| `data.client_reference_id` | ✅ Present | ✅ Present | ⚠️ Present when provided |
| `data.client_customer_ref` | ✅ Present | ✅ Present | ⚠️ Present when provided |
| `data.payment_id` | ✅ Present | ✅ Present | ✅ Present |
| `data.status` | ✅ Present | ✅ Present | ✅ Present |
| `data.customer_id` | ✅ Present | ✅ Present | ✅ Present |
See the example payloads below for the specific data object schema associated with each status value.
</Accordion>
<Accordion title="Glossary">
| Term | Definition |
|------|-----------|
| Envelope fields | Top-level event metadata: `event_id`, `event_type`, `version`, `event_timestamp` |
| Business data | Fields inside `data` describing the payment and its current status |
| Third party payment | Payment funded by someone other than the account holder (e.g. a buyer paying a property developer) |
| Non third party payment | Payment funded by the account holder from their own bank account |
</Accordion>
## Example payloads
Each status below shows payloads for all three payment types. The envelope (`event_id`, `event_type`, `version`, `event_timestamp`) is identical across types; only the `data` fields differ.
<Accordion title="AWAITING_FUNDS">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "1",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "AWAITING_FUNDS",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001"
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "1",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "AWAITING_FUNDS",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001"
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "1",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "AWAITING_FUNDS",
"customer_id": "0201001008132685"
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="RECEIVED_FUNDS">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "2",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "RECEIVED_FUNDS",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"amount": {
"currency": "GBP",
"value": 1000
}
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "2",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "RECEIVED_FUNDS",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"client_reference_id": "PAY-REF-001",
"amount": {
"currency": "GBP",
"value": 1000
}
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "2",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "RECEIVED_FUNDS",
"customer_id": "0201001008132685",
"amount": {
"currency": "GBP",
"value": 1000
}
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="FX_COMPLETED">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "3",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "FX_COMPLETED",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"sell_amount": {
"currency": "GBP",
"value": 1000
},
"buy_amount": {
"currency": "AED",
"value": 4982.70
},
"quote_rate": 4.9827
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "3",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "FX_COMPLETED",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"sell_amount": {
"currency": "GBP",
"value": 1000
},
"buy_amount": {
"currency": "AED",
"value": 4982.70
},
"quote_rate": 4.9827
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "3",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "FX_COMPLETED",
"customer_id": "0201001008132685",
"sell_amount": {
"currency": "GBP",
"value": 1000
},
"buy_amount": {
"currency": "AED",
"value": 4982.70
},
"quote_rate": 4.9827
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="PAYOUT_INITIATED">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "4",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "PAYOUT_INITIATED",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "4",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PAYOUT_INITIATED",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "4",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PAYOUT_INITIATED",
"customer_id": "0201001008132685",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="PAYOUT_CREDITED">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "5",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "PAYOUT_CREDITED",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "5",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PAYOUT_CREDITED",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "5",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PAYOUT_CREDITED",
"customer_id": "0201001008132685",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="CANCELLED">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "6",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "CANCELLED",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"reason_description": "Customer cancelled the payment"
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "6",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "CANCELLED",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"reason_description": "Customer cancelled the payment"
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "6",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "CANCELLED",
"customer_id": "0201001008132685",
"reason_description": "Customer cancelled the payment"
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="PROCESSING">
> **Note:** This status is used for same-currency payments (no FX conversion required). It is sent immediately after the Payment v3 call. The payload contains base fields only; no status-specific data fields are included.
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "7",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "PROCESSING",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001"
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "7",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PROCESSING",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001"
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "7",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PROCESSING",
"customer_id": "0201001008132685"
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="REFUNDED">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "8",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "REFUNDED",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"refund_amount": {
"currency": "GBP",
"value": 1000
},
"refund_reason": "Customer overpaid"
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "8",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "REFUNDED",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"refund_amount": {
"currency": "GBP",
"value": 1000
},
"refund_reason": "Customer overpaid"
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "8",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "REFUNDED",
"customer_id": "0201001008132685",
"refund_amount": {
"currency": "GBP",
"value": 1000
},
"refund_reason": "Customer overpaid"
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="PAYMENT_COMPLETED">
> **Note:** This status indicates that all payouts in a transaction are in PAYOUT_CREDITED state. This is the final status for all payments (both FX conversion and same-currency payments).
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "9",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "PAYMENT_COMPLETED",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"recipient_details": [
{
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
},
{
"amount": {
"currency": "AED",
"value": 400.00
},
"recipient_id": "162346"
}
]
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "9",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PAYMENT_COMPLETED",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"recipient_details": [
{
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
},
{
"amount": {
"currency": "AED",
"value": 400.00
},
"recipient_id": "162346"
}
]
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "9",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "PAYMENT_COMPLETED",
"customer_id": "0201001008132685",
"recipient_details": [
{
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345"
},
{
"amount": {
"currency": "AED",
"value": 400.00
},
"recipient_id": "162346"
}
]
}
}
```
</Tab>
</Tabs>
</Accordion>
<Accordion title="BOUNCED_BACK">
<Tabs>
<Tab title="Third Party Payment (Session-Based)">
```json
{
"event_id": "10",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"session_id": "123e4567-e89b-12d3-a456-426614174000",
"payment_id": "123456",
"status": "BOUNCED_BACK",
"customer_id": "0201001008132685",
"client_customer_ref": "CUST_001",
"client_reference_id": "PAY-REF-001",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345",
"bounce_reason": "Invalid account number"
}
}
```
</Tab>
<Tab title="API Payment (Third Party)">
```json
{
"event_id": "10",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "BOUNCED_BACK",
"customer_id": "0201001008132685",
"client_customer_ref": "skyline_customer_001",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345",
"bounce_reason": "Invalid account number"
}
}
```
</Tab>
<Tab title="API Payment (Non Third Party)">
```json
{
"event_id": "10",
"event_type": "PAYMENT STATUS",
"version": "v1.0.0",
"event_timestamp": "2025-01-01T00:00:00Z",
"data": {
"payment_id": "123456",
"status": "BOUNCED_BACK",
"customer_id": "0201001008132685",
"amount": {
"currency": "AED",
"value": 4982.70
},
"recipient_id": "162345",
"bounce_reason": "Invalid account number"
}
}
```
</Tab>
</Tabs>
</Accordion>
Payload
The payload of this webhook request is an object.
event_idstringRequired
Unique identifier for the event.
event_typeenumRequired
Type of webhook event. Always "PAYMENT STATUS" for payment status events.
Allowed values:
versionstringRequired
Payload version. Currently "v1.0.0". This enables controlled evolution of the webhook contract.
event_timestampdatetimeRequired
Timestamp of the event in ISO 8601 format (YYYY-MM-DDTHH:MM:SSZ).
dataobjectRequired
Business data for the payment status event. Contains payment, customer, and status information.
The structure varies by payment status and integration type.
Response
200
Webhook received successfully
400
Invalid payload
Sent when the status of a payment changes. Subscribe to the PAYMENT STATUS event type to receive these updates at your designated endpoint.
Implement idempotent processing and store each event keyed by event_id and payment_id to handle retries and out-of-order delivery.
Status flows and reference
Status Flows & Transitions
Payment status updates follow different flows depending on whether currency conversion (FX) is required:
Flow 1: Payments with FX Conversion (Different Currencies)
Flow 2: Same Currency Payments (No FX Conversion)
Status Reference:
Status
Description
Applies To
PROCESSING
Same-currency payment accepted, processing started
Same currency only
AWAITING_FUNDS
Payment created, waiting for incoming funds
FX payments
RECEIVED_FUNDS
Funds received and credited to customer’s Redpin wallet
FX payments
FX_COMPLETED
Currency conversion completed
FX payments only
PAYOUT_INITIATED
Transfer to recipient initiated
All payments
PAYOUT_CREDITED
Funds credited to recipient’s account
All payments
CANCELLED
Payment cancelled (reason in reason_description)
All payments
BOUNCED_BACK
Recipient bank returned the funds (reason in bounce_reason)
All payments
REFUNDED
Payment refunded to customer (details in refund_amount)
All payments
PAYMENT_COMPLETED
All recipients paid; final status
All payments
If you receive a status not listed here, log the event and contact the Partner Integrations Team. Your integration should be resilient to new statuses being added.
All envelope fields (event_id, event_type, version, event_timestamp) are always present. Business fields (payment_id, status, customer_id, etc.) are inside the data object.
PAYOUT_CREDITED vs PAYMENT_COMPLETED:
For single-recipient payments, both events are delivered and are functionally equivalent. For multi-recipient payments, PAYOUT_CREDITED fires per recipient; PAYMENT_COMPLETED fires once when all recipients are credited. Treat PAYMENT_COMPLETED as the definitive settlement signal.
Fields inside data describing the payment and its current status
Third party payment
Payment funded by someone other than the account holder (e.g. a buyer paying a property developer)
Non third party payment
Payment funded by the account holder from their own bank account
Example payloads
Each status below shows payloads for all three payment types. The envelope (event_id, event_type, version, event_timestamp) is identical across types; only the data fields differ.
"reason_description": "Customer cancelled the payment"
14
}
15
}
PROCESSING
Note: This status is used for same-currency payments (no FX conversion required). It is sent immediately after the Payment v3 call. The payload contains base fields only; no status-specific data fields are included.
Note: This status indicates that all payouts in a transaction are in PAYOUT_CREDITED state. This is the final status for all payments (both FX conversion and same-currency payments).