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

Environment
Endpoint

HTTP Method

POST

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:

POST Generate QRIS

post
Header parameters
X-PARTNER-IDstringRequired

Client Id for merchant that generated by DOKU

Example: BRN-0253-1758536533798
X-EXTERNAL-IDstringRequired

Numeric String. Reference number that should be unique in the same day (Request Id)

Example: 41807553358950093184162180797837
X-TIMESTAMPstringRequired

Client's current local time with format YYYY-MM-DDTHH:mm:ssZD

Example: 2020-12-21T14:56:11+07:00
X-SIGNATUREstringRequired

Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp

Example: ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==
AuthorizationstringRequired

String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)

Example: Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9a
CHANNEL-IDstringRequired

Channel ID for QRIS please fill with H2H (Host-To-Host)

Example: H2H
Body
partnerReferenceNostringRequired

Transaction ID from partners. | Mandatory | min length: 1 | max length: 64

Example: a98757c8dbc6434ab5dd4c55d9092d9a
merchantIdstringRequired

Credential mall ID from DOKU. | Mandatory | min length: 1 | max length: 64

Example: 2115
terminalIdstringRequired

Terminal Identification alphanumeric. | Mandatory | min length: 1 | max length: 16

Example: k45
validityPeriodstringOptional

Expired Time QRIS using ISO 8601 Format, if not sent will use Default value 30 days

Example: 2023-11-08T17:38:42+07:00
Responses
200

OK

application/json
post
/snap-adapter/b2b/v1.0/qr/qr-mpm-generate
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"
  }
}
200

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

Environment
Endpoint

HTTP Method

POST

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:

POST Query QRIS

post
Header parameters
X-PARTNER-IDstringRequired

Client Id for merchant that generated by DOKU

Example: BRN-0253-1758536533798
X-TIMESTAMPstringRequired

Client's current local time with format YYYY-MM-DDTHH:mm:ssZD

Example: 2020-12-21T14:56:11+07:00
X-EXTERNAL-IDstringRequired

Numeric String. Reference number that should be unique in the same day (Request Id)

Example: 41807553358950093184162180797837
X-SIGNATUREstringRequired

Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp

Example: ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==
AuthorizationstringRequired

String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)

Example: Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9a
CHANNEL-IDstringRequired

Channel ID for QRIS please fill with H2H (Host-To-Host)

Example: H2H
Body
originalReferenceNostringRequired

refund | Mandatory | min length: 1 | max length: 64

Example: 7d054649f9ba4c19ae5f95950c99be4d
originalPartnerReferenceNostringRequired

Transaction ID from partners when Generate QRIS | min length: 1 | max length: 64

Example: 7d054649f9ba4c19ae5f95950c99be4d
serviceCodestringRequired

Unique service API “47”

Example: 47
merchantIdstringRequired

Merchant ID registered in DOKU | min length: 1 | max length: 64

Example: 2997
Responses
200

OK

application/json
post
/snap-adapter/b2b/v1.0/qr/qr-mpm-query
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"
}
200

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

Environment
Endpoint

HTTP Method

POST

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:

POST Refund QRIS

post
Header parameters
X-PARTNER-IDstringRequired

Client Id for merchant that generated by DOKU

Example: BRN-0253-1758536533798
X-TIMESTAMPstringRequired

Client's current local time with format YYYY-MM-DDTHH:mm:ssZD

Example: 2020-12-21T14:56:11+07:00
X-EXTERNAL-IDstringRequired

Numeric String. Reference number that should be unique in the same day (Request Id)

Example: 41807553358950093184162180797837
X-SIGNATUREstringRequired

Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp

Example: ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==
AuthorizationstringRequired

String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)

Example: Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9a
CHANNEL-IDstringRequired

Channel ID for QRIS please fill with H2H (Host-To-Host)

Example: H2H
Body
merchantIdstringRequired

Credential mall ID from DOKU | Mandatory | min length: 1 | max length: 64

Example: 2115
originalPartnerReferenceNostringRequired

Transaction ID from DOKU when Generate QRIS from SNAP (same as originalReferenceNo value from Generate QRIS Request) | Mandatory | min length: 1 | max length: 64

Example: originalPartnerReferenceNo
originalReferenceNostringRequired

New Transaction ID used as transactions ID for this refund transaction | Mandatory | min length: 1 | max length: 64

Example: 7d054649f9ba4c19ae5f95950c99be4d
partnerRefundNostringRequiredExample: partnerRefundNo | Mandatory | min length: 1 | max length: 64
reasonstringRequired

Refund Reason | Mandatory | min length: 1 | max length: 256

Example: refund reason
Responses
200

OK

application/json
post
/snap-adapter/b2b/v1.0/qr/qr-mpm-refund
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"
  }
}
200

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

Environment
Endpoint

HTTP Method

POST

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:

POST Decode QRIS

post
Header parameters
X-PARTNER-IDstringRequired

Client Id for merchant that generated by DOKU

Example: BRN-0253-1758536533798
X-TIMESTAMPstringRequired

Client's current local time with format YYYY-MM-DDTHH:mm:ssZD

Example: 2020-12-21T14:56:11+07:00
X-EXTERNAL-IDstringRequired

Numeric String. Reference number that should be unique in the same day (Request Id)

Example: 41807553358950093184162180797837
X-SIGNATUREstringRequired

Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp

Example: ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==
AuthorizationstringRequired

String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)

Example: Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9a
CHANNEL-IDstringRequired

Channel ID for QRIS please fill with H2H (Host-To-Host)

Example: H2H
Body
partnerReferenceNostring · max: 64Required

Transaction ID from partners

Example: 75a98757c8dbc6434ab5dd4c55d9092d9a
qrContentstring · max: 512Required

QRIS content. QRIS generated by DOKU or other PJSP. Can be dynamic or static QRIS.

Example: 00020101021226530012COM.DOKU.WWW0118936008990000002997020429970303UMI51440014ID.CO.QRIS.WWW0215ID20200622029970303UMI52045411530336054071200.255502025606500.525802ID5911Green Pages6007Jakarta61051312062430703K455032a98757c8dbc6434ab5dd4c55d9092d9a6304F6EA
scanTimestringRequired

The time when the QRIS scanned by the User, ISO 8601 Format

Example: 2023-11-08T17:38:42+07:00
Responses
200

OK

application/json
post
/snap-adapter/b2b/v1.0/qr/qr-mpm-decode
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"
}
200

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

Environment
Endpoint

HTTP Method

POST

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:

POST Payment QRIS

post
Header parameters
X-PARTNER-IDstringRequired

Client Id for merchant that generated by DOKU

Example: BRN-0253-1758536533798
X-TIMESTAMPstringRequired

Client's current local time with format YYYY-MM-DDTHH:mm:ssZD

Example: 2020-12-21T14:56:11+07:00
X-EXTERNAL-IDstringRequired

Numeric String. Reference number that should be unique in the same day (Request Id)

Example: 41807553358950093184162180797837
X-SIGNATUREstringRequired

Symmetric Signature with Get Token (Default)HMAC_SHA512 (clientSecret, stringToSign) dengan formula stringToSign = HTTPMethod +”:“+ EndpointUrl +":"+ AccessToken +":“+ Lowercase(HexEncode(SHA-256(minify(RequestBody))))+ ":“ + TimeStamp

Example: ieNOENDdN4MnectGytx5UvmOfASZ2oGWMCJ8gVqkw3tB98ofgY9cbxSeY4IYoYeoKs+0QP4h8BTBhemlfeXp1w==
AuthorizationstringRequired

String starts with keyword “Bearer ” followed by token B2B (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)

Example: Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9a
Authorization-CustomerstringRequired

String starts with keyword “Bearer ” followed by token B2B2C (e.g. Bearer eyJraWQiOi...Jzc29zIiwiY)

Example: Bearer gp9HjjEj813Y9JGoqwOeOPWbnt4CUpvIJbU1mMU4a11MNDZ7Sg5u9a
CHANNEL-IDstringRequired

Channel ID for QRIS please fill with H2H (Host-To-Host)

Example: H2H
Body
partnerReferenceNostringRequiredExample: 91cbe52caf27471482d3430c37d174fc
Responses
200

OK

application/json
post
/snap-adapter/b2b2c/v1.0/qr/qr-mpm-payment
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"
  }
}
200

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?