QR MPM Generate
Overview
Service to generate MPM (Merchant Presented Mode) QRIS code that can be displayed by merchants for customer payments.
Direction: Merchant to Manjo
Version: 1.0
Service Code: 47
HTTP Method: POST
Path: ../v1.0/qr/qr-mpm-generate
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-27T08:10:57+07:00 |
X-SIGNATURE |
M | String | HMAC_SHA512 signature using clientSecret | b93034610c5d5a565415b40... |
ORIGIN |
O | String | Merchant domain | www.yourdomain.com |
X-IP-ADDRESS |
M | String | Merchant IP address | 172.24.281.24 |
X-PARTNER-ID |
M | String(36) | Unique merchant ID | MT60169117 |
X-EXTERNAL-ID |
M | String(36) | Unique reference number per day | 5dfixGSe93fkfFVzV7qZCafHEbjPIpKAAiy |
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
{
"partnerReferenceNo": "DIRECT-API-NMS-6giumc6rde",
"amount": {
"value": "30000.00",
"currency": "IDR"
},
"merchantId": "MT60169117",
"subMerchantId": "test",
"storeId": "123",
"terminalId": "456",
"validityPeriod": "111",
"additionalInfo": {
"paymentId": "99",
"dynamicAmount": "N",
"prodDesc": "mobile phone purchase"
}
}
Parameter Details
| Parameter | Attribute | Type | Description | Example |
|---|---|---|---|---|
partnerReferenceNo |
M | String(64) | Transaction identifier from merchant | DIRECT-API-NMS-6giumc6rde |
amount.value |
M | String(16,2) | Transaction amount (2 decimals) | "30000.00" |
amount.currency |
M | String(3) | Currency (ISO4217) | "IDR" |
merchantId |
M | String(64) | Unique merchant identifier | "MT60169117" |
subMerchantId |
O | String(32) | Sub merchant ID | "test" |
storeId |
O | String(64) | Store code on merchant side | "123" |
terminalId |
O | String(16) | Terminal identification | "456" |
validityPeriod |
M | String | Validity period | "111" |
additionalInfo.paymentId |
M | String(2) | Transaction code (99 for Manjo QRIS) | "99" |
additionalInfo.dynamicAmount |
M | String(1) | Dynamic amount flag (Y/N) | "N" |
additionalInfo.prodDesc |
M | String(100) | Product description | "mobile phone purchase" |
Note on dynamicAmount:
"N": Transaction amount set by merchant (taken fromamountparameter)"Y": Amount input by user during payment (amountparameter ignored)
Response Structure
HTTP Headers Response
Content-Type: application/json
X-TIMESTAMP: 2020-01-15T17:01:18+07:00
Response Body
{
"responseCode": "2004700",
"responseMessage": "Successful",
"referenceNo": "A0000001702",
"partnerReferenceNo": "DIRECT-API-NMS-6giumc6rde",
"qrContent": "00020101021226620015ID.CO.MANJO.WWW01189360085801751257030210MT601691170303UMI51530014ID.CO.QRIS.WWW0215ID102106515191704121.0.27.11.25520448165303360540850000.0055020357040.905802ID5910Prodaction6013JAKARTA PUSAT61059997362560525DIRECT-API-NMS-6giumc6rde0702450817Iphone 17 Pro Max6304FE20",
"qrUrl": "-",
"qrImage": "-",
"redirectUrl": "-",
"merchantName": "Prodaction",
"storeId": "abcd",
"terminalId": "45",
"additionalInfo": {
"paymentId": "99",
"merchantCode": "MT60169117",
"expiryDuration": "3600",
"expireDate": "20251127144448",
"amount": "50450.00"
}
}
Response Parameter Details
| Parameter | Attribute | Type | Description | Example |
|---|---|---|---|---|
responseCode |
M | String(7) | Response code | "2004700" |
responseMessage |
M | String(150) | Response description | "Successful" |
referenceNo |
M | String(64) | Transaction identifier from Manjo | "A0000001702" |
partnerReferenceNo |
M | String(64) | Echo from request | "DIRECT-API-NMS-6giumc6rde" |
qrContent |
C | String(512) | MPM QR String | "000201010212..." |
qrUrl |
O | String(256) | URL to download QR image | "-" |
qrImage |
O | String | Base64 QR image | "-" |
redirectUrl |
O | String(512) | Redirect URL to PJSP | "-" |
merchantName |
M | String(25) | Merchant name | "Prodaction" |
storeId |
O | String(64) | Store code | "abcd" |
terminalId |
O | String(16) | Terminal ID | "45" |
additionalInfo.merchantCode |
O | String(64) | Merchant ID | "MT60169117" |
additionalInfo.paymentId |
O | String(2) | Transaction code | "99" |
additionalInfo.amount |
M | String(16,2) | Transaction amount | "50450.00" |
additionalInfo.expiryDuration |
M | String(6) | Validity duration (seconds) | "3600" |
additionalInfo.expireDate |
M | String(20) | Expiry date (yyyyMMddHHmmss) | "20251127144448" |
Error Codes
| HTTP Code | Service Code | Case Code | Message | Description |
|---|---|---|---|---|
| 200 | 47 | 00 | Success | Transaction successful |
| 400 | 47 | 01 | Invalid Field Format {field name} | Invalid field format |
| 400 | 47 | 02 | Invalid Mandatory Field {field name} | Missing/invalid mandatory field |
| 401 | 47 | 00 | Unauthorized. {reason} | General unauthorized error |
| 401 | 47 | 01 | Invalid token | Invalid/expired token |
| 404 | 47 | 08 | Invalid Merchant | Merchant doesn't exist/abnormal status |
| 409 | 47 | 00 | Conflict | 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-generate' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer YWFlNTQ4NTEyZTE5ZjZi...' \
-H 'X-TIMESTAMP: 2025-11-27T08:10:57+07:00' \
-H 'X-SIGNATURE: b93034610c5d5a565415b40...' \
-H 'X-PARTNER-ID: MT60169117' \
-H 'X-EXTERNAL-ID: 5dfixGSe93fkfFVzV7qZCafHEbjPIpKAAiy' \
-H 'X-IP-ADDRESS: 172.24.281.24' \
-H 'CHANNEL-ID: 05' \
-d '{
"partnerReferenceNo": "TRX-001",
"amount": {
"value": "50000.00",
"currency": "IDR"
},
"merchantId": "MT60169117",
"validityPeriod": "3600",
"additionalInfo": {
"paymentId": "99",
"dynamicAmount": "N",
"prodDesc": "Laptop Purchase"
}
}'
Example Success Response
{
"responseCode": "2004700",
"responseMessage": "Successful",
"referenceNo": "A0000001703",
"partnerReferenceNo": "TRX-001",
"qrContent": "000201010212...",
"qrUrl": "-",
"qrImage": "-",
"redirectUrl": "-",
"merchantName": "Merchant Example",
"storeId": "001",
"terminalId": "01",
"additionalInfo": {
"paymentId": "99",
"merchantCode": "MT60169117",
"expiryDuration": "3600",
"expireDate": "20251127151448",
"amount": "50000.00"
}
}
Important Notes
- X-EXTERNAL-ID must be unique per merchant per day
- Timestamp follows Indonesia timezone (WIB)
- Dynamic Amount: if set to
"Y", customer can input custom amount during payment - QR Content: contains MPM string ready for QR code generation
- Validity Period: in seconds to determine expiryDuration
Version: 1.0
Last Updated: November 2024
Service Owner: Manjo QRIS Team