Payment Intents
Create, process, and track payments through their lifecycle
A Payment Intent represents a single payment attempt. The typical flow is:
- Create a payment intent with the amount, currency, and capture method
- Proceed with Yassir Cash as the payment method
- Handle any redirects (OTP verification)
- Check the payment status
For pre-authorization flows, create the intent with captureMethod: "RESERVATION", then capture or release the funds later.
Authentication by endpoint
client_auth (your client credentials). Proceed and Check also accept merchant_auth (browser / SDK: publishable key + x-client-secret) and user_auth (a signed-in customer's token). Full details in Authentication.Create Payment Intent#
Creates a new payment intent. Returns a paymentId and clientSecret that you use in subsequent calls.
/api/v1/payments/intentsQuery Parameters#
countryCodestringrequiredDZARequest Body#
actionIdstringrequiredamountnumberrequiredactionCurrencyCodestringrequiredDZD, MAD, USDactionCountryCodestringrequireduserIdstringrequiredcaptureMethodstringoptionalDIRECT.DIRECT — Capture immediately when the payment is processed.RESERVATION — Reserve the funds and capture later via the Capture endpoint.transactionTypestringoptionalQR_CODE to create a QR wallet payment intent. For regular payments, omit this field.metaDataobjectoptionalpaymentCheckoutId for tracking.Required Headers#
AuthorizationstringrequiredBearer base64(client_id:client_secret)x-platformstringrequiredAPIWEBANDROIDIOSx-servicestringrequiredContent-Typestringrequiredapplication/json.Response#
data.paymentIdstringrequireddata.clientSecretstringrequiredpa_{id}_secret_{hex}data.statusstringrequiredCREATED after initialization.data.amountnumberrequireddata.currencystringrequiredDZD).data.expiresAtstringrequiredcurl -X POST "https://api.payment.yassir.io/api/v1/payments/intents?countryCode=DZA" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"actionId": "order_12345",
"amount": 1500.00,
"actionCurrencyCode": "DZD",
"actionCountryCode": "DZA",
"userId": "user_abc123",
"captureMethod": "DIRECT"
}'curl -X POST "https://api.payment.yassir.io/api/v1/payments/intents?countryCode=DZA" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"actionId": "order_12345",
"amount": 1500.00,
"actionCurrencyCode": "DZD",
"actionCountryCode": "DZA",
"userId": "user_abc123",
"captureMethod": "DIRECT"
}'{
"data": {
"paymentId": "123e4567-e89b-12d3-a456-426614174000",
"clientSecret": "pa_123e4567_secret_a1b2c3d4e5f6a1b2c3d4e5f6",
"status": "CREATED",
"amount": 1500.00,
"currency": "DZD",
"expiresAt": "2026-02-18T10:30:00.000Z"
},
"message": "payment initiated successfully"
}{
"data": {
"paymentId": "123e4567-e89b-12d3-a456-426614174000",
"clientSecret": "pa_123e4567_secret_a1b2c3d4e5f6a1b2c3d4e5f6",
"status": "CREATED",
"amount": 1500.00,
"currency": "DZD",
"expiresAt": "2026-02-18T10:30:00.000Z"
},
"message": "payment initiated successfully"
}// QR wallet payment intent
{
"actionId": "merchant-order-123",
"amount": 1200,
"actionCurrencyCode": "DZD",
"actionCountryCode": "DZA",
"transactionType": "QR_CODE",
"metaData": {
"paymentCheckoutId": "checkout-123"
}
}// QR wallet payment intent
{
"actionId": "merchant-order-123",
"amount": 1200,
"actionCurrencyCode": "DZD",
"actionCountryCode": "DZA",
"transactionType": "QR_CODE",
"metaData": {
"paymentCheckoutId": "checkout-123"
}
}Proceed with Payment#
Submits the payment for processing with Yassir Cash. The response may indicate that additional user action is required (OTP verification).
/api/v1/payments/intents/:id/proceedURL Parameters#
idstringrequiredpaymentId returned from the Create Payment Intent endpoint.Request Body#
paymentMethodCodestringrequiredWALLET_V2 for Yassir Cash, or STRIPE for Visa / Mastercard card payments. Read the exact value from List Payment Methods.cardIdstringoptionalredirectUrlstringoptionalhttp/https URL. See Card Payments.Paying by card (Visa / Mastercard)
paymentMethodCode: "STRIPE". The response has statusCode: 12 with a payUrl; redirect the buyer there to enter their card (or complete 3D Secure for a saved card). The full flow, including the redirect response, is in the Card Payments guide.Required Headers#
AuthorizationstringrequiredBearer base64(client_id:client_secret) for client_auth, Bearer pk_yassir_... for merchant_auth, or the customer token for user_auth.x-client-secretstringoptionalmerchant_auth only. The payment's clientSecret from Create Payment Intent (format pa_{id}_secret_{hex}). Ignored in client_auth and user_auth.x-servicestringoptionalclient_auth/user_auth. Ignored for merchant_auth — the service is derived from your publishable key instead, so a caller cannot widen scope by sending a different value.x-platformstringrequiredAPIWEBANDROIDIOSx-country-codestringoptionalDZA.x-localestringoptionalen_USAuth modes for Proceed
- client_auth (server):
Authorization: Bearer base64(client_id:client_secret). - merchant_auth (browser / SDK):
Authorization: Bearer pk_yassir_...+x-client-secret+ an allow-listedOrigin. - user_auth (signed-in customer): the customer's access token in
x-client-token.
merchant_auth error responses
merchant_auth can additionally fail with:401 invalid_credentials— malformed/unresolvable publishable key or client secret, secret mismatch, or an attempt to access another merchant's payment intent.403 origin_not_allowed— the request'sOriginheader is not on your service's allow-list. Register your checkout page's origin before going live.410 intent_expired— a non-terminal intent is more than 30 minutes (plus a 30s grace window) past creation. Create a new intent rather than retrying the same one.429 rate_limited— per-publishable-key (600 req/min) or per-client-secret (120 req/min) limit exceeded. Back off rather than retrying immediately, especially when polling Check Payment Status.
Handling OTP Verification
require3DS is true, redirect the user to the payUrl. Yassir handles the entire OTP flow — sending the SMS, showing the verification page, and validating the code. Append a returnUrl query parameter so the user is redirected back to your app after verification.See the OTP Verification guide for the complete redirect flow.
Response#
data.require3DSbooleanrequiredtrue, redirect the user to payUrl.data.statusCodenumberrequireddata.statusstringrequireddata.metadata.payUrlstringoptionalrequire3DS is true. Append your returnUrl as a query parameter.data.metadata.qrImageUrlstringoptional transactionType: "QR_CODE" and proceeded with WALLET_V2. Display this URL to the customer.Status Codes#
| statusCode | Meaning | Action Required |
|---|---|---|
2 | Success | Payment completed. Show success to user. |
3 | Rejected | Payment failed. Show error and allow retry. |
12 | Requires Action | Redirect user to payUrl for OTP verification. |
13 | Pre-Authorized | Funds reserved. Use Capture or Release endpoint. |
# client_auth (server-side). For browser/SDK use merchant_auth:
# Authorization: Bearer pk_yassir_... + x-client-secret: pa_..._secret_...
curl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/proceed" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-H "x-country-code: DZA" \
-d '{
"paymentMethodCode": "WALLET_V2"
}'# client_auth (server-side). For browser/SDK use merchant_auth:
# Authorization: Bearer pk_yassir_... + x-client-secret: pa_..._secret_...
curl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/proceed" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-H "x-country-code: DZA" \
-d '{
"paymentMethodCode": "WALLET_V2"
}'// statusCode: 12 → Requires OTP verification
{
"data": {
"require3DS": true,
"statusCode": 12,
"status": "Require Authentication Action",
"metadata": {
"payUrl": "https://otp.payment.yassir.io/otp/verify?requestId=...&phone=213555123456&amount=1500¤cy=DZD"
}
},
"message": "payment proceeded successfully"
}// statusCode: 12 → Requires OTP verification
{
"data": {
"require3DS": true,
"statusCode": 12,
"status": "Require Authentication Action",
"metadata": {
"payUrl": "https://otp.payment.yassir.io/otp/verify?requestId=...&phone=213555123456&amount=1500¤cy=DZD"
}
},
"message": "payment proceeded successfully"
}// statusCode: 2 → Payment succeeded immediately
{
"data": {
"require3DS": false,
"statusCode": 2,
"status": "The amount was deposited successfully",
"metadata": {
"payUrl": ""
}
},
"message": "payment proceeded successfully"
}// statusCode: 2 → Payment succeeded immediately
{
"data": {
"require3DS": false,
"statusCode": 2,
"status": "The amount was deposited successfully",
"metadata": {
"payUrl": ""
}
},
"message": "payment proceeded successfully"
}// statusCode: 3 → Payment rejected
{
"data": {
"require3DS": false,
"statusCode": 3,
"status": "Transaction was rejected",
"metadata": {
"payUrl": ""
}
},
"message": "payment proceeded successfully"
}// statusCode: 3 → Payment rejected
{
"data": {
"require3DS": false,
"statusCode": 3,
"status": "Transaction was rejected",
"metadata": {
"payUrl": ""
}
},
"message": "payment proceeded successfully"
}// QR wallet payment → display qrImageUrl and wait for statusCode: 2
{
"data": {
"require3DS": false,
"metadata": {
"qrImageUrl": "https://storage.googleapis.com/.../qr-codes/2fddefa2-f137-4afd-b6a8-b1623d86b115.png?..."
}
},
"message": "payment proceeded successfully"
}// QR wallet payment → display qrImageUrl and wait for statusCode: 2
{
"data": {
"require3DS": false,
"metadata": {
"qrImageUrl": "https://storage.googleapis.com/.../qr-codes/2fddefa2-f137-4afd-b6a8-b1623d86b115.png?..."
}
},
"message": "payment proceeded successfully"
}// Card → redirect the buyer to payUrl to enter their card
{
"data": {
"require3DS": true,
"statusCode": 12,
"status": "Require card details",
"metadata": {
"payUrl": "https://<yassir-hosted-card-page>/..."
}
},
"message": "payment proceeded successfully"
}// Card → redirect the buyer to payUrl to enter their card
{
"data": {
"require3DS": true,
"statusCode": 12,
"status": "Require card details",
"metadata": {
"payUrl": "https://<yassir-hosted-card-page>/..."
}
},
"message": "payment proceeded successfully"
}Finalize Stripe Payment#
Called by the buyer's browser right after stripe.confirmCardPayment succeeds on the Yassir-hosted card-entry page (the payUrl a card Proceed response redirects to). Most integrations never call this directly — the hosted page does it for you — but it's documented here for custom card-entry integrations.
Idempotent on paymentIntentId: this same handler is also invoked by the payment_intent.succeeded Stripe webhook, so a race between the browser call and the webhook still results in exactly one saved card and one succeeded transaction.
/api/v1/payments/intents/:paymentActionId/stripe-finalizeURL Parameters#
paymentActionIdstringrequiredRequest Body#
paymentIntentIdstringrequiredpi_...).externalCardIdstringrequiredpm_...).Required Headers#
x-client-secretstringrequiredclientSecret (format pa_{id}_secret_{hex}).A different, narrower credential scheme
merchant_auth pair — only x-client-secret, compared against the paymentActionId in the URL. It's reached exclusively via a payUrl that core itself issued for that one payment intent, so the per-intent secret alone is sufficient proof of ownership.Response#
data.statusstringrequiredsucceeded on success.data.paymentIdstringrequireddata.cardIdstringoptionalcurl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/stripe-finalize" \
-H "x-client-secret: pa_xxxxxxxx_secret_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"paymentIntentId": "pi_3OabcXYZ1234567890",
"externalCardId": "pm_1OabcXYZ1234567890"
}'curl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/stripe-finalize" \
-H "x-client-secret: pa_xxxxxxxx_secret_xxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"paymentIntentId": "pi_3OabcXYZ1234567890",
"externalCardId": "pm_1OabcXYZ1234567890"
}'{
"data": {
"status": "succeeded",
"paymentId": "123e4567-e89b-12d3-a456-426614174000",
"cardId": "123e4567-e89b-12d3-a456-426614174001"
},
"message": "payment finalised successfully"
}{
"data": {
"status": "succeeded",
"paymentId": "123e4567-e89b-12d3-a456-426614174000",
"cardId": "123e4567-e89b-12d3-a456-426614174001"
},
"message": "payment finalised successfully"
}Check Payment Status#
Retrieves the current status of a payment intent. Use this after the user returns from a redirect to confirm the payment result.
/api/v1/payments/intents/:id/checkURL Parameters#
idstringrequiredpaymentId to check.Required Headers#
AuthorizationstringrequiredBearer base64(client_id:client_secret) (client_auth), Bearer pk_yassir_... (merchant_auth), or the customer token (user_auth).x-client-secretstringoptionalmerchant_auth only. The payment's clientSecret from Create Payment Intent. Ignored in client_auth and user_auth.x-servicestringoptionalclient_auth/user_auth. Ignored for merchant_auth — the service is derived from your publishable key instead, so a caller cannot widen scope by sending a different value.x-platformstringrequiredAPIWEBANDROIDIOSCheck accepts the same three auth modes as Proceed. See Authentication.
Response#
data.statusCodenumberrequired2 = succeeded, 3 = rejected,12 = requires action, 13 = pre-authorized).data.paymentMethodNamestringrequiredWALLET_V2).data.amountnumberrequireddata.currencyCodestringrequiredDZD).data.endUserMessagestringrequireddata.supportInfoobjectoptionalemail and phoneNumber.data.lastUpdatestringoptional# client_auth (server-side). For browser/SDK use merchant_auth
# (Authorization: Bearer pk_yassir_... + x-client-secret) or user_auth.
curl -X GET "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/check" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE"# client_auth (server-side). For browser/SDK use merchant_auth
# (Authorization: Bearer pk_yassir_... + x-client-secret) or user_auth.
curl -X GET "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/check" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE"{
"data": {
"statusCode": 2,
"paymentMethodName": "WALLET_V2",
"amount": 1500,
"currencyCode": "DZD",
"endUserMessage": "Payment completed successfully",
"supportInfo": {
"email": "support@yassir.com",
"phoneNumber": "+213000000000"
},
"lastUpdate": "2025-01-15T10:30:00.000Z"
},
"message": "payment status retrieved successfully"
}{
"data": {
"statusCode": 2,
"paymentMethodName": "WALLET_V2",
"amount": 1500,
"currencyCode": "DZD",
"endUserMessage": "Payment completed successfully",
"supportInfo": {
"email": "support@yassir.com",
"phoneNumber": "+213000000000"
},
"lastUpdate": "2025-01-15T10:30:00.000Z"
},
"message": "payment status retrieved successfully"
}// QR wallet payment still waiting for customer confirmation
{
"data": {
"statusCode": 1,
"paymentMethodName": "WALLET_V2",
"amount": 1200,
"currencyCode": "DZD",
"paymentOrderId": "2fddefa2-f137-4afd-b6a8-b1623d86b115",
"microServiceTransactionId": "",
"endUserMessage": {
"en": "Proceeding",
"fr": "En cours",
"ar": "قيد المعالجة"
},
"approvalCode": null
},
"message": "payment checked successfully"
}// QR wallet payment still waiting for customer confirmation
{
"data": {
"statusCode": 1,
"paymentMethodName": "WALLET_V2",
"amount": 1200,
"currencyCode": "DZD",
"paymentOrderId": "2fddefa2-f137-4afd-b6a8-b1623d86b115",
"microServiceTransactionId": "",
"endUserMessage": {
"en": "Proceeding",
"fr": "En cours",
"ar": "قيد المعالجة"
},
"approvalCode": null
},
"message": "payment checked successfully"
}Capture Payment#
Captures a pre-authorized payment. Only available for payment intents created with captureMethod: "RESERVATION" that have been successfully pre-authorized (statusCode 13).
You can capture less than the reserved amount (partial capture). The remaining unreserved amount is automatically released back to the user.
/api/v1/payments/intents/:id/captureURL Parameters#
idstringrequiredpaymentId of the pre-authorized payment.Request Body#
amountnumberoptionalRequired Headers#
AuthorizationstringrequiredBearer base64(client_id:client_secret)x-platformstringrequiredAPIWEBANDROIDIOSx-servicestringrequiredPartial Capture
# Capture a partial amount (e.g., reserved 5000, capture 4500)
curl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/capture" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"amount": 4500.00
}'# Capture a partial amount (e.g., reserved 5000, capture 4500)
curl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/capture" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"amount": 4500.00
}'{
"data": {
"status": "The amount was deposited successfully",
"statusCode": 2,
"metaData": {
"payUrl": ""
}
},
"message": "payment captured successfully"
}{
"data": {
"status": "The amount was deposited successfully",
"statusCode": 2,
"metaData": {
"payUrl": ""
}
},
"message": "payment captured successfully"
}Release Payment#
Releases a pre-authorized payment without capturing any funds. The full reserved amount is returned to the user's wallet.
/api/v1/payments/intents/:id/releaseURL Parameters#
idstringrequiredpaymentId of the pre-authorized payment.Required Headers#
AuthorizationstringrequiredBearer base64(client_id:client_secret)x-platformstringrequiredAPIWEBANDROIDIOSx-servicestringrequiredcurl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/release" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{}'curl -X POST "https://api.payment.yassir.io/api/v1/payments/intents/123e4567-e89b-12d3-a456-426614174000/release" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{}'{
"data": {
"status": "Reversed",
"statusCode": 10,
"metaData": {
"payUrl": ""
}
},
"message": "payment released successfully"
}{
"data": {
"status": "Reversed",
"statusCode": 10,
"metaData": {
"payUrl": ""
}
},
"message": "payment released successfully"
}Refund Payment#
Refund a completed payment, either fully or partially. Yassir Cash supports multiple partial refunds on a single payment — each refund reduces the remaining refundable balance.
/api/v1/payments/:paymentId/refundURL Parameters#
paymentIdstringrequiredRequest Body#
descriptionstringrequiredamountnumberoptionalreasonstringoptionalResponse Fields#
Full and partial refunds return the same shape. Tell them apart from the amounts: when totalRefundedAmount equals transactionAmount the payment is fully refunded; while it is less, the payment is partially refunded and remainingRefundableAmount is still refundable.
data.statusCodenumberoptional4 (refunded) for manual refunds, 14 for auto-refunds. It does not distinguish full from partial.data.statusstringoptionaldata.refundedAmountnumberoptionaldata.totalRefundedAmountnumberoptionaldata.transactionAmountnumberoptionaltotalRefundedAmount once fully refunded.data.remainingRefundableAmountnumberoptionaltransactionAmount − totalRefundedAmount).data.paymentOrderIdstringoptionaldata.microServiceTransactionIdstringoptionalRequired Headers#
AuthorizationstringrequiredBearer base64(client_id:client_secret)x-platformstringrequiredAPIWEBANDROIDIOSx-servicestringrequiredMultiple Partial Refunds
1. Refund 500 DZD → remaining refundable: 1000 DZD
2. Refund 300 DZD → remaining refundable: 700 DZD
3. Refund 700 DZD → remaining refundable: 0 DZD (fully refunded)
curl -X POST "https://api.payment.yassir.io/api/v1/payments/123e4567-e89b-12d3-a456-426614174000/refund" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"description": "Customer requested full refund"
}'curl -X POST "https://api.payment.yassir.io/api/v1/payments/123e4567-e89b-12d3-a456-426614174000/refund" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"description": "Customer requested full refund"
}'curl -X POST "https://api.payment.yassir.io/api/v1/payments/123e4567-e89b-12d3-a456-426614174000/refund" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"description": "Partial refund for item return",
"amount": 500.00
}'curl -X POST "https://api.payment.yassir.io/api/v1/payments/123e4567-e89b-12d3-a456-426614174000/refund" \
-H "Authorization: Bearer $(echo -n 'your_client_id:your_client_secret' | base64)" \
-H "Content-Type: application/json" \
-H "x-platform: API" \
-H "x-service: YOUR_SERVICE" \
-d '{
"description": "Partial refund for item return",
"amount": 500.00
}'{
"data": {
"statusCode": 4,
"status": "Transaction was refunded",
"refundedAmount": 1500,
"totalRefundedAmount": 1500,
"transactionAmount": 1500,
"remainingRefundableAmount": 0,
"paymentOrderId": "ORDER_67890",
"microServiceTransactionId": null,
"errorMessage": {
"internalErrorMessage": null,
"providerErrorMessage": null
}
},
"message": "Payment refunded successfully"
}{
"data": {
"statusCode": 4,
"status": "Transaction was refunded",
"refundedAmount": 1500,
"totalRefundedAmount": 1500,
"transactionAmount": 1500,
"remainingRefundableAmount": 0,
"paymentOrderId": "ORDER_67890",
"microServiceTransactionId": null,
"errorMessage": {
"internalErrorMessage": null,
"providerErrorMessage": null
}
},
"message": "Payment refunded successfully"
}{
"data": {
"statusCode": 4,
"status": "Transaction was refunded",
"refundedAmount": 500,
"totalRefundedAmount": 500,
"transactionAmount": 1500,
"remainingRefundableAmount": 1000,
"paymentOrderId": "ORDER_67890",
"microServiceTransactionId": null,
"errorMessage": {
"internalErrorMessage": null,
"providerErrorMessage": null
}
},
"message": "Payment refunded successfully"
}{
"data": {
"statusCode": 4,
"status": "Transaction was refunded",
"refundedAmount": 500,
"totalRefundedAmount": 500,
"transactionAmount": 1500,
"remainingRefundableAmount": 1000,
"paymentOrderId": "ORDER_67890",
"microServiceTransactionId": null,
"errorMessage": {
"internalErrorMessage": null,
"providerErrorMessage": null
}
},
"message": "Payment refunded successfully"
}