{"info":{"_postman_id":"1fde1df1-3b34-45a4-b769-18703388d82f","name":"Paga Engine API","description":"<html><head></head><body><p>Every Paga Engine endpoint, grouped by use case, in the same order as the guides at <a href=\"https://developer-docs.paga.com\">https://developer-docs.paga.com</a>.</p>\n<p><strong>Get started</strong></p>\n<ol>\n<li>Fork this collection into your own workspace.</li>\n<li>Open the collection’s <strong>Variables</strong> tab and enter your Sandbox keys in <strong>Current value</strong>: <code>sandboxPublicKey</code>, <code>sandboxSecretKey</code> and <code>sandboxHashKey</code>.</li>\n<li>Send any request. The base URL, the <code>hash</code> header and a fresh <code>referenceNumber</code> are set for you.</li>\n</ol>\n<p><strong>Going live:</strong> add your Live keys to <code>livePublicKey</code>, <code>liveSecretKey</code> and <code>liveHashKey</code>, then change <code>mode</code> to <code>live</code>. Change it back to <code>sandbox</code> when you’re done. Postman’s console shows which one each request used.</p>\n<p>Every variable has a description in the Variables tab saying what it is and where to find it. The last three fill themselves in as you send requests.</p>\n<p>Keys go in <strong>Current value</strong> only, which stays on your computer. Never put keys in Initial value, and never share a workspace that contains Live keys.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[],"owner":"27804242","collectionId":"1fde1df1-3b34-45a4-b769-18703388d82f","publishedId":"2sBYHYuHvb","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-11-07T14:56:56.000Z"},"item":[{"name":"Checkout","item":[{"name":"1. Handle the payment notification","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: amount + timeStamp + paymentReference + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"amount\",\"timeStamp\",\"paymentReference\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","body.hash = hash;","pm.request.body.update(JSON.stringify(body, null, 2));"],"id":"7b29205c-4b3a-4e8a-bc48-182f5b05bedb"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"62c6de8e-103e-4629-814e-ac76f942ea2e"}}],"id":"39812388-b493-4de2-843f-2dd2caf0a465","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"statusCode\": \"0\",\n  \"statusMessage\": \"success\",\n  \"paymentReference\": \"Paga_Auto_Ref_20250826_132929_yjmb\",\n  \"amount\": \"10.00\",\n  \"currency\": \"NGN\",\n  \"timeStamp\": \"2025-08-26T13:36:04\",\n  \"description\": null,\n  \"customerEmail\": \"testemail2@gmail.com\",\n  \"customerPhoneNumber\": \"+2348063334156\",\n  \"hash\": \"39453c520890841fe3a837701e60b7dba3f8d737696d8fa5a39e8566b9f96948eaac792e7c03783e67033c37bf6d123e1ff181f015e729e1bcfa70bd8a16ae97\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-checkout-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent to your callback URL when a Checkout payment completes. Check the hash, then respond with HTTP 200. Don’t fulfil from the browser redirect.</p>\n<p><strong>Hash:</strong> <code>amount + timeStamp + paymentReference + hashKey</code>. Use <code>amount</code> exactly as received, such as <code>10.00</code>.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/checkout-js\">https://developer-docs.paga.com/docs/checkout-js</a></p>\n","urlObject":{"path":["your-checkout-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"39812388-b493-4de2-843f-2dd2caf0a465"},{"name":"2. Verify a charge","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"e3f00318-237f-4909-98b0-cf3976553123"}}],"id":"9d4a207c-2394-478d-b9e5-2aaa97485a57","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"paymentReference\": \"JHX-18743567\",\n  \"publicKey\": \"YOUR_PUBLIC_KEY\",\n  \"amount\": 1000,\n  \"currency\": \"NGN\"\n}","options":{"raw":{"language":"json"}}},"url":"{{checkoutBaseUrl}}/checkout/transaction/verify","description":"<p>Confirms a Checkout payment from your server at any time, using its <code>paymentReference</code>. Uses HTTP Basic only. <code>status_code</code> <code>0</code> means paid; <code>2</code> means pending.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/checkout-js\">https://developer-docs.paga.com/docs/checkout-js</a></p>\n","urlObject":{"path":["checkout","transaction","verify"],"host":["{{checkoutBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"9d4a207c-2394-478d-b9e5-2aaa97485a57"}],"id":"203ad902-36cf-468f-b09d-d2e406670531","description":"<p>Accept card, bank transfer, USSD and Paga Wallet payments on a page Paga hosts.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/checkout-js\">https://developer-docs.paga.com/docs/checkout-js</a></p>\n","_postman_id":"203ad902-36cf-468f-b09d-d2e406670531"},{"name":"Dynamic virtual account","item":[{"name":"1. Create a payment request","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"currency\",\"payer.phoneNumber\",\"payer.email\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"857c3562-fdce-4cbb-b508-10fe5f09045e"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}","try { pm.collectionVariables.set(\"lastPaymentRequestReference\", JSON.parse(pm.variables.replaceIn(pm.request.body.raw)).referenceNumber); } catch (e) {}"],"id":"df8ac52b-cead-40b8-a037-3a3eb7907494"}}],"id":"8c0dd3d6-ce4e-4c14-a24f-20577017fedf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 50,\n  \"currency\": \"NGN\",\n  \"payer\": {\n    \"name\": \"Bello Ramon\",\n    \"phoneNumber\": \"08064343187\"\n  },\n  \"payee\": {\n    \"name\": \"Your business name\"\n  },\n  \"expiryDateTimeUTC\": \"2026-11-10T15:35:00\",\n  \"isSuppressMessages\": true,\n  \"payerCollectionFeeShare\": 1,\n  \"payeeCollectionFeeShare\": 0,\n  \"isAllowPartialPayments\": false,\n  \"isAllowOverPayments\": false,\n  \"callBackUrl\": \"https://yourstore.com/webhooks/paga\",\n  \"paymentMethods\": [\n    \"BANK_TRANSFER\"\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/paymentRequest","description":"<p>Creates a payment request. The <code>paymentMethods</code> you send decide how your customer pays.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey</code>. Use an empty string for <code>payer.email</code> if you don’t send it.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/virtual-accounts\">https://developer-docs.paga.com/docs/virtual-accounts</a></p>\n","urlObject":{"path":["paymentRequest"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"8c0dd3d6-ce4e-4c14-a24f-20577017fedf"},{"name":"2. Check payment status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"e6b0b8f9-55e0-4ff5-b53a-aac3fe02d419"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"08feb933-74a1-4a43-9fa9-c9a999b27e9e"}}],"id":"10925562-16f2-420c-a755-cdccecd2a861","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/status","description":"<p>Returns the status of a payment request. The outer <code>statusCode</code> only says whether your status request worked; the payment’s own status is in <code>data.statusCode</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/virtual-accounts\">https://developer-docs.paga.com/docs/virtual-accounts</a></p>\n","urlObject":{"path":["status"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"10925562-16f2-420c-a755-cdccecd2a861"},{"name":"3. Handle the callback","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: notificationId + statusCode + externalReferenceNumber + state + outstandingBalance + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"notificationId\",\"statusCode\",\"externalReferenceNumber\",\"state\",\"outstandingBalance\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","body.hash = hash;","pm.request.body.update(JSON.stringify(body, null, 2));"],"id":"42b3637c-12d2-4b5e-a4a2-fcc2ecbc4fb6"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"a1d10907-dcc2-4f86-875a-9e6f8e68f50f"}}],"id":"737a80e6-146a-4000-87df-b0e44fee6312","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"PAYMENT_COMPLETE\",\n  \"notificationId\": \"a12ef82b-14d0-4a67-a08c-162b95154f59\",\n  \"statusCode\": \"0\",\n  \"statusMessage\": \"Payment Request has been authorized\",\n  \"externalReferenceNumber\": \"ORD-2026-0187\",\n  \"state\": \"CONSUMED\",\n  \"outstandingBalance\": 0,\n  \"paymentAmount\": 50.41,\n  \"cumulativePaymentAmount\": 50.41,\n  \"collectionFee\": 0.41,\n  \"fundingDetails\": {\n    \"payerName\": \"Bello Ramon\",\n    \"payerAccountNumber\": \"0980763285\"\n  },\n  \"hash\": \"33f9c9bd0785c2cc…\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent to your <code>callBackUrl</code> when a payment request is paid, expires or is cancelled. Check the hash, then respond with HTTP 200. Paga retries up to three times with the same <code>notificationId</code>, so de-duplicate on it.</p>\n<p><strong>Hash:</strong> <code>notificationId + statusCode + externalReferenceNumber + state + outstandingBalance + hashKey</code>. Format <code>outstandingBalance</code> with two decimal places and no commas; leave it out if it’s <code>null</code>.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/virtual-accounts\">https://developer-docs.paga.com/docs/virtual-accounts</a></p>\n","urlObject":{"path":["your-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"737a80e6-146a-4000-87df-b0e44fee6312"}],"id":"07c08999-b6fd-42eb-9137-6b03cae972c5","description":"<p>Give your customer a one-time Paga account number for a single payment by bank transfer.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/virtual-accounts\">https://developer-docs.paga.com/docs/virtual-accounts</a></p>\n","_postman_id":"07c08999-b6fd-42eb-9137-6b03cae972c5"},{"name":"Bank USSD","item":[{"name":"1. Get the customer’s bank","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"00e35fd4-4965-40ce-b0e3-ed933b1dd912"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"4b90fffc-3db0-408a-add6-c9d9686079d3"}}],"id":"409a4091-6348-4c36-80b1-16df8f973d89","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/banks","description":"<p>Lists the banks your customer can pay from, each with its <code>uuid</code>. Send the customer’s bank as <code>payer.bankId</code> for USSD and Direct Debit, or as <code>autoSweep.bankPublicId</code> for Subsidiary Accounts.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bank-ussd-payment\">https://developer-docs.paga.com/docs/bank-ussd-payment</a></p>\n","urlObject":{"path":["banks"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"409a4091-6348-4c36-80b1-16df8f973d89"},{"name":"2. Create a payment request","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"currency\",\"payer.phoneNumber\",\"payer.email\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"1374404c-d28c-44af-b115-49266ae4ed09"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}","try { pm.collectionVariables.set(\"lastPaymentRequestReference\", JSON.parse(pm.variables.replaceIn(pm.request.body.raw)).referenceNumber); } catch (e) {}"],"id":"d5273b0e-aa83-4b0a-bca8-1ab9d28c3a81"}}],"id":"b5d5ef91-6522-4369-9284-5b0480cc8016","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 2500,\n  \"currency\": \"NGN\",\n  \"payer\": {\n    \"name\": \"Bello Ramon\",\n    \"phoneNumber\": \"08064343187\",\n    \"bankId\": \"40090E2F-7446-4217-9345-7BBAB7043C4C\"\n  },\n  \"payee\": {\n    \"name\": \"Your business name\"\n  },\n  \"expiryDateTimeUTC\": \"2026-11-10T15:35:00\",\n  \"payerCollectionFeeShare\": 1,\n  \"payeeCollectionFeeShare\": 0,\n  \"callBackUrl\": \"https://yourstore.com/webhooks/paga\",\n  \"paymentMethods\": [\n    \"FUNDING_USSD\"\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/paymentRequest","description":"<p>Creates a payment request. The <code>paymentMethods</code> you send decide how your customer pays.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey</code>. Use an empty string for <code>payer.email</code> if you don’t send it.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bank-ussd-payment\">https://developer-docs.paga.com/docs/bank-ussd-payment</a></p>\n","urlObject":{"path":["paymentRequest"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b5d5ef91-6522-4369-9284-5b0480cc8016"},{"name":"3. Check payment status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"f5e0d450-3a83-4b75-8fbf-883aea19169d"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"bfef32e8-9580-4ac0-b02d-63971f5ef0e8"}}],"id":"0ad97114-1181-485c-9593-531b90a74053","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/status","description":"<p>Returns the status of a payment request. The outer <code>statusCode</code> only says whether your status request worked; the payment’s own status is in <code>data.statusCode</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bank-ussd-payment\">https://developer-docs.paga.com/docs/bank-ussd-payment</a></p>\n","urlObject":{"path":["status"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0ad97114-1181-485c-9593-531b90a74053"},{"name":"4. Handle the callback","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: notificationId + statusCode + externalReferenceNumber + state + outstandingBalance + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"notificationId\",\"statusCode\",\"externalReferenceNumber\",\"state\",\"outstandingBalance\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","body.hash = hash;","pm.request.body.update(JSON.stringify(body, null, 2));"],"id":"6a0cc045-ccdc-4c09-81b1-779c0ae35398"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"252f1342-2213-44bc-ab65-28003b482a3f"}}],"id":"6ba4a288-30d2-4f70-8f18-5e184cf742bc","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"PAYMENT_COMPLETE\",\n  \"notificationId\": \"a12ef82b-14d0-4a67-a08c-162b95154f59\",\n  \"statusCode\": \"0\",\n  \"statusMessage\": \"Payment Request has been authorized\",\n  \"externalReferenceNumber\": \"ORD-2026-0187\",\n  \"state\": \"CONSUMED\",\n  \"outstandingBalance\": 0,\n  \"paymentAmount\": 50.41,\n  \"cumulativePaymentAmount\": 50.41,\n  \"collectionFee\": 0.41,\n  \"fundingDetails\": {\n    \"payerName\": \"Bello Ramon\",\n    \"payerAccountNumber\": \"0980763285\"\n  },\n  \"hash\": \"33f9c9bd0785c2cc…\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-ussd-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent to your <code>callBackUrl</code> when a payment request is paid, expires or is cancelled. Check the hash, then respond with HTTP 200. Paga retries up to three times with the same <code>notificationId</code>, so de-duplicate on it.</p>\n<p><strong>Hash:</strong> <code>notificationId + statusCode + externalReferenceNumber + state + outstandingBalance + hashKey</code>. Format <code>outstandingBalance</code> with two decimal places and no commas; leave it out if it’s <code>null</code>.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bank-ussd-payment\">https://developer-docs.paga.com/docs/bank-ussd-payment</a></p>\n","urlObject":{"path":["your-ussd-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"6ba4a288-30d2-4f70-8f18-5e184cf742bc"}],"id":"df4806da-b7eb-4f7d-a6e9-576dd95921d2","description":"<p>Give your customer a USSD code to pay from their bank, with no internet or card.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/bank-ussd-payment\">https://developer-docs.paga.com/docs/bank-ussd-payment</a></p>\n","_postman_id":"df4806da-b7eb-4f7d-a6e9-576dd95921d2"},{"name":"Direct Debit (Open Banking)","item":[{"name":"1. Start a hosted set-up session","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"d0f0f64e-58f3-48cc-bb28-def2b96073b4"}}],"id":"65ee8247-303d-47f1-b0c0-7cd1bdd5aba3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"accountReference\": \"CUST-000184-MANDATE\",\n  \"amountLimit\": 40000,\n  \"paymentMethods\": [\n    \"BANK_ACCOUNT_DIRECT_DEBIT\"\n  ],\n  \"callbackUrl\": \"https://yourstore.com/webhooks/paga\",\n  \"redirectUrl\": \"https://yourstore.com/mandate/complete\",\n  \"sessionExpirySeconds\": \"50000\",\n  \"paymentExpirySeconds\": \"157680000\",\n  \"additionalProperties\": {\n    \"payerPhoneNumber\": \"08064343187\",\n    \"payerEmail\": \"bello@example.com\",\n    \"authorizationAmount\": 40000\n  }\n}","options":{"raw":{"language":"json"}}},"url":"{{checkoutBaseUrl}}/checkout/charge-process/start","description":"<p>Creates a hosted Direct Debit set-up session. Redirect your customer to the returned <code>checkoutUrl</code>. This endpoint uses HTTP Basic only; it doesn’t use a <code>hash</code> header.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["checkout","charge-process","start"],"host":["{{checkoutBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"65ee8247-303d-47f1-b0c0-7cd1bdd5aba3"},{"name":"2. Set up a mandate by API","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"currency\",\"payer.phoneNumber\",\"payer.email\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"b8aeeada-41f6-4aa3-9684-e0e2385209c9"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}","try { pm.collectionVariables.set(\"lastPaymentRequestReference\", JSON.parse(pm.variables.replaceIn(pm.request.body.raw)).referenceNumber); } catch (e) {}"],"id":"556df1d8-b40a-46df-926d-ecc8e56245ce"}}],"id":"0fe0a0bf-6072-4238-9308-749893420cbf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 5000,\n  \"currency\": \"NGN\",\n  \"accountReference\": \"CUST-000185-MANDATE\",\n  \"payer\": {\n    \"name\": \"Bello Ramon\",\n    \"phoneNumber\": \"08064343187\",\n    \"email\": \"bello@example.com\",\n    \"address\": \"176 Herbert Macaulay Way, Yaba\",\n    \"bankId\": \"824d4b53-2752-49bb-b84a-20b69bb897ef\",\n    \"bankAccountNumber\": \"0697122703\"\n  },\n  \"payee\": {\n    \"name\": \"Your business name\"\n  },\n  \"isSingleUse\": false,\n  \"expiryDateTimeUTC\": \"2030-11-25T00:00:00\",\n  \"payerCollectionFeeShare\": 0,\n  \"payeeCollectionFeeShare\": 1,\n  \"isAllowPartialPayments\": true,\n  \"callBackUrl\": \"https://yourstore.com/webhooks/paga\",\n  \"paymentMethods\": [\n    \"DIRECT_DEBIT\"\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/paymentRequest","description":"<p>Creates a payment request. The <code>paymentMethods</code> you send decide how your customer pays.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey</code>. Use an empty string for <code>payer.email</code> if you don’t send it.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["paymentRequest"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0fe0a0bf-6072-4238-9308-749893420cbf"},{"name":"3. Handle the mandate callback","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: statusCode + timeStamp + accountNumber + bankName + referenceNumber + mandateStatus + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"statusCode\",\"timeStamp\",\"accountNumber\",\"bankName\",\"referenceNumber\",\"mandateStatus\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","body.hash = hash;","pm.request.body.update(JSON.stringify(body, null, 2));"],"id":"602834bf-960c-41de-9f67-489e6a9fcda2"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"5199a3b6-268a-4b39-a8e5-b8e7ac5e90ae"}}],"id":"b22e25fa-716d-4f14-baa7-a43e572c05cb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"Tokenization\",\n  \"notificationId\": \"9f1c2e44-0b7a-4d6e-9c1f-2b8e7a6d5c40\",\n  \"statusCode\": \"004\",\n  \"statusMessage\": \"VERIFIED\",\n  \"mandateStatus\": \"VERIFIED\",\n  \"referenceNumber\": \"DD-2026-0042\",\n  \"accountReference\": \"CUST-000184-MANDATE\",\n  \"customerEmail\": \"bello@example.com\",\n  \"customerPhoneNumber\": \"+2348064343187\",\n  \"bankName\": \"Opay\",\n  \"accountNumber\": \"8872493187\",\n  \"currency\": \"NGN\",\n  \"receivedAuthorizationAmount\": 40000,\n  \"timeStamp\": \"2026-11-04T07:31:00.885302596Z\",\n  \"hash\": \"f2a126a8…\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-mandate-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent when the authorisation transfer arrives (<code>VERIFIED</code>) and when the bank approves the mandate (<code>APPROVED</code>). Both set-up methods send the same callbacks.</p>\n<p><strong>Hash:</strong> <code>statusCode + timeStamp + accountNumber + bankName + referenceNumber + mandateStatus + hashKey</code>, using each value exactly as received.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["your-mandate-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"b22e25fa-716d-4f14-baa7-a43e572c05cb"},{"name":"4. Check mandate status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"6e05227d-bdcf-40c4-b172-2ab6bee85878"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"1a4f02d9-a15f-4aab-9277-6046baefa47e"}}],"id":"13c6c1d8-b23f-4ca7-ae96-086a38c5330d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/status","description":"<p>Returns the mandate’s status. Use <code>data.additionalData.mandate[].ProcessStatusId</code> (<code>PENDING</code>, <code>VERIFIED</code>, <code>APPROVED</code> or <code>REJECTED</code>) and charge only when it’s <code>APPROVED</code>. <code>data.statusCode</code> and <code>data.statusMessage</code> stay <code>1</code> and <code>pending</code> whatever happens to the mandate.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["status"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"13c6c1d8-b23f-4ca7-ae96-086a38c5330d"},{"name":"5. Charge the mandate","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + accountReference + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"accountReference\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"c46a6077-b3ba-41b6-a71e-54c298dcdd77"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"5f1f2cc8-56c0-4ebc-bab5-9ac69b5c1aec"}}],"id":"d343feb0-4e9e-4906-b7d0-0ebe9af68d41","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 600,\n  \"accountReference\": \"CUST-000184-MANDATE\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/chargeDebitMandate","description":"<p>Debits an approved mandate for any amount up to its limit. A successful response means the charge was accepted; fulfil only when the charge callback confirms it.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + accountReference + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["chargeDebitMandate"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d343feb0-4e9e-4906-b7d0-0ebe9af68d41"},{"name":"6. Handle the charge callback","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: statusCode + referenceNumber + accountReference + amount + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"statusCode\",\"referenceNumber\",\"accountReference\",\"amount\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","body.hash = hash;","pm.request.body.update(JSON.stringify(body, null, 2));"],"id":"c410d929-7cb2-4ae9-8c4a-2b13304eeb93"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"f3e9263a-3c11-4300-9317-7f23f076954c"}}],"id":"f4fb0811-1b02-4310-89d9-34ce0240a227","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"Charge_Complete\",\n  \"notificationId\": \"CHG-2026-0101\",\n  \"statusCode\": \"0\",\n  \"statusMessage\": \"SUCCESSFUL\",\n  \"processStatusId\": \"SUCCESSFUL\",\n  \"referenceNumber\": \"CHG-2026-0101\",\n  \"accountReference\": \"CUST-000184-MANDATE\",\n  \"amount\": \"600.00\",\n  \"currency\": \"NGN\",\n  \"senderName\": \"BELLO RAMON\",\n  \"sourceBankName\": \"Opay\",\n  \"sourceBankAccountNumber\": \"8872493187\",\n  \"hash\": \"c95f2466…\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-charge-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent when a mandate charge completes. Decide on <code>statusCode</code>, and look up any non-zero code before acting.</p>\n<p><strong>Hash:</strong> <code>statusCode + referenceNumber + accountReference + amount + hashKey</code>. <code>amount</code> has two decimal places and no commas, such as <code>50000.00</code>.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["your-charge-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"f4fb0811-1b02-4310-89d9-34ce0240a227"},{"name":"7. Check charge status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"5d5160e7-9450-44a5-b3ff-a2abdc93f2d1"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"65da2989-6ad0-4e62-942b-48d21f7e5fe7"}}],"id":"f28bdb4f-359a-4f78-8236-6288cc04539f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/getChargeMandateStatus","description":"<p>Returns the status of a charge, using the charge’s <code>referenceNumber</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["getChargeMandateStatus"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f28bdb4f-359a-4f78-8236-6288cc04539f"},{"name":"8. Disable a mandate","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + accountReference + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"accountReference\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"84e7c782-e850-4abf-a9d0-384f9f44f77a"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"e4537968-bbc5-4333-9403-297f4156147c"}}],"id":"a61d6001-3035-4588-a324-49f8ae508a36","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"accountReference\": \"CUST-000184-MANDATE\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/disableMandate","description":"<p>Stops all future charges on a mandate. Its <code>ProcessStatusId</code> then becomes <code>REJECTED</code>, and it can’t be charged again.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + accountReference + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","urlObject":{"path":["disableMandate"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"a61d6001-3035-4588-a324-49f8ae508a36"}],"id":"beb0f7a9-8091-4498-8606-f2af14126472","description":"<p>Get your customer’s permission once, then charge their bank account whenever a payment is due.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/direct-debit-api\">https://developer-docs.paga.com/docs/direct-debit-api</a></p>\n","_postman_id":"beb0f7a9-8091-4498-8606-f2af14126472"},{"name":"Paga Wallet","item":[{"name":"1. Create a payment request","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"currency\",\"payer.phoneNumber\",\"payer.email\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"48396a2e-6c2a-4597-bcb5-99e9484e492b"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}","try { pm.collectionVariables.set(\"lastPaymentRequestReference\", JSON.parse(pm.variables.replaceIn(pm.request.body.raw)).referenceNumber); } catch (e) {}"],"id":"6fdd14bc-973c-49c9-aa00-4b8b4e5e7c4f"}}],"id":"f1bd576f-b2d2-4a96-b4eb-67aa580a7007","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 3000,\n  \"currency\": \"NGN\",\n  \"payer\": {\n    \"name\": \"Bello Ramon\",\n    \"phoneNumber\": \"08064343187\"\n  },\n  \"payee\": {\n    \"name\": \"Your business name\"\n  },\n  \"expiryDateTimeUTC\": \"2026-11-10T15:35:00\",\n  \"payerCollectionFeeShare\": 1,\n  \"payeeCollectionFeeShare\": 0,\n  \"redirectUrl\": \"https://yourstore.com/payment/complete\",\n  \"callBackUrl\": \"https://yourstore.com/webhooks/paga\",\n  \"paymentMethods\": [\n    \"REQUEST_MONEY\"\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/paymentRequest","description":"<p>Creates a payment request. The <code>paymentMethods</code> you send decide how your customer pays.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey</code>. Use an empty string for <code>payer.email</code> if you don’t send it.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/paga-wallet\">https://developer-docs.paga.com/docs/paga-wallet</a></p>\n","urlObject":{"path":["paymentRequest"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f1bd576f-b2d2-4a96-b4eb-67aa580a7007"},{"name":"2. Check payment status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"59b7f6ef-51b0-4c68-bddb-724b4fdc1ed3"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"53030237-852f-4516-b00d-6f04d2440402"}}],"id":"96383be0-cb24-4279-b39f-03b0bed4e580","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/status","description":"<p>Returns the status of a payment request. The outer <code>statusCode</code> only says whether your status request worked; the payment’s own status is in <code>data.statusCode</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/paga-wallet\">https://developer-docs.paga.com/docs/paga-wallet</a></p>\n","urlObject":{"path":["status"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"96383be0-cb24-4279-b39f-03b0bed4e580"},{"name":"3. Handle the callback","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: notificationId + statusCode + externalReferenceNumber + state + outstandingBalance + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"notificationId\",\"statusCode\",\"externalReferenceNumber\",\"state\",\"outstandingBalance\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","body.hash = hash;","pm.request.body.update(JSON.stringify(body, null, 2));"],"id":"a558f8b9-ea68-4755-bbb0-ab67cf743b7c"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"a9880a34-b04c-4ddf-b7c9-af42881875a7"}}],"id":"885f01e6-3a1e-4301-b49c-b49f41f4d38e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"PAYMENT_COMPLETE\",\n  \"notificationId\": \"a12ef82b-14d0-4a67-a08c-162b95154f59\",\n  \"statusCode\": \"0\",\n  \"statusMessage\": \"Payment Request has been authorized\",\n  \"externalReferenceNumber\": \"ORD-2026-0187\",\n  \"state\": \"CONSUMED\",\n  \"outstandingBalance\": 0,\n  \"paymentAmount\": 50.41,\n  \"cumulativePaymentAmount\": 50.41,\n  \"collectionFee\": 0.41,\n  \"fundingDetails\": {\n    \"payerName\": \"Bello Ramon\",\n    \"payerAccountNumber\": \"0980763285\"\n  },\n  \"hash\": \"33f9c9bd0785c2cc…\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-wallet-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent to your <code>callBackUrl</code> when a payment request is paid, expires or is cancelled. Check the hash, then respond with HTTP 200. Paga retries up to three times with the same <code>notificationId</code>, so de-duplicate on it.</p>\n<p><strong>Hash:</strong> <code>notificationId + statusCode + externalReferenceNumber + state + outstandingBalance + hashKey</code>. Format <code>outstandingBalance</code> with two decimal places and no commas; leave it out if it’s <code>null</code>.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/paga-wallet\">https://developer-docs.paga.com/docs/paga-wallet</a></p>\n","urlObject":{"path":["your-wallet-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"885f01e6-3a1e-4301-b49c-b49f41f4d38e"}],"id":"428bbab5-c9f9-4ec8-a478-8c33de81ed1c","description":"<p>Request payment from a Paga wallet holder, who approves it in the Paga app.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/paga-wallet\">https://developer-docs.paga.com/docs/paga-wallet</a></p>\n","_postman_id":"428bbab5-c9f9-4ec8-a478-8c33de81ed1c"},{"name":"Bank Transfer (ACH, Wire and Swift)","item":[{"name":"1. Create a payment request","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"currency\",\"payer.phoneNumber\",\"payer.email\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"be04d4fa-1683-4876-8fad-50e77a941c92"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}","try { pm.collectionVariables.set(\"lastPaymentRequestReference\", JSON.parse(pm.variables.replaceIn(pm.request.body.raw)).referenceNumber); } catch (e) {}"],"id":"daf13389-6aaf-4cb4-b2c0-fbbcc0d6abc9"}}],"id":"e1200449-4199-422b-ae0d-76cb76d051b5","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 80000,\n  \"currency\": \"NGN\",\n  \"payer\": {\n    \"name\": \"Jill Scott\",\n    \"phoneNumber\": \"+19175247723\",\n    \"currency\": \"USD\"\n  },\n  \"payee\": {\n    \"name\": \"Your business name\"\n  },\n  \"expiryDateTimeUTC\": \"2026-10-27T22:04:00\",\n  \"payerCollectionFeeShare\": 1,\n  \"payeeCollectionFeeShare\": 0,\n  \"isAllowPartialPayments\": false,\n  \"isAllowOverPayments\": true,\n  \"callBackUrl\": \"https://yourstore.com/webhooks/paga\",\n  \"narration\": \"Invoice 0042\",\n  \"paymentMethods\": [\n    \"BANK_TRANSFER\"\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{usdBaseUrl}}/paymentRequest","description":"<p>Creates a payment request. The <code>paymentMethods</code> you send decide how your customer pays.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + currency + payer.phoneNumber + payer.email + hashKey</code>. Use an empty string for <code>payer.email</code> if you don’t send it.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection\">https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection</a></p>\n","urlObject":{"path":["paymentRequest"],"host":["{{usdBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e1200449-4199-422b-ae0d-76cb76d051b5"},{"name":"2. Handle the webhook","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"f075c98b-6cdd-4245-a1af-232a8d47c31d"}}],"id":"a4e46f2c-5925-4e01-bdce-15b2c8fe941f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"CAPTURED\",\n  \"referenceNumber\": \"INV-2026-0042\",\n  \"paymentId\": \"01a130c8-fec1-78e9-9bb1-a90e5797e9a0\",\n  \"paymentStatus\": \"CAPTURED\",\n  \"receivedAmounts\": {\n    \"currency\": \"USD\",\n    \"amounts\": {\n      \"BASE\": 515.06\n    }\n  },\n  \"serviceDetails\": {\n    \"sourceCurrency\": \"USD\",\n    \"destinationCurrency\": \"NGN\",\n    \"foreignExchangeRate\": 1670.5475,\n    \"destinationAmount\": 800000\n  }\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-usd-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent as <code>CAPTURED</code> when a dollar payment clears, or <code>FUNDING_FAILED</code> if Paga received money but couldn’t accept it. Index payments by <code>referenceNumber</code> and <code>paymentId</code>, and respond with HTTP 200 without fulfilling twice if a webhook repeats.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection\">https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection</a></p>\n","urlObject":{"path":["your-usd-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"a4e46f2c-5925-4e01-bdce-15b2c8fe941f"},{"name":"3. Check payment status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + paymentCurrency + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"paymentCurrency\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"0146ed55-8c3a-425d-9938-225ce95d3864"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"fb022050-e2eb-4aed-938c-e16ea1996aa8"}}],"id":"c751d2e7-0bca-4d65-bcb8-071949feae5f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\",\n  \"paymentCurrency\": \"USD\"\n}","options":{"raw":{"language":"json"}}},"url":"{{usdBaseUrl}}/status","description":"<p>Returns the status of a USD payment request. The outer <code>statusCode</code> says whether your status request worked; the payment’s own status is in <code>data.statusCode</code>, where <code>1</code> means still pending.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + paymentCurrency + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection\">https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection</a></p>\n","urlObject":{"path":["status"],"host":["{{usdBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c751d2e7-0bca-4d65-bcb8-071949feae5f"}],"id":"042e42a7-530f-46cb-b443-d4ecc0612591","description":"<p>Collect US dollars from customers abroad by ACH, US domestic wire or SWIFT, settled in naira.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection\">https://developer-docs.paga.com/docs/paga-dynamic-payment-identifier-usd-collection</a></p>\n","_postman_id":"042e42a7-530f-46cb-b443-d4ecc0612591"},{"name":"Subsidiary Accounts","item":[{"name":"1. Create an account","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["pm.variables.set(\"newAccountReference\", \"CUST-\" + Date.now());","// Paga request hash: referenceNumber + accountReference + iifiNumber + autoSweep.bankPublicId + autoSweep.destination + autoSweep.accountNumber + callbackUrl + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"accountReference\",\"iifiNumber\",\"autoSweep.bankPublicId\",\"autoSweep.destination\",\"autoSweep.accountNumber\",\"callbackUrl\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"5385a187-24a0-4ef0-9608-8a2584c57f2f"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}","try { pm.collectionVariables.set(\"subsidiaryAccount\", pm.response.json().accountReference || pm.variables.get(\"newAccountReference\")); } catch (e) {}"],"id":"11688d4b-c900-40e1-b15b-0ac2aba95bbb"}}],"id":"0792565f-ec6a-47de-8cfa-dee7e4fcf09f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"accountReference\": \"{{newAccountReference}}\",\n  \"accountName\": \"Bello Ramon\",\n  \"firstName\": \"Bello\",\n  \"lastName\": \"Ramon\",\n  \"phoneNumber\": \"08012345678\",\n  \"email\": \"bello@example.com\",\n  \"iifiNumber\": \"22222132329\",\n  \"fundingTransactionLimit\": 500000,\n  \"fundingDailyLimit\": 2000000,\n  \"status\": \"ACTIVE\",\n  \"callbackUrl\": \"https://yourstore.com/webhooks/paga\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/subsidiary-accounts","description":"<p>Creates a subsidiary account. Leave out <code>autoSweep</code> for a ledger-backed account that holds funds; set <code>autoSweep.destination</code> to <code>VIRTUAL_ACCOUNT</code> or <code>BANK</code> for a virtual account that settles straight away. Reusing a <code>referenceNumber</code> or <code>accountReference</code> returns status code <code>102</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + accountReference + iifiNumber + autoSweep.bankPublicId + autoSweep.destination + autoSweep.accountNumber + callbackUrl + hashKey</code>. Note that <code>bankPublicId</code> comes before <code>destination</code>, the opposite of update.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"0792565f-ec6a-47de-8cfa-dee7e4fcf09f"},{"name":"2. Handle a funding notification","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: transactionReference + transactionDate + amount + accountNumber + timestamp + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"transactionReference\",\"transactionDate\",\"amount\",\"accountNumber\",\"timestamp\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"x-paga-hash-v3\", value: hash });","pm.request.headers.upsert({ key: \"x-paga-hash-v3-parameters\", value: HASH_FIELDS.join(\",\") + \",hashKey\" });"],"id":"381421fe-23e3-47a2-9c38-2158544ab5b7"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"1c72bef3-30a0-48a7-b72c-a23baa94ce50"}}],"id":"7e45deab-ccc1-4d78-8d13-3b5125c1c1bd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"statusCode\": \"0\",\n  \"statusMessage\": \"success\",\n  \"transactionReference\": \"MPVAT-P_20260621182337959_1097807834\",\n  \"fundingTransactionReference\": \"DFB-U_20260621182337653_1097807831\",\n  \"fundingPaymentReference\": \"000013203297\",\n  \"accountNumber\": \"0750529406\",\n  \"accountName\": \"Bello Ramon\",\n  \"amount\": 5000,\n  \"clearingFeeAmount\": 37.5,\n  \"payerDetails\": {\n    \"paymentMethod\": \"BANK_TRANSFER\",\n    \"payerName\": \"OKOYE CHIZOBA\",\n    \"payerBankName\": \"GT Bank\",\n    \"payerBankAccountNumber\": \"0697122703\"\n  },\n  \"narration\": \"NIP Transfer to Your business - Bello Ramon\",\n  \"transactionDate\": \"2026-06-21T17:23:37.653\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-funding-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent when someone pays into a subsidiary account. The hash is in the <code>x-paga-hash-v3</code> header, not the body. Respond with <code>{\"status\": \"SUCCESS\"}</code>.</p>\n<p><strong>Hash:</strong> the fields named in <code>x-paga-hash-v3-parameters</code>, in order: <code>transactionReference + transactionDate + amount + accountNumber + timestamp + hashKey</code>.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["your-funding-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"7e45deab-ccc1-4d78-8d13-3b5125c1c1bd"},{"name":"3. Charge an account","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + currency + narration + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"currency\",\"narration\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"b9cb96ef-d721-4334-84eb-f9c8ac07e08c"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"91a3b5ee-3704-4403-aaf6-5f84a78bf937"}}],"id":"4cb853b5-afb8-49a7-9368-3a9c54914063","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 1000,\n  \"currency\": \"NGN\",\n  \"narration\": \"Service fee\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/subsidiary-accounts/:accountIdentifier/charge","description":"<p>Debits a ledger-backed account. Not available on virtual accounts. Retrying with the same <code>referenceNumber</code> never moves money twice.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + currency + narration + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts",":accountIdentifier","charge"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[{"id":"9b15a6d7-fdb6-4f8e-a918-c152aee5265f","type":"any","value":"CUST-000184-WALLET","key":"accountIdentifier"}]}},"response":[],"_postman_id":"4cb853b5-afb8-49a7-9368-3a9c54914063"},{"name":"4. Top up an account","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + currency + narration + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"currency\",\"narration\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"399f1419-6ce4-41ee-9d4e-623187dea97e"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"e7d63a07-e2dc-421c-9007-f010e3faefb1"}}],"id":"7a744d63-8442-4fdd-b943-50fa5c1f8914","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 500,\n  \"currency\": \"NGN\",\n  \"narration\": \"Bonus credit\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/subsidiary-accounts/:accountIdentifier/topup","description":"<p>Credits a ledger-backed account from your business balance. Not available on virtual accounts.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + currency + narration + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts",":accountIdentifier","topup"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[{"id":"70152e5c-3028-4bd1-8f32-7574f6d50a66","type":"any","value":"CUST-000184-WALLET","key":"accountIdentifier"}]}},"response":[],"_postman_id":"7a744d63-8442-4fdd-b943-50fa5c1f8914"},{"name":"5. Transfer between accounts","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + sourceAccountIdentifier + destinationAccountIdentifier + amount + currency + narration + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"sourceAccountIdentifier\",\"destinationAccountIdentifier\",\"amount\",\"currency\",\"narration\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"ab66b8b1-bdf9-4965-9d51-cfd4e7c5384a"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"a4fa02e4-9478-4d65-953d-bff8d2e650ea"}}],"id":"7b43eb20-3d44-496c-a6c1-32ad12db130b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"sourceAccountIdentifier\": \"CUST-000184-WALLET\",\n  \"destinationAccountIdentifier\": \"CUST-000221-WALLET\",\n  \"amount\": 1500,\n  \"currency\": \"NGN\",\n  \"narration\": \"Payment for goods\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/subsidiary-accounts/transfer","description":"<p>Moves money between two ledger-backed accounts. Paga sends one callback, for the source account only.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + sourceAccountIdentifier + destinationAccountIdentifier + amount + currency + narration + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts","transfer"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"7b43eb20-3d44-496c-a6c1-32ad12db130b"},{"name":"6. Handle a charge, top-up or transfer callback","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: externalReferenceNumber + transactionDate + amount + accountNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"externalReferenceNumber\",\"transactionDate\",\"amount\",\"accountNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","body.hash = hash;","pm.request.body.update(JSON.stringify(body, null, 2));"],"id":"eb7ddfb2-5931-4b8f-bfb9-24090588de80"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"9f5a3649-28f9-47d6-ac47-e348dd80c4a4"}}],"id":"8f008705-16ad-486d-9fe1-191d2e435944","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"event\": \"SUBSIDIARY_ACCOUNT_CHARGE_COMPLETE\",\n  \"notificationId\": \"913ee825-a17d-477c-8231-07dfb95442bb\",\n  \"statusCode\": \"0\",\n  \"statusMessage\": \"SUCCESS\",\n  \"externalReferenceNumber\": \"REF-CHARGE-001\",\n  \"transactionType\": \"DEBIT\",\n  \"transactionDate\": \"2026-11-03 22:13:53.977\",\n  \"accountReference\": \"CUST-000184-WALLET\",\n  \"totalDebitAmount\": 25,\n  \"fee\": 0,\n  \"amount\": \"25.00\",\n  \"accountNumber\": \"0750529406\",\n  \"hash\": \"148b4f94…\",\n  \"timestamp\": \"2026-11-03T21:13:54.081104984\"\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-account-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent when a charge (<code>SUBSIDIARY_ACCOUNT_CHARGE_COMPLETE</code>), top-up (<code>SUBSIDIARY_ACCOUNT_TOP_UP_COMPLETE</code>) or transfer (<code>SUBSIDIARY_ACCOUNT_TRANSFER_COMPLETE</code>, source account only) completes.</p>\n<p><strong>Hash:</strong> <code>externalReferenceNumber + transactionDate + amount + accountNumber + hashKey</code>. <code>amount</code> is a formatted string with commas, such as <code>1,000.00</code>; don’t convert it to a number.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["your-account-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"8f008705-16ad-486d-9fe1-191d2e435944"},{"name":"7. Retrieve an account","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + accountIdentifier + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"accountIdentifier\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"fe2276f4-1a49-4a8c-877f-e61a6e699119"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"6aa25bdc-34e2-443b-a719-f60b1da76a9b"}}],"id":"0c2e4b64-75da-4ab5-8b17-308f0e2f6c9b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"url":"{{collectBaseUrl}}/subsidiary-accounts/:accountIdentifier?referenceNumber={{ref}}","description":"<p>Returns an account’s details, limits, callback URL and balance.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + accountIdentifier + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts",":accountIdentifier"],"host":["{{collectBaseUrl}}"],"query":[{"key":"referenceNumber","value":"{{ref}}"}],"variable":[{"id":"e1653f52-a3fa-4afc-b68d-f9d8fcd524d5","type":"any","value":"CUST-000184-WALLET","key":"accountIdentifier"}]}},"response":[],"_postman_id":"0c2e4b64-75da-4ab5-8b17-308f0e2f6c9b"},{"name":"8. Update an account","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + accountIdentifier + iifiNumber + autoSweep.destination + autoSweep.bankPublicId + autoSweep.accountNumber + callbackUrl + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"accountIdentifier\",\"iifiNumber\",\"autoSweep.destination\",\"autoSweep.bankPublicId\",\"autoSweep.accountNumber\",\"callbackUrl\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"fde79f5f-5e04-4c99-912c-b5d8e19f8906"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"0cd5aea2-456f-40ff-b718-b370a1cf380f"}}],"id":"4e3f858b-7a69-4749-a4a5-48d50b522fb7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"PUT","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"accountName\": \"St Jones School\",\n  \"status\": \"DISABLED\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/subsidiary-accounts/:accountIdentifier","description":"<p>Changes an account. Send only what you want to change. <code>accountNumber</code> and <code>accountReference</code> can’t be changed.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + accountIdentifier + iifiNumber + autoSweep.destination + autoSweep.bankPublicId + autoSweep.accountNumber + callbackUrl + hashKey</code>. Note that <code>destination</code> comes before <code>bankPublicId</code>, the opposite of create.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts",":accountIdentifier"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[{"id":"dad99329-3667-413e-a77e-7a294a740569","type":"any","value":"CUST-000184-WALLET","key":"accountIdentifier"}]}},"response":[],"_postman_id":"4e3f858b-7a69-4749-a4a5-48d50b522fb7"},{"name":"9. Get the balance","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + accountIdentifier + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"accountIdentifier\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"536d971e-76fc-4a8c-b883-8005cf78369a"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"9fe5bc16-9c60-4550-81f7-60cf63c6fa9b"}}],"id":"4348dfac-e54f-4aaa-93e8-a431a6110586","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"url":"{{collectBaseUrl}}/subsidiary-accounts/:accountIdentifier/balance?referenceNumber={{ref}}","description":"<p>Returns an account’s balance.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + accountIdentifier + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts",":accountIdentifier","balance"],"host":["{{collectBaseUrl}}"],"query":[{"key":"referenceNumber","value":"{{ref}}"}],"variable":[{"id":"6155183b-5dd8-4c81-ba8c-af083ca0f043","type":"any","value":"CUST-000184-WALLET","key":"accountIdentifier"}]}},"response":[],"_postman_id":"4348dfac-e54f-4aaa-93e8-a431a6110586"},{"name":"10. Get transaction history","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: accountIdentifier + startDateTimeUTC + endDateTimeUTC + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"accountIdentifier\",\"startDateTimeUTC\",\"endDateTimeUTC\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"16bb4909-d40d-4465-b2f8-03930e49b0f4"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"d6302e86-69be-4ad4-8f90-979200e4079a"}}],"id":"ac9fc7d5-55ff-4e62-a74d-d0ab85a8dcff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"GET","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"url":"{{collectBaseUrl}}/subsidiary-accounts/:accountIdentifier/history?referenceNumber={{ref}}&startDateTimeUTC=2026-06-01T00:00:00&endDateTimeUTC=2026-06-30T23:59:59&pageSize=20&pageNumber=0","description":"<p>Returns an account’s transactions, up to 3 months at a time. Pages start at 0. <code>referenceNumber</code> is required, but isn’t part of this hash.</p>\n<p><strong>Hash:</strong> <code>accountIdentifier + startDateTimeUTC + endDateTimeUTC + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","urlObject":{"path":["subsidiary-accounts",":accountIdentifier","history"],"host":["{{collectBaseUrl}}"],"query":[{"key":"referenceNumber","value":"{{ref}}"},{"key":"startDateTimeUTC","value":"2026-06-01T00:00:00"},{"key":"endDateTimeUTC","value":"2026-06-30T23:59:59"},{"key":"pageSize","value":"20"},{"key":"pageNumber","value":"0"}],"variable":[{"id":"8c636b31-3adf-4d09-bd44-a7b5bf83c420","type":"any","value":"CUST-000184-WALLET","key":"accountIdentifier"}]}},"response":[],"_postman_id":"ac9fc7d5-55ff-4e62-a74d-d0ab85a8dcff"}],"id":"1bb2c5c4-4fbf-4b76-8d74-408aa93ea32c","description":"<p>Give each customer a permanent Paga account number that holds funds or settles straight to you.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/subsidiary-accounts\">https://developer-docs.paga.com/docs/subsidiary-accounts</a></p>\n","_postman_id":"1bb2c5c4-4fbf-4b76-8d74-408aa93ea32c"},{"name":"Refunds","item":[{"name":"1. Refund or cancel a payment request","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + refundAmount + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"refundAmount\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"53f8a8c0-df3c-4579-be11-9d875766e79d"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"a12b57bc-3037-4b7f-b5b2-fb6151f61716"}}],"id":"50c9c331-2fda-4ff2-aff7-0b7440359e93","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"paymentRequestReference\": \"\",\n  \"refundAmount\": 1000,\n  \"currency\": \"NGN\",\n  \"reason\": \"Item out of stock\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/refund/v2","description":"<p>Refunds a paid payment request in full or in part, or cancels one that hasn’t been paid. Send one request per partial refund, each with its own <code>referenceNumber</code>. Reusing a <code>referenceNumber</code> returns status code <code>102</code> and never refunds twice.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + refundAmount + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/refunds\">https://developer-docs.paga.com/docs/refunds</a></p>\n","urlObject":{"path":["refund","v2"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"50c9c331-2fda-4ff2-aff7-0b7440359e93"},{"name":"2. Check refund status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"213c3056-0509-4c92-b063-0e37871f46b3"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"4b980ac6-f769-4028-b933-f4d009996a3a"}}],"id":"b56d8751-f5c8-4bde-a3b5-3a85967e6efa","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{publicKey}}"},{"key":"password","value":"{{secretKey}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{collectBaseUrl}}/status","description":"<p>Call with the original payment request’s <code>referenceNumber</code>. <code>data.refundStatus</code> shows <code>refunded</code> once the refund is made.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/refunds\">https://developer-docs.paga.com/docs/refunds</a></p>\n","urlObject":{"path":["status"],"host":["{{collectBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b56d8751-f5c8-4bde-a3b5-3a85967e6efa"}],"id":"d76da1a1-8dd9-4f07-a5c9-968d3fd8fcf9","description":"<p>Refund a paid payment request in full or in parts, or cancel one that hasn’t been paid.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/refunds\">https://developer-docs.paga.com/docs/refunds</a></p>\n","_postman_id":"d76da1a1-8dd9-4f07-a5c9-968d3fd8fcf9"},{"name":"Money transfer","item":[{"name":"1. Get the bank’s UUID","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"77f833bc-d5f5-4cd0-9788-12ed12a48fc4"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"b6f7c424-addd-428a-b0f6-8b5e6bc0b7f7"}}],"id":"5ba2ce98-5ed7-4935-b981-8077391a8039","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/getBanks","description":"<p>Lists every institution you can pay, with its UUID. UUIDs never change, but new institutions are added every month, so cache the list and refresh it weekly or monthly.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","urlObject":{"path":["getBanks"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5ba2ce98-5ed7-4935-b981-8077391a8039"},{"name":"2. Validate the account","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + destinationBankUUID + destinationBankAccountNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"destinationBankUUID\",\"destinationBankAccountNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"aabcfcd2-0d5f-4b47-bf5d-daa25a72cedb"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"d45de41d-b1d0-43de-8da7-b87d5323ad15"}}],"id":"2d985926-97ff-49da-9d3e-ee7921fc9912","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": \"5000.00\",\n  \"currency\": \"NGN\",\n  \"destinationBankUUID\": \"40090E2F-7446-4217-9345-7BBAB7043C4C\",\n  \"destinationBankAccountNumber\": \"0000000000\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/validateDepositToBank","description":"<p>Confirms the account exists and returns the account holder’s name and the fee, before you send money.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + destinationBankUUID + destinationBankAccountNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","urlObject":{"path":["validateDepositToBank"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"2d985926-97ff-49da-9d3e-ee7921fc9912"},{"name":"3. Send the money","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + destinationBankUUID + destinationBankAccountNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"destinationBankUUID\",\"destinationBankAccountNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"4cfb6b19-2009-4042-a52f-04d52ebe2f20"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"6aef7894-6ae4-4aa1-962b-7ca3e86c3951"}}],"id":"b00abc3d-e69c-49ed-a7d4-ba1207a0798f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": \"5000.00\",\n  \"currency\": \"NGN\",\n  \"destinationBankUUID\": \"40090E2F-7446-4217-9345-7BBAB7043C4C\",\n  \"destinationBankAccountNumber\": \"0000000000\",\n  \"remarks\": \"Salary for June\",\n  \"statusCallbackUrl\": \"https://yourstore.com/webhooks/paga-payouts\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/depositToBank","description":"<p>Sends money from your business balance to a bank account, or to a Paga wallet using Paga’s UUID <code>AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + destinationBankUUID + destinationBankAccountNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","urlObject":{"path":["depositToBank"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b00abc3d-e69c-49ed-a7d4-ba1207a0798f"},{"name":"4. Handle the notification","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + transactionDate + transactionId + amount + sessionId + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"transactionDate\",\"transactionId\",\"amount\",\"sessionId\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"x-paga-hash\", value: hash });","pm.request.headers.upsert({ key: \"x-paga-hash-parameters\", value: HASH_FIELDS.join(\",\") + \",hashKey\" });"],"id":"2e866b63-a78b-44b7-a4f1-471afcfc7d38"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));"],"id":"88537893-a8fc-4824-9ab8-cdde02aec7ee"}}],"id":"56b26161-663b-479b-9897-1e68f5139218","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"responseCode\": 0,\n  \"message\": \"Successfully deposited N5,000.00 to bank account ******8830. Transaction Id: RP658.\",\n  \"referenceNumber\": \"PAY-2026-0311\",\n  \"transactionId\": \"RP658\",\n  \"transactionReference\": \"SCBS-U_20261103110225559_989465645_RP658_bfrgw\",\n  \"transactionType\": \"USER_SEND_CASH_TO_BANK_ACCOUNT_SETTLED\",\n  \"transactionDate\": \"2026-11-03 11:02:25.56\",\n  \"amount\": \"5000.0\",\n  \"currency\": \"NGN\",\n  \"fee\": 53.75,\n  \"vat\": 3.75,\n  \"sessionId\": \"100002261103110226001406467019\",\n  \"destinationAccountHolderNameAtBank\": \"Test Customer\",\n  \"reversalId\": null\n}","options":{"raw":{"language":"json"}}},"url":"https://yourstore.com/your-status-callback-url","description":"<p><strong>Sends a signed test callback to your own server</strong>, as Paga would. Set <code>yourServerBaseUrl</code> in the collection’s Variables tab, then send it to check your callback handling.</p>\n<p><strong>Paga sends this to your server.</strong> You don’t call it; build an endpoint at your callback URL that accepts it.</p>\n<p>Sent to your <code>statusCallbackUrl</code> once a transfer is processed. Verify the <code>x-paga-hash</code> header, decide on <code>responseCode</code>, then respond with HTTP 200 and <code>{\"status\": \"SUCCESS\"}</code>. Until Paga gets that, it retries, each time with a new <code>x-paga-attempt-id</code>; de-duplicate on <code>referenceNumber</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + transactionDate + transactionId + amount + sessionId + hashKey</code>, using each value exactly as received.</p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","urlObject":{"path":["your-status-callback-url"],"host":["https://yourstore.com"],"query":[],"variable":[]}},"response":[],"_postman_id":"56b26161-663b-479b-9897-1e68f5139218"},{"name":"5. Check the transaction status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"f65211dc-fb71-4a42-8812-e05abc513cd9"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"53f80d62-8e35-4718-b1ba-31aa930c46f6"}}],"id":"cf999a5e-f78b-495f-b370-dbf15d23b1bb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\",\n  \"locale\": \"en\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/transactionStatus","description":"<p>Checks a transaction from the last 48 hours. Decide on <code>responseCode</code>, not <code>status</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","urlObject":{"path":["transactionStatus"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"cf999a5e-f78b-495f-b370-dbf15d23b1bb"},{"name":"6. Check your balance","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"09c4ccda-fd9a-4b0f-815c-be329e176bcb"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"8968b17a-e360-4144-b541-fd4a51ac36d8"}}],"id":"f6a0d1a8-4114-45f0-bd80-c5ea80777df2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/accountBalance","description":"<p>Returns your business account balance. Check <code>availableBalance</code>, not <code>totalBalance</code>, before a payout run: it’s what you can actually send.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","urlObject":{"path":["accountBalance"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f6a0d1a8-4114-45f0-bd80-c5ea80777df2"},{"name":"7. Check your history","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"188693b4-2d45-489e-bdb4-128db61dca4e"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"88de030b-9f4a-4029-a7cc-8eef9d60d654"}}],"id":"65904554-bb15-4949-ba63-67d183538036","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"startDateUTC\": \"2026-11-01T00:00:00\",\n  \"endDateUTC\": \"2026-11-04T00:00:00\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/transactionHistory","description":"<p>Returns up to 10,000 of your most recent transactions between two dates. Use it to reconcile anything older than 48 hours.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","urlObject":{"path":["transactionHistory"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"65904554-bb15-4949-ba63-67d183538036"}],"id":"c410252d-953f-4e3f-8b8b-ab60dd6796ab","description":"<p>Send money from your business balance to 570+ banks and financial institutions in Nigeria, or to a Paga wallet.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/money-transfer-payout\">https://developer-docs.paga.com/docs/money-transfer-payout</a></p>\n","_postman_id":"c410252d-953f-4e3f-8b8b-ab60dd6796ab"},{"name":"Airtime and data","item":[{"name":"1. Get the mobile operator","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"2bc57778-0d9a-449c-b932-11926de7e915"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"17daef91-de63-413f-a90c-0c673783141e"}}],"id":"92f04797-2ba3-4144-8c1a-3d46668b63ff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"locale\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/getMobileOperators","description":"<p>Lists the networks you can top up. Send a network’s <code>mobileOperatorCode</code> as <code>mobileOperatorPublicId</code> when you buy, and as <code>operatorPublicId</code> when you list data bundles. Cache the list.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/airtime-and-data-purchase\">https://developer-docs.paga.com/docs/airtime-and-data-purchase</a></p>\n","urlObject":{"path":["getMobileOperators"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"92f04797-2ba3-4144-8c1a-3d46668b63ff"},{"name":"2. For data, pick a bundle","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + operatorPublicId + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"operatorPublicId\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"e1fc6711-2b6b-48d9-8f4e-50cb3549c535"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"c7c69ecd-0c4c-462b-87bb-406dcad31a9c"}}],"id":"16f02b6d-dbef-4d76-b318-e2e33299b321","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"operatorPublicId\": \"42419156-DD57-4737-8373-20678CD9AA29\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/getDataBundleByOperator","description":"<p>Lists a network’s data bundles. Send a bundle’s <code>serviceId</code> as <code>mobileOperatorServiceId</code>, and exactly its <code>servicePrice</code> as <code>amount</code>. Bundles rarely change, so cache the list and refresh it monthly.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + operatorPublicId + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/airtime-and-data-purchase\">https://developer-docs.paga.com/docs/airtime-and-data-purchase</a></p>\n","urlObject":{"path":["getDataBundleByOperator"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"16f02b6d-dbef-4d76-b318-e2e33299b321"},{"name":"3. Buy the airtime or data","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + destinationPhoneNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"destinationPhoneNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"b8b1dafd-3a61-4b7b-a725-c54f4ebd36cb"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"7c5db533-e110-4193-bc78-c0712f930fec"}}],"id":"5a811eb1-3c89-43ee-b21f-b8f5a4740617","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": \"500\",\n  \"currency\": \"NGN\",\n  \"destinationPhoneNumber\": \"08063332187\",\n  \"mobileOperatorPublicId\": \"42419156-DD57-4737-8373-20678CD9AA29\",\n  \"isDataBundle\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/airtimePurchase","description":"<p>Tops up a phone with airtime or data from your business balance. There’s no callback: decide on <code>responseCode</code>, and check the transaction status if you need to.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + destinationPhoneNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/airtime-and-data-purchase\">https://developer-docs.paga.com/docs/airtime-and-data-purchase</a></p>\n","urlObject":{"path":["airtimePurchase"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"5a811eb1-3c89-43ee-b21f-b8f5a4740617"},{"name":"4. Check the transaction status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"e84558e5-1153-43f2-88e2-d9b812152333"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"60875f7e-99f9-4bdf-ad10-1033ec705d5c"}}],"id":"6992d907-5ba2-4350-b9c4-c25741604218","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/transactionStatus","description":"<p>Checks a transaction from the last 48 hours. Decide on <code>responseCode</code>, not <code>status</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/airtime-and-data-purchase\">https://developer-docs.paga.com/docs/airtime-and-data-purchase</a></p>\n","urlObject":{"path":["transactionStatus"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6992d907-5ba2-4350-b9c4-c25741604218"},{"name":"5. Check your balance","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"2e77108a-94e8-4f40-80fe-2e1b91fa108b"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"4dac0d9b-5f22-4b63-b144-c5e3bf9159dd"}}],"id":"ae7d6f60-a55b-46c8-849d-320d8b39dfde","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/accountBalance","description":"<p>Returns your business account balance. Check <code>availableBalance</code>, not <code>totalBalance</code>, before a payout run: it’s what you can actually send.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/airtime-and-data-purchase\">https://developer-docs.paga.com/docs/airtime-and-data-purchase</a></p>\n","urlObject":{"path":["accountBalance"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ae7d6f60-a55b-46c8-849d-320d8b39dfde"},{"name":"6. Check your history","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"f0691dd3-1d54-49a4-abae-e436e58fa310"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"c7ada201-4b44-4277-8432-b60c11399638"}}],"id":"1442ba12-d071-4896-93a1-6de562d040e1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"startDateUTC\": \"2026-11-01T00:00:00\",\n  \"endDateUTC\": \"2026-11-04T00:00:00\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/transactionHistory","description":"<p>Returns up to 10,000 of your most recent transactions between two dates. Use it to reconcile anything older than 48 hours.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/airtime-and-data-purchase\">https://developer-docs.paga.com/docs/airtime-and-data-purchase</a></p>\n","urlObject":{"path":["transactionHistory"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"1442ba12-d071-4896-93a1-6de562d040e1"}],"id":"23b156df-c223-4839-ad1e-a6c18515c7c4","description":"<p>Top up any of Nigeria’s 190 million+ phone numbers on MTN, Airtel, Glo and 9mobile with airtime or data.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/airtime-and-data-purchase\">https://developer-docs.paga.com/docs/airtime-and-data-purchase</a></p>\n","_postman_id":"23b156df-c223-4839-ad1e-a6c18515c7c4"},{"name":"Bill payment","item":[{"name":"1. Find the biller","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"d6c2ec82-6c3a-4b36-9545-5f9bd1476da4"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"8cb75341-1277-46e3-aad6-36b84b450154"}}],"id":"56f1ecf0-4bfb-493a-8c41-e3fb4ddb5f8e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/getMerchants","description":"<p>Lists every biller, with the <code>uuid</code> you pay. Cache the list.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","urlObject":{"path":["getMerchants"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"56f1ecf0-4bfb-493a-8c41-e3fb4ddb5f8e"},{"name":"2. Pick the service","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + merchantPublicId + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"merchantPublicId\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"286ce746-b02f-4114-b0ff-dfb0bfa3a7ff"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"9d6698eb-6d9b-440d-8937-709fc36ffeee"}}],"id":"d2442607-e36a-4bcb-a845-ee36e5cbf43c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"merchantPublicId\": \"A3878DC1-F07D-48E7-AA59-8276C3C26647\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/getMerchantServices","description":"<p>Lists what a biller can be paid for. No services means any amount; services with <code>price</code> <code>0.0</code> mean the customer chooses the amount; otherwise pay the service’s price.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + merchantPublicId + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","urlObject":{"path":["getMerchantServices"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d2442607-e36a-4bcb-a845-ee36e5cbf43c"},{"name":"3. Validate the customer","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + merchantAccount + merchantReferenceNumber + merchantServiceProductCode + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"merchantAccount\",\"merchantReferenceNumber\",\"merchantServiceProductCode\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"f6c90a45-78ec-4e39-b20b-989202a2a4b4"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"24dd8064-04fb-45c1-837e-8802c9ea8839"}}],"id":"a7005369-7885-4aa8-aa30-f1b5233600ff","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"merchantAccount\": \"A3878DC1-F07D-48E7-AA59-8276C3C26647\",\n  \"merchantReferenceNumber\": \"8110411076\",\n  \"merchantServiceProductCode\": \"STARTERE36\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/getMerchantAccountDetails","description":"<p>Checks a meter, smart card or account number and returns the customer’s name. If your customer chose a service, always send its <code>code</code> as <code>merchantServiceProductCode</code>; billers that don’t need it ignore it. Use an empty string in the hash otherwise.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + merchantAccount + merchantReferenceNumber + merchantServiceProductCode + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","urlObject":{"path":["getMerchantAccountDetails"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"a7005369-7885-4aa8-aa30-f1b5233600ff"},{"name":"4. Pay the bill","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + amount + merchantAccount + merchantReferenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\",\"amount\",\"merchantAccount\",\"merchantReferenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"5715c75a-1847-42a1-8f99-e798daafd12b"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"29ba5321-0d60-410a-aeeb-efa186e4f263"}}],"id":"179a479e-261b-4cbd-b19f-16dbad2251a1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"amount\": 6000,\n  \"currency\": \"NGN\",\n  \"merchantAccount\": \"A3878DC1-F07D-48E7-AA59-8276C3C26647\",\n  \"merchantReferenceNumber\": \"8110411076\",\n  \"merchantService\": [\n    \"STARTERE36\"\n  ]\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/merchantPayment","description":"<p>Pays a bill from your business balance. There’s no callback: decide on <code>responseCode</code>. <code>integrationStatus</code> is for information only.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + amount + merchantAccount + merchantReferenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","urlObject":{"path":["merchantPayment"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"179a479e-261b-4cbd-b19f-16dbad2251a1"},{"name":"5. Check the transaction status","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"3063c970-5bd6-435a-8596-6526691891db"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"e4eddc9f-5eaa-4594-8d3a-47667762f3dd"}}],"id":"a18b14a8-0fe4-428b-bef6-31436433af90","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/transactionStatus","description":"<p>Checks a transaction from the last 48 hours. Decide on <code>responseCode</code>, not <code>status</code>.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","urlObject":{"path":["transactionStatus"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"a18b14a8-0fe4-428b-bef6-31436433af90"},{"name":"6. Check your balance","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"cef9384c-508b-44bc-aaf0-55145702b7da"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"85847bb1-fbed-4be4-a7e9-30baec1f5d7e"}}],"id":"e204a89e-8fd0-4a7d-87e6-531b2587ee72","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/accountBalance","description":"<p>Returns your business account balance. Check <code>availableBalance</code>, not <code>totalBalance</code>, before a payout run: it’s what you can actually send.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","urlObject":{"path":["accountBalance"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"e204a89e-8fd0-4a7d-87e6-531b2587ee72"},{"name":"7. Check your history","event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// Paga request hash: referenceNumber + hashKey","// Generated from the API reference. Reads the values actually being sent.","const HASH_FIELDS = [\"referenceNumber\"];","const raw = pm.request.body && pm.request.body.raw ? pm.variables.replaceIn(pm.request.body.raw) : \"\";","const body = raw ? JSON.parse(raw) : {};","const params = {};","pm.request.url.query.each((q) => { params[q.key] = pm.variables.replaceIn(q.value); });","pm.request.url.variables.each((v) => { params[v.key] = pm.variables.replaceIn(v.value); });","const valueOf = (field) => params[field] !== undefined ? params[field] : field.split(\".\").reduce((node, key) => (node == null ? undefined : node[key]), body);","const hashKey = pm.variables.get(\"hashKey\");","const text = HASH_FIELDS.map((f) => { const v = valueOf(f); return v == null ? \"\" : String(v); }).join(\"\") + hashKey;","const hash = CryptoJS.SHA512(text).toString(CryptoJS.enc.Hex);","pm.request.headers.upsert({ key: \"hash\", value: hash });"],"id":"6cffcc28-3372-471b-916c-23e8ca8c9ad4"}},{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"HTTP 200\", () => pm.response.to.have.status(200));","// Remember this step's reference, so the next status check can use it.","try { const sent = JSON.parse(pm.variables.replaceIn(pm.request.body.raw || \"{}\")); if (sent.referenceNumber && !String(pm.request.body.raw).includes(\"lastReference\")) pm.collectionVariables.set(\"lastReference\", sent.referenceNumber); } catch (e) {}"],"id":"5ebf7c15-be7e-41af-9b89-86800c017ae6"}}],"id":"709381b5-7a44-463f-a3bb-802723764af3","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"},{"key":"Accept","value":"application/json"},{"key":"principal","value":"{{publicKey}}"},{"key":"credentials","value":"{{secretKey}}"}],"body":{"mode":"raw","raw":"{\n  \"referenceNumber\": \"{{ref}}\",\n  \"startDateUTC\": \"2026-11-01T00:00:00\",\n  \"endDateUTC\": \"2026-11-04T00:00:00\"\n}","options":{"raw":{"language":"json"}}},"url":"{{businessBaseUrl}}/transactionHistory","description":"<p>Returns up to 10,000 of your most recent transactions between two dates. Use it to reconcile anything older than 48 hours.</p>\n<p><strong>Hash:</strong> <code>referenceNumber + hashKey</code></p>\n<p>API reference: <a href=\"https://developer-docs.paga.com/reference\">https://developer-docs.paga.com/reference</a> · Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","urlObject":{"path":["transactionHistory"],"host":["{{businessBaseUrl}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"709381b5-7a44-463f-a3bb-802723764af3"}],"id":"f37613d1-fc3d-4bff-aad4-2af0901e59d3","description":"<p>Pay 100+ billers across every essential service in Nigeria, from electricity and TV to internet and exams.</p>\n<p>Guide: <a href=\"https://developer-docs.paga.com/docs/bill-payment\">https://developer-docs.paga.com/docs/bill-payment</a></p>\n","_postman_id":"f37613d1-fc3d-4bff-aad4-2af0901e59d3"}],"event":[{"listen":"prerequest","script":{"type":"text/javascript","exec":["// One collection for Sandbox and Live. Set `mode` in the collection's Variables tab.","const SERVERS = {","  sandbox: { collectBaseUrl: \"https://beta-collect.paga.com\", usdBaseUrl: \"https://qa1-collect.paga.com\", checkoutBaseUrl: \"https://beta-checkout.paga.com\", businessBaseUrl: \"https://beta.mypaga.com/paga-webservices/business-rest/secured\" },","  live: { collectBaseUrl: \"https://collect.paga.com\", usdBaseUrl: \"https://collect.paga.com\", checkoutBaseUrl: \"https://checkout.paga.com\", businessBaseUrl: \"https://www.mypaga.com/paga-webservices/business-rest/secured\" },","};","const ALIASES = { sandbox: \"sandbox\", test: \"sandbox\", testing: \"sandbox\", beta: \"sandbox\", live: \"live\", production: \"live\", prod: \"live\" };","const typed = String(pm.collectionVariables.get(\"mode\") || \"sandbox\").trim().toLowerCase();","const mode = ALIASES[typed];","if (!mode) throw new Error(\"`mode` is “\" + typed + \"”. Set it to sandbox (or test) for testing, or live (or production) for real payments.\");","for (const [key, url] of Object.entries(SERVERS[mode])) pm.variables.set(key, url);","","// Use the keys for the chosen mode, so Sandbox and Live keys are never mixed up.","for (const name of [\"publicKey\", \"secretKey\", \"hashKey\"]) {","  const value = pm.collectionVariables.get(mode + name.charAt(0).toUpperCase() + name.slice(1));","  if (!value) throw new Error(\"Set \" + mode + name.charAt(0).toUpperCase() + name.slice(1) + \" in the collection’s Variables tab (Current value).\");","  pm.variables.set(name, value);","}","if (mode === \"live\") console.warn(\"Paga Engine · LIVE: real money will move.\"); else console.log(\"Paga Engine · Sandbox\");","","// A fresh, unique reference for every request, so repeat runs never clash.","pm.variables.set(\"ref\", \"PG-\" + Date.now() + \"-\" + Math.floor(Math.random() * 1e6));"],"id":"083bb12f-27bb-48ea-968f-27a53df368a4"}}],"variable":[{"key":"mode","value":"sandbox","description":"Where every request goes. Type sandbox (or test) to test with no real money, or live (or production) for real payments. Capitals don’t matter. Anything else stops the request."},{"key":"sandboxPublicKey","value":"","description":"Your Sandbox public key. Log in to the Sandbox business portal (https://beta-business.paga.com) and open your API keys. See https://developer-docs.paga.com/docs/introduction. Enter it in Current value."},{"key":"sandboxSecretKey","value":"","description":"Your Sandbox secret key, also called the password. Same place as the public key, in the Sandbox business portal. Enter it in Current value only."},{"key":"sandboxHashKey","value":"","description":"Your Sandbox hash key, sometimes labelled HMAC. Same place, in the Sandbox business portal. Used to sign every request. Enter it in Current value only."},{"key":"livePublicKey","value":"","description":"Your Live public key. Log in to the Live business portal (https://business.paga.com) and open your API keys. Live keys work once your business is approved. Enter it in Current value."},{"key":"liveSecretKey","value":"","description":"Your Live secret key. Same place, in the Live business portal. Enter it in Current value only, and never in a shared workspace."},{"key":"liveHashKey","value":"","description":"Your Live hash key, sometimes labelled HMAC. Same place, in the Live business portal. Enter it in Current value only, and never in a shared workspace."},{"key":"yourServerBaseUrl","value":"https://yourstore.com","description":"Optional. Your server’s address, such as https://api.yourcompany.com. Only used by the “Handle the …” requests, which send signed test callbacks to your server."},{"key":"lastReference","value":"","description":"Filled in automatically. Holds the referenceNumber of the last request you sent, so status checks look it up. To check an older transaction, paste its reference here."},{"key":"lastPaymentRequestReference","value":"","description":"Filled in automatically by “Create a payment request”. Used by Refunds, which need the original payment request’s reference."},{"key":"subsidiaryAccount","value":"CUST-000184-WALLET","description":"Filled in automatically by “Create an account” with your new account’s accountReference, and used by every later Subsidiary Accounts step. The starting value is only an example."}]}