{"info":{"_postman_id":"cb6bb01f-efea-45d4-acef-13c263aad6e4","name":"Shop Kit (Lango sandbox)","description":"Generated from the Shop Kit API group. Run \"Get a token\" first — every other request reads {{token}}.","schema":"https://schema.getpostman.com/json/collection/v2.1.0/collection.json"},"item":[{"name":"Get a token","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/x-www-form-urlencoded"}],"url":{"raw":"{{baseUrl}}/oauth/v1/token","host":["{{baseUrl}}"],"path":["oauth","v1","token"]},"auth":{"type":"basic","basic":[{"key":"username","value":"{{consumerKey}}","type":"string"},{"key":"password","value":"{{consumerSecret}}","type":"string"}]},"body":{"mode":"urlencoded","urlencoded":[{"key":"grant_type","value":"client_credentials","type":"text"}]}},"event":[{"listen":"test","script":{"type":"text/javascript","exec":["const data = pm.response.json();","pm.collectionVariables.set('token', data.access_token);"]}}]},{"name":"Collect","item":[{"name":"Send a payment prompt","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/collect/v1/push","host":["{{baseUrl}}"],"path":["collect","v1","push"],"variable":[],"query":[]},"description":"Starts a payment. The response only confirms the prompt was sent. The final result arrives on `callbackUrl` a few seconds later.","body":{"mode":"raw","raw":"{\n  \"shortCode\": \"600100\",\n  \"amount\": 1500,\n  \"currency\": \"KES\",\n  \"phoneNumber\": \"254712345678\",\n  \"reference\": \"INV-2041\",\n  \"description\": \"Order 2041\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Customer pays","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/collect/v1/push","host":["{{baseUrl}}"],"path":["collect","v1","push"],"variable":[],"query":[]},"description":"Starts a payment. The response only confirms the prompt was sent. The final result arrives on `callbackUrl` a few seconds later.","body":{"mode":"raw","raw":"{\n  \"shortCode\": \"600100\",\n  \"amount\": 1500,\n  \"currency\": \"KES\",\n  \"phoneNumber\": \"254712345678\",\n  \"reference\": \"INV-2041\",\n  \"description\": \"Order 2041\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"checkoutId\": \"chk_1h9tzzg0\",\n  \"status\": \"PENDING\",\n  \"customerMessage\": \"Enter your PIN on your phone to pay KES 1500.\"\n}"},{"name":"Insufficient funds","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/collect/v1/push","host":["{{baseUrl}}"],"path":["collect","v1","push"],"variable":[],"query":[]},"description":"Starts a payment. The response only confirms the prompt was sent. The final result arrives on `callbackUrl` a few seconds later.","body":{"mode":"raw","raw":"{\n  \"shortCode\": \"600100\",\n  \"amount\": 1500,\n  \"currency\": \"KES\",\n  \"phoneNumber\": \"254712345678\",\n  \"reference\": \"INV-2041\",\n  \"description\": \"Order 2041\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"checkoutId\": \"chk_1y7bbjgv\",\n  \"status\": \"PENDING\",\n  \"customerMessage\": \"Enter your PIN on your phone to pay KES 1500.\"\n}"},{"name":"Customer cancels the prompt","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/collect/v1/push","host":["{{baseUrl}}"],"path":["collect","v1","push"],"variable":[],"query":[]},"description":"Starts a payment. The response only confirms the prompt was sent. The final result arrives on `callbackUrl` a few seconds later.","body":{"mode":"raw","raw":"{\n  \"shortCode\": \"600100\",\n  \"amount\": 1500,\n  \"currency\": \"KES\",\n  \"phoneNumber\": \"254712345678\",\n  \"reference\": \"INV-2041\",\n  \"description\": \"Order 2041\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"checkoutId\": \"chk_2srp96yq\",\n  \"status\": \"PENDING\",\n  \"customerMessage\": \"Enter your PIN on your phone to pay KES 1500.\"\n}"},{"name":"Customer never responds","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/collect/v1/push","host":["{{baseUrl}}"],"path":["collect","v1","push"],"variable":[],"query":[]},"description":"Starts a payment. The response only confirms the prompt was sent. The final result arrives on `callbackUrl` a few seconds later.","body":{"mode":"raw","raw":"{\n  \"shortCode\": \"600100\",\n  \"amount\": 1500,\n  \"currency\": \"KES\",\n  \"phoneNumber\": \"254712345678\",\n  \"reference\": \"INV-2041\",\n  \"description\": \"Order 2041\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"checkoutId\": \"chk_n9q3gmpn\",\n  \"status\": \"PENDING\",\n  \"customerMessage\": \"Enter your PIN on your phone to pay KES 1500.\"\n}"},{"name":"Invalid phone number","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/collect/v1/push","host":["{{baseUrl}}"],"path":["collect","v1","push"],"variable":[],"query":[]},"description":"Starts a payment. The response only confirms the prompt was sent. The final result arrives on `callbackUrl` a few seconds later.","body":{"mode":"raw","raw":"{\n  \"shortCode\": \"600100\",\n  \"amount\": 1500,\n  \"currency\": \"KES\",\n  \"phoneNumber\": \"254712345678\",\n  \"reference\": \"INV-2041\",\n  \"description\": \"Order 2041\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Bad Request","code":400,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"error\": \"INVALID_PHONE_NUMBER\",\n  \"message\": \"phoneNumber must be a reachable mobile number in international format.\",\n  \"requestId\": \"req_gqab7tt5\"\n}"}]},{"name":"Check a payment prompt","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/collect/v1/push/:checkoutId","host":["{{baseUrl}}"],"path":["collect","v1","push",":checkoutId"],"variable":[{"key":"checkoutId","value":"chk_8f2k1m9x"}],"query":[]},"description":"Use this when a callback has not arrived and you need the current state."},"response":[{"name":"Completed","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/collect/v1/push/:checkoutId","host":["{{baseUrl}}"],"path":["collect","v1","push",":checkoutId"],"variable":[{"key":"checkoutId","value":"chk_8f2k1m9x"}],"query":[]},"description":"Use this when a callback has not arrived and you need the current state."},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"checkoutId\": \"chk_8f2k1m9x\",\n  \"status\": \"COMPLETED\",\n  \"resultCode\": 0,\n  \"amount\": 1500,\n  \"receipt\": \"RCT_pxe05hjp\"\n}"},{"name":"Unknown id","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/collect/v1/push/:checkoutId","host":["{{baseUrl}}"],"path":["collect","v1","push",":checkoutId"],"variable":[{"key":"checkoutId","value":"chk_8f2k1m9x"}],"query":[]},"description":"Use this when a callback has not arrived and you need the current state."},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"error\": \"NOT_FOUND\",\n  \"message\": \"No payment prompt with that id.\",\n  \"requestId\": \"req_xn67r5r8\"\n}"}]}]},{"name":"SMS","item":[{"name":"Send a text message","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/messaging/v1/sms","host":["{{baseUrl}}"],"path":["messaging","v1","sms"],"variable":[],"query":[]},"description":"Send a text message","body":{"mode":"raw","raw":"{\n  \"senderId\": \"LANGO\",\n  \"to\": \"254712345678\",\n  \"message\": \"Your order 2041 has shipped.\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Delivered","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/messaging/v1/sms","host":["{{baseUrl}}"],"path":["messaging","v1","sms"],"variable":[],"query":[]},"description":"Send a text message","body":{"mode":"raw","raw":"{\n  \"senderId\": \"LANGO\",\n  \"to\": \"254712345678\",\n  \"message\": \"Your order 2041 has shipped.\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"messageId\": \"msg_ecr8dg7m\",\n  \"status\": \"ACCEPTED\",\n  \"parts\": 1\n}"},{"name":"Handset switched off","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/messaging/v1/sms","host":["{{baseUrl}}"],"path":["messaging","v1","sms"],"variable":[],"query":[]},"description":"Send a text message","body":{"mode":"raw","raw":"{\n  \"senderId\": \"LANGO\",\n  \"to\": \"254712345678\",\n  \"message\": \"Your order 2041 has shipped.\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"messageId\": \"msg_rf03557b\",\n  \"status\": \"ACCEPTED\",\n  \"parts\": 1\n}"},{"name":"Unregistered sender ID","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/messaging/v1/sms","host":["{{baseUrl}}"],"path":["messaging","v1","sms"],"variable":[],"query":[]},"description":"Send a text message","body":{"mode":"raw","raw":"{\n  \"senderId\": \"LANGO\",\n  \"to\": \"254712345678\",\n  \"message\": \"Your order 2041 has shipped.\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Forbidden","code":403,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"error\": \"SENDER_NOT_REGISTERED\",\n  \"message\": \"That sender ID is not registered to your organization.\",\n  \"requestId\": \"req_wad9rxrd\"\n}"}]},{"name":"Check a message","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/messaging/v1/sms/:messageId","host":["{{baseUrl}}"],"path":["messaging","v1","sms",":messageId"],"variable":[{"key":"messageId","value":"msg_7k3p1w6t"}],"query":[]},"description":"Check a message"},"response":[{"name":"Delivered","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/messaging/v1/sms/:messageId","host":["{{baseUrl}}"],"path":["messaging","v1","sms",":messageId"],"variable":[{"key":"messageId","value":"msg_7k3p1w6t"}],"query":[]},"description":"Check a message"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"messageId\": \"msg_7k3p1w6t\",\n  \"status\": \"DELIVERED\",\n  \"parts\": 1,\n  \"deliveredAt\": \"2026-09-28T10:59:40.082Z\"\n}"}]}]},{"name":"Ledger","item":[{"name":"Look up a transaction","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/ledger/v2/transactions/:transactionId","host":["{{baseUrl}}"],"path":["ledger","v2","transactions",":transactionId"],"variable":[{"key":"transactionId","value":"RCT_5h1v9k2b"}],"query":[]},"description":"Look up a transaction"},"response":[{"name":"Found","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/ledger/v2/transactions/:transactionId","host":["{{baseUrl}}"],"path":["ledger","v2","transactions",":transactionId"],"variable":[{"key":"transactionId","value":"RCT_5h1v9k2b"}],"query":[]},"description":"Look up a transaction"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"transactionId\": \"RCT_5h1v9k2b\",\n  \"type\": \"COLLECTION\",\n  \"status\": \"COMPLETED\",\n  \"amount\": 1500,\n  \"currency\": \"KES\",\n  \"counterparty\": \"254712345678\",\n  \"reference\": \"INV-2041\",\n  \"completedAt\": \"2026-09-28T10:59:40.083Z\"\n}"},{"name":"Unknown receipt","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/ledger/v2/transactions/:transactionId","host":["{{baseUrl}}"],"path":["ledger","v2","transactions",":transactionId"],"variable":[{"key":"transactionId","value":"RCT_5h1v9k2b"}],"query":[]},"description":"Look up a transaction"},"status":"Not Found","code":404,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"error\": \"NOT_FOUND\",\n  \"message\": \"No transaction with that receipt number.\",\n  \"requestId\": \"req_8tacce9h\"\n}"}]},{"name":"Reverse a transaction","request":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/ledger/v2/transactions/:transactionId/reversal","host":["{{baseUrl}}"],"path":["ledger","v2","transactions",":transactionId","reversal"],"variable":[{"key":"transactionId","value":"RCT_5h1v9k2b"}],"query":[]},"description":"Returns the money to the payer. Only completed collections can be reversed, once.","body":{"mode":"raw","raw":"{\n  \"reason\": \"Customer paid twice\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"response":[{"name":"Reversal succeeds","originalRequest":{"method":"POST","header":[{"key":"Content-Type","value":"application/json"}],"url":{"raw":"{{baseUrl}}/ledger/v2/transactions/:transactionId/reversal","host":["{{baseUrl}}"],"path":["ledger","v2","transactions",":transactionId","reversal"],"variable":[{"key":"transactionId","value":"RCT_5h1v9k2b"}],"query":[]},"description":"Returns the money to the payer. Only completed collections can be reversed, once.","body":{"mode":"raw","raw":"{\n  \"reason\": \"Customer paid twice\",\n  \"callbackUrl\": \"https://example.com/hooks/lango\"\n}","options":{"raw":{"language":"json"}}}},"status":"Accepted","code":202,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"reversalId\": \"rev_eba04ayw\",\n  \"status\": \"QUEUED\"\n}"}]},{"name":"Read your balances","request":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/ledger/v2/balance?shortCode=600100","host":["{{baseUrl}}"],"path":["ledger","v2","balance"],"variable":[],"query":[{"key":"shortCode","value":"600100"}]},"description":"Read your balances"},"response":[{"name":"Healthy float","originalRequest":{"method":"GET","header":[],"url":{"raw":"{{baseUrl}}/ledger/v2/balance?shortCode=600100","host":["{{baseUrl}}"],"path":["ledger","v2","balance"],"variable":[],"query":[{"key":"shortCode","value":"600100"}]},"description":"Read your balances"},"status":"OK","code":200,"_postman_previewlanguage":"json","header":[{"key":"Content-Type","value":"application/json"}],"body":"{\n  \"shortCode\": \"600100\",\n  \"currency\": \"KES\",\n  \"available\": 1284500,\n  \"reserved\": 25000,\n  \"asOf\": \"2026-09-28T10:59:40.083Z\"\n}"}]}]}],"auth":{"type":"bearer","bearer":[{"key":"token","value":"{{token}}","type":"string"}]},"variable":[{"key":"baseUrl","value":"https://devportal.softwaregroup.com/api/sandbox","type":"string"},{"key":"consumerKey","value":"","type":"string"},{"key":"consumerSecret","value":"","type":"string"},{"key":"token","value":"","type":"string"}]}