QRIS
QRIS (Quick Response Code Indonesian Standard) is a QR code standard developed by Bank Indonesia and Indonesian Payment System Association (ASPI) for cashless payments in Indonesia.
Overview Steps
Overview of integration process with QRIS
1. Generate QRIS
After customer creates an order and choose QRIS as the payment method, merchant will hit this API to generate QRIS that will be shown to the customer. To generate QRIS, you need to hit this API through your Backend:
API Endpoint
HTTP Method
POST
API Sandbox
API Production
Path
/snap-adapter/b2b/v1.0/qr/qr-mpm-generate
Here is the sample request header, request body and response body for generate QRIS:
Client Id for merchant that generated by DOKU
BRN-0253-1758536533798Numeric String. Reference number that should be unique in the same day (Request Id)
41807553358950093184162180797837Client's current local time with format YYYY-MM-DDTHH:mm:ssZD
2020-12-21T14:56:11+07:00Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp
ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)
Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9aChannel ID for QRIS please fill with H2H (Host-To-Host)
H2HTransaction ID from partners. | Mandatory | min length: 1 | max length: 64
a98757c8dbc6434ab5dd4c55d9092d9aCredential mall ID from DOKU. | Mandatory | min length: 1 | max length: 64
2115Terminal Identification alphanumeric. | Mandatory | min length: 1 | max length: 16
k45Expired Time QRIS using ISO 8601 Format, if not sent will use Default value 30 days
2023-11-08T17:38:42+07:00OK
POST /snap-adapter/b2b/v1.0/qr/qr-mpm-generate HTTP/1.1
Host: api-sandbox.doku.com
X-PARTNER-ID: text
X-EXTERNAL-ID: text
X-TIMESTAMP: text
X-SIGNATURE: text
Authorization: text
CHANNEL-ID: text
Content-Type: application/json
Accept: */*
Content-Length: 226
{
"partnerReferenceNo": "INV-Test02102025",
"amount": {
"value": "1000.00",
"currency": "IDR"
},
"merchantId": "47435",
"terminalId": "A01",
"validityPeriod": "2025-11-30T19:27:15+07:00",
"additionalInfo": {
"postalCode": "12190",
"feeType": "1"
}
}OK
{
"responseCode": "2004700",
"responseMessage": "Request has been processed successfully",
"referenceNo": "INV-Test02102025",
"partnerReferenceNo": "INV-Test02102025",
"qrContent": "00020101021226540012COM.DOKU.WWW01189360089900000474350205474350303UMI51440014ID.CO.QRIS.WWW0215ID10243163058860303UMI52045812530336054071000.005802ID5911Tea Dynamic6008SEMARANG61051219062270703A015016INV-Test0210202563049E2E",
"terminalId": "A01",
"additionalInfo": {
"validityPeriod": "2025-11-30T19:27:15+07:00"
}
}2. Query QRIS
To query QRIS, you need to hit this API through your Backend:
API Endpoint
HTTP Method
POST
API Sandbox
API Production
Path
/snap-adapter/b2b/v1.0/qr/qr-mpm-query
Here is the sample request header, request body and response body for query QRIS:
Client Id for merchant that generated by DOKU
BRN-0253-1758536533798Client's current local time with format YYYY-MM-DDTHH:mm:ssZD
2020-12-21T14:56:11+07:00Numeric String. Reference number that should be unique in the same day (Request Id)
41807553358950093184162180797837Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp
ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)
Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9aChannel ID for QRIS please fill with H2H (Host-To-Host)
H2Hrefund | Mandatory | min length: 1 | max length: 64
7d054649f9ba4c19ae5f95950c99be4dTransaction ID from partners when Generate QRIS | min length: 1 | max length: 64
7d054649f9ba4c19ae5f95950c99be4dUnique service API “47”
47Merchant ID registered in DOKU | min length: 1 | max length: 64
2997OK
POST /snap-adapter/b2b/v1.0/qr/qr-mpm-query HTTP/1.1
Host: api-sandbox.doku.com
X-PARTNER-ID: text
X-TIMESTAMP: text
X-EXTERNAL-ID: text
X-SIGNATURE: text
Authorization: text
CHANNEL-ID: text
Content-Type: application/json
Accept: */*
Content-Length: 130
{
"originalReferenceNo": "INV-Test02102025",
"originalPartnerReferenceNo": "INV-Test02102025",
"merchantId": "47435",
"serviceCode": "47"
}OK
{
"responseCode": "2005100",
"responseMessage": "Request has been processed successfully",
"originalReferenceNo": "INV-Test02102025",
"originalPartnerReferenceNo": "INV-Test02102025",
"serviceCode": "47",
"latestTransactionStatus": "00",
"transactionStatusDesc": "Success",
"paidTime": "2025-10-02T17:44:19+07:00",
"amount": {
"value": 1000,
"currency": "IDR"
},
"additionalInfo": {
"issuerId": "93600501",
"approvalCode": "1hk9vlw79634",
"convenienceFee": "C00000000",
"issuerName": "BCAD",
"terminalId": "A01 ",
"customerName": "YURI PRAMANA "
}
}3. Refund QRIS
This endpoint is used to create refund request for previous successful payment, merchant can request a transaction refund to DOKU. To refund, you need to hit this API through your Backend:
API Endpoint
HTTP Method
POST
API Sandbox
API Production
Path
/snap-adapter/b2b/v1.0/qr/qr-mpm-refund
Here is the sample request header, request body and response body for refund QRIS:
Client Id for merchant that generated by DOKU
BRN-0253-1758536533798Client's current local time with format YYYY-MM-DDTHH:mm:ssZD
2020-12-21T14:56:11+07:00Numeric String. Reference number that should be unique in the same day (Request Id)
41807553358950093184162180797837Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp
ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)
Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9aChannel ID for QRIS please fill with H2H (Host-To-Host)
H2HCredential mall ID from DOKU | Mandatory | min length: 1 | max length: 64
2115Transaction ID from DOKU when Generate QRIS from SNAP (same as originalReferenceNo value from Generate QRIS Request) | Mandatory | min length: 1 | max length: 64
originalPartnerReferenceNoNew Transaction ID used as transactions ID for this refund transaction | Mandatory | min length: 1 | max length: 64
7d054649f9ba4c19ae5f95950c99be4dpartnerRefundNo | Mandatory | min length: 1 | max length: 64Refund Reason | Mandatory | min length: 1 | max length: 256
refund reasonOK
POST /snap-adapter/b2b/v1.0/qr/qr-mpm-refund HTTP/1.1
Host: api-sandbox.doku.com
X-PARTNER-ID: text
X-TIMESTAMP: text
X-EXTERNAL-ID: text
X-SIGNATURE: text
Authorization: text
CHANNEL-ID: text
Content-Type: application/json
Accept: */*
Content-Length: 295
{
"originalPartnerReferenceNo": "INV-Test02102025",
"originalReferenceNo": "INV-Test02102025",
"partnerRefundNo": "INV-Test022022026",
"merchantId": "47435",
"reason": "Refund for transacion INV-Test02102025",
"refundAmount": {
"value": 1000,
"currency": "IDR"
},
"additionalInfo": {
"approvalCode": "1hk9vlw79634"
}
}OK
{
"responseCode": "2007800",
"responseMessage": "Request has been processed successfully",
"originalPartnerReferenceNo": "INV-Test02102025",
"originalReferenceNo": "INV-Test02102025",
"refundNo": "R_74463aa1-6627-4064-a09a-e8c5cd06c1cd",
"partnerRefundNo": "INV-Test022022026",
"refundAmount": {
"value": 1000,
"currency": "IDR"
},
"refundTime": "2025-10-02T05:51:05+07:00"
}4. Decode QRIS
To decode QRIS, you need to hit this API through your Backend:
API Endpoint
HTTP Method
POST
API Sandbox
API Production
Path
/snap-adapter/b2b/v1.0/qr/qr-mpm-decode
Here is the sample request header, request body and response body for decode QRIS:
Client Id for merchant that generated by DOKU
BRN-0253-1758536533798Client's current local time with format YYYY-MM-DDTHH:mm:ssZD
2020-12-21T14:56:11+07:00Numeric String. Reference number that should be unique in the same day (Request Id)
41807553358950093184162180797837Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp
ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)
Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9aChannel ID for QRIS please fill with H2H (Host-To-Host)
H2HTransaction ID from partners
75a98757c8dbc6434ab5dd4c55d9092d9aQRIS content. QRIS generated by DOKU or other PJSP. Can be dynamic or static QRIS.
00020101021226530012COM.DOKU.WWW0118936008990000002997020429970303UMI51440014ID.CO.QRIS.WWW0215ID20200622029970303UMI52045411530336054071200.255502025606500.525802ID5911Green Pages6007Jakarta61051312062430703K455032a98757c8dbc6434ab5dd4c55d9092d9a6304F6EAThe time when the QRIS scanned by the User, ISO 8601 Format
2023-11-08T17:38:42+07:00OK
POST /snap-adapter/b2b/v1.0/qr/qr-mpm-decode HTTP/1.1
Host: api-sandbox.doku.com
X-PARTNER-ID: text
X-TIMESTAMP: text
X-EXTERNAL-ID: text
X-SIGNATURE: text
Authorization: text
CHANNEL-ID: text
Content-Type: application/json
Accept: */*
Content-Length: 335
{
"partnerReferenceNo": "INV-qris02102025",
"qrContent": "00020101021226540012COM.DOKU.WWW01189360089900000145820205145820303UKE51440014ID.CO.QRIS.WWW0215ID20250922540640303UKE520456615303360540810000.005802ID5910KZaV9TOvsR6015JAKARTA SELATAN61051219062270703A015016INV-QRIS0220251063043DD2",
"scanTime": "2025-10-02T18:00:51+07:00"
}OK
{
"responseCode": "2004800",
"responseMessage": "Request has been processed successfully",
"referenceNo": "INV-qris02102025",
"partnerReferenceNo": "INV-qris02102025",
"merchantName": "KZaV9TOvsR",
"merchantCategory": "5661",
"merchantLocation": "JAKARTA SELATAN",
"postalCode": "12190",
"mid": "14582",
"transactionAmount": {
"value": "10000.00",
"currency": "IDR"
},
"additionalInfo": {
"pointOfInitiationMethod": "12",
"pointOfInitiationMethodDescription": "DYNAMIC",
"feeTypeDescription": "NO_TIPS"
},
"merchantInfos": [
{
"merchantPAN": "936008990000014582",
"acquirerName": "DOKU"
}
]
}5. Payment QRIS
You need to hit this API through your Backend:
API Endpoint
HTTP Method
POST
API Sandbox
API Production
Path
/snap-adapter/b2b2c/v1.0/qr/qr-mpm-payment
Here is the sample request header, request body and response body for payment QRIS:
Client Id for merchant that generated by DOKU
BRN-0253-1758536533798Client's current local time with format YYYY-MM-DDTHH:mm:ssZD
2020-12-21T14:56:11+07:00Numeric String. Reference number that should be unique in the same day (Request Id)
41807553358950093184162180797837Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp
ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)
Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9aString starts with keyword “Bearer ” followed by token B2B2C (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)
Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9aChannel ID for QRIS please fill with H2H (Host-To-Host)
H2H91cbe52caf27471482d3430c37d174fcOK
POST /snap-adapter/b2b2c/v1.0/qr/qr-mpm-payment HTTP/1.1
Host: api-sandbox.doku.com
X-PARTNER-ID: text
X-TIMESTAMP: text
X-EXTERNAL-ID: text
X-SIGNATURE: text
Authorization: text
Authorization-Customer: text
CHANNEL-ID: text
Content-Type: application/json
Accept: */*
Content-Length: 345
{
"partnerReferenceNo": "INV-QR22202511",
"amount": {
"value": "10000.00",
"currency": "IDR"
},
"additionalInfo": {
"qrContent": "00020101021226520012COM.DOKU.WWW011793600899000007373020473730303URE51440014ID.CO.QRIS.WWW0215ID10221466173730303URE520473735303360540810000.005802ID5913snapSandbox 16009Indonesia61051312062250703K455014INV-QR22202511630477F0"
}
}OK
{
"responseCode": "2005000",
"responseMessage": "Request has been processed successfully",
"referenceNo": "INV-QR22202511",
"partnerReferenceNo": "INV-QR22202511",
"transactionDate": "2025-10-03T09:45:20+07:00",
"amount": {
"value": 10000,
"currency": "IDR"
},
"feeAmount": {
"value": 0,
"currency": "IDR"
},
"additionalInfo": {
"approvalCode": "356038"
}
}Last updated
Was this helpful?