{"info":{"_postman_id":"7c907e78-5af6-4beb-a84a-50cfa11d7273","name":"Moko Afrika - Developer","description":"<html><head></head><body><h1 id=\"moko-afrika-developer-collections\">Moko Afrika - Developer collections</h1>\n<p>One Postman collection covering the <strong>4 Moko Afrika products</strong>:</p>\n<ul>\n<li><strong>Payments</strong> — Mobile money collect/payout via Gateway (M-Pesa, Orange, Airtel, Afrimoney)</li>\n<li><strong>Remittance</strong> — Cross-border IMT to DRC mobile wallets (KYC, FX, account lookup)</li>\n<li><strong>Platform</strong> — Sub-merchant aggregator API (Merchant API v2)</li>\n<li><strong>Cards</strong> — Cybersource Hosted Checkout (Visa/Mastercard + 3DS)</li>\n</ul>\n<h2 id=\"how-to-use\">How to use</h2>\n<p>Each product is a top-level folder. Pick the one for your integration and follow its requests in order.</p>\n<h2 id=\"environment-variables\">Environment variables</h2>\n<p>Each product has its own <code>base_url</code> variable and its own auth scheme. The merged collection ships with sensible defaults; open the <strong>Variables</strong> tab to set your sandbox or production keys.</p>\n<h2 id=\"auth-recap\">Auth recap</h2>\n<ul>\n<li>Payments: <code>merchant_id</code> + <code>merchant_secrete</code> in body, AES+HMAC for sensitive payloads</li>\n<li>Remittance: HTTP Basic (merchant_code:api_secret)</li>\n<li>Platform: Bearer token (API key)</li>\n<li>Cards: HMAC-SHA256 (X-API-Key / X-Signature / X-Timestamp)</li>\n</ul>\n<h2 id=\"documentation-portal\">Documentation portal</h2>\n<p>Full reference at <a href=\"https://sandbox.gofreshpay.com\">sandbox.gofreshpay.com</a>.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Moko Afrika - Developer collections","slug":"moko-afrika-developer-collections"}],"owner":"11657131","collectionId":"7c907e78-5af6-4beb-a84a-50cfa11d7273","publishedId":"2sBXwyG6sN","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"0F1729","highlight":"00C8A8"},"publishDate":"2026-06-27T04:14:15.000Z"},"item":[{"name":"Payments","item":[{"name":"Deposit","item":[{"name":"Deposit Request","event":[{"listen":"test","script":{"exec":["pm.test(\"Response status code is 200\", function () {","  pm.response.to.have.status(200);","});","","","pm.test(\"Amount is a non-negative number\", function () {","  const responseData = pm.response.json();","  ","  pm.expect(responseData).to.be.an('object');","  pm.expect(responseData.Amount).to.exist.and.to.be.a('number');","  pm.expect(responseData.Amount).to.be.at.least(0);","});","","","pm.test(\"Comment is a string\", function () {","    const responseData = pm.response.json();","    ","    pm.expect(responseData).to.be.an('object');","    pm.expect(responseData.Comment).to.be.a('string');","});","","","pm.test(\"Created_At is a valid date format\", function () {","  const responseData = pm.response.json();","  ","  pm.expect(responseData).to.be.an('object');","  pm.expect(responseData.Created_At).to.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/, \"Invalid date format\");","});","","","pm.test(\"Currency is a non-empty string\", function () {","    const responseData = pm.response.json();","    ","    pm.expect(responseData).to.be.an('object');","    pm.expect(responseData.Currency).to.be.a('string').and.to.have.lengthOf.at.least(1, \"Value should not be empty\");","});"],"type":"text/javascript","packages":{},"id":"ac1097f3-efc5-4d49-9b7f-3d5c2f601031"}}],"id":"78b152f1-9f5e-4979-be70-8d28ccb67f73","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"1e89c128-e152-4559-bd49-efcd5c8a7379\",\r\n    \"merchant_secrete\": \"t9OehanoQGF23ASZWr9l01xvMnVBSH4sN1buwBYgHeU\",\r\n    \"amount\": \"100\",\r\n    \"currency\": \"CDF\",\r\n    \"action\": \"debit\",\r\n    \"customer_number\": \"0971069967\",\r\n    \"firstname\": \"HenockTest\",\r\n    \"lastname\": \"HenockTest\",\r\n    \"email\": \"henock_b@bmprimecapital.comm\",\r\n    \"reference\": \"26289330029\",\r\n    \"method\": \"airtel\",\r\n    \"callback_url\": \"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/gateway","description":"<p>This endpoint allows you to create new deposit transactions.</p>\n","urlObject":{"protocol":"https","path":["gateway"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"126f13b9-1788-4c17-91ca-a9ea0adc9632","name":"Successful response","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"1e89c128-e152-4559-bd49-efcd5c8a7379\",\r\n    \"merchant_secrete\": \"t9OehanoQGF23ASZWr9l01xvMnVBSH4sN1buwBYgHeU\",\r\n    \"amount\": \"100\",\r\n    \"currency\": \"CDF\",\r\n    \"action\": \"debit\",\r\n    \"customer_number\": \"0971069967\",\r\n    \"firstname\": \"HenockTest\",\r\n    \"lastname\": \"HenockTest\",\r\n    \"email\": \"henock_b@bmprimecapital.comm\",\r\n    \"reference\": \"26289330029\",\r\n    \"method\": \"airtel\",\r\n    \"callback_url\": \"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/gateway"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.18.0 (Ubuntu)"},{"key":"Date","value":"Wed, 12 Mar 2025 10:42:42 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"282"},{"key":"Connection","value":"keep-alive"},{"key":"x-content-type-options","value":"nosniff"},{"key":"x-frame-options","value":"DENY"},{"key":"x-xss-protection","value":"1; mode=block"},{"key":"strict-transport-security","value":"max-age=31536000; includeSubDomains"},{"key":"content-security-policy","value":"default-src 'self'"},{"key":"X-Frame-Options","value":"DENY"},{"key":"X-Content-Type-Options","value":"nosniff"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": \"Success\",\n    \"Comment\": \"Transaction Received Successfully\",\n    \"Reference\": \"26289330029\",\n    \"Customer_Number\": \"971069967\",\n    \"Amount\": 100,\n    \"Currency\": \"CDF\",\n    \"Created_At\": \"2025-03-12 10:42:42.776515\",\n    \"Updated_At\": \"2025-03-12 10:42:42.776541\",\n    \"Transaction_id\": \"PDRp9AY03ft112MYuj825ViC\"\n}"}],"_postman_id":"78b152f1-9f5e-4979-be70-8d28ccb67f73"}],"id":"2f95247d-e36b-4467-b62b-b4f1afa84247","description":"<p>Create new deposit transactions to add funds to your customers' accounts.</p>\n","_postman_id":"2f95247d-e36b-4467-b62b-b4f1afa84247"},{"name":"Withdrawal","item":[{"name":"Withdrawal Request","event":[{"listen":"test","script":{"exec":["pm.test(\"Response status code is 200\", function () {","  pm.expect(pm.response.code).to.equal(200);","});","","","pm.test(\"Amount is a non-negative number\", function () {","    const responseData = pm.response.json();","    ","    pm.expect(responseData.Amount).to.be.a('number');","    pm.expect(responseData.Amount).to.be.at.least(0, \"Amount should be a non-negative number\");","});","","","pm.test(\"Comment is a string\", function () {","    const responseData = pm.response.json();","    ","    pm.expect(responseData.Comment).to.be.a('string');","});","","","pm.test(\"Created_At is a valid date and time format\", function () {","    const responseData = pm.response.json();","","    pm.expect(responseData.Created_At).to.match(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{3}Z$/, \"Created_At should be in valid date and time format\");","});","","","pm.test(\"Currency is a string with 3 characters\", function () {","    const responseData = pm.response.json();","    ","    pm.expect(responseData).to.be.an('object');","    pm.expect(responseData.Currency).to.exist.and.to.be.a('string');","    pm.expect(responseData.Currency).to.have.lengthOf(3);","});"],"type":"text/javascript","packages":{},"id":"a3d90372-6a9c-4628-9fbe-b8ee048f4b5c"}}],"id":"df714762-25b3-4c84-85db-5ed0540d24e1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"1e89c128-e152-4559-bd49-efcd5c8a7379\",\r\n    \"merchant_secrete\": \"t9OehanoQGF23ASZWr9l01xvMnVBSH4sN1buwBYgHeU\",\r\n    \"amount\": \"100\",\r\n    \"currency\": \"CDF\",\r\n    \"action\": \"credit\",\r\n    \"customer_number\": \"0971069967\",\r\n    \"firstname\": \"HenockTest\",\r\n    \"lastname\": \"HenockTest\",\r\n    \"email\": \"henock_b@bmprimecapital.comm\",\r\n    \"reference\": \"TTT26289330029\",\r\n    \"method\": \"airtel\",\r\n    \"callback_url\": \"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/gateway","description":"<p>This endpoint allows you to create new withdrawal transactions.</p>\n","urlObject":{"protocol":"https","path":["gateway"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"0f5ad26b-06dc-4196-8a8a-a482e5b539f4","name":"Successful response","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"1e89c128-e152-4559-bd49-efcd5c8a7379\",\r\n    \"merchant_secrete\": \"t9OehanoQGF23ASZWr9l01xvMnVBSH4sN1buwBYgHeU\",\r\n    \"amount\": \"100\",\r\n    \"currency\": \"CDF\",\r\n    \"action\": \"credit\",\r\n    \"customer_number\": \"0971069967\",\r\n    \"firstname\": \"HenockTest\",\r\n    \"lastname\": \"HenockTest\",\r\n    \"email\": \"henock_b@bmprimecapital.comm\",\r\n    \"reference\": \"TTT26289330029\",\r\n    \"method\": \"airtel\",\r\n    \"callback_url\": \"\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/gateway"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.18.0 (Ubuntu)"},{"key":"Date","value":"Wed, 12 Mar 2025 12:31:41 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"285"},{"key":"Connection","value":"keep-alive"},{"key":"x-content-type-options","value":"nosniff"},{"key":"x-frame-options","value":"DENY"},{"key":"x-xss-protection","value":"1; mode=block"},{"key":"strict-transport-security","value":"max-age=31536000; includeSubDomains"},{"key":"content-security-policy","value":"default-src 'self'"},{"key":"X-Frame-Options","value":"DENY"},{"key":"X-Content-Type-Options","value":"nosniff"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": \"Success\",\n    \"Comment\": \"Transaction Received Successfully\",\n    \"Reference\": \"TTT26289330029\",\n    \"Customer_Number\": \"971069967\",\n    \"Amount\": 100,\n    \"Currency\": \"CDF\",\n    \"Created_At\": \"2025-03-12 12:31:41.715791\",\n    \"Updated_At\": \"2025-03-12 12:31:41.715816\",\n    \"Transaction_id\": \"PDYnjVY03uEf12DToUc25W1V\"\n}"}],"_postman_id":"df714762-25b3-4c84-85db-5ed0540d24e1"}],"id":"6e0c06ed-a0a4-4899-b5cc-8141057faf14","description":"<p>Initiate withdrawal transactions to transfer funds from your customers' accounts.</p>\n","_postman_id":"6e0c06ed-a0a4-4899-b5cc-8141057faf14"},{"name":"Transaction Status","item":[{"name":"Get Transaction Status","event":[{"listen":"test","script":{"exec":["pm.test(\"Response status code is 200\", function () {","  pm.response.to.have.status(200);","});","","","pm.test(\"Amount is a non-negative number\", function () {","    const responseData = pm.response.json();","    ","    pm.expect(responseData).to.be.an('object');","    pm.expect(responseData.Amount).to.be.a('number');","    pm.expect(responseData.Amount).to.be.at.least(0, \"Amount should be a non-negative number\");","});","","","pm.test(\"Currency is a valid currency code\", function () {","    const responseData = pm.response.json();","    ","    pm.expect(responseData).to.be.an('object');","    pm.expect(responseData.Currency).to.exist.and.to.match(/^[A-Z]{3}$/);","});"],"type":"text/javascript","packages":{},"id":"9d5582e3-c442-4eba-912c-a87e92a775eb"}}],"id":"63836f75-de43-4b98-af36-fc7f89975c1d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{json_web_token_0tvp}}"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"1e89c128-e152-4559-bd49-efcd5c8a7379\",\r\n    \"merchant_secrete\": \"t9OehanoQGF23ASZWr9l01xvMnVBSH4sN1buwBYgHeU\",\r\n    \"action\": \"verify\",\r\n    \"reference\": \"PDYnjVY03uEf12DToUc25W1V\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/gateway","description":"<p>Check the current status of a specific payment transaction. This endpoint allows you to retrieve real-time updates on the status of your payment transactions, such as \"Pending\", \"Successful\", \"Failed\", or \"Rejected\". This information is crucial for managing the payment lifecycle and providing transparent updates to your customers.</p>\n","urlObject":{"protocol":"https","path":["gateway"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"64994dcb-02ab-48d6-8078-6b9242d8d807","name":"Successful response","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"1e89c128-e152-4559-bd49-efcd5c8a7379\",\r\n    \"merchant_secrete\": \"t9OehanoQGF23ASZWr9l01xvMnVBSH4sN1buwBYgHeU\",\r\n    \"action\": \"verify\",\r\n    \"reference\": \"PDYnjVY03uEf12DToUc25W1V\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/gateway"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.18.0 (Ubuntu)"},{"key":"Date","value":"Wed, 12 Mar 2025 12:55:43 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"524"},{"key":"Connection","value":"keep-alive"},{"key":"x-content-type-options","value":"nosniff"},{"key":"x-frame-options","value":"DENY"},{"key":"x-xss-protection","value":"1; mode=block"},{"key":"strict-transport-security","value":"max-age=31536000; includeSubDomains"},{"key":"content-security-policy","value":"default-src 'self'"},{"key":"X-Frame-Options","value":"DENY"},{"key":"X-Content-Type-Options","value":"nosniff"}],"cookie":[],"responseTime":null,"body":"{\n    \"Status\": \"Success\",\n    \"Comment\": \"Transaction Found\",\n    \"Trans_Status\": \"Successful\",\n    \"Currency\": \"CDF\",\n    \"Amount\": 100,\n    \"Method\": \"airtel\",\n    \"Customer_result\": \"971069967\",\n    \"Reference\": \"TTT26289330029\",\n    \"Transaction_id\": \"PDYnjVY03uEf12DToUc25W1V\",\n    \"Action\": \"credit\",\n    \"Created_at\": \"2025-03-12 12:31:42\",\n    \"Updated_at\": \"2025-03-12 12:31:43\",\n    \"Trans_Status_Description\": \"Trans.ID: CI250312.1331.C57322 vous avez envoye de 100.0000 CDF a 971069967.Votre solde est -603317276.4302CDF.Cout:1.1600CDF\",\n    \"Financial_Institution_id\": \"CI250312.1331.C57322\"\n}"}],"_postman_id":"63836f75-de43-4b98-af36-fc7f89975c1d"}],"id":"1010b7a1-c1f1-4628-b18d-9d01163df9ad","description":"<p>Track the current status of your payment transactions and monitor their progress.</p>\n","_postman_id":"1010b7a1-c1f1-4628-b18d-9d01163df9ad"},{"name":"Account Services","item":[{"name":"Get Account Balance","id":"13283930-5d33-43da-b63b-0f9146b48c41","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{json_web_token_0tvp}}"}]},"isInherited":false},"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"0a180cef-ec3b-41ac-85f3-decc4d13a55a\",\r\n    \"merchant_secrete\": \"xQ0PU0Zk_G0bQzeG_Ni8ODg8iG_lsPNqSoMchzCIRz4\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/account/balance","description":"<p>Retrieve the current balance of a specific account.</p>\n","urlObject":{"protocol":"https","path":["account","balance"],"host":["{{baseURL}}"],"query":[],"variable":[]}},"response":[{"id":"91b406fa-536c-46e3-8087-722911941aea","name":"Get Account Balance","originalRequest":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"merchant_id\": \"0a180cef-ec3b-41ac-85f3-decc4d13a55a\",\r\n    \"merchant_secrete\": \"xQ0PU0Zk_G0bQzeG_Ni8ODg8iG_lsPNqSoMchzCIRz4\"\r\n}","options":{"raw":{"language":"json"}}},"url":"https://{{baseURL}}/account/balance"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.27.0"},{"key":"Date","value":"Fri, 26 Jul 2024 13:00:58 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"971"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"Operator\": \"airtel\",\n        \"Wallet_Type\": \"credit\",\n        \"Balance\": \"0.33500000000000085\",\n        \"Currency\": \"USD\"\n    },\n    {\n        \"Operator\": \"airtel\",\n        \"Wallet_Type\": \"credit\",\n        \"Balance\": \"55.5\",\n        \"Currency\": \"CDF\"\n    },\n    {\n        \"Operator\": \"airtel\",\n        \"Wallet_Type\": \"debit\",\n        \"Balance\": \"0.0\",\n        \"Currency\": \"USD\"\n    },\n    {\n        \"Operator\": \"airtel\",\n        \"Wallet_Type\": \"debit\",\n        \"Balance\": \"28017.0\",\n        \"Currency\": \"CDF\"\n    },\n    {\n        \"Operator\": \"orange\",\n        \"Wallet_Type\": \"credit\",\n        \"Balance\": \"1.0\",\n        \"Currency\": \"USD\"\n    },\n    {\n        \"Operator\": \"orange\",\n        \"Wallet_Type\": \"credit\",\n        \"Balance\": \"123669.75\",\n        \"Currency\": \"CDF\"\n    },\n    {\n        \"Operator\": \"orange\",\n        \"Wallet_Type\": \"debit\",\n        \"Balance\": \"0.0965\",\n        \"Currency\": \"USD\"\n    },\n    {\n        \"Operator\": \"orange\",\n        \"Wallet_Type\": \"debit\",\n        \"Balance\": \"675.5\",\n        \"Currency\": \"CDF\"\n    },\n    {\n        \"Operator\": \"vodacom\",\n        \"Wallet_Type\": \"credit\",\n        \"Balance\": \"0.0\",\n        \"Currency\": \"USD\"\n    },\n    {\n        \"Operator\": \"vodacom\",\n        \"Wallet_Type\": \"credit\",\n        \"Balance\": \"416.7\",\n        \"Currency\": \"CDF\"\n    },\n    {\n        \"Operator\": \"vodacom\",\n        \"Wallet_Type\": \"debit\",\n        \"Balance\": \"0.0\",\n        \"Currency\": \"USD\"\n    },\n    {\n        \"Operator\": \"vodacom\",\n        \"Wallet_Type\": \"debit\",\n        \"Balance\": \"193.0\",\n        \"Currency\": \"CDF\"\n    }\n]"}],"_postman_id":"13283930-5d33-43da-b63b-0f9146b48c41"}],"id":"8625045e-b63f-40a5-a020-64e6c4cd88f7","description":"<p>The Account Services section of the PayDRC API provides endpoints to manage your account-related information and balances.</p>\n","_postman_id":"8625045e-b63f-40a5-a020-64e6c4cd88f7"}],"id":"593664df-1d7a-4047-ae50-913f17a5d243","description":"<p>API Gateway — collect (debit) and payout (credit) payments via mobile money rails (M-Pesa, Orange, Airtel, Afrimoney). HMAC + AES-128-CBC body signing. Asynchronous callback to your webhook URL.</p>\n","_postman_id":"593664df-1d7a-4047-ae50-913f17a5d243"},{"name":"Remittance","item":[{"name":"00. Health Check","item":[{"name":"[TC-HLT-001] Health check","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Health response has status\", function () {","    var json = pm.response.json();","    pm.expect(json).to.have.property(\"status\");","});"],"id":"2bb9a5ba-614c-4899-a4e1-d4fef5cabd3d"}}],"id":"6d06b43e-f0b8-47e7-8ef1-28cb7e8867f1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/health","urlObject":{"path":["api","v1","remittance","health"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6d06b43e-f0b8-47e7-8ef1-28cb7e8867f1"}],"id":"53cf2806-b6f1-4e37-baea-8b2f10cc1fc5","_postman_id":"53cf2806-b6f1-4e37-baea-8b2f10cc1fc5","description":""},{"name":"01. Authentication","item":[{"name":"[SETUP] Merchant Login - Get JWT (RUN THIS FIRST)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Login successful with access_token\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","    pm.expect(json.data).to.have.property(\"access_token\");","    pm.expect(json.data).to.have.property(\"merchant_code\");","    pm.expect(json.data).to.have.property(\"company_name\");","    pm.expect(json.data).to.have.property(\"wallets\");","    pm.expect(json.data.wallets).to.be.an(\"array\");","});","","if (pm.response.code === 200) {","    var jsonData = pm.response.json();","    if (jsonData.data && jsonData.data.access_token) {","        pm.collectionVariables.set(\"merchant_jwt\", jsonData.data.access_token);","        pm.collectionVariables.set(\"merchant_code\", jsonData.data.merchant_code);","        console.log(\"Merchant JWT and merchant_code stored successfully\");","    }","}"],"id":"65a35e69-fa7e-4d79-a8d6-6ccaea2818e4"}}],"id":"40ac3309-8895-4211-b43a-6dde424a57b1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"email\": \"{{merchant_email}}\",\n  \"password\": \"{{merchant_password}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/merchant/login","urlObject":{"path":["api","v1","merchant","login"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"40ac3309-8895-4211-b43a-6dde424a57b1"},{"name":"[TC-AUTH-001] API key auth - valid Basic credentials on /inbound","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Auth passes - status is 202 or 200\", function () {","    pm.expect(pm.response.code).to.be.oneOf([200, 202]);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Merchant authenticated via Basic auth\", function () {","    var json = pm.response.json();","    // Should NOT get RMT-2003 auth error","    if (json.error) {","        pm.expect(json.error.code).to.not.eql(\"RMT-2003\");","    }","});"],"id":"e8331a05-aaed-4126-a383-e4c4d39b4730"}}],"id":"09478be8-e8ab-49d6-8c67-b644b853d1a6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-AUTH001-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"09478be8-e8ab-49d6-8c67-b644b853d1a6"},{"name":"[TC-AUTH-003] Dashboard JWT - Get balance with valid Bearer","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});","","pm.test(\"Has wallets array\", function () {","    var json = pm.response.json();","    pm.expect(json.data).to.have.property(\"wallets\");","    pm.expect(json.data.wallets).to.be.an(\"array\");","});"],"id":"3fe32c5a-65d9-4fdc-801c-04bb0bb2b935"}}],"id":"d98338c5-30e7-4b6f-860d-c117e16ecf5c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/balance","urlObject":{"path":["api","v1","remittance","balance"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"d98338c5-30e7-4b6f-860d-c117e16ecf5c"},{"name":"[TC-AUTH-002] API key auth - invalid api_secret (expect 401)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 401\", function () {","    pm.response.to.have.status(401);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Error code is RMT-2003\", function () {","    var json = pm.response.json();","    pm.expect(json.error.code).to.eql(\"RMT-2003\");","});"],"id":"dd8897a9-cb39-4c7e-816c-8d4733aa683f"}}],"id":"275f6d58-c900-463b-8a85-473e4fd4c982","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{auth_password_0j1w}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-AUTH002-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"275f6d58-c900-463b-8a85-473e4fd4c982"}],"id":"0053fbae-069f-46e8-b9f6-4a8e38fe772d","_postman_id":"0053fbae-069f-46e8-b9f6-4a8e38fe772d","description":""},{"name":"02. Inbound Remittance","item":[{"name":"[TC-INB-001] Happy path - M-Pesa USD inbound","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 202\", function () {","    pm.response.to.have.status(202);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Transaction accepted\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"accepted\");","    pm.expect(json.data).to.have.property(\"transaction_id\");","    pm.expect(json.data).to.have.property(\"reference\");","    pm.expect(json.data).to.have.property(\"amount\");","    pm.expect(json.data).to.have.property(\"currency\");","    pm.expect(json.data).to.have.property(\"operator\");","});","","if (pm.response.code === 202) {","    var json = pm.response.json();","    pm.collectionVariables.set(\"last_txn_id\", json.data.transaction_id);","    pm.collectionVariables.set(\"last_reference\", json.data.reference);","    console.log(\"Stored transaction_id: \" + json.data.transaction_id);","}"],"id":"80e1b990-77ed-4a19-a241-0ae5f6fec0a3"}}],"id":"09408cc8-50d9-46c7-ab25-2cc347767529","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-INB-MPESA-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"09408cc8-50d9-46c7-ab25-2cc347767529"},{"name":"[TC-INB-008] Happy path - Airtel inbound","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 202\", function () {","    pm.response.to.have.status(202);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Transaction accepted\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"accepted\");","    pm.expect(json.data).to.have.property(\"transaction_id\");","    pm.expect(json.data).to.have.property(\"reference\");","    pm.expect(json.data).to.have.property(\"amount\");","    pm.expect(json.data).to.have.property(\"currency\");","    pm.expect(json.data).to.have.property(\"operator\");","});","","if (pm.response.code === 202) {","    var json = pm.response.json();","    pm.collectionVariables.set(\"last_txn_id\", json.data.transaction_id);","    pm.collectionVariables.set(\"last_reference\", json.data.reference);","    console.log(\"Stored transaction_id: \" + json.data.transaction_id);","}"],"id":"6624c204-1701-416c-a148-04807f23e8d3"}}],"id":"b23a9169-fdbd-4857-98f2-2c8072207bbf","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_airtel}}\",\n  \"reference\": \"SIT-INB-AIRTEL-1783279849\",\n  \"operator\": \"airtel\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"b23a9169-fdbd-4857-98f2-2c8072207bbf"},{"name":"[TC-INB-009] Happy path - Orange inbound (will fail CONFIG_ERROR if no Orange channel)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","// Orange channel may not be configured for this test merchant.","// Expected: either 202 accepted or CONFIG_ERROR."],"id":"467bf591-d066-4a78-b9c0-d6ab2bc41a09"}}],"id":"be55171d-e5bd-4fad-bba0-3f6c157a40ac","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_orange}}\",\n  \"reference\": \"SIT-INB-ORANGE-1783279849\",\n  \"operator\": \"orange\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"be55171d-e5bd-4fad-bba0-3f6c157a40ac"},{"name":"[TC-INB-006] Inbound CDF with FX conversion","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 202\", function () {","    pm.response.to.have.status(202);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Transaction accepted\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"accepted\");","    pm.expect(json.data).to.have.property(\"transaction_id\");","    pm.expect(json.data).to.have.property(\"reference\");","    pm.expect(json.data).to.have.property(\"amount\");","    pm.expect(json.data).to.have.property(\"currency\");","    pm.expect(json.data).to.have.property(\"operator\");","});","","if (pm.response.code === 202) {","    var json = pm.response.json();","    pm.collectionVariables.set(\"last_txn_id\", json.data.transaction_id);","    pm.collectionVariables.set(\"last_reference\", json.data.reference);","    console.log(\"Stored transaction_id: \" + json.data.transaction_id);","}"],"id":"50d0df0d-5351-433c-8a08-81e9d474ccac"}}],"id":"49e7117d-ad8e-459a-ba98-578dd25f8548","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 28000,\n  \"currency\": \"CDF\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-INB-CDF-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"49e7117d-ad8e-459a-ba98-578dd25f8548"},{"name":"[TC-INB-002] Negative - Missing amount field","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 400\", function () {","    pm.response.to.have.status(400);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is error\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"error\");","});"],"id":"a48bb46f-b004-4741-a909-63645b1e9a1b"}}],"id":"34e53022-0f33-46c2-9f65-97b96c61c1e2","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-INB-MPESA-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"34e53022-0f33-46c2-9f65-97b96c61c1e2"},{"name":"[TC-INB-003] Negative - Invalid operator","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 400\", function () {","    pm.response.to.have.status(400);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is error\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"error\");","});"],"id":"605b78a4-fc62-4dfc-a72b-2fc9196af4cd"}}],"id":"ee32dd34-90af-4422-935c-0051b4820cd1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-INB-BADOP-1783279849\",\n  \"operator\": \"unknown\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"ee32dd34-90af-4422-935c-0051b4820cd1"},{"name":"[TC-INB-005] Duplicate thirdparty_reference - idempotency check","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Duplicate reference detected\", function () {","    // Expect 409 Conflict or original transaction returned","    pm.expect(pm.response.code).to.be.oneOf([409, 200, 202]);","    var json = pm.response.json();","    if (pm.response.code === 409) {","        pm.expect(json.status).to.eql(\"error\");","        console.log(\"Idempotency: duplicate correctly rejected\");","    } else {","        console.log(\"Idempotency: original transaction returned or accepted\");","    }","});"],"id":"ec9a6f27-c30d-45f1-97b0-15763e825c17"}}],"id":"c4af8076-6d43-4121-aafa-8d54d18c9ea4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"{{last_reference}}\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\",\n  \"expected_receiver_name\": \"Marie Kabeya\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c4af8076-6d43-4121-aafa-8d54d18c9ea4"},{"name":"Check transaction status (uses last created txn)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () { pm.response.to.have.status(200); });","pm.test(\"Response is valid JSON\", function () { pm.response.to.be.json; });","pm.test(\"Transaction has expected fields\", function () {","    var json = pm.response.json();","    pm.expect(json.data).to.have.property(\"transaction_id\");","    pm.expect(json.data).to.have.property(\"status\");","});"],"id":"a17b8e17-cd66-42c3-8f4a-ef82e62ba7bf"}}],"id":"e1c8657e-43f6-4efc-85ee-358f5969e608","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/transaction/status?transaction_id={{last_txn_id}}","urlObject":{"path":["api","v1","remittance","transaction","status"],"host":["{{base_url}}"],"query":[{"key":"transaction_id","value":"{{last_txn_id}}"}],"variable":[]}},"response":[],"_postman_id":"e1c8657e-43f6-4efc-85ee-358f5969e608"},{"name":"[TC-INB-NAME-004] Match — happy path (expect 202 with subscriber_name)","id":"23033a0f-9599-4810-a5cd-460e42c2e22e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"TEST-INB-NAME-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"Jemasa\",\n  \"sender_last_name\": \"TOMATALA\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Henock\",\n  \"receiver_last_name\": \"BARAKAEL\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"provider_name\": \"Paypal\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"expected_receiver_name\": \"Henock BARAKAEL\"\n}"},"url":"{{base_url}}/api/v1/remittance/inbound","description":"<p>When expected_receiver_name matches the telco record, /inbound returns 202 and includes the canonical <code>subscriber_name</code> from the telco in data — convenient for the merchant to display/log the authoritative name.</p>\n","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"23033a0f-9599-4810-a5cd-460e42c2e22e"},{"name":"[TC-INB-NAME-001] Missing expected_receiver_name (expect 400 RMT-1005)","id":"8d5911ef-f594-48ec-97e7-0ec559b8e063","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"TEST-INB-NAME-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"Jemasa\",\n  \"sender_last_name\": \"TOMATALA\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Henock\",\n  \"receiver_last_name\": \"BARAKAEL\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"provider_name\": \"Paypal\",\n  \"callback_url\": \"https://merchant.example.com/callback\"\n}"},"url":"{{base_url}}/api/v1/remittance/inbound","description":"<p>Strict mode (default) refuses /inbound when expected_receiver_name is absent. The error response includes a <code>field</code> pointer and a <code>telco_name_hint</code> so the merchant can retry without re-running /account-lookup.</p>\n","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"8d5911ef-f594-48ec-97e7-0ec559b8e063"},{"name":"[TC-INB-NAME-002] Name mismatch (expect 422 RMT-4006)","id":"4100314d-8fcc-4275-b01f-401308eeeac1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"TEST-INB-NAME-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"Jemasa\",\n  \"sender_last_name\": \"TOMATALA\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Henock\",\n  \"receiver_last_name\": \"BARAKAEL\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"provider_name\": \"Paypal\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"expected_receiver_name\": \"Jane Doe\"\n}"},"url":"{{base_url}}/api/v1/remittance/inbound","description":"<p>Fuzzy match: case-insensitive, accent-folded, order-independent, tolerates 1 missing middle name and up to 2 char typos per token. Wildly different names return 422 with both names in the payload.</p>\n","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"4100314d-8fcc-4275-b01f-401308eeeac1"}],"id":"76485f77-7b2a-4d34-8fa2-8913fa1021a0","_postman_id":"76485f77-7b2a-4d34-8fa2-8913fa1021a0","description":""},{"name":"02b. Account Lookup","item":[{"name":"[TC-LKP-001] Account lookup (operator auto-detected from prefix)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('Status code is 200 (valid) or 422 (invalid subscriber)', function () {","    pm.expect([200, 422]).to.include(pm.response.code);","});","pm.test('Response has the standard lookup payload', function () {","    var j = pm.response.json();","    pm.expect(j.status).to.eql('success');","    pm.expect(j.data).to.have.property('valid');","    pm.expect(j.data).to.have.property('operator');","    pm.expect(j.data).to.have.property('subscriber_name');","    pm.expect(j.data).to.have.property('response_code');","    pm.expect(j.data.lookup_reference).to.match(/^LOOKUP-/);","});"],"id":"85185a55-f451-4ca3-9904-d16029feb0d5"}}],"id":"bc8a1541-e790-4cd0-8a07-07f31f7aa159","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"amount\": \"100\",\n  \"currency\": \"CDF\",\n  \"receiver_first_name\": \"Jeanette\",\n  \"receiver_last_name\": \"Lukombo\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_msisdn\": \"243819214761\",\n  \"sender_country_code\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"reference\": \"SIT-LKP-1783279849\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/account-lookup","description":"<p>Most common case: partner sends just customer_number + amount/currency + sender/receiver names. The operator is inferred from the DRC phone prefix.</p>\n<p>For Airtel-only lookups you can omit the receiver_*<em>name and sender</em>*_name fields — Airtel doesn't require them.</p>\n","urlObject":{"path":["api","v1","remittance","account-lookup"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bc8a1541-e790-4cd0-8a07-07f31f7aa159"},{"name":"[TC-LKP-002] Override operator explicitly (skip auto-detect)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('Status code is 200 or 422', function () {","    pm.expect([200, 422]).to.include(pm.response.code);","});","pm.test('Operator is airtel', function () {","    pm.expect(pm.response.json().data.operator).to.eql('airtel');","});"],"id":"ef0ca072-79ca-4789-b9db-5069c2408566"}}],"id":"39e97413-de21-44a8-8637-f860a12c941e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"operator\": \"airtel\",\n  \"customer_number\": \"{{test_phone_airtel}}\",\n  \"amount\": \"10\",\n  \"currency\": \"USD\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/account-lookup","description":"<p>Pass <code>operator</code> explicitly when you need to override the prefix-based detection (rare).</p>\n","urlObject":{"path":["api","v1","remittance","account-lookup"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"39e97413-de21-44a8-8637-f860a12c941e"},{"name":"[TC-LKP-003] Unknown DRC prefix → 400 IMT-1002","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test('Status code is 400', function () { pm.response.to.have.status(400); });","pm.test('Error code is IMT-1002', function () { pm.expect(pm.response.json().error.code).to.eql('IMT-1002'); });"],"id":"f60a1185-6ef8-4bd5-ab51-38b2ce7490ff"}}],"id":"7482eab9-5968-494c-853b-249744cf203a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"customer_number\": \"243601234567\",\n  \"amount\": \"100\",\n  \"currency\": \"USD\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/account-lookup","description":"<p>Prefix 60 is not a DRC mobile-money operator → IMT-1002 'Could not infer operator from msisdn prefix'. Partner should pass operator explicitly or fix the number.</p>\n","urlObject":{"path":["api","v1","remittance","account-lookup"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"7482eab9-5968-494c-853b-249744cf203a"}],"id":"bf95d82c-542e-42da-9b3c-4c5141f57c9d","description":"<p>POST /api/v1/remittance/account-lookup — Pre-validate a receiver MSISDN before submitting the actual inbound.</p>\n<p>No need to send <code>operator</code> — it's auto-detected from the DRC phone prefix:\n• 81 / 82 / 83 / 86 → mpesa (Vodacom)\n• 97 / 98 / 99 → airtel\n• 80 / 84 / 85 / 89 → orange (not yet supported, returns 400)</p>\n<p>If the prefix is non-DRC or unmapped, pass <code>operator</code> explicitly to override.</p>\n<p>Returns subscriber_name (when the operator provides it) + response_code + response_desc.\nFree, no debit, rate-limited 60/min per merchant_code.</p>\n","_postman_id":"bf95d82c-542e-42da-9b3c-4c5141f57c9d"},{"name":"02c. Transaction Timeline","item":[{"name":"[TC-TLN-001] Get timeline for last txn","id":"47008a69-b7ef-48c3-8b2e-f59e08ca6843","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/transactions/{{last_txn_id}}/timeline","description":"<p>Returns <code>summary</code> (final status, duration_s) + <code>events[]</code> ordered chronologically. Each event has kind, status (ok|warn|fail|info), title, ts, detail{}.</p>\n","urlObject":{"path":["api","v1","remittance","transactions","{{last_txn_id}}","timeline"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"47008a69-b7ef-48c3-8b2e-f59e08ca6843"}],"id":"714d29db-2e78-4a68-adf7-729c07772c62","description":"<p>Per-transaction event timeline (received, screening, FX, telco validate, switch send, telco callback). Same data merchants see in the dashboard drawer.</p>\n","_postman_id":"714d29db-2e78-4a68-adf7-729c07772c62"},{"name":"03. Outbound Remittance","item":[{"name":"[TC-OUT-001] Outbound M-Pesa (currently disabled - expect 403)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 403\", function () {","    pm.response.to.have.status(403);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Outbound not yet available\", function () {","    var json = pm.response.json();","    pm.expect(json.error.code).to.eql(\"RMT-9001\");","});"],"id":"c133caac-7e47-40e4-b45d-de4b4d2f5b5f"}}],"id":"704a7cfb-5650-4dd3-a9fb-15b23a722801","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-OUT-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/outbound","urlObject":{"path":["api","v1","remittance","outbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"704a7cfb-5650-4dd3-a9fb-15b23a722801"},{"name":"[TC-OUT-002] Insufficient wallet balance (expect 402 or 403)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Insufficient funds or outbound disabled\", function () {","    pm.expect(pm.response.code).to.be.oneOf([402, 403]);","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"error\");","    console.log(\"Rejection: \" + json.error.code + \" - \" + json.error.message);","});"],"id":"101f0948-f5be-4608-bf02-dea66682fd34"}}],"id":"74c31ace-ea39-4cb6-b12e-09b8974553f0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 999999999,\n  \"currency\": \"USD\",\n  \"customer_number\": \"{{test_phone_mpesa}}\",\n  \"reference\": \"SIT-OUT002-1783279849\",\n  \"operator\": \"mpesa\",\n  \"sender_first_name\": \"John\",\n  \"sender_last_name\": \"Doe\",\n  \"sender_nationality\": \"FRA\",\n  \"sender_birthdate\": \"1985-05-15\",\n  \"sending_country\": \"FRA\",\n  \"sender_city\": \"Paris\",\n  \"current_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"permanent_address\": \"10 rue de la Paix, 75001 Paris\",\n  \"profession\": \"Engineer\",\n  \"identity_number\": \"FR1234567890\",\n  \"document_issue_date\": \"2018-01-01\",\n  \"document_expiration_date\": \"2028-01-01\",\n  \"receiver_first_name\": \"Marie\",\n  \"receiver_last_name\": \"Kabeya\",\n  \"receiver_nationality\": \"COD\",\n  \"receiving_country\": \"COD\",\n  \"callback_url\": \"https://merchant.example.com/callback\",\n  \"provider_name\": \"Paypal\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/outbound","urlObject":{"path":["api","v1","remittance","outbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"74c31ace-ea39-4cb6-b12e-09b8974553f0"}],"id":"b573ff28-ad67-43a2-8c6b-0997206ddfe6","_postman_id":"b573ff28-ad67-43a2-8c6b-0997206ddfe6","description":""},{"name":"04. FX Rates","item":[{"name":"[TC-FX-002] Public FX rate (no auth required)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Rate response has data\", function () {","    var json = pm.response.json();","    pm.expect(json).to.have.property(\"data\");","});"],"id":"a9b1dc32-08f3-45f4-98d4-f38f7879ae36"}}],"id":"993356a8-de48-42f4-8850-e4a7a3084094","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/rate?currency=CDF","urlObject":{"path":["api","v1","remittance","rate"],"host":["{{base_url}}"],"query":[{"key":"currency","value":"CDF"}],"variable":[]}},"response":[],"_postman_id":"993356a8-de48-42f4-8850-e4a7a3084094"},{"name":"[TC-FX-001] Live FX rate USD/CDF (triggers live fetch)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});"],"id":"abca5cd0-f9bc-493f-908e-5f9ad09841b8"}}],"id":"da734159-9cf2-4f53-8232-5ed2594b3484","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/rate/live?currency=CDF","urlObject":{"path":["api","v1","remittance","rate","live"],"host":["{{base_url}}"],"query":[{"key":"currency","value":"CDF"}],"variable":[]}},"response":[],"_postman_id":"da734159-9cf2-4f53-8232-5ed2594b3484"},{"name":"[TC-FX-012] Multi-currency - UGX rate","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});"],"id":"dabc8719-6058-408f-adc6-a2a6d7288cc0"}}],"id":"18663653-ee44-4018-be16-40cfcab6211c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/rate/live?currency=UGX","urlObject":{"path":["api","v1","remittance","rate","live"],"host":["{{base_url}}"],"query":[{"key":"currency","value":"UGX"}],"variable":[]}},"response":[],"_postman_id":"18663653-ee44-4018-be16-40cfcab6211c"}],"id":"6a4e60b9-8c46-4bb7-a185-78660e9b4454","_postman_id":"6a4e60b9-8c46-4bb7-a185-78660e9b4454","description":""},{"name":"05. Wallet Management","item":[{"name":"[TC-WAL-001] Get wallet balance","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});","","pm.test(\"Wallets returned with balance fields\", function () {","    var json = pm.response.json();","    pm.expect(json.data.wallets).to.be.an(\"array\");","    if (json.data.wallets.length > 0) {","        var w = json.data.wallets[0];","        pm.expect(w).to.have.property(\"balance\");","        pm.expect(w).to.have.property(\"available\");","        pm.expect(w).to.have.property(\"reserved\");","        pm.expect(w).to.have.property(\"wallet_code\");","    }","});"],"id":"0871eeaa-9d56-46f3-8d9a-1f9a0a573d3a"}}],"id":"76aef260-208f-4cf3-95be-c60c1421ff08","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/balance","urlObject":{"path":["api","v1","remittance","balance"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"76aef260-208f-4cf3-95be-c60c1421ff08"},{"name":"[TC-WAL-002] Wallet history","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"24bb1d73-8f50-47e9-be42-8b4374168def"}}],"id":"91247d5b-57fa-4d78-9777-5cc6f3bebe1b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/wallet/history?wallet_code={{wallet_code}}","urlObject":{"path":["api","v1","wallet","history"],"host":["{{base_url}}"],"query":[{"key":"wallet_code","value":"{{wallet_code}}"}],"variable":[]}},"response":[],"_postman_id":"91247d5b-57fa-4d78-9777-5cc6f3bebe1b"}],"id":"dd9465cc-a088-4508-b180-eb4ea6526431","_postman_id":"dd9465cc-a088-4508-b180-eb4ea6526431","description":""},{"name":"06. Merchant Dashboard","item":[{"name":"[TC-DSH-002] Change merchant password","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"fbe0bd96-0d44-4a3f-9913-a89370ab89d6"}}],"id":"c3915dbf-92cf-4ac0-86cb-68a1ba08fc99","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"old_password\": \"{{merchant_password}}\",\n  \"new_password\": \"MokoTestNew2026!\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/merchant/change-password","urlObject":{"path":["api","v1","merchant","change-password"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c3915dbf-92cf-4ac0-86cb-68a1ba08fc99"},{"name":"[TC-DSH-003] List transactions","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});","","pm.test(\"Transactions array returned\", function () {","    var json = pm.response.json();","    pm.expect(json.data).to.have.property(\"transactions\");","    pm.expect(json.data.transactions).to.be.an(\"array\");","    pm.expect(json.data).to.have.property(\"total\");","    pm.expect(json.data).to.have.property(\"page\");","});"],"id":"0ff6c0c2-398d-44d0-a553-afe54ec64f15"}}],"id":"fc83988f-f674-451d-b57f-1f572fc8c638","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/transactions?page=1&limit=20","urlObject":{"path":["api","v1","remittance","transactions"],"host":["{{base_url}}"],"query":[{"key":"page","value":"1"},{"key":"limit","value":"20"}],"variable":[]}},"response":[],"_postman_id":"fc83988f-f674-451d-b57f-1f572fc8c638"},{"name":"[TC-DSH-004] Regenerate API secret (CAUTION: invalidates current api_secret)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});","","pm.test(\"New secret returned\", function () {","    var json = pm.response.json();","    pm.expect(json.data).to.have.property(\"merchant_secret\");","    // Store the new secret","    pm.collectionVariables.set(\"api_secret\", json.data.merchant_secret);","    console.log(\"New API secret stored: \" + json.data.merchant_secret);","});"],"id":"053d53d6-6944-4c98-a118-bf632918c6ee"}}],"id":"173fa70e-d7b6-4e49-a4ed-8c805080a5c7","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"merchant_code\": \"{{merchant_code}}\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/merchant/secret","urlObject":{"path":["api","v1","merchant","secret"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"173fa70e-d7b6-4e49-a4ed-8c805080a5c7"},{"name":"[TC-DSH-005] List IP whitelist","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"76eeaf9a-98e4-43e0-b39a-59eeed76f41c"}}],"id":"3270a306-f796-40b1-8fe1-464249a13c47","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/merchant/whitelist","urlObject":{"path":["api","v1","merchant","whitelist"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3270a306-f796-40b1-8fe1-464249a13c47"},{"name":"[TC-DSH-005] Add IP to whitelist","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"77910dd5-1922-421c-8fe7-4d3b33d6cf4f"}}],"id":"c40d543e-d7f1-48db-87c1-c7f5ec02477b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"ip_address\": \"1.2.3.4\",\n  \"label\": \"SIT test IP\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/merchant/whitelist","urlObject":{"path":["api","v1","merchant","whitelist"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"c40d543e-d7f1-48db-87c1-c7f5ec02477b"},{"name":"[TC-DSH-005] Remove IP from whitelist","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"cd0afea9-4d2d-4a20-bcad-4e24fb358365"}}],"id":"3bd122ea-f645-46c0-9bc3-421d2a286eec","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"DELETE","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"ip_address\": \"1.2.3.4\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/merchant/whitelist","urlObject":{"path":["api","v1","merchant","whitelist"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"3bd122ea-f645-46c0-9bc3-421d2a286eec"},{"name":"[TC-DSH-006] List callback URLs","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"06395299-8bf4-48f9-853b-a35575ee57e3"}}],"id":"f78ddb6d-6a91-4038-a5b2-5fa3b344843c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/merchant/callback","urlObject":{"path":["api","v1","merchant","callback"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"f78ddb6d-6a91-4038-a5b2-5fa3b344843c"},{"name":"[TC-DSH-006] Update callback URL","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"22d9fa5a-d70b-4b9b-9104-1c021b375e67"}}],"id":"02bd40f2-4adf-420f-bb1d-afde67b04019","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"PUT","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n  \"channel\": \"mpesa\",\n  \"direction\": \"inbound\",\n  \"callback_url\": \"https://merchant.example.com/cb\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/merchant/callback","urlObject":{"path":["api","v1","merchant","callback"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"02bd40f2-4adf-420f-bb1d-afde67b04019"},{"name":"[TC-DSH-008] Submit go-live request","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});"],"id":"ff66531c-81ce-401f-97e8-f3fd9b250255"}}],"id":"bae83dd5-afba-479b-9c66-e12e5ccbc5a6","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{merchant_jwt}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/merchant/go-live","urlObject":{"path":["api","v1","merchant","go-live"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bae83dd5-afba-479b-9c66-e12e5ccbc5a6"},{"name":"[TC-DSH-007] List settlements","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 200\", function () {","    pm.response.to.have.status(200);","});","","pm.test(\"Response is valid JSON\", function () {","    pm.response.to.be.json;","});","","pm.test(\"Status is success\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"success\");","});"],"id":"6f8499df-aa96-46ac-bf48-65f4da0dea43"}}],"id":"55196a2f-a285-4c8c-b7d0-665e5970c414","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/api/v1/remittance/settlement/list?merchant_code={{merchant_code}}","urlObject":{"path":["api","v1","remittance","settlement","list"],"host":["{{base_url}}"],"query":[{"key":"merchant_code","value":"{{merchant_code}}"}],"variable":[]}},"response":[],"_postman_id":"55196a2f-a285-4c8c-b7d0-665e5970c414"}],"id":"22b75cb0-aea9-41c2-9a7f-bf85d0a213bd","_postman_id":"22b75cb0-aea9-41c2-9a7f-bf85d0a213bd","description":""},{"name":"07. Error Handling","item":[{"name":"[TC-ERR-002] Malformed JSON in request body (expect 400, not 500)","event":[{"listen":"test","script":{"type":"text/javascript","exec":["pm.test(\"Status code is 400 (not 500)\", function () {","    pm.response.to.have.status(400);","});","","pm.test(\"Clear error message returned\", function () {","    var json = pm.response.json();","    pm.expect(json.status).to.eql(\"error\");","    console.log(\"Error: \" + json.error.message);","});"],"id":"d86ef275-6c06-4371-bb81-e58749e7eeae"}}],"id":"6303a4b8-80b7-482a-9950-f587d5d1ae8c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"basic","basic":{"basicConfig":[{"key":"username","value":"{{merchant_code}}"},{"key":"password","value":"{{api_secret}}"}]},"isInherited":false},"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{invalid json here;;;","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/api/v1/remittance/inbound","urlObject":{"path":["api","v1","remittance","inbound"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6303a4b8-80b7-482a-9950-f587d5d1ae8c"}],"id":"358d2947-b952-41ff-af3b-acab3b538e31","_postman_id":"358d2947-b952-41ff-af3b-acab3b538e31","description":""}],"id":"925611cd-4c81-4612-94f4-cf63cff02bbb","description":"<p>IMT (International Money Transfer) merchant-facing endpoints. Submit cross-border payouts to DRC mobile wallets (Vodacom M-Pesa, Airtel), real-time FX, account lookup, KYC, reservations.</p>\n","_postman_id":"925611cd-4c81-4612-94f4-cf63cff02bbb"},{"name":"Platform","item":[{"name":"Health","item":[{"name":"Health Check","id":"77ab8cc0-2dc0-4d61-9362-9f047cbbc89e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/health","description":"<p>Verifie que l'API est en ligne.</p>\n","urlObject":{"path":["health"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"77ab8cc0-2dc0-4d61-9362-9f047cbbc89e"}],"id":"0240d7b7-bfdf-4a32-a4db-451b61d93382","_postman_id":"0240d7b7-bfdf-4a32-a4db-451b61d93382","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}}},{"name":"Account","item":[{"name":"Mon compte + soldes","id":"20f5274b-5bcb-4c14-9b59-bbb4b3d1d5ac","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{base_url}}/v1/account","description":"<p>Retourne les informations de votre compte marchand et vos soldes par operateur/devise.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","account"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"f1b8751d-9b49-4cca-b6ba-53b291f024a7","name":"Exemple de reponse","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/v1/account","description":"Retourne les informations de votre compte marchand et vos soldes par operateur/devise."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"account\": {\n        \"merchant_code\": \"mXLMPLwhq7bnK\",\n        \"name\": \"Mon Entreprise\",\n        \"email\": \"contact@entreprise.cd\",\n        \"phone\": \"243990000000\",\n        \"active\": true,\n        \"sub_merchants_count\": 5\n    },\n    \"balances\": [\n        {\n            \"method\": \"mpesa\",\n            \"currency\": \"CDF\",\n            \"deposit\": 150000.0,\n            \"withdrawal\": 50000.0,\n            \"available\": 200000.0\n        }\n    ]\n}"}],"_postman_id":"20f5274b-5bcb-4c14-9b59-bbb4b3d1d5ac"}],"id":"7c414414-a183-4192-98c9-22e13c09d0af","_postman_id":"7c414414-a183-4192-98c9-22e13c09d0af","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}}},{"name":"Categories","item":[{"name":"Lister les categories","id":"7efdebd1-a9a9-4aa0-91e5-d11708a07a6d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"GET","header":[],"url":"{{base_url}}/v1/categories","description":"<p>Liste les categories disponibles pour les sous-marchands.</p>\n<p>Endpoint public, pas besoin d'API key.</p>\n<p>Utilisez le <code>code</code> retourne dans le champ <code>category</code> lors de la creation d'un sous-marchand.</p>\n","urlObject":{"path":["v1","categories"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"b751406a-2261-40ee-b731-938fed6285dc","name":"Liste des categories","originalRequest":{"auth":{"type":"noauth"},"method":"GET","header":[],"url":"{{base_url}}/v1/categories","description":"Liste les categories disponibles pour les sous-marchands.\n\nEndpoint public, pas besoin d'API key.\n\nUtilisez le `code` retourne dans le champ `category` lors de la creation d'un sous-marchand."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"categories\": [\n        {\"code\": \"school\", \"name\": \"Ecole\"},\n        {\"code\": \"hospital\", \"name\": \"Hopital / Clinique\"},\n        {\"code\": \"pharmacy\", \"name\": \"Pharmacie\"},\n        {\"code\": \"restaurant\", \"name\": \"Restaurant\"},\n        {\"code\": \"church\", \"name\": \"Eglise\"},\n        {\"code\": \"hotel\", \"name\": \"Hotel\"},\n        {\"code\": \"gym\", \"name\": \"Salle de sport\"},\n        {\"code\": \"ngo\", \"name\": \"ONG / Association\"},\n        {\"code\": \"shop\", \"name\": \"Commerce / Boutique\"},\n        {\"code\": \"other\", \"name\": \"Autre\"}\n    ]\n}"}],"_postman_id":"7efdebd1-a9a9-4aa0-91e5-d11708a07a6d"}],"id":"e421503d-a451-4b20-818d-620d0720748b","_postman_id":"e421503d-a451-4b20-818d-620d0720748b","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}}},{"name":"Sub-Merchants","item":[{"name":"Lister mes sous-marchands","id":"a453e9dc-238d-4d11-937e-cebb2bfffa4a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{base_url}}/v1/sub-merchants","description":"<p>Liste tous vos sous-marchands.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","sub-merchants"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"530599ce-2ecb-4f35-9d73-4463e15ac365","name":"Exemple de reponse","originalRequest":{"method":"GET","header":[],"url":"{{base_url}}/v1/sub-merchants","description":"Liste tous vos sous-marchands."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"sub_merchants\": [\n        {\n            \"code\": \"mAbCdEfGhIjKl\",\n            \"name\": \"Ecole Primaire Kasa-Vubu\",\n            \"active\": true,\n            \"created_at\": \"2026-04-04 10:30:00\",\n            \"email\": \"contact@ecole.cd\",\n            \"phone\": \"+243990000000\"\n        }\n    ],\n    \"total\": 1\n}"}],"_postman_id":"a453e9dc-238d-4d11-937e-cebb2bfffa4a"},{"name":"Creer un sous-marchand","event":[{"listen":"test","script":{"exec":["var json = pm.response.json();","if (json.sub_merchant) {","    pm.collectionVariables.set('sub_merchant_code', json.sub_merchant.code);","}"],"type":"text/javascript","id":"c16a5dfa-7818-4d74-b79e-f7b48b47a7f3"}}],"id":"fd019c99-df42-49b2-8ad8-4df4560e8359","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Ecole Primaire Kasa-Vubu\",\n    \"firstname\": \"Jean\",\n    \"lastname\": \"Mukendi\",\n    \"email\": \"contact@ecole-kasavubu.cd\",\n    \"phone\": \"+243990000000\",\n    \"category\": \"school\",\n    \"commission_markup\": 1.0\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/sub-merchants","description":"<p>Cree un nouveau sous-marchand.</p>\n<p><strong>Champs requis</strong>: <code>name</code>, <code>firstname</code>, <code>lastname</code></p>\n<p><strong>Champs optionnels</strong>: <code>email</code>, <code>phone</code>, <code>category</code>, <code>commission_markup</code></p>\n<ul>\n<li><code>name</code>: nom du commerce/ecole</li>\n<li><code>firstname</code>: prenom du responsable</li>\n<li><code>lastname</code>: nom du responsable</li>\n<li><code>category</code>: code de categorie (voir GET /v1/categories)</li>\n<li><code>commission_markup</code>: marge de commission ajoutee par le parent (ex: 1.0 pour +1%). La commission du SM = votre commission de base + markup. Si non fourni, le SM herite de votre commission sans marge.</li>\n</ul>\n<p><strong>IMPORTANT</strong>: Un sous-marchand sans <code>commission_markup</code> (ou avec markup = 0) sera bloque lors des paiements. Ajoutez toujours une marge.</p>\n<p>Le <code>code</code> retourne est a conserver pour les paiements.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","sub-merchants"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"c2a1d786-c7f2-4e96-b78f-4fb3c9edbbbf","name":"Sous-marchand cree","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Ecole Primaire Kasa-Vubu\",\n    \"firstname\": \"Jean\",\n    \"lastname\": \"Mukendi\",\n    \"email\": \"contact@ecole-kasavubu.cd\",\n    \"phone\": \"+243990000000\",\n    \"category\": \"school\",\n    \"commission_markup\": 1.0\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/sub-merchants","description":"Cree un nouveau sous-marchand.\n\n**Champs requis**: `name`, `firstname`, `lastname`\n\n**Champs optionnels**: `email`, `phone`, `category`, `commission_markup`\n\n- `name`: nom du commerce/ecole\n- `firstname`: prenom du responsable\n- `lastname`: nom du responsable\n- `category`: code de categorie (voir GET /v1/categories)\n- `commission_markup`: marge de commission ajoutee par le parent (ex: 1.0 pour +1%). La commission du SM = votre commission de base + markup. Si non fourni, le SM herite de votre commission sans marge.\n\n**IMPORTANT**: Un sous-marchand sans `commission_markup` (ou avec markup = 0) sera bloque lors des paiements. Ajoutez toujours une marge.\n\nLe `code` retourne est a conserver pour les paiements."},"status":"Created","code":201,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"sub_merchant\": {\n        \"code\": \"mAbCdEfGhIjKl\",\n        \"name\": \"Ecole Primaire Kasa-Vubu\",\n        \"email\": \"contact@ecole-kasavubu.cd\",\n        \"phone\": \"+243990000000\",\n        \"category\": \"school\",\n        \"active\": true,\n        \"created_at\": \"2026-04-04 10:30:00\"\n    }\n}"}],"_postman_id":"fd019c99-df42-49b2-8ad8-4df4560e8359"},{"name":"Detail d'un sous-marchand","id":"6cc976fd-52de-48c0-b435-25932a8f985e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{base_url}}/v1/sub-merchants/{{sub_merchant_code}}","description":"<p>Retourne le detail d'un sous-marchand avec ses soldes par operateur/devise.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","sub-merchants","{{sub_merchant_code}}"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"6cc976fd-52de-48c0-b435-25932a8f985e"},{"name":"Modifier un sous-marchand","id":"bbad7db3-c089-44d9-a089-a2d95e6215a1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"name\": \"Nouveau nom\",\n    \"email\": \"nouveau@ecole.cd\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/sub-merchants/{{sub_merchant_code}}","description":"<p>Modifie le nom, email, telephone ou statut d'un sous-marchand.</p>\n<p>Tous les champs sont optionnels. Envoyez seulement ceux a modifier.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","sub-merchants","{{sub_merchant_code}}"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"bbad7db3-c089-44d9-a089-a2d95e6215a1"},{"name":"Ajouter/modifier la marge de commission","id":"827cd1b0-2484-4819-81ec-1a718ba295eb","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"commission_markup\": 1.0\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/sub-merchants/{{sub_merchant_code}}","description":"<p>Ajoute ou modifie la marge de commission d'un sous-marchand.</p>\n<p><code>commission_markup</code> est la marge que vous ajoutez sur votre commission de base.</p>\n<p>Exemple: si votre commission est 2.5% et vous mettez <code>commission_markup: 1.0</code>, la commission du SM sera 3.5%.</p>\n<p>La difference (1%) vous sera creditee a chaque transaction reussie sur ce SM.</p>\n<p><strong>IMPORTANT</strong>: Un SM sans marge sera bloque lors des paiements.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","sub-merchants","{{sub_merchant_code}}"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"7120902b-3312-44a6-a701-123eb8552a44","name":"Marge mise a jour","originalRequest":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"commission_markup\": 1.0\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/sub-merchants/{{sub_merchant_code}}","description":"Ajoute ou modifie la marge de commission d'un sous-marchand.\n\n`commission_markup` est la marge que vous ajoutez sur votre commission de base.\n\nExemple: si votre commission est 2.5% et vous mettez `commission_markup: 1.0`, la commission du SM sera 3.5%.\n\nLa difference (1%) vous sera creditee a chaque transaction reussie sur ce SM.\n\n**IMPORTANT**: Un SM sans marge sera bloque lors des paiements."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"updated\": [\"commission_markup\"],\n    \"sub_merchant_code\": \"mAbCdEfGhIjKl\"\n}"}],"_postman_id":"827cd1b0-2484-4819-81ec-1a718ba295eb"},{"name":"Desactiver un sous-marchand","id":"4256f3d4-d67c-4fdd-ba26-6b75f804fada","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"active\": false\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/sub-merchants/{{sub_merchant_code}}","description":"<p>Desactive un sous-marchand. Pour reactiver, envoyez {\"active\": true}.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","sub-merchants","{{sub_merchant_code}}"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"4256f3d4-d67c-4fdd-ba26-6b75f804fada"}],"id":"ce92e855-c434-450c-b6a9-dabd3cb000b3","_postman_id":"ce92e855-c434-450c-b6a9-dabd3cb000b3","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}}},{"name":"Payments","item":[{"name":"Calculer les frais","id":"bd386135-7177-4ed8-aa01-2b4a5e976b25","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{base_url}}/v1/payments/fees?amount=5000&currency=CDF&method=mpesa&sub_merchant={{sub_merchant_code}}","description":"<p>Calcule les frais de commission pour un montant donne.</p>\n<p>Utilisez cet endpoint AVANT d'initier un paiement pour connaitre le montant total a facturer au client (parent).</p>\n<p><strong>Flux recommande</strong>:</p>\n<ol>\n<li>Appelez GET /v1/payments/fees avec le montant net</li>\n<li>Affichez le <code>total_to_charge</code> au client</li>\n<li>Utilisez <code>total_to_charge</code> comme <code>amount</code> dans POST /v1/payments</li>\n</ol>\n<p>Ainsi le sous-marchand recoit le montant net demande, et les frais sont supportes par le client.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","payments","fees"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Montant net que le SM doit recevoir</p>\n","type":"text/plain"},"key":"amount","value":"5000"},{"description":{"content":"<p>CDF ou USD</p>\n","type":"text/plain"},"key":"currency","value":"CDF"},{"description":{"content":"<p>mpesa, airtel, orange, afrimoney</p>\n","type":"text/plain"},"key":"method","value":"mpesa"},{"description":{"content":"<p>Code du sous-marchand (optionnel, sinon compte parent)</p>\n","type":"text/plain"},"key":"sub_merchant","value":"{{sub_merchant_code}}"}],"variable":[]}},"response":[{"id":"b363c507-93b5-4d9b-a3c2-06b19b1d2769","name":"Calcul des frais","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/payments/fees?amount=5000&currency=CDF&method=mpesa&sub_merchant={{sub_merchant_code}}","host":["{{base_url}}"],"path":["v1","payments","fees"],"query":[{"key":"amount","value":"5000","description":"Montant net que le SM doit recevoir"},{"key":"currency","value":"CDF","description":"CDF ou USD"},{"key":"method","value":"mpesa","description":"mpesa, airtel, orange, afrimoney"},{"key":"sub_merchant","value":"{{sub_merchant_code}}","description":"Code du sous-marchand (optionnel, sinon compte parent)"}]},"description":"Calcule les frais de commission pour un montant donne.\n\nUtilisez cet endpoint AVANT d'initier un paiement pour connaitre le montant total a facturer au client (parent).\n\n**Flux recommande**:\n1. Appelez GET /v1/payments/fees avec le montant net\n2. Affichez le `total_to_charge` au client\n3. Utilisez `total_to_charge` comme `amount` dans POST /v1/payments\n\nAinsi le sous-marchand recoit le montant net demande, et les frais sont supportes par le client."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"amount\": 5000.0,\n    \"currency\": \"CDF\",\n    \"method\": \"mpesa\",\n    \"sub_merchant\": \"mAbCdEfGhIjKl\",\n    \"commission_percent\": 3.5,\n    \"fee\": 175.0,\n    \"total_to_charge\": 5175.0,\n    \"description\": \"Montant net: 5000.0 CDF, frais: 175.0 (3.5%), total a facturer au client: 5175.0 CDF\"\n}"}],"_postman_id":"bd386135-7177-4ed8-aa01-2b4a5e976b25"},{"name":"Initier un paiement (collection)","event":[{"listen":"test","script":{"exec":["var json = pm.response.json();","if (json.payment) {","    pm.collectionVariables.set('payment_reference', json.payment.reference);","}"],"type":"text/javascript","id":"5b3e6dcd-7130-4397-a922-3dff864eb5bc"}}],"id":"69dced61-e0b5-4db9-a1df-833971a6cbe0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"sub_merchant\": \"{{sub_merchant_code}}\",\n    \"amount\": 5175,\n    \"currency\": \"CDF\",\n    \"phone\": \"0828584688\",\n    \"method\": \"mpesa\",\n    \"reference\": \"INV-2026-001\",\n    \"callback_url\": \"https://votre-site.com/api/callback\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/payments","description":"<p>Initie un paiement mobile money (collection).</p>\n<p><strong>Champs requis</strong>: <code>amount</code>, <code>currency</code>, <code>phone</code>, <code>method</code>, <code>reference</code>, <code>callback_url</code></p>\n<p><strong>Champs optionnels</strong>:</p>\n<ul>\n<li><code>sub_merchant</code>: code du sous-marchand (omettez pour payer sur votre compte parent)</li>\n</ul>\n<p><strong>Methodes</strong>: <code>mpesa</code>, <code>airtel</code>, <code>orange</code>, <code>afrimoney</code>\n<strong>Devises</strong>: <code>CDF</code>, <code>USD</code></p>\n<p><strong>IMPORTANT</strong>: Utilisez le <code>total_to_charge</code> retourne par GET /v1/payments/fees comme montant. Les frais seront ainsi supportes par le client et le SM recevra le montant net.</p>\n<p><strong>IMPORTANT</strong>: Un sous-marchand sans marge de commission sera bloque (erreur 403). Ajoutez une marge via PATCH /v1/sub-merchants/{code} avec <code>commission_markup</code>.</p>\n<p>Le client recevra un push USSD pour confirmer le paiement. Le statut sera envoye a votre <code>callback_url</code>.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","payments"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[{"id":"4569935a-da5a-4ce8-879b-cf09025d190e","name":"Paiement soumis","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"sub_merchant\": \"{{sub_merchant_code}}\",\n    \"amount\": 5175,\n    \"currency\": \"CDF\",\n    \"phone\": \"0828584688\",\n    \"method\": \"mpesa\",\n    \"reference\": \"INV-2026-001\",\n    \"callback_url\": \"https://votre-site.com/api/callback\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/payments","description":"Initie un paiement mobile money (collection).\n\n**Champs requis**: `amount`, `currency`, `phone`, `method`, `reference`, `callback_url`\n\n**Champs optionnels**:\n- `sub_merchant`: code du sous-marchand (omettez pour payer sur votre compte parent)\n\n**Methodes**: `mpesa`, `airtel`, `orange`, `afrimoney`\n**Devises**: `CDF`, `USD`\n\n**IMPORTANT**: Utilisez le `total_to_charge` retourne par GET /v1/payments/fees comme montant. Les frais seront ainsi supportes par le client et le SM recevra le montant net.\n\n**IMPORTANT**: Un sous-marchand sans marge de commission sera bloque (erreur 403). Ajoutez une marge via PATCH /v1/sub-merchants/{code} avec `commission_markup`.\n\nLe client recevra un push USSD pour confirmer le paiement. Le statut sera envoye a votre `callback_url`."},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"payment\": {\n        \"reference\": \"INV-2026-001\",\n        \"status\": \"Submitted\",\n        \"amount\": 5175,\n        \"currency\": \"CDF\",\n        \"method\": \"mpesa\",\n        \"phone\": \"0828584688\",\n        \"sub_merchant\": \"mAbCdEfGhIjKl\"\n    },\n    \"gateway_response\": {\n        \"Amount\": 5175,\n        \"Comment\": \"Transaction Received Successfully\",\n        \"Status\": \"Success\",\n        \"Transaction_id\": \"pd2026040617754739328739f858f\"\n    }\n}"},{"id":"9682da6e-5ede-45fe-8e3e-29adecde7b10","name":"Erreur: SM sans marge","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"sub_merchant\": \"{{sub_merchant_code}}\",\n    \"amount\": 5175,\n    \"currency\": \"CDF\",\n    \"phone\": \"0828584688\",\n    \"method\": \"mpesa\",\n    \"reference\": \"INV-2026-001\",\n    \"callback_url\": \"https://votre-site.com/api/callback\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/payments","description":"Initie un paiement mobile money (collection).\n\n**Champs requis**: `amount`, `currency`, `phone`, `method`, `reference`, `callback_url`\n\n**Champs optionnels**:\n- `sub_merchant`: code du sous-marchand (omettez pour payer sur votre compte parent)\n\n**Methodes**: `mpesa`, `airtel`, `orange`, `afrimoney`\n**Devises**: `CDF`, `USD`\n\n**IMPORTANT**: Utilisez le `total_to_charge` retourne par GET /v1/payments/fees comme montant. Les frais seront ainsi supportes par le client et le SM recevra le montant net.\n\n**IMPORTANT**: Un sous-marchand sans marge de commission sera bloque (erreur 403). Ajoutez une marge via PATCH /v1/sub-merchants/{code} avec `commission_markup`.\n\nLe client recevra un push USSD pour confirmer le paiement. Le statut sera envoye a votre `callback_url`."},"status":"Forbidden","code":403,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"detail\": {\n        \"error\": \"no_commission_markup\",\n        \"message\": \"Le sous-marchand mAbCdEfGhIjKl n'a pas de marge de commission configuree. Commission parent: 2.5%, commission SM: 2.5%. Utilisez PATCH /v1/sub-merchants/mAbCdEfGhIjKl avec commission_markup pour ajouter une marge avant d'initier des paiements. Exemple: {\\\"commission_markup\\\": 1.0} pour +1%.\"\n    }\n}"}],"_postman_id":"69dced61-e0b5-4db9-a1df-833971a6cbe0"},{"name":"Paiement sur compte parent","id":"11129e52-d990-4255-b259-c86d4a07b5ce","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"body":{"mode":"raw","raw":"{\n    \"amount\": 10000,\n    \"currency\": \"CDF\",\n    \"phone\": \"0990000000\",\n    \"method\": \"mpesa\",\n    \"reference\": \"INV-2026-002\",\n    \"callback_url\": \"https://votre-site.com/api/callback\"\n}","options":{"raw":{"language":"json"}}},"url":"{{base_url}}/v1/payments","description":"<p>Paiement direct sur le compte parent (pas de sous-marchand).</p>\n<p>Le champ <code>sub_merchant</code> est omis. Tous les autres champs sont requis.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","payments"],"host":["{{base_url}}"],"query":[],"variable":[]}},"response":[],"_postman_id":"11129e52-d990-4255-b259-c86d4a07b5ce"},{"name":"Statut d'un paiement","id":"70dc8242-25e1-4dbc-a7be-e87c0f6e2388","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{base_url}}/v1/payments/status?reference={{payment_reference}}","description":"<p>Verifie le statut d'un paiement par votre reference.</p>\n<p>Statuts possibles: <code>Submitted</code>, <code>Pending</code>, <code>Successful</code>, <code>Failed</code></p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","payments","status"],"host":["{{base_url}}"],"query":[{"description":{"content":"<p>Votre reference de paiement</p>\n","type":"text/plain"},"key":"reference","value":"{{payment_reference}}"}],"variable":[]}},"response":[{"id":"de4c6d83-232c-4aa1-a504-4e8686ceeb9f","name":"Transaction trouvee","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{base_url}}/v1/payments/status?reference={{payment_reference}}","host":["{{base_url}}"],"path":["v1","payments","status"],"query":[{"key":"reference","value":"{{payment_reference}}","description":"Votre reference de paiement"}]},"description":"Verifie le statut d'un paiement par votre reference.\n\nStatuts possibles: `Submitted`, `Pending`, `Successful`, `Failed`"},"status":"OK","code":200,"_postman_previewlanguage":"Text","header":[],"cookie":[],"responseTime":null,"body":"{\n    \"payment\": {\n        \"id\": 12345,\n        \"merchant_code\": \"mAbCdEfGhIjKl\",\n        \"reference\": \"INV-2026-001\",\n        \"gateway_reference\": \"pd2026040517753554431650e2b51\",\n        \"operator_reference\": \"MP260405.0317.D02198\",\n        \"status\": \"Successful\",\n        \"description\": \"Your transaction has been successfully processed\",\n        \"amount\": 5175.0,\n        \"currency\": \"CDF\",\n        \"method\": \"mpesa\",\n        \"created_at\": \"2026-04-04 10:35:00\",\n        \"updated_at\": \"2026-04-04 10:36:00\"\n    }\n}"}],"_postman_id":"70dc8242-25e1-4dbc-a7be-e87c0f6e2388"},{"name":"Lister les transactions","id":"a3e6b892-8de8-4d2e-9cb3-c6f3b53bb6ef","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"{{base_url}}/v1/payments?limit=20&offset=0","description":"<p>Liste toutes vos transactions (parent + sous-marchands).</p>\n<p>Filtres optionnels:</p>\n<ul>\n<li><code>sub_merchant</code>: code du sous-marchand</li>\n<li><code>status</code>: Submitted, Pending, Successful, Failed</li>\n<li><code>limit</code>: nombre de resultats (defaut 50, max 500)</li>\n<li><code>offset</code>: pagination</li>\n</ul>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}},"urlObject":{"path":["v1","payments"],"host":["{{base_url}}"],"query":[{"disabled":true,"description":{"content":"<p>Filtrer par sous-marchand</p>\n","type":"text/plain"},"key":"sub_merchant","value":""},{"disabled":true,"description":{"content":"<p>Filtrer par statut</p>\n","type":"text/plain"},"key":"status","value":"Successful"},{"description":{"content":"<p>Nombre de resultats (max 500)</p>\n","type":"text/plain"},"key":"limit","value":"20"},{"description":{"content":"<p>Pagination</p>\n","type":"text/plain"},"key":"offset","value":"0"}],"variable":[]}},"response":[],"_postman_id":"a3e6b892-8de8-4d2e-9cb3-c6f3b53bb6ef"}],"id":"f6c572b0-89a3-48eb-95cb-691ee9544fed","_postman_id":"f6c572b0-89a3-48eb-95cb-691ee9544fed","description":"","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":true,"source":{"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","name":"Platform","type":"folder"}}}],"id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63","description":"<p>Merchant API v2 — aggregator/platform features. Manage sub-merchants (schools, hospitals, shops), set commission_markup, initiate payments under any sub-merchant, query fees and balances. Bearer API key auth.</p>\n","auth":{"type":"bearer","bearer":{"basicConfig":[{"key":"token","value":"{{api_key}}"}]},"isInherited":false},"_postman_id":"8dd5836b-1b1b-4ec9-9974-9276ed35ed63"},{"name":"Cards","item":[{"name":"Payment","item":[{"name":"initiate","event":[{"listen":"prerequest","script":{"exec":["const cryptoJsUrl = \"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js\";","pm.sendRequest(cryptoJsUrl, (err, res) => {","    if (err) {","        console.error(\"Erreur lors du chargement de CryptoJS :\", err);","        return;","    }","    eval(res.text()); ","","    const API_KEY = \"328fab11c5cd494eb0f80c3f7aedb67f\";  ","    const API_SECRET = \"29015cda152d7dc7b4042b24b7b502d92d90879f311374e87cbf24b01a2de14c\"; ","","    const timestamp = new Date().toISOString().replace(/\\.\\d+Z$/, 'Z');","","    const payload_str = pm.request.body.raw;","","    console.log(\"Client Payload String:\", payload_str);","    console.log(\"Client Timestamp:\", timestamp); ","","    const message = payload_str + timestamp;","","    console.log(\"Client Message (Payload + Timestamp):\", message);","","    const signature = CryptoJS.HmacSHA256(message, API_SECRET).toString(CryptoJS.enc.Hex);","","    console.log(\"Client Generated Signature:\", signature);","","    pm.environment.set(\"X-Timestamp\", timestamp);","    pm.environment.set(\"X-Signature\", signature);","    pm.environment.set(\"X-API-Key\", API_KEY);","","    pm.request.url.query.add({key: \"sig\", value: signature});","","    pm.request.body.raw = payload_str;","});"],"type":"text/javascript","packages":{},"requests":{},"id":"2f4bbfba-fda3-47b1-9281-0352aa4d0d0c"}},{"listen":"test","script":{"exec":[""],"type":"text/javascript","packages":{},"requests":{},"id":"7049e301-1de8-4baf-a6b1-d3c42c125ea5"}}],"id":"57e64d3b-595a-42f7-9e23-37a926e1692c","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"auth":{"type":"noauth","isInherited":false},"method":"POST","header":[{"key":"X-API-Key","value":"{{X-API-Key}}","type":"text"},{"key":"X-Signature","value":"{{X-Signature}}","type":"text"},{"key":"X-Timestamp","value":"{{X-Timestamp}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"amount\": 1.00,\n  \"currency\": \"USD\",\n  \"merchant_reference\": \"673637QDY6RWQ545678998\",\n  \"bill_to_forename\": \"Henock\",\n  \"bill_to_surname\": \"Barakael\",\n  \"bill_to_email\": \"barahenock@gmail.com\",\n  \"bill_to_phone\": \"+243828584688\",\n  \"bill_to_address_line1\": \"Kinshasa\",\n  \"bill_to_address_city\": \"Kinshasa\",\n  \"bill_to_address_state\": \"\",\n  \"bill_to_address_postal_code\": \"\",\n  \"bill_to_address_country\": \"CD\",\n  \"callback_url\": \"https://votre-domaine.com/api/callback\",\n  \"return_url\": \"https://votre-domaine.com/paiement/resultat\",\n  \"cancel_url\": \"https://votre-domaine.com/paiement/annule\"\n}","options":{"raw":{"language":"json"}}},"url":"https://test.card.gofreshpay.com/api/v1/payment/orders","description":"<h3 id=\"initiate-card-payment\">Initiate Card Payment</h3>\n<p>Initiate a card payment via Cybersource Hosted Checkout. Returns a payment link to redirect the customer to.</p>\n<p><strong>HTTP Request</strong></p>\n<p><code>POST https://test.card.gofreshpay.com/api/v1/payment/orders</code>  <em>(sandbox)</em><br /><code>POST https://card.gofreshpay.com/api/v1/payment/orders</code>       <em>(production)</em></p>\n<p><strong>Authentication</strong></p>\n<p>HMAC-SHA256. Three headers required on every request:</p>\n<ul>\n<li><code>X-API-Key</code> — your merchant API key</li>\n<li><code>X-Timestamp</code> — ISO 8601 UTC timestamp (e.g. <code>2026-04-06T12:00:00Z</code>). Rejected if older than 30 seconds.</li>\n<li><code>X-Signature</code> — <code>HMAC-SHA256(api_secret, body_raw_json + timestamp).hexdigest()</code></li>\n</ul>\n<p><strong>Request Body — required fields</strong></p>\n<ul>\n<li><code>amount</code> (number) — Transaction amount in USD. Minimum: <code>1.00 USD</code>.</li>\n<li><code>currency</code> (string) — ISO 4217 code. <strong>USD only</strong> for Cards (CDF not supported on the card rail).</li>\n<li><code>merchant_reference</code> (string) — Unique reference from your system.</li>\n<li><code>callback_url</code> (string) — HTTPS server-to-server notification URL (final status, signed with X-FreshPay-Signature).</li>\n<li><code>bill_to_forename</code> (string) — Customer first name.</li>\n<li><code>bill_to_surname</code> (string) — Customer last name.</li>\n<li><code>bill_to_email</code> (string) — Customer email.</li>\n<li><code>bill_to_phone</code> (string) — International format, min 5 chars (e.g. <code>+243828584688</code>).</li>\n<li><code>bill_to_address_line1</code> (string) — Customer street address.</li>\n<li><code>bill_to_address_city</code> (string) — Customer city.</li>\n<li><code>bill_to_address_country</code> (string) — ISO 3166-1 alpha-2 country code (e.g. <code>CD</code>, <code>US</code>, <code>CA</code>).</li>\n</ul>\n<p><strong>Request Body — conditional</strong></p>\n<ul>\n<li><code>bill_to_address_state</code> (string) — 2-letter state code. <strong>Required</strong> for <code>US</code>, <code>CA</code>, <code>BR</code>, <code>IN</code>, <code>MX</code>, <code>AU</code>.</li>\n<li><code>bill_to_address_postal_code</code> (string) — <strong>Required</strong> for <code>US</code>, <code>CA</code>.</li>\n</ul>\n<p><strong>Request Body — optional</strong></p>\n<ul>\n<li><code>return_url</code> (string) — Browser redirect URL after payment success/failure. If absent, Moko default pages are shown.</li>\n<li><code>redirect_url</code> (string) — Alias of <code>return_url</code> (legacy compatibility).</li>\n<li><code>cancel_url</code> (string) — Browser redirect URL after the customer cancels payment.</li>\n</ul>\n<p><strong>Response (200 OK)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"status\": \"success\",\n    \"data\": {\n        \"amount\": \"27.03\",\n        \"currency\": \"USD\",\n        \"transaction_uuid\": \"FP-20260406-165135-80a28bec-CD\",\n        \"transaction_status\": \"PENDING\",\n        \"links\": \"https://test.card.gofreshpay.com/api/v1/payment/FP-...?sig=...\",\n        \"financial_details\": {\n            \"commission_rate\": \"3.50\",\n            \"commission_amount\": \"0.95\",\n            \"merchant_amount\": \"26.08\",\n            \"bank_commission_amount\": \"0.68\",\n            \"freshpay_commission_amount\": \"0.27\"\n        }\n    }\n}\n</code></pre>\n<ul>\n<li><code>data.links</code> (string) — URL to redirect the customer's browser to. Valid for <strong>3 minutes</strong>.</li>\n<li><code>data.financial_details</code> — Commission breakdown (merchant_commission_rate = bank_2.5% + freshpay_share).</li>\n</ul>\n<p><strong>Browser redirects (query string sent to your URLs)</strong></p>\n<p>On success → <code>{return_url}?status=SUCCESS&amp;transaction_uuid=...&amp;transaction_id=...&amp;amount=...&amp;currency=...&amp;reference=...</code><br />On failure → <code>{return_url}?status=FAILED&amp;transaction_uuid=...&amp;reason_code=...&amp;message=...</code><br />On cancel → <code>{cancel_url}?status=CANCELLED&amp;transaction_uuid=...&amp;amount=...&amp;currency=...&amp;reference=...</code></p>\n<p><strong>Error codes</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP</th>\n<th>Cause</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>400</td>\n<td>Invalid params / currency not supported / amount below minimum</td>\n</tr>\n<tr>\n<td>401</td>\n<td>Missing X-API-Key / X-Signature / X-Timestamp</td>\n</tr>\n<tr>\n<td>403</td>\n<td>Invalid signature or wrong environment</td>\n</tr>\n<tr>\n<td>408</td>\n<td>Timestamp older than 30s (replay protection)</td>\n</tr>\n<tr>\n<td>500</td>\n<td>Internal error</td>\n</tr>\n</tbody>\n</table>\n</div><p>Full guide: <a href=\"https://sandbox.gofreshpay.com/docs/moko-afrika-cards.pdf\">https://sandbox.gofreshpay.com/docs/moko-afrika-cards.pdf</a></p>\n","urlObject":{"protocol":"https","path":["api","v1","payment","orders"],"host":["test","card","gofreshpay","com"],"query":[],"variable":[]}},"response":[{"id":"497b5752-2166-4067-8f53-70e671005943","name":"Successful response","originalRequest":{"method":"POST","header":[{"key":"X-API-Key","value":"{{X-API-Key}}","type":"text"},{"key":"X-Signature","value":"{{X-Signature}}","type":"text"},{"key":"X-Timestamp","value":"{{X-Timestamp}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"amount\": 1.00,\n    \"currency\": \"USD\",\n    \"merchant_reference\": \"53883993234244\",\n    \"callback_url\": \"http://merchant-site.com/callback\"\n}","options":{"raw":{"language":"json"}}},"url":"https://test.card.gofreshpay.com/api/v1/payment/orders"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.18.0 (Ubuntu)"},{"key":"Date","value":"Tue, 11 Mar 2025 10:49:14 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"434"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"data\": {\n        \"amount\": 1,\n        \"currency\": \"USD\",\n        \"transaction_uuid\": \"FP-20250311-104914-6c8c3782-CD\",\n        \"message\": \"You are being redirected to the payment gateway\",\n        \"transaction_status\": \"PENDING\",\n        \"next_step\": \"Follow payment gateway instructions to complete transaction\",\n        \"links\": \"https://test.card.gofreshpay.com/api/v1/payment/FP-20250311-104914-6c8c3782-CD?sig=62c32eddb6392fc4f7ac9100e52f43a83df394ab397da7c4601222fe86dda58a\"\n    }\n}"},{"id":"7d1f6340-a58a-4829-a6ee-3956e8139ed8","name":"Error response","originalRequest":{"method":"POST","header":[{"key":"X-API-Key","value":"{{X-API-Key}}","type":"text"},{"key":"X-Signature","value":"{{X-Signature}}","type":"text"},{"key":"X-Timestamp","value":"{{X-Timestamp}}","type":"text"}],"body":{"mode":"raw","raw":"{\n    \"amount\": 1.00,\n    \"currency\": \"USD\",\n    \"callback_url\": \"http://merchant-site.com/callback\"\n}","options":{"raw":{"language":"json"}}},"url":"https://test.card.gofreshpay.com/api/v1/payment/orders"},"status":"Unprocessable Content","code":422,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.18.0 (Ubuntu)"},{"key":"Date","value":"Tue, 11 Mar 2025 10:45:06 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"181"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"{\n    \"detail\": [\n        {\n            \"type\": \"missing\",\n            \"loc\": [\n                \"body\",\n                \"merchant_reference\"\n            ],\n            \"msg\": \"Field required\",\n            \"input\": {\n                \"amount\": 1,\n                \"currency\": \"USD\",\n                \"callback_url\": \"http://merchant-site.com/callback\"\n            }\n        }\n    ]\n}"}],"_postman_id":"57e64d3b-595a-42f7-9e23-37a926e1692c"},{"name":"get status","event":[{"listen":"prerequest","script":{"exec":["const cryptoJsUrl = \"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js\";","pm.sendRequest(cryptoJsUrl, (err, res) => {","    if (err) {","        console.error(\"Erreur lors du chargement de CryptoJS :\", err);","        return;","    }","    eval(res.text()); ","","    const API_KEY = \"328fab11c5cd494eb0f80c3f7aedb67f\";  ","    const API_SECRET = \"29015cda152d7dc7b4042b24b7b502d92d90879f311374e87cbf24b01a2de14c\"; ","","    const timestamp = new Date().toISOString().replace(/\\.\\d+Z$/, 'Z');","","    const payload_str = pm.request.body.raw;","","    console.log(\"Client Payload String:\", payload_str);","    console.log(\"Client Timestamp:\", timestamp); ","","    const message = payload_str + timestamp;","","    console.log(\"Client Message (Payload + Timestamp):\", message);","","    const signature = CryptoJS.HmacSHA256(message, API_SECRET).toString(CryptoJS.enc.Hex);","","    console.log(\"Client Generated Signature:\", signature);","","    pm.environment.set(\"X-Timestamp\", timestamp);","    pm.environment.set(\"X-Signature\", signature);","    pm.environment.set(\"X-API-Key\", API_KEY);","","    pm.request.url.query.add({key: \"sig\", value: signature});","","    pm.request.body.raw = payload_str;","});"],"type":"text/javascript","packages":{},"requests":{},"id":"1abd4904-e4e2-4d73-b876-0e7f141fda03"}},{"listen":"test","script":{"exec":[""],"type":"text/javascript","packages":{},"requests":{},"id":"2182a30b-ffba-4216-a128-3d115e447ad8"}}],"id":"3022f25c-b2ec-4e16-880c-16fe191eb715","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"X-API-Key","value":"{{X-API-Key}}","type":"text"},{"key":"X-Signature","value":"{{X-Signature}}","type":"text"},{"key":"X-Timestamp","value":"{{X-Timestamp}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"transaction_uuid\": \"FP-20250310-120910-9716fa07-CD\"\n}","options":{"raw":{"language":"json"}}},"url":"https://test.card.gofreshpay.com/api/v1/payment/status","description":"<h3 id=\"check-card-payment-status\">Check Card Payment Status</h3>\n<p>Retrieve the final status of a card payment transaction. Each merchant can only query its own transactions — <code>Transaction not found</code> is returned otherwise.</p>\n<p><strong>HTTP Request</strong></p>\n<p><code>POST https://test.card.gofreshpay.com/api/v1/payment/status</code>  <em>(sandbox)</em><br /><code>POST https://card.gofreshpay.com/api/v1/payment/status</code>       <em>(production)</em></p>\n<p><strong>Authentication</strong></p>\n<p>Same HMAC-SHA256 headers as the initiate endpoint: <code>X-API-Key</code>, <code>X-Timestamp</code>, <code>X-Signature</code>.</p>\n<p><strong>Request Body</strong></p>\n<ul>\n<li><code>transaction_uuid</code> (string, required) — UUID returned by <code>POST /api/v1/payment/orders</code> (format <code>FP-YYYYMMDD-HHMMSS-xxxx-CD</code>).</li>\n</ul>\n<p><strong>Response (200 OK)</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n    \"status\": \"success\",\n    \"data\": {\n        \"amount\": 10.0,\n        \"currency\": \"USD\",\n        \"merchant_reference\": \"ORDER-123456\",\n        \"message\": \"Request was processed successfully.\",\n        \"transaction_uuid\": \"FP-20260415-120000-abcd1234-CD\",\n        \"transaction_status\": \"SUCCESS\",\n        \"card_type\": \"Visa\",\n        \"card_last4\": \"1234\",\n        \"card_expiry_date\": \"09-2029\",\n        \"card_bin_country\": \"CD\",\n        \"card_issuer\": \"Equity Bank\",\n        \"card_scheme\": \"VISA DEBIT\"\n    }\n}\n</code></pre>\n<p><strong>Transaction fields</strong></p>\n<ul>\n<li><code>transaction_status</code> — <code>SUCCESS</code> | <code>FAILED</code> | <code>PENDING</code> | <code>CANCELLED</code></li>\n<li><code>merchant_reference</code> — your reference</li>\n<li><code>amount</code> / <code>currency</code> — transaction amount</li>\n<li><code>message</code> — descriptive result</li>\n</ul>\n<p><strong>Card fields</strong></p>\n<ul>\n<li><code>card_type</code> — brand (Visa, Mastercard, American Express, ...)</li>\n<li><code>card_last4</code> — last 4 digits</li>\n<li><code>card_expiry_date</code> — <code>MM-YYYY</code></li>\n<li><code>card_bin_country</code> — ISO 2-letter country of the issuer (e.g. <code>CD</code>, <code>IE</code>, <code>US</code>)</li>\n<li><code>card_issuer</code> — issuing bank (e.g. <code>Equity Bank</code>, <code>Revolut Ltd</code>)</li>\n<li><code>card_scheme</code> — payment network + type (e.g. <code>VISA DEBIT</code>, <code>MASTERCARD CREDIT</code>)</li>\n</ul>\n<p><strong>Error responses</strong></p>\n<div class=\"click-to-expand-wrapper is-table-wrapper\"><table>\n<thead>\n<tr>\n<th>HTTP</th>\n<th>Body</th>\n<th>Meaning</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>404</td>\n<td><code>{\"status\":\"error\",\"message\":\"Transaction not found\"}</code></td>\n<td>UUID does not exist or belongs to another merchant</td>\n</tr>\n<tr>\n<td>403</td>\n<td><code>{\"detail\":\"Invalid request signature\"}</code></td>\n<td>HMAC mismatch</td>\n</tr>\n<tr>\n<td>408</td>\n<td><code>{\"detail\":\"Expired request\"}</code></td>\n<td>Timestamp older than 30s</td>\n</tr>\n</tbody>\n</table>\n</div><p>Full guide: <a href=\"https://sandbox.gofreshpay.com/docs/moko-afrika-cards.pdf\">https://sandbox.gofreshpay.com/docs/moko-afrika-cards.pdf</a></p>\n","urlObject":{"protocol":"https","path":["api","v1","payment","status"],"host":["test","card","gofreshpay","com"],"query":[],"variable":[]}},"response":[{"id":"64b9e267-365c-4ed6-8a7c-6342bbaf5ea9","name":"Successful response","originalRequest":{"method":"POST","header":[{"key":"X-API-Key","value":"{{X-API-Key}}","type":"text"},{"key":"X-Signature","value":"{{X-Signature}}","type":"text"},{"key":"X-Timestamp","value":"{{X-Timestamp}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"transaction_uuid\": \"FP-20250310-120910-9716fa07-CD\"\n}","options":{"raw":{"language":"json"}}},"url":"https://test.card.gofreshpay.com/api/v1/payment/status"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Server","value":"nginx/1.18.0 (Ubuntu)"},{"key":"Date","value":"Tue, 11 Mar 2025 10:37:01 GMT"},{"key":"Content-Type","value":"application/json"},{"key":"Content-Length","value":"198"},{"key":"Connection","value":"keep-alive"}],"cookie":[],"responseTime":null,"body":"{\n    \"status\": \"success\",\n    \"data\": {\n        \"amount\": 1,\n        \"currency\": \"USD\",\n        \"merchant_reference\": \"63799776625109873\",\n        \"message\": null,\n        \"transaction_uuid\": \"FP-20250310-120910-9716fa07-CD\",\n        \"transaction_status\": \"PENDING\"\n    }\n}"},{"id":"599ec08b-3f1d-4748-a19d-6a7b54275c16","name":"Error response","originalRequest":{"method":"POST","header":[{"key":"X-API-Key","value":"{{X-API-Key}}","type":"text"},{"key":"X-Signature","value":"{{X-Signature}}","type":"text"},{"key":"X-Timestamp","value":"{{X-Timestamp}}","type":"text"}],"body":{"mode":"raw","raw":"{\n  \"transaction_uuid\": \"FP-20250303-114138-54ac0fd9-CD\"\n}","options":{"raw":{"language":"json"}}},"url":"https://test.card.gofreshpay.com/api/v1/payment/status"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"date","value":"Mon, 10 Mar 2025 12:01:25 GMT"},{"key":"server","value":"uvicorn"},{"key":"content-length","value":"58"},{"key":"content-type","value":"application/json"}],"cookie":[],"responseTime":null,"body":"[\n    {\n        \"status\": \"error\",\n        \"message\": \"Transaction not found\"\n    },\n    404\n]"}],"_postman_id":"3022f25c-b2ec-4e16-880c-16fe191eb715"}],"id":"70fa684c-c4f7-4b00-b3bd-eae775c4f0af","_postman_id":"70fa684c-c4f7-4b00-b3bd-eae775c4f0af","description":""}],"id":"ad72d2f6-984c-4e22-a2e5-a9e6c65a4ebc","description":"<p>Cybersource Hosted Checkout. Initiate card payments (Visa/Mastercard) with 3D Secure, then poll status. HMAC-SHA256 signing of body+timestamp. Pre-request scripts included for Postman.</p>\n","event":[{"listen":"prerequest","script":{"type":"text/javascript","packages":{},"exec":["const cryptoJsUrl = \"https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js\";","pm.sendRequest(cryptoJsUrl, (err, res) => {","    if (err) {","        console.error(\"Erreur lors du chargement de CryptoJS :\", err);","        return;","    }","    eval(res.text()); ","","    const API_KEY = \"328fab11c5cd494eb0f80c3f7aedb67f\";  ","    const API_SECRET = \"29015cda152d7dc7b4042b24b7b502d92d90879f311374e87cbf24b01a2de14c\"; ","","    const timestamp = new Date().toISOString().replace(/\\.\\d+Z$/, 'Z');","","    const payload_str = pm.request.body.raw;","","    console.log(\"Client Payload String:\", payload_str);","    console.log(\"Client Timestamp:\", timestamp); ","","    const message = payload_str + timestamp;","","    console.log(\"Client Message (Payload + Timestamp):\", message);","","    const signature = CryptoJS.HmacSHA256(message, API_SECRET).toString(CryptoJS.enc.Hex);","","    console.log(\"Client Generated Signature:\", signature);","","    pm.environment.set(\"X-Timestamp\", timestamp);","    pm.environment.set(\"X-Signature\", signature);","    pm.environment.set(\"X-API-Key\", API_KEY);","","    pm.request.url.query.add({key: \"sig\", value: signature});","","    pm.request.body.raw = payload_str;","});"],"id":"63e6d0e2-87d9-4bb8-a780-e7dceefe6b34"}},{"listen":"test","script":{"type":"text/javascript","packages":{},"exec":[""],"id":"040ebaa9-a88c-43c5-b4c2-0d757fe89a16"}}],"_postman_id":"ad72d2f6-984c-4e22-a2e5-a9e6c65a4ebc"}],"variable":[{"key":"sandbox_host","value":"https://api.gofreshpay.com"},{"key":"production_host","value":"https://api.gofreshpay.com"},{"key":"remittance_base_url","value":"https://staging.remittance.gofreshpay.com"},{"key":"remittance_merchant_code","value":"MKA-IJDD-113X"},{"key":"remittance_api_secret","value":"{{stripe_secret_key_0lgi}}"},{"key":"remittance_merchant_email","value":"finaltest@moko.com"},{"key":"remittance_merchant_password","value":"MokoTest2026"},{"key":"remittance_merchant_jwt","value":""},{"key":"remittance_test_phone_mpesa","value":"0828254066"},{"key":"remittance_test_phone_airtel","value":"999964415"},{"key":"remittance_test_phone_orange","value":"0891234567"},{"key":"remittance_wallet_code","value":"wc_mpesa_usd_test1"},{"key":"remittance_last_txn_id","value":""},{"key":"remittance_last_reference","value":""},{"key":"platform_base_url","value":"https://moko.gofreshpay.com"},{"key":"platform_api_key","value":"mk_live_VOTRE_CLE_ICI"},{"key":"platform_sub_merchant_code","value":""},{"key":"platform_payment_reference","value":""},{"key":"cards_X-API-Key","value":"{{X-API-Key}}"},{"key":"cards_X-Signature","value":"{{X-Signature}}"},{"key":"cards_X-Timestamp","value":"{{X-Timestamp}}"},{"key":"json_web_token_0tvp","secret":true},{"key":"stripe_secret_key_0lgi","secret":true},{"key":"auth_password_0j1w","secret":true}]}