notify_url with additional event and event_data fields, allowing merchants to take appropriate action (e.g., flag the transaction, update internal records).Important: These event notifications do not change the order status on the Lesspay2 platform. The order remains in its current state (e.g., SUCCEED). The purpose is purely informational — to alert the merchant about risk events.
| Event Type | Trigger | Description |
|---|---|---|
payment_declined | The upstream channel detects a payment decline with response code 30034 (Suspected Fraud) or 4xxxx (Risk Blocked) | The payment was declined due to suspected fraud or risk rules |
dispute_received | The upstream channel receives a dispute notification from the card scheme | A cardholder has disputed the payment with their bank (chargeback initiated) |
payment_declined)| Response Code | Description |
|---|---|
30034 | Suspected fraud - Pick up. The issuer declined the payment due to suspected fraud. |
41101 | Risk Blocked Transaction (client-level risk rule) |
41201 | Decline list - Card number (client-level) |
41301 | Fraud score exceeds threshold |
42101 | Risk Blocked Transaction (entity-level risk rule) |
42201 | Decline list - Card number (entity-level) |
42301 | Fraud score exceeds threshold (entity-level) |
For a full list of 4xxxxrisk response codes, contact Lesspay Operations.
dispute_received)| Category | Description |
|---|---|
fraudulent | The cardholder claims they did not authorize the transaction |
unrecognized | The cardholder does not recognize the transaction |
product_service_not_received | The cardholder claims they did not receive the product/service |
product_service_not_as_described | The product/service was not as described |
credit_not_processed | The cardholder claims a refund/credit was not processed |
duplicate | The cardholder claims they were charged more than once |
other | Other reasons |
notify_url with the following payload. The format is consistent with the standard Create Payin, with two additional fields: event and event_data.| Field Name | Type | Description |
|---|---|---|
request_id | String | Merchant's unique Request ID |
pay_order_id | String | Lesspay's unique Order ID |
order_status | String | Current order status (unchanged, e.g., SUCCEED) |
order_status_int | Integer | Current order status (numeric) |
target_currency | String | Transaction currency |
target_amount | String | Transaction amount |
product_name | String | Product name |
description | String | Order description |
api_version | String | API Version |
channel_biz_data | Object | Additional channel parameters |
event | String | Event type: payment_declined or dispute_received |
event_data | Object | Event-specific data (see below) |
How to distinguish event notifications from payment notifications: If the eventfield is present and non-null, it is an event notification. Standard payment success/failure webhooks do not contain theeventfield.
x-auth-signature header is included and should be verified using the same process.event_data Structure| Field | Type | Description |
|---|---|---|
response_code | String | Channel response code (e.g., "30034", "41101") |
response_summary | String | Human-readable decline reason (e.g., "Suspected fraud - Pick up") |
risk_flagged | Boolean | Whether the transaction was flagged by the channel risk engine |
checkout_payment_id | String | Channel payment ID (e.g., "pay_xxxxxxxxxxxx") |
{
"pay_order_id": "P2011789219984105474",
"request_id": "M20260228150001",
"order_status": "SUCCEED",
"order_status_int": 2,
"target_currency": "USD",
"target_amount": "100.00",
"product_name": "Test Product",
"description": "Test Order",
"api_version": "V2",
"success_url": "https://merchant.example.com/success",
"fail_url": "https://merchant.example.com/fail",
"event": "payment_declined",
"event_data": {
"response_code": "30034",
"response_summary": "Suspected fraud - Pick up",
"risk_flagged": true,
"checkout_payment_id": "pay_xxxxxxxxxxxxxxxxxxxxx"
}
}4xxxx codes (risk-blocked), consider adding the cardholder to your internal watchlist.30034 (suspected fraud), do not retry the payment with the same card.event_data Structure| Field | Type | Description |
|---|---|---|
dispute_id | String | Channel dispute ID (e.g., "dsp_xxxxxxxxxxxxxxxxxxxx") |
category | String | Dispute category (e.g., "fraudulent", "unrecognized") |
amount | Long | Disputed amount in minor units (e.g., 8150 = 81.50 GBP) |
currency | String | Dispute currency (e.g., "GBP") |
reason_code | String | Card scheme reason code (e.g., "10.4" for Visa fraud) |
payment_method | String | Card scheme (e.g., "VISA", "MASTERCARD") |
date | String | Dispute date in ISO 8601 format |
checkout_payment_id | String | Channel payment ID linked to this dispute |
{
"pay_order_id": "P2011789219984105474",
"request_id": "M20260228150001",
"order_status": "SUCCEED",
"order_status_int": 2,
"target_currency": "GBP",
"target_amount": "81.50",
"product_name": "Test Product",
"description": "Test Order",
"api_version": "V2",
"success_url": "https://merchant.example.com/success",
"fail_url": "https://merchant.example.com/fail",
"event": "dispute_received",
"event_data": {
"dispute_id": "dsp_xxxxxxxxxxxxxxxxxxxx",
"category": "fraudulent",
"amount": 8150,
"currency": "GBP",
"reason_code": "10.4",
"payment_method": "VISA",
"date": "2025-12-15T15:20:31Z",
"checkout_payment_id": "pay_xxxxxxxxxxxxxxxxxxxxx"
}
}dispute_received event is the starting point. The dispute may progress through the following stages:Payment Disputed → Evidence Required → Evidence Under Review → Won / Lost
→ Expired (no response)
→ Accepted (merchant accepted)
→ Canceled (issuer canceled)Note: Currently only the dispute_receivedevent is forwarded to merchants. Future updates may include additional dispute lifecycle events (e.g.,dispute_won,dispute_lost,dispute_evidence_required).
event field in incoming notificationspayment_declined events — log fraud information and flag transactionsdispute_received events — create dispute records and alert your operations team2xx for all event notifications (including events you choose not to act on)x-auth-signature header as described in Payin webhookpayment_declined and a dispute_received for the same order?order_status=SUCCEED), and later receive a dispute_received when the cardholder disputes the charge. Separately, a payment_declined event indicates a failed payment attempt due to fraud detection — this is typically for transactions that were never successfully completed.2xx to acknowledge receipt. If it does not, Lesspay2 will retry the notification. Unhandled events will not affect your payment processing.dispute_received amount always in minor units?amount field in event_data uses minor units (e.g., 8150 for GBP 81.50, 10000 for USD 100.00). The target_amount field in the top-level payload uses standard decimal format (e.g., "81.50").