{"info":{"_postman_id":"ecb29d04-b764-4cb9-8229-52fb940a8e16","name":"Dalang Pay SNAP","description":"<html><head></head><body><h2 id=\"overview\">Overview</h2>\n<p><strong>Dalang Pay</strong> is a secure and developer-friendly <strong>payment gateway API platform</strong> designed to simplify payment integration across Indonesian financial ecosystems.</p>\n<p>It enables partners to create Virtual Accounts, generate QRIS codes, perform fund disbursements, and manage reconciliation using standardized RESTful APIs that comply with <strong>SNAP (National Standard Open API for Payments)</strong> by Bank Indonesia.</p>\n<p>Dalang Pay supports both <strong>Symmetric and Asymmetric signature authentication</strong>, ensuring every API request is verified and tamper-proof.</p>\n<p>Through its modular endpoints, merchants and institutions can connect to multiple banks, manage payment channels such as VA, QR, and monitor real-time transactions securely.</p>\n<h2 id=\"🌐-dalang-pay-client-dashboard\">🌐 Dalang Pay Client Dashboard</h2>\n<p>URL: <a href=\"https://dashboard.dalangpay.com\">https://dashboard.dalangpay.com</a></p>\n<p>The Dalang Pay Client Dashboard is the control panel for registered partners.<br>It is used to manage credentials, view available products, and monitor configuration.</p>\n<h3 id=\"what-you-can-do-in-the-dashboard\">What you can do in the Dashboard</h3>\n<ul>\n<li><p><strong>Generate and manage credentials</strong></p>\n<ul>\n<li><p>View your <code>Client Key</code> / <code>Client ID</code></p>\n</li>\n<li><p>Generate or rotate your private key / client secret</p>\n</li>\n<li><p>Download the public key that Dalang Pay will use to verify your signature</p>\n</li>\n<li><p>Manage signature mode (Symmetric / Asymmetric)</p>\n</li>\n</ul>\n</li>\n<li><p><strong>View product activation status</strong></p>\n<ul>\n<li><p>See which payment products are currently enabled for your account<br>  (e.g. Virtual Account, QRIS MPM, Direct Debit, Bank Transfer)</p>\n</li>\n<li><p>Check which bank channels or payout channels are available to you</p>\n</li>\n<li><p>Review each product’s service code and endpoint path</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Account profile and limits</strong></p>\n<ul>\n<li><p>View your merchant profile information</p>\n</li>\n<li><p>Monitor settlement accounts / destination accounts</p>\n</li>\n</ul>\n</li>\n</ul>\n<blockquote>\n<p>All credentials (Client Key, client secret / private key, webhook configuration, and product access) are managed from the Dalang Pay Dashboard. Each partner is responsible for keeping these credentials safe and generating their own request signatures in production. </p>\n</blockquote>\n<h2 id=\"🗒️-global-note\">🗒️ <strong>Global Note</strong></h2>\n<h3 id=\"🌐-environment\">🌐 Environment</h3>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Name</strong></th>\n<th><strong>URL</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>LIVE</td>\n<td><a href=\"http://gwapi.dalangpay.com\">https://gwapi.dalangpay.com</a></td>\n</tr>\n<tr>\n<td>SANDBOX</td>\n<td><a href=\"http://sbxapi.dalangpay.com\">https://sbxapi.dalangpay.com</a></td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Important:</strong></p>\n<p>For security reason, partners are advised to whitelist Dalang Pay's IP Address: <strong><code>13.228.138.76</code></strong> . Please incorporate this into your system firewall configurations.</p>\n<h3 id=\"🔐-security--signature-policy\">🔐 Security &amp; Signature Policy</h3>\n<p>Dalang Pay provides two helper endpoints in the sandbox environment:</p>\n<ul>\n<li><p>Auth Signature</p>\n</li>\n<li><p>Signature Access (Symmetric/Asymmetric)</p>\n</li>\n</ul>\n<p>These helper endpoints exist only for testing and onboarding purposes.</p>\n<p>They allow you to:</p>\n<ul>\n<li><p>Verify how the signature is constructed</p>\n</li>\n<li><p>Validate the final X-Signature format</p>\n</li>\n<li><p>Experiment quickly using Postman</p>\n</li>\n</ul>\n<p><strong>Important:</strong></p>\n<ul>\n<li><p><code>Auth Signature</code>, <code>Signature Access (Symmetric Signature)</code>, and <code>Signature Access (Asymmetric Signature)</code> are <strong>provided for sandbox/testing purposes only.</strong></p>\n</li>\n<li><p>These helper endpoints are <strong>not available in production.</strong></p>\n</li>\n<li><p>In <strong>production</strong>, you must <strong>generate the signature on your side using your own</strong> <strong>client secret / private key.</strong> Dalang Pay will verify the signature, but will not generate it for you.</p>\n</li>\n</ul>\n<h3 id=\"📍-service-code\">📍 Service Code</h3>\n<p>Dalang Pay uses the following service codes for its endpoints, following the SNAP format: <code>HTTP Status Code + Service Code + Case Code</code>. <strong>Example:</strong> A successful <strong>Get Token B2B</strong> request (Service Code 73) returns <code>2007300</code>.</p>\n<p>Reference SNAP Documentation: <a href=\"https://apidevportal.aspi-indonesia.or.id/api-services/keamanan\">Response Code</a> (Response Code section)</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Service Name</strong></th>\n<th><strong>Path</strong></th>\n<th><strong>Code</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Get Token B2B</td>\n<td>/snap-api/v1/access-token/b2b</td>\n<td>73</td>\n</tr>\n<tr>\n<td>Balance Inquiry</td>\n<td>/snap-api/v1/balance-inquiry</td>\n<td>11</td>\n</tr>\n<tr>\n<td>Create Virtual Account</td>\n<td>/snap-api/v1/transfer-va/create-va</td>\n<td>27</td>\n</tr>\n<tr>\n<td>Create QR MPM</td>\n<td>/snap-api/v1/qr/qr-mpm-generate</td>\n<td>47</td>\n</tr>\n<tr>\n<td>Create Payment</td>\n<td>/snap-api/v1/debit/payment-host-to-host</td>\n<td>54</td>\n</tr>\n<tr>\n<td>Account Inquiry</td>\n<td>/snap-api/v1/emoney/bank-account-inquiry</td>\n<td>42</td>\n</tr>\n<tr>\n<td>Transfer to Bank</td>\n<td>/snap-api/v1/emoney/transfer-bank</td>\n<td>42</td>\n</tr>\n</tbody>\n</table>\n</div><h3 id=\"⚠️-error-code-model\">⚠️ Error Code Model</h3>\n<p>Reference SNAP Documentation: <a href=\"https://apidevportal.aspi-indonesia.or.id/api-services/keamanan\">Response Code</a> (Response Code section)</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>HTTP Code</strong></th>\n<th><strong>Service Code</strong></th>\n<th><strong>Case Code</strong></th>\n<th><strong>Response Message</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>200</td>\n<td>any</td>\n<td>00</td>\n<td>Successful</td>\n<td>Successful</td>\n</tr>\n<tr>\n<td>400</td>\n<td>any</td>\n<td>00</td>\n<td>Bad Request</td>\n<td><code>X-Timestamp</code> cannot be in the future or <code>X-Timestamp</code> is too old</td>\n</tr>\n<tr>\n<td>403</td>\n<td>any</td>\n<td>09</td>\n<td>Client is inactive</td>\n<td>Dormant Account</td>\n</tr>\n</tbody>\n</table>\n</div></body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"50997704","collectionId":"ecb29d04-b764-4cb9-8229-52fb940a8e16","publishedId":"2sBXVZnDix","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2025-12-23T07:01:41.000Z"},"item":[{"name":"AUTHENTICATION","item":[{"name":"Utilities","item":[{"name":"Auth Signature","id":"0cb86102-995c-4ab3-891d-412006892c44","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","description":"<p>The private key used for generating an asymmetric signature (SHA256 with RSA).\nObtain this key from your Dalang Pay Developer Dashboard\n.\nIt must be in Base64-encoded PEM format and kept confidential — do not expose it in client-side code.</p>\n","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"<p>Required when using Asymmetric Signature (RSA-SHA256).\nRepresents the client identifier registered in the Dalang Pay Developer Dashboard.\nUsed together with Private_Key to generate a digital signature in the format {ClientKey}|{Timestamp}.</p>\n","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"<p>A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.</p>\n","type":"text"}],"url":"{{baseURL}}/snap-api/v1/utilities/signature-service","description":"<h3 id=\"🚫-environment-sandbox-only\">🚫 <strong>Environment: Sandbox Only</strong></h3>\n<p>This endpoint is available only in the sandbox / UAT environment.</p>\n<p>Purpose:</p>\n<ul>\n<li><p>Help you build and verify the correct <code>Signature</code></p>\n</li>\n<li><p>Show you how the final <code>X-Signature</code> header should look</p>\n</li>\n<li><p>Allow you to test the flow quickly using Postman</p>\n</li>\n</ul>\n<p>This endpoint must NOT be called in production.</p>\n<p>In production:</p>\n<ul>\n<li><p>You MUST generate the signature locally in your own system</p>\n</li>\n<li><p>You MUST send the generated signature in the <code>X-Signature</code> header</p>\n</li>\n<li><p>You MUST NOT send your private key or client secret to Dalang Pay</p>\n</li>\n</ul>\n<p>Dalang Pay does not expose this endpoint in production and will not sign requests for you.</p>\n<h2 id=\"production-client-example\">Production Client Example</h2>\n<p>SNAP uses <code>SHA256 Signed With RSA</code> as the standard for signing Auth API requests. The signed data uses the pattern <code>{ClientKey}|{TimeStamp}</code>. You can get <code>ClientKey</code> and <code>Private Key</code> from <a href=\"https://dashboard.dalangpay.com\">Dalang Pay Client Dashboard</a>.</p>\n<p>The final signature must be sent as a Base64 string in the <code>X-Signature</code> header.</p>\n<p><strong>Example Code:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-php\">$privateKey = 'YourPrivateKeyFromClientDashboard';\n$clientKey = 'YourClientKeyFromClientDashboard';\n$timestamp = '2025-01-01T23:59:59Z';\n// 1. Build the string to sign\n$dataToSign = $clientKey . '|' . $timestamp;\n// 2. Sign using RSA-SHA256\n$signatureBinary = '';\nopenssl_sign($dataToSign, $signatureBinary, $privateKey, OPENSSL_ALGO_SHA256);\n// 3. Convert binary signature to Base64\n$signatureBase64 = base64_encode($signatureBinary);\necho $signatureBase64;\n?&gt;\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">const { createSign } = require('crypto');\nconst privateKey = 'YourPrivateKeyFromClientDashboard';\nconst clientKey = 'YourClientKeyFromClientDashboard';\nconst timestamp = '2025-01-01T23:59:59Z';\n// 1. Build the string to sign\nconst dataToSign = clientKey + '|' + timestamp;\n// 2. Sign using RSA-SHA256 and output Base64\nconst signatureBase64 = createSign('sha256')\n  .update(dataToSign)\n  .sign(privateKey, 'base64');\nconsole.log(signatureBase64);\n\n</code></pre>\n","urlObject":{"path":["snap-api","v1","utilities","signature-service"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"ed6af5b3-2fd4-41a2-a01c-aa7c138b48fc","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","description":"The private key used for generating an asymmetric signature (SHA256 with RSA).\nObtain this key from your Dalang Pay Developer Dashboard\n.\nIt must be in Base64-encoded PEM format and kept confidential — do not expose it in client-side code.","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"Required when using Asymmetric Signature (RSA-SHA256).\nRepresents the client identifier registered in the Dalang Pay Developer Dashboard.\nUsed together with Private_Key to generate a digital signature in the format {ClientKey}|{Timestamp}.","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"url":"{{baseURL}}/snap-api/v1/utilities/signature-auth"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"signature\": \"069a81f985277e7aade3f503088cde559ba09ea0603e00a568aed10a3d8f1920\"\n}"}],"_postman_id":"0cb86102-995c-4ab3-891d-412006892c44"},{"name":"Signature Access (Symmetric Signature)","id":"94125ab7-0503-422c-a447-cbe3c6ea69ba","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"<p>Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.</p>\n","type":"text"},{"key":"EndpointUrl","value":"/snap-api/v1/access-token/b2b","description":"<p>Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.</p>\n","type":"text"},{"key":"HttpMethod","value":"POST","description":"<p>Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.</p>\n","type":"text"},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"<p>Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.</p>\n","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"<p>A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service","description":"<h3 id=\"🚫-environment-sandbox-only\">🚫 <strong>Environment: Sandbox Only</strong></h3>\n<p>This endpoint is available only in the sandbox / UAT environment.</p>\n<p>Purpose:</p>\n<ul>\n<li><p>Help you build and verify the correct <code>Signature</code></p>\n</li>\n<li><p>Show you how the final <code>X-Signature</code> header should look</p>\n</li>\n<li><p>Allow you to test the flow quickly using Postman</p>\n</li>\n</ul>\n<p>This endpoint must NOT be called in production.</p>\n<p>In production:</p>\n<ul>\n<li><p>You MUST generate the signature locally in your own system</p>\n</li>\n<li><p>You MUST send the generated signature in the <code>X-Signature</code> header</p>\n</li>\n<li><p>You MUST NOT send your private key or client secret to Dalang Pay</p>\n</li>\n</ul>\n<p>Dalang Pay does not expose this endpoint in production and will not sign requests for you.</p>\n<h2 id=\"production-client-example\">Production Client Example</h2>\n<p>SNAP uses <code>HMAC_SHA512</code> as the standard for symmetric signing of API requests with <code>clientSecret</code> as the secret key. The signed data uses the pattern <code>{HTTPMethod}:{EndpointUrl}:{AccessToken}:{LowercaseHashedRequestBody}:{TimeStamp}</code>. While <code>LowercaseHashedRequestBody</code> is obtained by making <code>RequestBody</code> into single-line, then hashing it using <code>SHA256</code> with <code>HEX</code> format made into lower-case.</p>\n<p>If explained, here are the steps that must be taken:</p>\n<p><strong>1 . Normalize and hash the request body (conditional)</strong></p>\n<p>Dalang Pay expects request bodies in JSON format. By default, JSON is multiline / pretty-printed. For signing, you must convert it into a single-line JSON string, then hash it.</p>\n<p><strong>Example body (raw JSON):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"name\": \"Eko Sugema\",\n  \"address\": \"Jl. Surabaya Selatan II / 123\"\n}\n\n</code></pre>\n<p>This must be converted to a single-line string:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\"name\":\"Eko Sugema\",\"address\":\"Jl. Surabaya Selatan II / 123\"}\n\n</code></pre>\n<p>Then you hash that single-line string using SHA-256, and take the result as lowercase hex. For example:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>069a81f985277e7aade3f503088cde559ba09ea0603e00a568aed10a3d8f1920\n\n</code></pre><p><strong>Example Code:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-php\">$payload = [\n    'name' =&gt; 'Eko Sugema',\n    'address' =&gt; 'Jl. Surabaya Selatan II / 123'\n];\n// 1. Minify JSON (no spaces / newlines)\n$trimmedPayload = json_encode($payload, JSON_UNESCAPED_SLASHES);\n// 2. SHA256 hash, output as lowercase hex\n$hashPayload = strtolower(\n    bin2hex(hash('sha256', $trimmedPayload, true))\n);\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">const { createHash } = require('crypto');\nconst payload = {\n  name: \"Eko Sugema\",\n  address: \"Jl. Surabaya Selatan II / 123\"\n};\n// 1. Minify JSON\nconst trimmedPayload = JSON.stringify(payload);\n// 2. SHA256 hash -&gt; lowercase hex\nconst hashPayload = createHash('sha256')\n  .update(trimmedPayload)\n  .digest('hex')\n  .toLowerCase();\n\n</code></pre>\n<p><strong>2. Pattern of Data to be Signed</strong></p>\n<p>The data pattern that will be signed is</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>VARIABLE</strong></th>\n<th><strong>DESCRIPTION</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>HTTPMethod</td>\n<td>HTTP method (eg. POST, GET)</td>\n</tr>\n<tr>\n<td>EndpointUrl</td>\n<td>Relative URL path (eg. /open-api/v1/wallet)</td>\n</tr>\n<tr>\n<td>AccessToken</td>\n<td>Value from the Authorization header, excluding the “Bearer ” prefix</td>\n</tr>\n<tr>\n<td>LowercaseHashedRequestBody</td>\n<td>Hashed Body Request from step 1 or empty string \"\"</td>\n</tr>\n<tr>\n<td>TimeStamp</td>\n<td>Exactly same with X-TIMESTAMP header</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Pattern:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{HTTPMethod}:{EndpointUrl}:{AccessToken}:{LowercaseHashedRequestBody}:{TimeStamp}\n\n</code></pre><p><strong>Example (with payload):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST:/open-api/v1/va/create:946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6:069a81f985277e7aade3f503088cde559ba09ea0603e00a568aed10a3d8f1920:2025-01-01T23:59:59Z\n\n</code></pre><p><strong>Example (no payload):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET:/open-api/v1/wallet:946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6::2025-01-01T23:59:59Z\n\n</code></pre><p><strong>3. Sign The Data using</strong> <code>HMAC_SHA512</code> <strong>and encode as Base64</strong></p>\n<p>The last step is Hash the data using <code>HMAC_SHA512</code> with your <code>X-Client-Secret</code> that you created from</p>\n<p><a href=\"https://dashboard.dalangpay.com\">Dalang Pay Client Dashboard</a><strong>.</strong></p>\n<p>The final signature MUST be encoded in <strong>Base64</strong>, and that Base64 value is what you send in the <code>X-Signature</code> header.</p>\n<p><strong>Example (HMAC</strong> → <strong>Base64):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-php\">$secretKey  = 'YourSecretKeyFromClientDashboard';\n$dataToSign = $httpMethod . ':' .\n              $urlPath . ':' .\n              $accessToken . ':' .\n              $hashPayload . ':' .\n              $timestamp;\n// 1. Generate HMAC-SHA512 (binary output)\n$rawSignature = hash_hmac('sha512', $dataToSign, $secretKey, true);\n// 2. Encode as Base64 for transport\n$signatureBase64 = base64_encode($rawSignature);\necho $signatureBase64;\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">const { createHmac } = require('crypto');\nconst secretKey  = 'YourSecretKeyFromClientDashboard';\nconst dataToSign = [\n  httpMethod,\n  urlPath,\n  accessToken,\n  hashPayload,\n  timestamp\n].join(':');\n// 1. Generate HMAC-SHA512\nconst rawSignature = createHmac('sha512', secretKey)\n  .update(dataToSign)\n  .digest();\n// 2. Convert to Base64\nconst signatureBase64 = rawSignature.toString('base64');\nconsole.log(signatureBase64);\n\n</code></pre>\n","urlObject":{"path":["snap-api","v1","utilities","signature-service"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"dd257963-85d3-4260-ac3b-0677a5dc3f99","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text"},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","type":"text","disabled":true},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"A unique client identifier provided by Dalang Pay for your account.\nThis key is used to link each signature or token request with your registered application.","type":"text"},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"/snap-api/v1/utilities/signature-service"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"signature\": \"069a81f985277e7aade3f503088cde559ba09ea0603e00a568aed10a3d8f1920\"\n}"},{"id":"247f82a9-7895-4369-848f-6d7d97e52feb","name":"422 Unprocessable Content","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text"},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","type":"text","disabled":true},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"A unique client identifier provided by Dalang Pay for your account.\nThis key is used to link each signature or token request with your registered application.","type":"text","disabled":true},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"string\",\n  \"errors\": {\n    \"property1\": [\n      \"string\"\n    ],\n    \"property2\": [\n      \"string\"\n    ]\n  }\n}"},{"id":"8dc47fba-9872-4b84-b06d-c35dbcbfb8ce","name":"403 Forbidden","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text"},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","type":"text","disabled":true},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"A unique client identifier provided by Dalang Pay for your account.\nThis key is used to link each signature or token request with your registered application.","type":"text","disabled":true},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n  \"responseCode\": 4030009,\n  \"responseMessage\": \"Client Not Found or inactive\"\n}"},{"id":"018145db-16c0-4aa4-8308-a0d290088baa","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text"},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","type":"text","disabled":true},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"A unique client identifier provided by Dalang Pay for your account.\nThis key is used to link each signature or token request with your registered application.","type":"text","disabled":true},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": 4000000,\n    \"responseMessage\": \"Required headers are missing: ((`X-Client-Key` and `Private_Key`) or (`Authorization` and `X-Client-Secret`)), `X-Timestamp`, `HttpMethod`, and `EndpoinUrl`\"\n}"}],"_postman_id":"94125ab7-0503-422c-a447-cbe3c6ea69ba"},{"name":"Signature Access (Asymmetric Signature)","id":"4fc97637-1d6a-43d6-89cb-0a617ca074e6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"EndpointUrl","value":"/snap-api/v1/access-token/b2b","description":"<p>Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.</p>\n","type":"text"},{"key":"HttpMethod","value":"POST","description":"<p>Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.</p>\n","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","description":"<p>Required when using Asymmetric Signature (RSA-SHA256).\nContains the Base64-encoded private key provided in the Dalang Pay Developer Dashboard.\nThis key is used to generate the digital signature through the RSA-SHA256 algorithm.</p>\n","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"<p>Required when using Asymmetric Signature (RSA-SHA256).\nRepresents the client identifier registered in the Dalang Pay Developer Dashboard.\nUsed together with Private_Key to generate a digital signature in the format {ClientKey}|{Timestamp}.</p>\n","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"<p>A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.</p>\n","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service","description":"<h3 id=\"🚫-environment-sandbox-only\">🚫 <strong>Environment: Sandbox Only</strong></h3>\n<p>This endpoint is available only in the sandbox / UAT environment.</p>\n<p>Purpose:</p>\n<ul>\n<li><p>Help you build and verify the correct <code>Signature</code></p>\n</li>\n<li><p>Show you how the final <code>X-Signature</code> header should look</p>\n</li>\n<li><p>Allow you to test the flow quickly using Postman</p>\n</li>\n</ul>\n<p>This endpoint must NOT be called in production.</p>\n<p>In production:</p>\n<ul>\n<li><p>You MUST generate the signature locally in your own system</p>\n</li>\n<li><p>You MUST send the generated signature in the <code>X-Signature</code> header</p>\n</li>\n<li><p>You MUST NOT send your private key or client secret to Dalang Pay</p>\n</li>\n</ul>\n<p>Dalang Pay does not expose this endpoint in production and will not sign requests for you.</p>\n<h2 id=\"production-client-example\">Production Client Example</h2>\n<p>SNAP uses <code>SHA_256 Signed With RSA</code> as the standard for asymmetric signing of API requests. The signed data uses the pattern <code>{HTTPMethod}:{EndpointUrl}:{LowercaseHashedRequestBody}:{TimeStamp}</code>. While <code>LowercaseHashedRequestBody</code> is obtained by making <code>RequestBody</code> into single-line, then hashing it using <code>SHA256</code> with <code>HEX</code> format made into lower-case.</p>\n<p>If explained, here are the steps that must be taken:</p>\n<p>Dalang Pay uses JSON for request bodies. By default, JSON is usually formatted across multiple lines. For signing, you must convert it into a single-line JSON string.</p>\n<p><strong>1. Trim the body request and Hash using SHA256 (conditional)</strong></p>\n<p><strong>Example:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"name\": \"Eko Sugema\",\n  \"address\": \"Jl. Surabaya Selatan II / 123\"\n}\n\n</code></pre>\n<p>This must be converted to a single-line string:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\"name\": \"Eko Sugema\",\"address\": \"Jl. Surabaya Selatan II / 123\"}\n\n</code></pre>\n<p>Then you hash that single-line string using SHA-256, and take the result as lowercase hex. For example:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>069a81f985277e7aade3f503088cde559ba09ea0603e00a568aed10a3d8f1920\n\n</code></pre><p><strong>Example Code:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-php\">$payload = [\n    'name' =&gt; 'Eko Sugema',\n    'address' =&gt; 'Jl. Surabaya Selatan II / 123'\n];\n// 1. Minify JSON (no spaces / newlines)\n$trimmedPayload = json_encode($payload, JSON_UNESCAPED_SLASHES);\n// 2. SHA256 hash, output as lowercase hex\n$hashPayload = strtolower(\n    bin2hex(hash('sha256', $trimmedPayload, true))\n);\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">const { createHash } = require('crypto');\nconst payload = {\n  name: \"Eko Sugema\",\n  address: \"Jl. Surabaya Selatan II / 123\"\n};\n// 1. Minify JSON\nconst trimmedPayload = JSON.stringify(payload);\n// 2. SHA256 hash -&gt; lowercase hex\nconst hashPayload = createHash('sha256')\n  .update(trimmedPayload)\n  .digest('hex')\n  .toLowerCase();\n\n</code></pre>\n<p><strong>2. Pattern of Data to be Signed</strong></p>\n<p>The data pattern that will be signed is</p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>VARIABLE</strong></th>\n<th><strong>DESCRIPTION</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>HTTPMethod</td>\n<td>HTTP method (eg. POST, GET)</td>\n</tr>\n<tr>\n<td>EndpointUrl</td>\n<td>Relative URL path (eg. /open-api/v1/wallet)</td>\n</tr>\n<tr>\n<td>LowercaseHashedRequestBody</td>\n<td>Hashed Body Request from step 1 or empty string \"\"</td>\n</tr>\n<tr>\n<td>TimeStamp</td>\n<td>Exactly same with X-TIMESTAMP header</td>\n</tr>\n</tbody>\n</table>\n</div><p><strong>Pattern:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>{HTTPMethod}:{EndpointUrl}:{LowercaseHashedRequestBody}:{TimeStamp}\n\n</code></pre><p><strong>Example (with payload):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>POST:/open-api/v1/va/create:069a81f985277e7aade3f503088cde559ba09ea0603e00a568aed10a3d8f1920:2025-01-01T23:59:59Z\n\n</code></pre><p><strong>Example (no payload):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>GET:/open-api/v1/wallet::2025-01-01T23:59:59Z\n\n</code></pre><p><strong>3. Hash The Data using</strong> <code>SHA256 Signed With RSA</code> <strong>and encode as Base64</strong></p>\n<p>The last step is Hash the data using <code>SHA_256</code> with your Private Key that you get from</p>\n<p><a href=\"https://dashboard.dalangpay.com\">Dalang Pay Client Dashboard</a><strong>.</strong></p>\n<p>The final signature MUST be encoded in <strong>Base64</strong>, and that Base64 value is what you send in the <code>X-Signature</code> header.</p>\n<p><strong>Example (RSA</strong> → <strong>Base64):</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-php\">$privateKey = 'YourPrivateKeyFromClientDashboard';\n$dataToSign = $httpMethod.':'.\n              $urlPath.':'.\n              $hashPayload.':'.\n              $timestamp;\n$signature = '';\nopenssl_sign($dataToSign, $signature, $privateKey, OPENSSL_ALGO_SHA256);\necho base64_encode($signature);\n\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-javascript\">const { createSign } = require('crypto');\nconst privateKey = 'YourPrivateKeyFromClientDashboard';\nconst dataToSign = [\n   httpMethod,\n   urlPath,\n   hashPayload,\n   timestamp\n].join(':');\nconst signature = createSign('sha256').update(dataToSign).sign(privateKey, 'hex');\nconsole.log(signature);\n\n</code></pre>\n","urlObject":{"path":["snap-api","v1","utilities","signature-service"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"18d6cbe1-89ff-48bc-a543-361435aad405","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text","disabled":true},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","description":"Required when using Asymmetric Signature (RSA-SHA256).\nContains the Base64-encoded private key provided in the Dalang Pay Developer Dashboard.\nThis key is used to generate the digital signature through the RSA-SHA256 algorithm.","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"Required when using Asymmetric Signature (RSA-SHA256).\nRepresents the client identifier registered in the Dalang Pay Developer Dashboard.\nUsed together with Private_Key to generate a digital signature in the format {ClientKey}|{Timestamp}.","type":"text"},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text","disabled":true},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"/snap-api/v1/utilities/signature-service"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"signature\": \"069a81f985277e7aade3f503088cde559ba09ea0603e00a568aed10a3d8f1920\"\n}"},{"id":"66796922-9373-4320-aa5f-8b59240b134e","name":"422 Unprocessable Content","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text","disabled":true},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","description":"Required when using Asymmetric Signature (RSA-SHA256).\nContains the Base64-encoded private key provided in the Dalang Pay Developer Dashboard.\nThis key is used to generate the digital signature through the RSA-SHA256 algorithm.","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"Required when using Asymmetric Signature (RSA-SHA256).\nRepresents the client identifier registered in the Dalang Pay Developer Dashboard.\nUsed together with Private_Key to generate a digital signature in the format {ClientKey}|{Timestamp}.","type":"text"},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text","disabled":true},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n  \"message\": \"string\",\n  \"errors\": {\n    \"property1\": [\n      \"string\"\n    ],\n    \"property2\": [\n      \"string\"\n    ]\n  }\n}"},{"id":"ee6decb9-edb6-4e4a-a860-8d10f62106b9","name":"403 Forbidden","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text","disabled":true},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","description":"Required when using Asymmetric Signature (RSA-SHA256).\nContains the Base64-encoded private key provided in the Dalang Pay Developer Dashboard.\nThis key is used to generate the digital signature through the RSA-SHA256 algorithm.","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"Required when using Asymmetric Signature (RSA-SHA256).\nRepresents the client identifier registered in the Dalang Pay Developer Dashboard.\nUsed together with Private_Key to generate a digital signature in the format {ClientKey}|{Timestamp}.","type":"text"},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text","disabled":true},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service"},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n  \"responseCode\": 4030009,\n  \"responseMessage\": \"Client Not Found or inactive\"\n}"},{"id":"0fca6f1e-3176-4327-a920-9b7f718155c4","name":"400 Bad Request","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","description":"Required when using Symmetric Signature (HMAC-SHA512).\nContains the Bearer token obtained from /access-token/b2b.","type":"text","disabled":true},{"key":"EndpointUrl","value":" /snap-api/v1/access-token/b2b","description":"Specifies the target API endpoint that will be simulated during the signature generation process.\nAllowed values correspond to valid SNAP API paths (e.g. /snap-api/v1/balance-inquiry, /snap-api/v1/transfer-va/create-va, /snap-api/v1/qr/qr-mpm-generate).\nThis helps determine the request path used as part of the signing string.","type":"text"},{"key":"HttpMethod","value":" POST","description":"Indicates the HTTP method used in the signature process.\nAllowed values: GET or POST.\nThis value must match the actual HTTP method used when sending the API request.","type":"text"},{"key":"Private_Key","value":"MIIEugIBADANBgkqhkiG9w0BAQEFAASCBKQwggSgAgEAAoIBAQCbQVYbzmeqOPnc\\...+vXGzNgM\\nasp7/9rHflVuhy1KOyo=","description":"Required when using Asymmetric Signature (RSA-SHA256).\nContains the Base64-encoded private key provided in the Dalang Pay Developer Dashboard.\nThis key is used to generate the digital signature through the RSA-SHA256 algorithm.","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","description":"Required when using Asymmetric Signature (RSA-SHA256).\nRepresents the client identifier registered in the Dalang Pay Developer Dashboard.\nUsed together with Private_Key to generate a digital signature in the format {ClientKey}|{Timestamp}.","type":"text"},{"key":"X-Client-Secret","value":"c4nehEmpSdSDw8HeYarbYvCf","description":"Required when using Symmetric Signature (HMAC-SHA512).\nRepresents the client’s secret key, used to compute the HMAC signature.","type":"text","disabled":true},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","description":"A timestamp string following ISO 8601 format: YYYY-MM-DDTHH:mm:ssZ.\nUsed to prevent replay attacks — the request is only valid for 60 seconds from this timestamp.\nExample: 2025-01-01T23:59:59Z.","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"virtualAccountName\": \"String\",\n    \"trxId\": \"String\"\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/utilities/signature-service"},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": 4000000,\n    \"responseMessage\": \"Required headers are missing: ((`X-Client-Key` and `Private_Key`) or (`Authorization` and `X-Client-Secret`)), `X-Timestamp`, `HttpMethod`, and `EndpoinUrl`\"\n}"}],"_postman_id":"4fc97637-1d6a-43d6-89cb-0a617ca074e6"}],"id":"76c09dfc-7d4f-450a-a2a7-6584e0d482df","description":"<h2 id=\"signature\">Signature</h2>\n<h3 id=\"⚠-read-first-signature-usage-policy\">⚠ READ FIRST: Signature Usage Policy</h3>\n<p><strong>About</strong> <code>Auth Signature</code> <strong>and</strong> <code>Signature Access</code></p>\n<p>The Auth Signature and Signature Access endpoints are provided for sandbox / UAT integration testing only.</p>\n<p><strong>Allowed usage (sandbox only):</strong></p>\n<ul>\n<li><p>Generate a test signature to try Dalang Pay endpoints from Postman</p>\n</li>\n<li><p>Confirm that your request headers are correct (<code>X-Timestamp</code>, <code>EndpointUrl</code>, etc.)</p>\n</li>\n<li><p>Debug signature mismatches during integration</p>\n</li>\n</ul>\n<p><strong>Not allowed (production):</strong></p>\n<ul>\n<li><p>Calling these endpoints from a live application</p>\n</li>\n<li><p>Sending your client secret or private key to Dalang Pay</p>\n</li>\n<li><p>Relying on Dalang Pay to generate <code>X-Signature</code> for you at runtime</p>\n</li>\n</ul>\n<p>In production:</p>\n<ul>\n<li><p>You generate the <code>X-Signature</code> locally using your own credentials</p>\n</li>\n<li><p>Dalang Pay will only verify your signature</p>\n</li>\n<li><p>Dalang Pay will never generate or return a production signature on your behalf</p>\n</li>\n</ul>\n<p>Any request sent to production APIs must already include a valid <code>X-Signature</code> created by the client.</p>\n<h3 id=\"cryptographic-signatures\"><strong>Cryptographic Signatures</strong></h3>\n<p>Dalang Pay supports <strong>two types of cryptographic signatures</strong>:</p>\n<ul>\n<li><p><strong>Auth Signature (Asymmetric)</strong> — uses <code>SHA256 with RSA</code> to sign authentication requests.</p>\n<ul>\n<li><p>{ClientKey}|{TimeStamp}</p>\n</li>\n<li><p>Generated using your <strong>Private Key</strong> obtained from the <a href=\"https://dashboard.dalangpay.com\">Dalang Pay Client Dashboard</a>.</p>\n</li>\n<li><p>Ensures each client identity is securely verified.</p>\n</li>\n</ul>\n</li>\n<li><p><strong>Transaction Signature (Symmetric / Asymmetric)</strong> — used for business API requests such as VA, QRIS, or Disbursement.</p>\n<ul>\n<li><p><strong>Symmetric (HMAC-SHA512)</strong> → signs request body with your <code>clientSecret</code>.</p>\n</li>\n<li><p><strong>Asymmetric (RSA)</strong> → signs using your registered <code>Private_Key</code>.</p>\n</li>\n<li><p>{HTTPMethod}:{EndpointUrl}:{AccessToken}:{LowercaseHashedRequestBody}:{TimeStamp}</p>\n</li>\n<li><p>When no request body exists, use an empty string <code>\"\"</code> for <code>LowercaseHashedRequestBody</code>.</p>\n</li>\n</ul>\n</li>\n</ul>\n<p>These signatures confirm that the payload has not been altered and that each request originates from a trusted partner application.</p>\n","_postman_id":"76c09dfc-7d4f-450a-a2a7-6584e0d482df"},{"name":"Get Token B2B","id":"7fbee40e-fae9-4cd6-9b6f-a77a862d6569","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"url":"{{baseURL}}/snap-api/v1/access-token/b2b","description":"<p>This endpoint is used to retrieve a <strong>Business-to-Business (B2B) access token</strong>, which represents an authenticated session between your system and Dalang Pay.</p>\n<p>After a successful request containing your signature and client credentials (<code>X-Client-Key</code>, <code>X-Timestamp</code>, and <code>X-Signature</code>), Dalang Pay returns an <code>accessToken</code> and <code>tokenType</code>.</p>\n<blockquote>\n<p>In production, the client is responsible for generating and sending a valid <code>X-Signature</code>. Dalang Pay will validate the signature but will not generate it for you. </p>\n</blockquote>\n<p>The token must be included in subsequent API requests in the <code>Authorization</code> header as:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">Authorization: Bearer {accessToken}\n\n</code></pre>\n<p>Each token has an expiration period (<code>expiresIn</code>), after which you must request a new one.</p>\n<h4 id=\"request-headers\"><strong>Request Headers</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>X-Client-Key</strong></td>\n<td>string</td>\n<td>Conditional</td>\n<td>Required only for Asymmetric Signature (RSA-SHA256). Client identifier registered in Dalang Pay Dashboard.</td>\n</tr>\n<tr>\n<td><strong>X-Timestamp</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 timestamp (<code>YYYY-MM-DDTHH:mm:ssZ</code>). Used for replay protection. Request is valid for 60 seconds from this timestamp.</td>\n</tr>\n<tr>\n<td><strong>X-Signature</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Digital signature generated using Symmetric (HMAC-SHA512) or Asymmetric (RSA-SHA256). Ensures payload integrity and authenticity.</td>\n</tr>\n<tr>\n<td><strong>X-Signature-Id</strong></td>\n<td>string</td>\n<td>Optional</td>\n<td>Used when rotating/changing signature keys. Indicates which key is used for validating the signature.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Ensure all headers are generated <strong>before sending</strong> the request body.<br />Requests with invalid or expired signatures will be rejected. </p>\n</blockquote>\n<h4 id=\"response-body-explanation-http-200\"><strong>Response Body Explanation (HTTP 200)</strong></h4>\n<p><strong>Snap Service Code: 73</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>responseCode</td>\n<td>string</td>\n<td>Response status code from Dalang Pay. A successful request returns a code 200XX00.</td>\n</tr>\n<tr>\n<td>responseMessage</td>\n<td>string</td>\n<td>Message describing the response.</td>\n</tr>\n<tr>\n<td>accessToken</td>\n<td>string</td>\n<td>This token must be sent in the Authorization header when calling other secured endpoint.</td>\n</tr>\n<tr>\n<td>tokenType</td>\n<td>string</td>\n<td>Type of token to use in the Authorization header. Typically \"Bearer\"</td>\n</tr>\n<tr>\n<td>expiresIn</td>\n<td>integer</td>\n<td>Token lifetime in seconds</td>\n</tr>\n</tbody>\n</table>\n</div>","urlObject":{"path":["snap-api","v1","access-token","b2b"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"6983a9d5-4779-4cec-94bd-44c7fa1ba9ac","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-01-01T23:59:59Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"url":"{{baseURL}}/snap-api/v1/access-token/b2b"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 05 2025 12:56 GMT","description":"","type":"text"},{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"Content-Length","value":"207","description":"","type":"text"},{"key":"Connection","value":"keep-alive","description":"","type":"text"},{"key":"Cache-Control","value":"no-cache, private","description":"","type":"text"},{"key":"Server","value":"FrankenPHP Caddy","description":"","type":"text"},{"key":"Vary","value":"Origin","description":"","type":"text"},{"key":"X-Powered-By","value":"PHP/8.4.15","description":"","type":"text"},{"key":"X-Ratelimit-Limit","value":"600","description":"","type":"text"},{"key":"X-Ratelimit-Remaining","value":"599","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": \"2007300\",\n    \"responseMessage\": \"Successful\",\n    \"accessToken\": \"946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6\",\n    \"tokenType\": \"Bearer\",\n    \"expiresIn\": 86400\n}"}],"_postman_id":"7fbee40e-fae9-4cd6-9b6f-a77a862d6569"}],"id":"0a49f4a3-b5fb-4a50-bee3-3b852910efc2","description":"<h2 id=\"overview\">Overview</h2>\n<p>Authentication endpoints in Dalang Pay provide secure identity validation between partner systems and Dalang Pay’s API gateway.</p>\n<p>All API requests must include a valid <strong>signature</strong> and, in some cases, a <strong>B2B access token</strong> to ensure data integrity, prevent tampering, and comply with <strong>SNAP (Standard National Open API for Payments)</strong> security standards.</p>\n<p>Developers can use these endpoints to generate or verify signatures and obtain access tokens before calling any business APIs (e.g., Virtual Account, QRIS, Disbursement).</p>\n<p>The authentication flow consists of:</p>\n<ol>\n<li><p><strong>Generate Signature</strong> – Create a cryptographic signature (<code>X-Signature</code>) using your Private Key or Secret Key.</p>\n</li>\n<li><p><strong>Obtain B2B Token</strong> – Request an access token by calling <code>/access-token/b2b</code> with the generated signature.</p>\n</li>\n<li><p><strong>Call Business APIs</strong> – Use the obtained token and signature in subsequent API requests (e.g., Virtual Account, QRIS, Disbursement).</p>\n</li>\n</ol>\n<p>Each signature and token is time-bound (typically 60 seconds) to prevent replay attacks and ensure integrity.</p>\n","_postman_id":"0a49f4a3-b5fb-4a50-bee3-3b852910efc2"},{"name":"BALANCE","item":[{"name":"Balance Inquiry","id":"63a83b21-84ae-4207-a2b5-8efd7993f573","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"url":"{{baseURL}}/snap-api/v1/balance-inquiry","description":"<p>This endpoint allows the client to retrieve the current account balance information.</p>\n<p>It can be accessed using either <strong>Symmetric</strong> or <strong>Asymmetric Signature Authentication</strong>, depending on the client configuration.</p>\n<p>The request must be signed properly using the <code>X-Signature</code> header and timestamped with <code>X-Timestamp</code> to ensure security and compliance with <strong>SNAP</strong> standards.</p>\n<blockquote>\n<p>In production, the client is responsible for generating and sending a valid <code>X-Signature</code>. Dalang Pay will validate the signature but will not generate it for you. </p>\n</blockquote>\n<h4 id=\"request-headers\"><strong>Request Headers</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Authorization</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Bearer token required for Symmetric Signature (HMAC-SHA512). Token obtained via <code>/access-token/b2b</code>.</td>\n</tr>\n<tr>\n<td><strong>X-Client-Key</strong></td>\n<td>string</td>\n<td>Conditional</td>\n<td>Required only for Asymmetric Signature (RSA-SHA256). Client identifier registered in Dalang Pay Dashboard.</td>\n</tr>\n<tr>\n<td><strong>X-Timestamp</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 timestamp (<code>YYYY-MM-DDTHH:mm:ssZ</code>). Used for replay protection. Request is valid for 60 seconds from this timestamp.</td>\n</tr>\n<tr>\n<td><strong>X-Signature</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Digital signature generated using Symmetric (HMAC-SHA512) or Asymmetric (RSA-SHA256). Ensures payload integrity and authenticity.</td>\n</tr>\n<tr>\n<td><strong>X-Signature-Id</strong></td>\n<td>string</td>\n<td>Optional</td>\n<td>Used when rotating/changing signature keys. Indicates which key is used for validating the signature.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Ensure all headers are generated <strong>before sending</strong> the request body.<br />Requests with invalid or expired signatures will be rejected. </p>\n</blockquote>\n<h4 id=\"request-body\"><strong>Request Body</strong></h4>\n<p>This endpoint does not require a request body.</p>\n<p>All necessary authentication parameters are included in the request headers.</p>\n<h4 id=\"response-body-explanation-http-200\"><strong>Response Body Explanation (HTTP 200)</strong></h4>\n<p><strong>Snap Service Code: 11</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>responseCode</td>\n<td>string</td>\n<td>Response status code from Dalang Pay. A successful request returns a code 200XX00.</td>\n</tr>\n<tr>\n<td>responseMessage</td>\n<td>string</td>\n<td>Message describing the response.</td>\n</tr>\n<tr>\n<td>accountInfos</td>\n<td>array(object)</td>\n<td>Contains balance-related objects describing different balance types and amounts.</td>\n</tr>\n<tr>\n<td>accountInfos.balanceType</td>\n<td>string</td>\n<td>The type of the balance being described in this object.</td>\n</tr>\n<tr>\n<td>accountInfos.amount</td>\n<td>object</td>\n<td>The total balance amount for this balance type.</td>\n</tr>\n<tr>\n<td>accountInfos.amount.value</td>\n<td>string</td>\n<td>The numeric amount of the total balance.</td>\n</tr>\n<tr>\n<td>accountInfos.amount.currency</td>\n<td>string</td>\n<td>Currency code following ISO 4217.</td>\n</tr>\n<tr>\n<td>accountInfos.floatAmount</td>\n<td>object</td>\n<td>The total float balance for this balance type.</td>\n</tr>\n<tr>\n<td>accountInfos.floatAmount.value</td>\n<td>string</td>\n<td>The numeric float amount of the total float balance.</td>\n</tr>\n<tr>\n<td>accountInfos.floatAmount.currency</td>\n<td>string</td>\n<td>Currency code following ISO 4217.</td>\n</tr>\n<tr>\n<td>accountInfos.holdAmount</td>\n<td>object</td>\n<td>The total hold amount for this balance type.</td>\n</tr>\n<tr>\n<td>accountInfos.holdAmount.value</td>\n<td>string</td>\n<td>The numeric hold amount of the total hold balance.</td>\n</tr>\n<tr>\n<td>accountInfos.holdAmount.currency</td>\n<td>string</td>\n<td>Currency code following ISO 4217.</td>\n</tr>\n<tr>\n<td>accountInfos.availableBalance</td>\n<td>object</td>\n<td>The amount that is currently available to use or withdraw.</td>\n</tr>\n<tr>\n<td>accountInfos.availableBalance.value</td>\n<td>string</td>\n<td>The numeric amount that is actually available.</td>\n</tr>\n<tr>\n<td>accountInfos.availableBalance.currency</td>\n<td>string</td>\n<td>Currency code following ISO 4217.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-error-code\">Response Error Code</h4>\n<p><a href=\"#intro\">Error code model</a></p>\n","urlObject":{"path":["snap-api","v1","balance-inquiry"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"13035e05-5170-4ec5-838c-3528c94a40af","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-23-10T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"url":"{{baseURL}}/snap-api/v1/balance-inquiry"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"Date","value":"Fri, 05 2025 12:56 GMT","description":"","type":"text"},{"key":"Content-Length","value":"207","description":"","type":"text"},{"key":"Connection","value":"keep-alive","description":"","type":"text"},{"key":"Cache-Control","value":"no-cache, private","description":"","type":"text"},{"key":"Server","value":"FrankenPHP Caddy","description":"","type":"text"},{"key":"Vary","value":"Origin","description":"","type":"text"},{"key":"X-Powered-By","value":"PHP/8.4.15","description":"","type":"text"},{"key":"X-Ratelimit-Limit","value":"600","description":"","type":"text"},{"key":"X-Ratelimit-Remaining","value":"599","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": 2001100,\n    \"responseMessage\": \"Request has been processed successfully\",\n    \"accountInfos\": [\n        {\n            \"balanceType\": \"Wallet\",\n            \"amount\": {\n                \"value\": \"30255.00\",\n                \"currency\": \"IDR\"\n            },\n            \"floatAmount\": {\n                \"value\": \"0.00\",\n                \"currency\": \"IDR\"\n            },\n            \"holdAmount\": {\n                \"value\": \"0.00\",\n                \"currency\": \"IDR\"\n            },\n            \"availableBalance\": {\n                \"value\": \"30255.00\",\n                \"currency\": \"IDR\"\n            }\n        }\n    ]\n}"}],"_postman_id":"63a83b21-84ae-4207-a2b5-8efd7993f573"}],"id":"fcd83685-96c4-4e5d-9cb4-1cae4ede52ca","_postman_id":"fcd83685-96c4-4e5d-9cb4-1cae4ede52ca","description":""},{"name":"PAY-IN","item":[{"name":"VIRTUAL ACCOUNT","item":[{"name":"Create Virtual Account","id":"decba034-d990-4b18-9bcd-333e9d57ae61","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"virtualAccountName\": \"Eko Sugema\",\n  \"trxId\": \"202501025224500001\",\n  \"totalAmount\": {\n    \"value\": \"10000.00\",\n    \"currency\": \"IDR\"\n  },\n  \"additionalInfo\": {\n    \"channelCode\": \"VA_BCA\",\n    \"reusability\": \"ONE_TIME_USE\",\n    \"expiredDate\": \"2025-10-27T00:00:00.000Z\"\n  },\n  \"freeTexts\": [\n    {\n      \"indonesia\": \"Google Play 10K\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/transfer-va/create-va","description":"<p>This endpoint allows partners to create a <strong>Virtual Account (VA)</strong> under Dalang Pay’s payment system.</p>\n<p>Each VA can be configured for <strong>one-time use</strong> or <strong>multi-use</strong>, depending on your business requirements.</p>\n<p>It can be accessed using either <strong>Symmetric</strong> or <strong>Asymmetric Signature Authentication</strong>, depending on the client configuration.</p>\n<p>The request must be signed properly using the <code>X-Signature</code> header and timestamped with <code>X-Timestamp</code> to ensure security and compliance with <strong>SNAP</strong> standards.</p>\n<blockquote>\n<p>In production, the client is responsible for generating and sending a valid <code>X-Signature</code>. Dalang Pay will validate the signature but will not generate it for you. </p>\n</blockquote>\n<h4 id=\"request-headers\"><strong>Request Headers</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Authorization</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Bearer token required for Symmetric Signature (HMAC-SHA512). Token obtained via <code>/access-token/b2b</code>.</td>\n</tr>\n<tr>\n<td><strong>X-Client-Key</strong></td>\n<td>string</td>\n<td>Conditional</td>\n<td>Required only for Asymmetric Signature (RSA-SHA256). Client identifier registered in Dalang Pay Dashboard.</td>\n</tr>\n<tr>\n<td><strong>X-Timestamp</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 timestamp (<code>YYYY-MM-DDTHH:mm:ssZ</code>). Used for replay protection. Request is valid for 60 seconds from this timestamp.</td>\n</tr>\n<tr>\n<td><strong>X-Signature</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Digital signature generated using Symmetric (HMAC-SHA512) or Asymmetric (RSA-SHA256). Ensures payload integrity and authenticity.</td>\n</tr>\n<tr>\n<td><strong>X-Signature-Id</strong></td>\n<td>string</td>\n<td>Optional</td>\n<td>Used when rotating/changing signature keys. Indicates which key is used for validating the signature.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Ensure all headers are generated <strong>before sending</strong> the request body.<br />Requests with invalid or expired signatures will be rejected. </p>\n</blockquote>\n<h4 id=\"request-body\"><strong>Request Body</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th><strong>Required</strong></th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>virtualAccountName</td>\n<td>string</td>\n<td>Yes</td>\n<td>Name that will be displayed on the generated virtual account.</td>\n</tr>\n<tr>\n<td>trxId</td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique transaction identifier generated by the client. It is used to track the VA transaction accross systems.</td>\n</tr>\n<tr>\n<td>expiredDate</td>\n<td>string</td>\n<td>Optional</td>\n<td>Expiration date and time in ISO 8601 UTC format. After this date, the VA becomes invalid.</td>\n</tr>\n<tr>\n<td>totalAmount</td>\n<td>object</td>\n<td>Yes</td>\n<td>The total transaction amount, containing both value and currency.</td>\n</tr>\n<tr>\n<td>totalAmount.value</td>\n<td>string</td>\n<td>Yes</td>\n<td>The total transaction amount to be paid.</td>\n</tr>\n<tr>\n<td>totalAmount.currency</td>\n<td>string</td>\n<td>Yes</td>\n<td>Currency code following ISO 4217 standard. Currently supports IDR.</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Yes</td>\n<td>Extra parameters to define metadata for the VA.</td>\n</tr>\n<tr>\n<td>additionalInfo.channelCode</td>\n<td>string</td>\n<td>Yes</td>\n<td>Payment channel identifier. Value: OUTLET_ALFAMART, OUTLET_INDOMARET, VA_BCA, VA_BRI, VA_CIMB, VA_BNI, VA_MANDIRI, VA_MAYBANK, VA_PERMATA, VA_DANAMON, VA_BSI, VA_BNC, VA_OCBC, VA_MUAMALAT, VA_SINAR_MAS</td>\n</tr>\n<tr>\n<td>additionalInfo.reusability</td>\n<td>string</td>\n<td>Yes</td>\n<td>Defines if the VA can be reused for multiple payments. Values: \"ONE_TIME_USE\" or \"MULTI_USE\"</td>\n</tr>\n<tr>\n<td>additionalInfo.webhookUrl</td>\n<td>string</td>\n<td>Optional</td>\n<td>URL endpoint for receiving asynchronous payment status notifications (callback).</td>\n</tr>\n<tr>\n<td>additionalInfo.expiredDate</td>\n<td>string</td>\n<td>Optional</td>\n<td>Expiration date and time in ISO 8601 UTC format. After this date, the VA becomes invalid.</td>\n</tr>\n<tr>\n<td>freeTexts</td>\n<td>array(object)</td>\n<td>Optional</td>\n<td>List of custom messages of labels that can appear in the payment screen or receipt, in multiple languages.</td>\n</tr>\n<tr>\n<td>freeTexts.english</td>\n<td>string</td>\n<td>Optional</td>\n<td>English version of the custom message.</td>\n</tr>\n<tr>\n<td>freeTexts.indonesia</td>\n<td>string</td>\n<td>Optional</td>\n<td>Indonesian version of the custom message.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-body-explanation-http-200\"><strong>Response Body Explanation (HTTP 200)</strong></h4>\n<p><strong>Snap Service Code: 27</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>responseCode</td>\n<td>string</td>\n<td>Response status code from Dalang Pay. A successful request returns a code 200XX00.</td>\n</tr>\n<tr>\n<td>responseMessage</td>\n<td>string</td>\n<td>Message describing the response.</td>\n</tr>\n<tr>\n<td>virtualAccountData</td>\n<td>object</td>\n<td>Object that contains detailed information about the created VA.</td>\n</tr>\n<tr>\n<td>virtualAccountData.virtualAccountNo</td>\n<td>string</td>\n<td>The VA number generated by Dalang Pay. Used by the payer to make payments.</td>\n</tr>\n<tr>\n<td>virtualAccountData.virtualAccountName</td>\n<td>string</td>\n<td>The name registered under the VA. Matches the name sent in the request body.</td>\n</tr>\n<tr>\n<td>trxId</td>\n<td>string</td>\n<td>Unique transaction identifier corresponding to the VA creation request. This value mirrors the trxId sent in the request body.</td>\n</tr>\n<tr>\n<td>expiredDate</td>\n<td>string</td>\n<td>Expiration date and time in ISO 8601 UTC format. After this date, the VA becomes invalid.</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Extra parameters to define metadata for the VA.</td>\n</tr>\n<tr>\n<td>additionalInfo.id</td>\n<td>string</td>\n<td>Unique identifier for the virtual account within Dalang Pay’s system.</td>\n</tr>\n<tr>\n<td>additionalInfo.status</td>\n<td>string</td>\n<td>Current payment status of the VA. Possible values: \"active\", \"inactive\".</td>\n</tr>\n<tr>\n<td>additionalInfo.channelCode</td>\n<td>string</td>\n<td>Payment channel used to create the VA.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-error-code\">Response Error Code</h4>\n<p><a href=\"#intro\">Error code model</a></p>\n","urlObject":{"path":["snap-api","v1","transfer-va","create-va"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"e7b617a8-3683-49e9-b1c5-362e425cd3f0","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"virtualAccountName\": \"Eko Sugema\",\n  \"trxId\": \"202501025224500001\",\n  \"totalAmount\": {\n    \"value\": \"10000.00\",\n    \"currency\": \"IDR\"\n  },\n  \"additionalInfo\": {\n    \"channelCode\": \"VA_BCA\",\n    \"reusability\": \"ONE_TIME_USE\",\n    \"expiredDate\": \"2025-10-27T00:00:00.000Z\"\n  },\n  \"freeTexts\": [\n    {\n      \"indonesia\": \"Google Play 10K\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/transfer-va/create-va"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 05 2025 12:56 GMT","description":"","type":"text"},{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"Content-Length","value":"207","description":"","type":"text"},{"key":"Connection","value":"keep-alive","description":"","type":"text"},{"key":"Cache-Control","value":"no-cache, private","description":"","type":"text"},{"key":"Server","value":"FrankenPHP Caddy","description":"","type":"text"},{"key":"Vary","value":"Origin","description":"","type":"text"},{"key":"X-Powered-By","value":"PHP/8.4.15","description":"","type":"text"},{"key":"X-Ratelimit-Limit","value":"600","description":"","type":"text"},{"key":"X-Ratelimit-Remaining","value":"599","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": \"2002700\",\n    \"responseMessage\": \"Success\",\n    \"virtualAccountData\": {\n        \"virtualAccountNo\": \"1551413290000286\",\n        \"virtualAccountName\": \"Eko Sugema\",\n        \"trxId\": \"202501025224500001\",\n        \"expiredDate\": \"2056-10-25T05:42:16.000+07:00\",\n        \"additionalInfo\": {\n            \"id\": \"01K8CY75HZQ5MFV4D2EMXDXBBY\",\n            \"status\": \"active\",\n            \"reusability\": \"ONE_TIME_USE\",\n            \"channelCode\": \"VA_BCA\"\n        }\n    }\n}"}],"_postman_id":"decba034-d990-4b18-9bcd-333e9d57ae61"}],"id":"d9710f41-075f-405d-ad0c-ad81b4001923","description":"<h2 id=\"overview\">Overview</h2>\n<p>Dalang Pay provides a complete Virtual Account (VA) payment solution that allows customers to make payments through various Indonesian banks. Partners can create one-time or multi-use Virtual Accounts depending on operational needs.</p>\n<h2 id=\"supported-virtual-account-channels\">Supported Virtual Account Channels</h2>\n<p>Dalang Pay support multiple banks and financial institutions.</p>\n<p>Each channel is identified using a <code>channelCode</code>.</p>\n<p>Example VA channels include:</p>\n<ul>\n<li><p><code>VA_BCA</code> - Bank Central Asia</p>\n</li>\n<li><p><code>VA_BNI</code> - Bank Negara Indonesia</p>\n</li>\n<li><p><code>VA_MANDIRI</code> - Bank Mandiri</p>\n</li>\n<li><p><code>VA_BRI</code> - Bank Rakyat Indonesia</p>\n</li>\n<li><p><code>VA_PERMATA</code> - Permata Bank</p>\n</li>\n</ul>\n<blockquote>\n<p><strong>The available channels may vary based on your merchant setup.</strong><br />Some channels may require additional configuration or approval depending on your business type. </p>\n</blockquote>\n<p>The <strong>latest and complete</strong> product/channel list can be viewed through the Dalang Pay Client Portal.</p>\n<h2 id=\"product-list\">Product List</h2>\n<p>You can view the full VA product catalog through the portal.</p>\n<p><strong>URL:</strong> <a href=\"https://dashboard.dalangpay.com/payment-channels\">dashboard.dalangpay.com/payment-channels</a> <em>(Login Required)</em></p>\n<blockquote>\n<p><strong>Important:</strong><br />Access to the portal requires merchant credentials created by the Dalang Pay Admin team.<br />If your have not received your credentials, please contact Dalang Pay Support.</p>\n</blockquote>\n","_postman_id":"d9710f41-075f-405d-ad0c-ad81b4001923"},{"name":"QRIS","item":[{"name":"Create QR MPM","id":"15faba5a-77ef-4025-a15c-23078e427285","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"partnerReferenceNo\": \"20251025025500001\",\n    \"amount\": {\n        \"value\": \"1000.00\",\n        \"currency\": \"IDR\"\n    },\n    \"additionalInfo\": {\n        \"channelCode\": \"CODE_QRIS\",\n        \"reusability\": \"ONE_TIME_USE\",\n        \"expiredDate\": \"2025-10-27T00:00:00.000Z\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/qr/qr-mpm-generate","description":"<p>The <strong>Generate QR MPM (Merchant Presented Mode)</strong> endpoint is used to create a QR code that can be displayed by the merchant for customer payments.</p>\n<p>Customers scan this QR using preferred payment application (QRIS-compliant) to complete a transaction.</p>\n<p>It can be accessed using either <strong>Symmetric</strong> or <strong>Asymmetric Signature Authentication</strong>, depending on the client configuration.</p>\n<p>The request must be signed properly using the <code>X-Signature</code> header and timestamped with <code>X-Timestamp</code> to ensure security and compliance with <strong>SNAP</strong> standards.</p>\n<blockquote>\n<p>In production, the client is responsible for generating and sending a valid <code>X-Signature</code>. Dalang Pay will validate the signature but will not generate it for you. </p>\n</blockquote>\n<h4 id=\"request-headers\"><strong>Request Headers</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Authorization</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Bearer token required for Symmetric Signature (HMAC-SHA512). Token obtained via <code>/access-token/b2b</code>.</td>\n</tr>\n<tr>\n<td><strong>X-Client-Key</strong></td>\n<td>string</td>\n<td>Conditional</td>\n<td>Required only for Asymmetric Signature (RSA-SHA256). Client identifier registered in Dalang Pay Dashboard.</td>\n</tr>\n<tr>\n<td><strong>X-Timestamp</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 timestamp (<code>YYYY-MM-DDTHH:mm:ssZ</code>). Used for replay protection. Request is valid for 60 seconds from this timestamp.</td>\n</tr>\n<tr>\n<td><strong>X-Signature</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Digital signature generated using Symmetric (HMAC-SHA512) or Asymmetric (RSA-SHA256). Ensures payload integrity and authenticity.</td>\n</tr>\n<tr>\n<td><strong>X-Signature-Id</strong></td>\n<td>string</td>\n<td>Optional</td>\n<td>Used when rotating/changing signature keys. Indicates which key is used for validating the signature.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Ensure all headers are generated <strong>before sending</strong> the request body.<br />Requests with invalid or expired signatures will be rejected. </p>\n</blockquote>\n<h4 id=\"request-body\"><strong>Request Body</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th><strong>Required</strong></th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>partnerReferenceNo</td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique transaction or reference number generated by the merchant system. Used to reconcile payment results.</td>\n</tr>\n<tr>\n<td>amount</td>\n<td>object</td>\n<td>Yes</td>\n<td>The total transaction amount, containing both value and currency.</td>\n</tr>\n<tr>\n<td>amount.value</td>\n<td>string</td>\n<td>Yes</td>\n<td>The total transaction amount to be paid.</td>\n</tr>\n<tr>\n<td>amount.currency</td>\n<td>string</td>\n<td>Yes</td>\n<td>Currency code following ISO 4217 standard. Currently supports IDR.</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Yes</td>\n<td>Extra parameters to define metadata for the QR.</td>\n</tr>\n<tr>\n<td>additionalInfo.channelCode</td>\n<td>string</td>\n<td>Yes</td>\n<td>Payment channel identifier. Value: CODE_QRIS</td>\n</tr>\n<tr>\n<td>additionalInfo.reusability</td>\n<td>string</td>\n<td>Yes</td>\n<td>Defines if the QR can be reused for multiple payments. Values: \"ONE_TIME_USE\" or \"MULTI_USE\"</td>\n</tr>\n<tr>\n<td>additionalInfo.expiredDate</td>\n<td>string</td>\n<td>Optional</td>\n<td>Expiration date and time in ISO 8601 UTC format. After this date, the QR becomes invalid.</td>\n</tr>\n<tr>\n<td>additionalInfo.webhookUrl</td>\n<td>string</td>\n<td>Optional</td>\n<td>URL endpoint for receiving asynchronous payment status notifications (callback).</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-body-explanation-http-200\"><strong>Response Body Explanation (HTTP 200)</strong></h4>\n<p><strong>Snap Service Code: 47</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>responseCode</td>\n<td>string</td>\n<td>Response status code from Dalang Pay. A successful request returns a code 200XX00.</td>\n</tr>\n<tr>\n<td>responseMessage</td>\n<td>string</td>\n<td>Message describing the response.</td>\n</tr>\n<tr>\n<td>referenceNo</td>\n<td>string</td>\n<td>Unique reference number assigned by Dalang Pay for internal tracking</td>\n</tr>\n<tr>\n<td>partnerReferenceNo</td>\n<td>string</td>\n<td>Unique transaction or reference number generated by the merchant system. Used to reconcile payment results.</td>\n</tr>\n<tr>\n<td>qrContent</td>\n<td>string</td>\n<td>The generated QRIS data string following Bank Indonesia's QRIS standard (can be rendered into a QR image).</td>\n</tr>\n<tr>\n<td>merchantName</td>\n<td>string</td>\n<td>Merchant name associated with the generated QR</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Extra parameters to define metadata for the QR.</td>\n</tr>\n<tr>\n<td>additionalInfo.status</td>\n<td>string</td>\n<td>Current payment status of the QR. Possible values: \"active\", \"inactive\".</td>\n</tr>\n<tr>\n<td>additionalInfo.channelCode</td>\n<td>string</td>\n<td>Payment channel used to create the QR.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-error-code\">Response Error Code</h4>\n<p><a href=\"#intro\">Error code model</a></p>\n","urlObject":{"path":["snap-api","v1","qr","qr-mpm-generate"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"1a3501d1-3b30-48f1-afa2-6098f7c40ef2","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"partnerReferenceNo\": \"20251025025500001\",\n    \"amount\": {\n        \"value\": \"1000.00\",\n        \"currency\": \"IDR\"\n    },\n    \"additionalInfo\": {\n        \"channelCode\": \"CODE_QRIS\",\n        \"reusability\": \"ONE_TIME_USE\",\n        \"expiredDate\": \"2025-10-27T00:00:00.000Z\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/qr/qr-mpm-generate"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 05 2025 12:56 GMT","description":"","type":"text"},{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"Content-Length","value":"207","description":"","type":"text"},{"key":"Connection","value":"keep-alive","description":"","type":"text"},{"key":"Cache-Control","value":"no-cache, private","description":"","type":"text"},{"key":"Content-Encoding","value":"br","description":"","type":"text"},{"key":"Server","value":"FrankenPHP Caddy","description":"","type":"text"},{"key":"Vary","value":"Origin","description":"","type":"text"},{"key":"Vary","value":"Accept-Encoding","description":"","type":"text"},{"key":"X-Powered-By","value":"PHP/8.4.15","description":"","type":"text"},{"key":"X-Ratelimit-Limit","value":"600","description":"","type":"text"},{"key":"X-Ratelimit-Remaining","value":"599","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": 2004700,\n    \"responseMessage\": \"Success\",\n    \"referenceNo\": \"01K8CYB7GAP6V6VVS553WJA5NC\",\n    \"partnerReferenceNo\": \"20251025025500001\",\n    \"qrContent\": \"00020101021226640017ID.CO.DANAMON.WWW0118936000110000283342021010314497010303UME51440014ID.CO.QRIS.WWW0215ID10254233746810303UME6279011617613713422129290519QRA17613710701028120709199573522991900020001093585739195303360540410006005BATAM520454115913Banana Gaming5802ID61052944463045528\",\n    \"merchantName\": \"ChangPay\",\n    \"additionalInfo\": {\n        \"status\": \"active\",\n        \"reusability\": \"ONE_TIME_USE\",\n        \"channelCode\": \"CODE_QRIS\"\n    }\n}"}],"_postman_id":"15faba5a-77ef-4025-a15c-23078e427285"}],"id":"9bcf1a99-6338-4afb-b7b1-aff01bbe9278","description":"<h2 id=\"overview\">Overview</h2>\n<p>Dalang Pay provides QRIS MPM (Merchant Presented Mode) payment services that allow customers to make payments by scanning a QR code displayed by the merchant. QRIS ensures interoperability across all Indonesian payment service providers (banks, e-wallets, fintech), enabling a seamless and standardized checkout experience.</p>\n<p>Partners can generate <strong>transaction-specific QR codes (QRIS Dynamic)</strong> depending on operational needs.</p>\n<h2 id=\"qris-types-supported\">QRIS Types Supported</h2>\n<p><strong>QRIS Dynamic (MPM Dynamic)</strong></p>\n<p>A dynamically generated QR tied to a specific transaction.</p>\n<p>Contains:</p>\n<ul>\n<li><p>Amount</p>\n</li>\n<li><p>Unique reference</p>\n</li>\n<li><p>Validity period</p>\n</li>\n<li><p>Single-use payment mapping</p>\n</li>\n</ul>\n<p>Example QRIS <code>channelCode</code>:</p>\n<ul>\n<li><code>QR_CODE</code></li>\n</ul>\n<p>This is the primary QR type supported by Dalang Pay at the moment.</p>\n<blockquote>\n<p><strong>Note:</strong><br />As of now, Dalang Pay supports <strong>QRIS Dynamic only</strong>.<br />Support for <strong>QRIS Static</strong> is planned and will be made available in a future update.<br />Merchants will be notified once QRIS Static is officialy supported. </p>\n</blockquote>\n<h2 id=\"product-list\">Product List</h2>\n<p>You can view the complete list of QRIS channels through the portal.</p>\n<p><strong>URL:</strong> <a href=\"https://dashboard.dalangpay.com/payment-channels\">dashboard.dalangpay.com/payment-channels</a> <em>(Login Required)</em></p>\n<blockquote>\n<p><strong>Important:</strong><br />Access to the portal requires merchant credentials created by the Dalang Pay Admin team.<br />If your have not received your credentials, please contact Dalang Pay Support.</p>\n</blockquote>\n","_postman_id":"9bcf1a99-6338-4afb-b7b1-aff01bbe9278"},{"name":"DIRECT DEBIT","item":[{"name":"Create Payment","id":"fe8129fa-83cd-4250-8412-ceb2ee98960b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"partnerReferenceNo\": \"01JE2Z9ZHCBTM75T07MACVZHB1\",\n  \"validUpTo\": \"2025-10-26T00:00:00.000Z\",\n  \"amount\": {\n    \"value\": \"10000.00\",\n    \"currency\": \"IDR\"\n  },\n  \"additionalInfo\": {\n    \"accountNumber\": 62895342279156\n  },\n  \"payOptionDetails\": [\n    {\n      \"payMethod\": \"E_WALLET\",\n      \"payOption\": \"EWALLET_SHOPEEPAY\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/debit/payment-host-to-host","description":"<p><strong>The Create Payment (Direct Debit)</strong> endpoint is used to initiate a <strong>host-to-host debit transaction</strong> from the customer’s account to the merchant’s account through Dalang Pay’s Direct Debit channel.</p>\n<p>It can be accessed using either <strong>Symmetric</strong> or <strong>Asymmetric Signature Authentication</strong>, depending on the client configuration.</p>\n<p>The request must be signed properly using the <code>X-Signature</code> header and timestamped with <code>X-Timestamp</code> to ensure security and compliance with <strong>SNAP</strong> standards.</p>\n<blockquote>\n<p>In production, the client is responsible for generating and sending a valid <code>X-Signature</code>. Dalang Pay will validate the signature but will not generate it for you. </p>\n</blockquote>\n<h4 id=\"request-headers\"><strong>Request Headers</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Authorization</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Bearer token required for Symmetric Signature (HMAC-SHA512). Token obtained via <code>/access-token/b2b</code>.</td>\n</tr>\n<tr>\n<td><strong>X-Client-Key</strong></td>\n<td>string</td>\n<td>Conditional</td>\n<td>Required only for Asymmetric Signature (RSA-SHA256). Client identifier registered in Dalang Pay Dashboard.</td>\n</tr>\n<tr>\n<td><strong>X-Timestamp</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 timestamp (<code>YYYY-MM-DDTHH:mm:ssZ</code>). Used for replay protection. Request is valid for 60 seconds from this timestamp.</td>\n</tr>\n<tr>\n<td><strong>X-Signature</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Digital signature generated using Symmetric (HMAC-SHA512) or Asymmetric (RSA-SHA256). Ensures payload integrity and authenticity.</td>\n</tr>\n<tr>\n<td><strong>X-Signature-Id</strong></td>\n<td>string</td>\n<td>Optional</td>\n<td>Used when rotating/changing signature keys. Indicates which key is used for validating the signature.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Ensure all headers are generated <strong>before sending</strong> the request body.<br />Requests with invalid or expired signatures will be rejected. </p>\n</blockquote>\n<h4 id=\"request-body\"><strong>Request Body</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th><strong>Required</strong></th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>partnerReferenceNo</td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique transaction or reference number generated by the merchant system. Used to reconcile payment results.</td>\n</tr>\n<tr>\n<td>validUpTo</td>\n<td>string</td>\n<td>optional</td>\n<td>Expiration time for this payment request in ISO-8601 format.</td>\n</tr>\n<tr>\n<td>amount</td>\n<td>object</td>\n<td>Yes</td>\n<td>The total transaction amount, containing both value and currency.</td>\n</tr>\n<tr>\n<td>amount.value</td>\n<td>string</td>\n<td>Yes</td>\n<td>The total transaction amount to be paid.</td>\n</tr>\n<tr>\n<td>amount.currency</td>\n<td>string</td>\n<td>Yes</td>\n<td>Currency code following ISO 4217 standard. Currently supports IDR.</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Yes</td>\n<td>Extra parameters to define metadata for the payment.</td>\n</tr>\n<tr>\n<td>additionalInfo.accountNumber</td>\n<td>string</td>\n<td>Yes</td>\n<td>The destination account or merchant account that will receive the funds.</td>\n</tr>\n<tr>\n<td>additionalInfo.webhookUrl</td>\n<td>string</td>\n<td>Optional</td>\n<td>URL endpoint for receiving asynchronous payment status notifications (callback).</td>\n</tr>\n<tr>\n<td>payOptionDetails</td>\n<td>array(object)</td>\n<td>Yes</td>\n<td>List of available payment methods or channels for the debit.</td>\n</tr>\n<tr>\n<td>payOptionDetails.payMethod</td>\n<td>string</td>\n<td>Yes</td>\n<td>The customer's account number to be debited. This is the source of funds. Value: E_WALLET, CARD</td>\n</tr>\n<tr>\n<td>payOptionDetails.payOption</td>\n<td>string</td>\n<td>Yes</td>\n<td>Specific payment option or provider code related to the payMethod</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-body-explanation-http-200\"><strong>Response Body Explanation (HTTP 200)</strong></h4>\n<p><strong>Snap Service Code: 54</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>responseCode</td>\n<td>string</td>\n<td>Response status code from Dalang Pay. A successful request returns a code 200XX00.</td>\n</tr>\n<tr>\n<td>responseMessage</td>\n<td>string</td>\n<td>Message describing the response.</td>\n</tr>\n<tr>\n<td>referenceNo</td>\n<td>string</td>\n<td>Unique reference number assigned by Dalang Pay for internal tracking</td>\n</tr>\n<tr>\n<td>partnerReferenceNo</td>\n<td>string</td>\n<td>Unique transaction or reference number generated by the merchant system. Used to reconcile payment results.</td>\n</tr>\n<tr>\n<td>appRedirectUrl</td>\n<td>string</td>\n<td>URL to redirect the customer in-app for authorization or confirmation (mobile environment)</td>\n</tr>\n<tr>\n<td>webRedirectUrl</td>\n<td>string</td>\n<td>URL to redirect the customer on the web browser for authorization or confirmation (web environment)</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-error-code\">Response Error Code</h4>\n<p><a href=\"#intro\">Error code model</a></p>\n","urlObject":{"path":["snap-api","v1","debit","payment-host-to-host"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"6478ed68-ec4c-4ba3-b4df-c59901a15b58","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-23-10T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"partnerReferenceNo\": \"01JE2Z9ZHCBTM75T07MACVZHB1\",\n  \"validUpTo\": \"2025-10-26T00:00:00.000Z\",\n  \"amount\": {\n    \"value\": \"10000.00\",\n    \"currency\": \"IDR\"\n  },\n  \"additionalInfo\": {\n    \"accountNumber\": 62895342279156\n  },\n  \"payOptionDetails\": [\n    {\n      \"payMethod\": \"E_WALLET\",\n      \"payOption\": \"EWALLET_SHOPEEPAY\"\n    }\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/debit/payment-host-to-host"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 05 2025 12:56 GMT","description":"","type":"text"},{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"Content-Length","value":"207","description":"","type":"text"},{"key":"Connection","value":"keep-alive","description":"","type":"text"},{"key":"Cache-Control","value":"no-cache, private","description":"","type":"text"},{"key":"Server","value":"FrankenPHP Caddy","description":"","type":"text"},{"key":"Vary","value":"Origin","description":"","type":"text"},{"key":"X-Powered-By","value":"PHP/8.4.15","description":"","type":"text"},{"key":"X-Ratelimit-Limit","value":"600","description":"","type":"text"},{"key":"X-Ratelimit-Remaining","value":"599","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": \"2005400\",\n    \"responseMessage\": \"Request has been processed successfully\",\n    \"referenceNo\": \"01K8CYFZWMN4R78TBCJYVCGZ7C\",\n    \"partnerReferenceNo\": \"01JE2Z9ZHCBTM75T07MACVZHB1\",\n    \"appRedirectUrl\": \"https://urls\",\n    \"webRedirectUrl\": \"https://urls\"\n}"}],"_postman_id":"fe8129fa-83cd-4250-8412-ceb2ee98960b"}],"id":"8412ddc5-7966-4a10-b962-1ff4260d3efd","description":"<h2 id=\"overview\">Overview</h2>\n<p>Dalang Pay's Direct Debit API enables customers to pay directly from their registered funding source such as bank accounts, e-wallets, or card-based instruments.</p>\n<h2 id=\"supported-direct-debit-methods\">Supported Direct Debit Methods</h2>\n<p>Dalang Pay supports multiple Direct Debit methods under the <code>payOptionDetails</code> parameter. Each method may come with different requirements depending on the customer's payment instrument.</p>\n<p>Currently supported values for <code>payMethod</code> include:</p>\n<ul>\n<li><p><code>E_WALLET</code> - Direct debit using supported e-wallet providers</p>\n</li>\n<li><p><code>CARD</code> - Payment using tokenized debit/credit cards <em>(Coming Soon)</em></p>\n</li>\n</ul>\n<blockquote>\n<p><strong>Note:</strong><br />The availability of each method may vary based on your merchant configuration.<br />Additional Direct Debit sources (such as bank accounts via Open Banking) may be enabled in future releases based on eligibility and regulatory approval. </p>\n</blockquote>\n<h3 id=\"supported-e-wallets-paymethod--e_wallet\"><strong>Supported E-Wallets (payMethod :</strong> E_WALLET)</h3>\n<p>The following e-wallet providers are available under <code>payOption</code>:</p>\n<ul>\n<li><p><code>EWALLET_OVO</code> - OVO</p>\n</li>\n<li><p><code>EWALLET_SHOPEEPAY</code> - ShopeePay</p>\n</li>\n<li><p><code>EWALLET_DANA</code> - DANA</p>\n</li>\n<li><p><code>EWALLET_GOPAY</code> - GOPAY</p>\n</li>\n<li><p><code>EWALLET_LINKAJA</code> - LinkAja</p>\n</li>\n</ul>\n<p>Each e-wallet may require:</p>\n<ul>\n<li><p>Customer account registration</p>\n</li>\n<li><p>Authorization approval (OTP, PIN, biometric, or in-app confirmation)</p>\n</li>\n<li><p>Tokenization for recurring or subscription-type transactions</p>\n</li>\n</ul>\n<h2 id=\"product-list\">Product List</h2>\n<p>You can view the full list of supported Direct Debit providers through the portal.</p>\n<p><strong>URL:</strong> <a href=\"https://dashboard.dalangpay.com/payment-channels\">dashboard.dalangpay.com/payment-channels</a> <em>(Login Required)</em></p>\n<blockquote>\n<p><strong>Important:</strong><br />Access to the portal requires merchant credentials created by the Dalang Pay Admin team.<br />If your have not received your credentials, please contact Dalang Pay Support.</p>\n</blockquote>\n","_postman_id":"8412ddc5-7966-4a10-b962-1ff4260d3efd"}],"id":"e33975a7-e019-4ac6-8415-dc06da640bfc","description":"<p>All APIs that allow customers to send funds to the merchant via Virtual Account, QRIS, or direct debit channels.</p>\n","_postman_id":"e33975a7-e019-4ac6-8415-dc06da640bfc"},{"name":"PAY-OUT","item":[{"name":"DISBURSEMENT","item":[{"name":"Account Inquiry","id":"2a08da01-dbbe-4dd5-88ea-b12e8dbbec75","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"customerNumber\": \"5432187678\",\n    \"amount\": {\n        \"value\": \"10000.00\",\n        \"currency\": \"IDR\"\n    },\n    \"additionalInfo\": {\n        \"beneficiaryBankCode\": \"DISB_BCA\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/emoney/bank-account-inquiry","description":"<p>The <strong>Account Inquiry</strong> endpoint is used to <strong>validate the recipient's bank account</strong> before sending funds. It checks whether the given account number and bank code are valid and retrieves the <strong>account holder's</strong> <strong>name</strong> for confirmation.</p>\n<p>This step ensures payment accuracy and prevents transfer errors due to incorrect beneficiary data.</p>\n<h4 id=\"request-headers\"><strong>Request Headers</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Authorization</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Bearer token required for Symmetric Signature (HMAC-SHA512). Token obtained via <code>/access-token/b2b</code>.</td>\n</tr>\n<tr>\n<td><strong>X-Client-Key</strong></td>\n<td>string</td>\n<td>Conditional</td>\n<td>Required only for Asymmetric Signature (RSA-SHA256). Client identifier registered in Dalang Pay Dashboard.</td>\n</tr>\n<tr>\n<td><strong>X-Timestamp</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 timestamp (<code>YYYY-MM-DDTHH:mm:ssZ</code>). Used for replay protection. Request is valid for 60 seconds from this timestamp.</td>\n</tr>\n<tr>\n<td><strong>X-Signature</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Digital signature generated using Symmetric (HMAC-SHA512) or Asymmetric (RSA-SHA256). Ensures payload integrity and authenticity.</td>\n</tr>\n<tr>\n<td><strong>X-Signature-Id</strong></td>\n<td>string</td>\n<td>Optional</td>\n<td>Used when rotating/changing signature keys. Indicates which key is used for validating the signature.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Ensure all headers are generated <strong>before sending</strong> the request body.<br />Requests with invalid or expired signatures will be rejected. </p>\n</blockquote>\n<h4 id=\"request-body\"><strong>Request Body</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th><strong>Required</strong></th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>customerNumber</td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique identifier assigned by the client to represent the inquiry request.</td>\n</tr>\n<tr>\n<td>amount</td>\n<td>object</td>\n<td>Yes</td>\n<td>The total transaction amount, containing both value and currency.</td>\n</tr>\n<tr>\n<td>amount.value</td>\n<td>string</td>\n<td>Yes</td>\n<td>The total transaction amount to be paid.</td>\n</tr>\n<tr>\n<td>amount.currency</td>\n<td>string</td>\n<td>Yes</td>\n<td>Currency code following ISO 4217 standard. Currently supports IDR.</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Yes</td>\n<td>Extra parameters to define metadata for the disbursement.</td>\n</tr>\n<tr>\n<td>additionalInfo.beneficiaryBankCode</td>\n<td>string</td>\n<td>Yes</td>\n<td>Bank code of the beneficiary's bank. Used to route the inquiry request to the correct bank network.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-body-explanation-http-200\"><strong>Response Body Explanation (HTTP 200)</strong></h4>\n<p><strong>Snap Service Code: 42</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>responseCode</td>\n<td>string</td>\n<td>Response status code from Dalang Pay. A successful request returns a code 200XX00.</td>\n</tr>\n<tr>\n<td>responseMessage</td>\n<td>string</td>\n<td>Message describing the response.</td>\n</tr>\n<tr>\n<td>referenceNo</td>\n<td>string</td>\n<td>Unique reference number assigned by Dalang Pay for internal tracking</td>\n</tr>\n<tr>\n<td>beneficiaryAccountNumber</td>\n<td>string</td>\n<td>The beneficiary’s account number that was validated. Echoed back from the request for confirmation.</td>\n</tr>\n<tr>\n<td>beneficiaryAccountName</td>\n<td>string</td>\n<td>The registered account holder name as confirmed by the destination bank. Used to verify name matching.</td>\n</tr>\n<tr>\n<td>beneficiaryBankCode</td>\n<td>string</td>\n<td>The code of the beneficiary bank used during validation.</td>\n</tr>\n<tr>\n<td>beneficiaryBankName</td>\n<td>string</td>\n<td>The official name of the beneficiary’s bank as registered in the banking network.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-error-code\">Response Error Code</h4>\n<p><a href=\"#intro\">Error code model</a></p>\n","urlObject":{"path":["snap-api","v1","emoney","bank-account-inquiry"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"2a525ed3-d5b7-444b-8aa5-1eb2ce3b39d6","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-23-10T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"customerNumber\": \"5432187678\",\n    \"amount\": {\n        \"value\": \"10000.00\",\n        \"currency\": \"IDR\"\n    },\n    \"additionalInfo\": {\n        \"beneficiaryBankCode\": \"DISB_BCA\"\n    }\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/emoney/bank-account-inquiry"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Date","value":"Fri, 05 2025 12:56 GMT","description":"","type":"text"},{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"Content-Length","value":"207","description":"","type":"text"},{"key":"Connection","value":"keep-alive","description":"","type":"text"},{"key":"Cache-Control","value":"no-cache, private","description":"","type":"text"},{"key":"Server","value":"FrankenPHP Caddy","description":"","type":"text"},{"key":"Vary","value":"Origin","description":"","type":"text"},{"key":"X-Powered-By","value":"PHP/8.4.15","description":"","type":"text"},{"key":"X-Ratelimit-Limit","value":"600","description":"","type":"text"},{"key":"X-Ratelimit-Remaining","value":"599","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": 2004200,\n    \"responseMessage\": \"Success\",\n    \"referenceNo\": \"01K8CYHV4J7TYNRWE13WDTXD3D\",\n    \"beneficiaryAccountNumber\": \"5432187678\",\n    \"beneficiaryAccountName\": \"EKO SUGEMA\",\n    \"beneficiaryBankCode\": \"DISB_BCA\",\n    \"beneficiaryBankName\": \"BCA (Bank Central Asia)\"\n}"}],"_postman_id":"2a08da01-dbbe-4dd5-88ea-b12e8dbbec75"},{"name":"Transfer to Bank","id":"a0d7938b-b53a-4088-b864-c347a2f08538","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"partnerReferenceNo\": \"01JE2Z9ZHCBTM75T07MACVZHX1\",\n  \"beneficiaryBankCode\": \"DISB_BCA\",\n  \"beneficiaryAccountNumber\": \"5432187678\",\n  \"amount\": {\n    \"value\": \"10000.00\",\n    \"currency\": \"IDR\"\n  },\n  \"additionalInfo\": {\n    \"note\": \"PROD DISB BCA\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/emoney/transfer-bank","description":"<p>The Transfer to Bank endpoint performs the actual disbursement process, transferring funds from the partner's Dalang Pay balance to a verified recipient bank account.</p>\n<p>This operation follows the two-step-model:</p>\n<ol>\n<li><p>Perform Account Inquiry (to Validate).</p>\n</li>\n<li><p>Call Transfer to Bank (to execute the fund movement).</p>\n</li>\n</ol>\n<p>Each transfer is uniquely identified by a partnerReferenceNo for reconciliate and tracking.</p>\n<h4 id=\"request-headers\"><strong>Request Headers</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th>Required</th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><strong>Authorization</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Bearer token required for Symmetric Signature (HMAC-SHA512). Token obtained via <code>/access-token/b2b</code>.</td>\n</tr>\n<tr>\n<td><strong>X-Client-Key</strong></td>\n<td>string</td>\n<td>Conditional</td>\n<td>Required only for Asymmetric Signature (RSA-SHA256). Client identifier registered in Dalang Pay Dashboard.</td>\n</tr>\n<tr>\n<td><strong>X-Timestamp</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>ISO 8601 timestamp (<code>YYYY-MM-DDTHH:mm:ssZ</code>). Used for replay protection. Request is valid for 60 seconds from this timestamp.</td>\n</tr>\n<tr>\n<td><strong>X-Signature</strong></td>\n<td>string</td>\n<td>Yes</td>\n<td>Digital signature generated using Symmetric (HMAC-SHA512) or Asymmetric (RSA-SHA256). Ensures payload integrity and authenticity.</td>\n</tr>\n<tr>\n<td><strong>X-Signature-Id</strong></td>\n<td>string</td>\n<td>Optional</td>\n<td>Used when rotating/changing signature keys. Indicates which key is used for validating the signature.</td>\n</tr>\n</tbody>\n</table>\n</div><blockquote>\n<p>Ensure all headers are generated <strong>before sending</strong> the request body.<br />Requests with invalid or expired signatures will be rejected. </p>\n</blockquote>\n<h4 id=\"request-body\"><strong>Request Body</strong></h4>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>Field</th>\n<th>Type</th>\n<th><strong>Required</strong></th>\n<th>Description</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>partnerReferenceNo</td>\n<td>string</td>\n<td>Yes</td>\n<td>Unique transaction or reference number generated by the merchant system. Used to reconcile payment results.</td>\n</tr>\n<tr>\n<td>beneficiaryBankCode</td>\n<td>string</td>\n<td>Yes</td>\n<td>Bank code identifying the destination bank where funds will be transferred.</td>\n</tr>\n<tr>\n<td>beneficiaryAccountNumber</td>\n<td>string</td>\n<td>Yes</td>\n<td>The beneficiary's account number where the funds will be sent.</td>\n</tr>\n<tr>\n<td>amount</td>\n<td>object</td>\n<td>Yes</td>\n<td>The total transaction amount, containing both value and currency.</td>\n</tr>\n<tr>\n<td>amount.value</td>\n<td>string</td>\n<td>Yes</td>\n<td>The total transaction amount to be paid.</td>\n</tr>\n<tr>\n<td>amount.currency</td>\n<td>string</td>\n<td>Yes</td>\n<td>Currency code following ISO 4217 standard. Currently supports IDR.</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Yes</td>\n<td>Extra parameters to define metadata for the disbursement.</td>\n</tr>\n<tr>\n<td>additionalInfo.note</td>\n<td>string</td>\n<td>Optional</td>\n<td>Note or remark describing the purpose of the transfer. Can include invoice or reference details.</td>\n</tr>\n<tr>\n<td>additionalInfo.webhookUrl</td>\n<td>string</td>\n<td>Optional</td>\n<td>URL endpoint for receiving asynchronous payment status notifications (callback).</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-body-explanation-http-200\"><strong>Response Body Explanation (HTTP 200)</strong></h4>\n<p><strong>Snap Service Code: 42</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th><strong>Field</strong></th>\n<th><strong>Type</strong></th>\n<th><strong>Description</strong></th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>responseCode</td>\n<td>string</td>\n<td>Response status code from Dalang Pay. A successful request returns a code 200XX00.</td>\n</tr>\n<tr>\n<td>responseMessage</td>\n<td>string</td>\n<td>Message describing the response.</td>\n</tr>\n<tr>\n<td>referenceNo</td>\n<td>string</td>\n<td>Unique reference number assigned by Dalang Pay for internal tracking</td>\n</tr>\n<tr>\n<td>partnerReferenceNo</td>\n<td>string</td>\n<td>Unique transaction or reference number generated by the merchant system. Used to reconcile payment results.</td>\n</tr>\n<tr>\n<td>beneficiaryAccountName</td>\n<td>string</td>\n<td>The registered account holder name as confirmed by the destination bank. Used to verify name matching.</td>\n</tr>\n<tr>\n<td>additionalInfo</td>\n<td>object</td>\n<td>Extra parameters to define metadata for the disbursement.</td>\n</tr>\n<tr>\n<td>additionalInfo.note</td>\n<td>string</td>\n<td>Note or remark describing the purpose of the transfer. Can include invoice or reference details.</td>\n</tr>\n</tbody>\n</table>\n</div><h4 id=\"response-error-code\">Response Error Code</h4>\n<p><a href=\"#intro\">Error code model</a></p>\n","urlObject":{"path":["snap-api","v1","emoney","transfer-bank"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"0fc0446d-d7b0-4c4b-823a-4003162314bd","name":"200 OK","originalRequest":{"method":"POST","header":[{"key":"Authorization","value":" Bearer 946a8d2c0aec0eb65737c5712b845c4d6273f9bc832dec3926a44d8a187a8710781101f7b038af99efb382402f1db2d6","type":"text"},{"key":"X-Client-Key","value":"01JE2Y4PMSF32RSV5XRWAJY2BX","type":"text"},{"key":"X-Signature","value":"1fd81deda180dbd789f5b15...22c0f04f243868dd5b2a8d","type":"text"},{"key":"X-Timestamp","value":"2025-10-23T21:37:37Z","type":"text"},{"key":"X-Signature-Id","value":"01JE2Z9ZHCBTM75T07MACVZHM5","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"partnerReferenceNo\": \"01JE2Z9ZHCBTM75T07MACVZHX1\",\n  \"beneficiaryBankCode\": \"DISB_BCA\",\n  \"beneficiaryAccountNumber\": \"5432187678\",\n  \"amount\": {\n    \"value\": \"10000.00\",\n    \"currency\": \"IDR\"\n  },\n  \"additionalInfo\": {\n    \"note\": \"PROD DISB BCA\"\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{baseURL}}/snap-api/v1/emoney/transfer-bank"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json","description":"","type":"text"},{"key":"Date","value":"Fri, 05 2025 12:56 GMT","description":"","type":"text"},{"key":"Content-Type\napplication/json\nContent-Length","value":"207","description":"","type":"text"},{"key":"Connection","value":"keep-alive","description":"","type":"text"},{"key":"Cache-Control","value":"no-cache, private","description":"","type":"text"},{"key":"Server","value":"FrankenPHP Caddy","description":"","type":"text"},{"key":"Vary","value":"Origin","description":"","type":"text"},{"key":"X-Powered-By","value":"PHP/8.4.15","description":"","type":"text"},{"key":"X-Ratelimit-Limit","value":"600","description":"","type":"text"},{"key":"X-Ratelimit-Remaining","value":"599","description":"","type":"text"}],"cookie":[],"responseTime":null,"body":"{\n    \"responseCode\": 2004200,\n    \"responseMessage\": \"Success\",\n    \"referenceNo\": \"01K87R1D89XEXFZKT0CKG10R5T\",\n    \"partnerReferenceNo\": \"01JE2Z9ZHCBTM75T07MACVZHX1\",\n    \"additionalInfo\": {\n        \"note\": \"PROD DISB OVO\"\n    }\n}"}],"_postman_id":"a0d7938b-b53a-4088-b864-c347a2f08538"}],"id":"12d8e07d-c89b-4f6e-955d-6d1a637e25e2","description":"<h2 id=\"overview\">Overview</h2>\n<p>Dalang Pay provides a <strong>Disbursement API</strong> that enables partners to perform <strong>outgoing fund transfers</strong> from their balance or settlement account to external bank accounts or supported e-wallets.</p>\n<p>This API offers a secure and standardized way to automate <strong>payouts</strong>, <strong>refunds</strong>, <strong>vendor payments</strong>, and other outbound transfers, aligned with <strong>SNAP (Standard Nasional Open API Pembayaran)</strong> specifications.</p>\n<p>Partners can initiate disbursements based on operational needs and supported payout channels.</p>\n<h2 id=\"supported-disbursement-methods\">Supported Disbursement Methods</h2>\n<p>Dalang Pay supports disbursement to Indonesian banks and major e-wallets using standardized <code>beneficiaryBankCode</code> identifiers.</p>\n<p>Each transfer request includes the destination channel code, beneficiary account number, and other relevant payment information.</p>\n<h3 id=\"supported-beneficiarybankcode-values\"><strong>Supported</strong> <code>beneficiaryBankCode</code> <strong>values:</strong></h3>\n<p><strong>Bank Transfers</strong></p>\n<ul>\n<li><p><code>DISB_BCA</code> – Bank Central Asia</p>\n</li>\n<li><p><code>DISB_PERMATA</code> – Permata Bank</p>\n</li>\n</ul>\n<p><strong>E-Wallet Transfers</strong></p>\n<ul>\n<li><p><code>DISB_EWALLET_OVO</code> – OVO</p>\n</li>\n<li><p><code>DISB_EWALLET_SHOPEEPAY</code> – ShopeePay</p>\n</li>\n<li><p><code>DISB_EWALLET_DANA</code> – DANA</p>\n</li>\n<li><p><code>DISB_EWALLET_GOJEK</code> – GoPay / GoJek</p>\n</li>\n<li><p><code>DISB_EWALLET_LINKAJA</code> – LinkAja</p>\n</li>\n</ul>\n<blockquote>\n<p>The availability of each channel may vary based on your merchant configuration and settlement setup. Additional transfer channels may be added in future updates, depending on bank partnerships and regulatory support. </p>\n</blockquote>\n<h3 id=\"disbursement-features\">Disbursement Features</h3>\n<p>Disbursement methods include:</p>\n<p><strong>Bank Account Transfer (Domestic)</strong></p>\n<p>Real-time or near real-time transfer depending on the banking partner.</p>\n<p><strong>Account Inquiry</strong></p>\n<p>Used to validate the beneficiary account before partner.</p>\n<blockquote>\n<p>Additional transfer channels may be added in the future depending on bank availability and regulatory support. </p>\n</blockquote>\n<h2 id=\"product-list--bank-coverage\">Product List &amp; Bank Coverage</h2>\n<p>A complete list of supported bank codes, settlement rules, and availability can be viewed in the.</p>\n<p><strong>URL:</strong> <a href=\"https://dashboard.dalangpay.com/payment-channels\">dashboard.dalangpay.com/payment-channels</a> <em>(Login Required)</em></p>\n<p><strong>Important:</strong><br />Access to the portal requires merchant credentials created by the Dalang Pay Admin team.<br />If your have not received your credentials, please contact Dalang Pay Support.</p>\n<h2 id=\"authentication--signature\">Authentication &amp; Signature</h2>\n<p>This module consists of two main endpoints:</p>\n<ol>\n<li><p><strong>Account Inquiry</strong> -- to validate recipient bank account details before initiating a transfer.</p>\n</li>\n<li><p><strong>Transfer to Bank</strong> -- to execute the actual disbursement (fund transfer) to a verified beneficiary account.</p>\n</li>\n</ol>\n<p>It can be accessed using either <a href=\"#aadc14e4-d6d6-45cf-955b-82765ee12d3d\">Symmetric</a> or <a href=\"#a0492d81-11fa-4ce0-98a7-c2f1daf37741\">Asymmetric</a> <strong>Signature Authentication</strong>, depending on the client configuration.</p>\n<p>The request must be signed properly using the <code>X-Signature</code> header and timestamped with <code>X-Timestamp</code> to ensure security and compliance with <strong>SNAP</strong> standards.</p>\n<blockquote>\n<p>In production, the client is responsible for generating and sending a valid <code>X-Signature</code>. Dalang Pay will validate the signature but will not generate it for you.</p>\n</blockquote>\n","_postman_id":"12d8e07d-c89b-4f6e-955d-6d1a637e25e2"}],"id":"1a21ceac-cc32-4e18-906c-98630363d574","description":"<p>All APIs used by merchants to send funds outward to bank accounts or beneficiaries.</p>\n","_postman_id":"1a21ceac-cc32-4e18-906c-98630363d574"}]}