QR MPM Refund Payment
Overview
Service to process refunds for MPM (Merchant Presented Mode) QRIS transactions. Supports both full and partial refunds.
Direction: Merchant to Manjo
Version: 1.0
Service Code: 78
HTTP Method: POST
Path: ../v1.0/qr/qr-mpm-refund
Request Structure
HTTP Headers
| Field | Attribute | Type | Description | Example |
|---|---|---|---|---|
Content-Type |
M | String | Media type of resource | application/json |
Authorization |
M | String | Access token with Bearer format | Bearer YWFlNTQ4NTEyZTE5ZjZi... |
X-TIMESTAMP |
M | String | Client's local timestamp (yyyy-MM-ddTHH:mm:ssTZD) | 2025-11-27T07:16:37.598+07:00 |
X-SIGNATURE |
M | String | HMAC_SHA512 signature using clientSecret | 0347f2a8a9e533530e4fc34d1ab0c78a... |
ORIGIN |
O | String | Merchant domain | www.hostname.com |
X-IP-ADDRESS |
O | String | Merchant IP address | 172.24.281.24 |
X-PARTNER-ID |
M | String(36) | Unique merchant ID | EP9613058999 |
X-EXTERNAL-ID |
M | String(36) | Unique reference number per day | XTID-08oy4jf326 |
X-DEVICE-ID |
O | String | Device ID | 09864ADCASA |
CHANNEL-ID |
M | String(5) | Device identification | 05 |
X-SIGNATURE Formula:
stringToSign = HTTPMethod + ":" + EndpointUrl + ":" + AccessToken + ":" + Lowercase(HexEncode(SHA256(minify(RequestBody)))) + ":" + TimeStamp
signature = HMAC_SHA512(clientSecret, stringToSign)
Request Body
{
"merchantId": "EP96130589",
"externalStoreId": "A0000001086",
"originalPartnerReferenceNo": "DIRECT-API-NMS-12ajd1mir8",
"originalReferenceNo": "A0000001703",
"originalExternalId": "10052019",
"partnerRefundNo": "MRF-tqktcivp64",
"refundAmount": {
"value": "10000.00",
"currency": "IDR"
},
"reason": "Customer complain",
"additionalInfo": {
"paymentId": "99"
}
}
Parameter Details
| Parameter | Attribute | Type | Description | Example |
|---|---|---|---|---|
merchantId |
M | String(64) | Unique merchant identifier | "EP96130589" |
externalStoreId |
O | String(64) | External store ID | "A0000001086" |
originalPartnerReferenceNo |
M | String(64) | Original partner reference from QRIS generation | "DIRECT-API-NMS-12ajd1mir8" |
originalReferenceNo |
M | String(64) | Original reference from QRIS generation (Manjo) | "A0000001703" |
originalExternalId |
M | String | Original X-EXTERNAL-ID from QRIS generation | "10052019" |
partnerRefundNo |
M | String(64) | Merchant's unique refund reference number | "MRF-tqktcivp64" |
refundAmount.value |
M | String(16,2) | Refund amount (2 decimals) | "10000.00" |
refundAmount.currency |
M | String(3) | Currency (ISO4217) | "IDR" |
reason |
M | String(256) | Refund reason | "Customer complain" |
additionalInfo.paymentId |
M | String(2) | Payment code (99 for Manjo QRIS) | "99" |
Response Structure
HTTP Headers Response
Content-Type: application/json
X-TIMESTAMP: 2020-12-23T08:10:18+07:00
Response Body
{
"responseCode": "2007800",
"responseMessage": "Successful",
"originalPartnerReferenceNo": "DIRECT-API-NMS-12ajd1mir8",
"originalReferenceNo": "A0000001703",
"originalExternalId": "10052019",
"refundNo": "RF-70G7-721071-1jac11603005-20251127-37648",
"partnerRefundNo": "MRF-tqktcivp64",
"refundAmount": {
"value": "10000.00",
"currency": "IDR"
},
"refundTime": "2025-11-27T14:16:39.209256321+07:00",
"additionalInfo": {
"acqName": "manjo",
"merchantName": "PRODACTION",
"mpan": "9360085801751257039",
"issuerName": "Midazpay",
"customerName": "JOSS GONDES",
"cpan": "9360082112345678919",
"refundMethod": "Partial",
"refundOrder": 1,
"rcSwitching": "00",
"errSwitching": "Success",
"amountTrx": "50450.00",
"rrn": "1jac41603007"
}
}
Response Parameter Details
| Parameter | Attribute | Type | Description | Example |
|---|---|---|---|---|
responseCode |
M | String(7) | Response code | "2007800" |
responseMessage |
M | String(150) | Response description | "Successful" |
originalPartnerReferenceNo |
M | String(64) | Echo of original partner reference | "DIRECT-API-NMS-12ajd1mir8" |
originalReferenceNo |
M | String(64) | Echo of original reference number | "A0000001703" |
originalExternalId |
M | String | Echo of original external ID | "10052019" |
refundNo |
M | String(64) | Refund reference from switching | "RF-70G7-721071-1jac11603005-20251127-37648" |
partnerRefundNo |
M | String(64) | Echo of merchant's refund reference | "MRF-tqktcivp64" |
refundAmount.value |
M | String(16,2) | Approved refund amount | "10000.00" |
refundAmount.currency |
M | String(3) | Currency | "IDR" |
refundTime |
M | String(25) | Refund timestamp (ISO 8601) | "2025-11-27T14:16:39.209256321+07:00" |
additionalInfo.acqName |
O | String(25) | Acquirer name | "manjo" |
additionalInfo.merchantName |
O | String(25) | Merchant name | "PRODACTION" |
additionalInfo.mpan |
O | String(50) | Merchant PAN | "9360085801751257039" |
additionalInfo.issuerName |
O | String(25) | Issuer name | "Midazpay" |
additionalInfo.customerName |
O | String(25) | Customer name | "JOSS GONDES" |
additionalInfo.cpan |
O | String(50) | Customer PAN | "9360082112345678919" |
additionalInfo.refundMethod |
M | String(25) | Refund method (Partial/Full) | "Partial" |
additionalInfo.refundOrder |
M | String(2) | Refund sequence number | 1 |
additionalInfo.rcSwitching |
M | String(25) | Switching response code | "00" |
additionalInfo.errSwitching |
M | String(60) | Switching error description | "Success" |
additionalInfo.amountTrx |
M | String(16,2) | Original transaction amount | "50450.00" |
additionalInfo.rrn |
M | String(25) | RRN from switching | "1jac41603007" |
Error Codes
| HTTP Code | Service Code | Case Code | Message | Category | Description |
|---|---|---|---|---|---|
| 200 | 78 | 00 | Success | Successful | Refund successful |
| 202 | 78 | 00 | Success | Request In Progress | Transaction still processing |
| 400 | 78 | 01 | Invalid Field Format {field name} | Message | Invalid field format |
| 400 | 78 | 02 | Invalid Mandatory Field {field name} | Message | Missing/invalid mandatory field |
| 401 | 78 | 00 | Unauthorized. {reason} | System | Invalid signature or client key |
| 401 | 78 | 01 | Invalid token | System | Invalid/expired access token |
| 404 | 78 | 01 | Transaction Not Found | Business | Original transaction not found |
| 404 | 78 | 13 | Invalid Amount | Business | Refund amount doesn't match |
| 409 | 78 | 00 | Conflict | System | X-EXTERNAL-ID already used today |
Response Code Format: httpcode(3) + servicecode(2) + casecode(2)
Implementation Examples
Example Request
curl -X POST \
'https://api.manjo.com/v1.0/qr/qr-mpm-refund' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YWFlNTQ4NTEyZTE5ZjZi...' \
-H 'X-TIMESTAMP: 2025-11-27T07:16:37.598+07:00' \
-H 'X-SIGNATURE: 0347f2a8a9e533530e4fc34d1ab0c78a...' \
-H 'X-PARTNER-ID: EP9613058999' \
-H 'X-EXTERNAL-ID: XTID-08oy4jf326' \
-H 'X-IP-ADDRESS: 172.24.281.24' \
-H 'CHANNEL-ID: 05' \
-d '{
"merchantId": "EP96130589",
"originalPartnerReferenceNo": "DIRECT-API-NMS-12ajd1mir8",
"originalReferenceNo": "A0000001703",
"originalExternalId": "10052019",
"partnerRefundNo": "MRF-tqktcivp64",
"refundAmount": {
"value": "10000.00",
"currency": "IDR"
},
"reason": "Customer complain",
"additionalInfo": {
"paymentId": "99"
}
}'
Example Success Response (Partial Refund)
{
"responseCode": "2007800",
"responseMessage": "Successful",
"originalPartnerReferenceNo": "DIRECT-API-NMS-12ajd1mir8",
"originalReferenceNo": "A0000001703",
"originalExternalId": "10052019",
"refundNo": "RF-70G7-721071-1jac11603005-20251127-37648",
"partnerRefundNo": "MRF-tqktcivp64",
"refundAmount": {
"value": "10000.00",
"currency": "IDR"
},
"refundTime": "2025-11-27T14:16:39.209256321+07:00",
"additionalInfo": {
"refundMethod": "Partial",
"refundOrder": 1,
"rcSwitching": "00",
"errSwitching": "Success",
"amountTrx": "50450.00",
"rrn": "1jac41603007"
}
}
Example Processing Response
{
"responseCode": "2027800",
"responseMessage": "Request In Progress",
"originalPartnerReferenceNo": "DIRECT-API-NMS-12ajd1mir8",
"originalReferenceNo": "A0000001703",
"partnerRefundNo": "MRF-tqktcivp64"
}
Example Invalid Amount Response
{
"responseCode": "4047813",
"responseMessage": "Invalid Amount",
"originalPartnerReferenceNo": "DIRECT-API-NMS-12ajd1mir8",
"originalReferenceNo": "A0000001703",
"partnerRefundNo": "MRF-tqktcivp64",
"refundAmount": {
"value": "60000.00",
"currency": "IDR"
}
}
Important Notes
- X-EXTERNAL-ID must be unique per merchant per day
- partnerRefundNo must be unique for each refund request
- Partial Refunds: Multiple partial refunds are allowed until the total refunded amount equals the original transaction amount
- Refund Order: For partial refunds,
refundOrderindicates the sequence number of the refund - Refund Time: Refund processing may take time; check status using query API if response is 202 (processing)
- Amount Validation: Refund amount cannot exceed the original transaction amount minus any previous refunds
- Original References: All original reference numbers must match the ones from the successful payment transaction
Version: 1.0
Last Updated: November 2024
Service Owner: Manjo QRIS Team