<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Chizurum Egwunwankwo</title>
    <description>The latest articles on DEV Community by Chizurum Egwunwankwo (@chizurum).</description>
    <link>https://dev.to/chizurum</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3321752%2Fa98ed08a-1f90-4544-8a8e-c8cb285b67d8.png</url>
      <title>DEV Community: Chizurum Egwunwankwo</title>
      <link>https://dev.to/chizurum</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chizurum"/>
    <language>en</language>
    <item>
      <title>Building an E-Commerce Checkout with Interswitch Payment Gateway (Web Checkout) -</title>
      <dc:creator>Chizurum Egwunwankwo</dc:creator>
      <pubDate>Fri, 10 Jul 2026 10:17:21 +0000</pubDate>
      <link>https://dev.to/interswitchdevcommunity/building-an-e-commerce-checkout-with-interswitch-payment-gateway-web-checkout--ocp</link>
      <guid>https://dev.to/interswitchdevcommunity/building-an-e-commerce-checkout-with-interswitch-payment-gateway-web-checkout--ocp</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9vmza9yptug5xys33ty7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9vmza9yptug5xys33ty7.png" alt="Accept payments with Interswitch" width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Take a customer from "Add to Cart" to a verified payment — including the failure cases the quickstart doesn't walk you through&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You're building a checkout for an online store. A customer fills their cart, clicks "Pay," and from that moment a dozen things can happen, most of them fine, some of them not. They complete payment cleanly. They close the tab mid-OTP. Their card gets declined. Your callback fires but the money isn't actually real. A good checkout handles all of these, not just the success path.&lt;/p&gt;

&lt;p&gt;This guide builds a complete e-commerce checkout on the Interswitch Payment Gateway using Web Checkout, then walks through the failure cases that separate a checkout that works in a demo from one that survives real customers.&lt;/p&gt;

&lt;p&gt;A quick note on terminology before we start: Interswitch's Web Checkout has two integration methods: &lt;strong&gt;&lt;em&gt;Inline Checkout&lt;/em&gt;&lt;/strong&gt; (the payment popup opens over your page, no redirect) and &lt;strong&gt;&lt;em&gt;Web Redirect&lt;/em&gt;&lt;/strong&gt; (the customer is sent to Interswitch's payment page and back). We'll use Inline Checkout, since keeping the customer on your store is the better experience for e-commerce.&lt;/p&gt;




&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;A checkout flow for an online store that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Takes the customer's cart total and triggers an Interswitch payment&lt;/li&gt;
&lt;li&gt;Handles the customer completing payment and the ways they don't&lt;/li&gt;
&lt;li&gt;Verifies the payment server-side before fulfilling the order (the part that matters most)&lt;/li&gt;
&lt;li&gt;Moves cleanly from test to production&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 — Test Credentials
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Parameter&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Merchant Code&lt;/td&gt;
&lt;td&gt;MX6072&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay Item ID&lt;/td&gt;
&lt;td&gt;9405967&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Client ID&lt;/td&gt;
&lt;td&gt;IKIAB23A4E2756605C1ABC33CE3C287E27267F660D61&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Secret&lt;/td&gt;
&lt;td&gt;secret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mode&lt;/td&gt;
&lt;td&gt;TEST&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When you go live, you'll generate your own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Trigger Checkout From The Cart
&lt;/h2&gt;

&lt;p&gt;For an e-commerce store, Inline Checkout is the right choice. The payment popup opens over your store, the customer never leaves your page, and the cart context stays intact.&lt;/p&gt;

&lt;p&gt;Add the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://newwebpay-sandbox.interswitchng.com/inline-checkout.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now wire it to your cart. The key move here is translating your cart total into what Interswitch expects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;checkoutCart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// cart.total is in naira (e.g. 4500.00)&lt;/span&gt;
    &lt;span class="c1"&gt;// Interswitch expects kobo, so multiply by 100&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;amountInKobo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Generate a unique reference and store it against this order&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;txnRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`order_&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;_&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;webpayCheckout&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
        &lt;span class="na"&gt;merchant_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MX6072&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pay_item_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;9405967&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;txn_ref&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;txnRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;amountInKobo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;566&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                          &lt;span class="c1"&gt;// NGN&lt;/span&gt;
        &lt;span class="na"&gt;cust_email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customerEmail&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;cust_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;customerName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;site_redirect_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://yourstore.com/payment-complete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;// optional for inline; used by web redirect&lt;/span&gt;
        &lt;span class="na"&gt;onComplete&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handlePaymentResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cart&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;txnRef&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;TEST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things here are the source of most real bugs, so take note of them:&lt;br&gt;
Amount is in kobo. A ₦4,500 cart is 450000, not 4500. Convert at the boundary — Math.round(cart.total * 100) and never let naira leak into the API call.&lt;/p&gt;

&lt;p&gt;txn_ref must be unique per attempt. Notice it includes both the order ID and a timestamp. The order ID alone isn't enough, because a customer might try to pay for the same order twice (first attempt failed, they retry). Each attempt needs its own reference, while still being traceable back to the order.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3 — Handle What The Customer Actually Does
&lt;/h2&gt;

&lt;p&gt;The quickstart shows you the success case. With real customers, it gets trickier. Here's the response handler that deals with reality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;handlePaymentResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;txnRef&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// resp === "00" indicates the customer completed the flow in the browser.&lt;/span&gt;
    &lt;span class="c1"&gt;// (Confirm the callback object's exact field names against a live test —&lt;/span&gt;
    &lt;span class="c1"&gt;//  see the note below.)&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;resp&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Customer completed the flow — but DON'T fulfill yet.&lt;/span&gt;
        &lt;span class="c1"&gt;// Send to your server to verify before giving value.&lt;/span&gt;
        &lt;span class="nf"&gt;verifyAndFulfill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;txnRef&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Customer did not complete — declined, cancelled, or errored.&lt;/span&gt;
        &lt;span class="c1"&gt;// Do NOT fulfill. Show a retry option.&lt;/span&gt;
        &lt;span class="nf"&gt;showRetryOption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;desc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A note on field names: Interswitch's Web Redirect response is documented to return resp (response code — 00 means approved), desc (description), apprAmt (approved amount), txnref, and retRef. The Inline onComplete callback receives a response object that mirrors these, but the docs don't enumerate its fields explicitly, so console.log(response) once in the sandbox and confirm the exact keys before you rely on them. Whatever the field names, the rule in Step 4 is unchanged: the callback is never your source of truth.&lt;/p&gt;

&lt;p&gt;But there's a case the response handler alone can't catch: the customer who closes the tab mid-payment. If a customer starts the OTP step and then closes the popup, your onComplete callback may never fire. As far as your frontend knows, nothing happened, but the payment might have actually gone through on Interswitch's side. &lt;/p&gt;

&lt;p&gt;This is exactly why you cannot rely on the callback as your source of truth, and why the next step exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Verify Server-Side (The Rule You Never Break)
&lt;/h2&gt;

&lt;p&gt;This is the most important section in this guide.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Never fulfill an order based on the client-side callback alone.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The callback firing with a success code means the customer completed the payment flow in their browser. It does not, by itself, prove the money is real and in your account. Two reasons this matters for an e-commerce store specifically-&lt;/p&gt;

&lt;p&gt;First, &lt;strong&gt;the abandoned-tab problem from above&lt;/strong&gt; - the callback might never fire even when payment succeeded. Your server needs to be able to check independently.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;client responses can be manipulated&lt;/strong&gt;. A malicious user can fake a success response to your frontend. If you ship goods on that alone, you've shipped for free.&lt;/p&gt;

&lt;p&gt;So before you mark the order paid and trigger fulfillment, your server independently verifies the transaction with Interswitch using your merchant code, the transaction reference you stored, and the amount:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// On your server — verify before fulfilling&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;verifyAndFulfill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;txnRef&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;expectedAmountInKobo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;merchantCode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MX6072&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;`https://sandbox.interswitchng.com/collections/api/v1/gettransaction.json`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="s2"&gt;`?merchantcode=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;merchantCode&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="s2"&gt;`&amp;amp;transactionreference=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;txnRef&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="s2"&gt;`&amp;amp;amount=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;expectedAmountInKobo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GET&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// ResponseCode "00" = approved. Always confirm the returned&lt;/span&gt;
    &lt;span class="c1"&gt;// Amount matches your order total before giving value.&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isApproved&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseCode&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;amountMatches&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;expectedAmountInKobo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;isApproved&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;amountMatches&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;markOrderPaid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="nf"&gt;triggerFulfillment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;flagForReview&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;orderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ResponseDescription&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to note about this verification call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auth on the requery.&lt;/strong&gt; The simplified call above passes only the query parameters. Some Interswitch setups require an additional Hash header on the gettransaction.json requery (a SHA-512 hash of the requery string plus your secret key). Confirm against your Developer Console whether your integration needs it, and add it before going live if so.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The returned Amount is also in kobo&lt;/strong&gt;. You're comparing your expectedAmountInKobo against Interswitch's Amount, both in the minor unit so don't accidentally compare naira to kobo and trigger a false mismatch.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check the amount, not just the status. Verify not only that a payment happened, but that the amount paid matches the order total. A customer paying ₦100 for a ₦45,000 order is a payment that "succeeded" and one you must never fulfill. Confirm both that the money is real and that it's the right money.&lt;/p&gt;

&lt;p&gt;The flow is always: customer's browser says "I think I paid" → your server confirms "yes, the money is real and it's the correct amount" → only then do you give value. Build this from day one. It's far harder to retrofit after you've been fulfilling on trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 — Complete a Test Payment
&lt;/h2&gt;

&lt;p&gt;With the flow wired up, use Interswitch's test cards to run a payment in sandbox. Enter a test card in the popup, complete the OTP, and watch your handler fire. Then deliberately test the failure paths: cancel mid-flow, close the tab, use a declining test card. A checkout you've only tested on the success path is a checkout you haven't really tested.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Go Live
&lt;/h2&gt;

&lt;p&gt;When test works and the failure cases are handled:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate your own credentials and replace the sandbox ones&lt;/li&gt;
&lt;li&gt;Change the sandbox host to the live host (script: newwebpay.interswitchng.com; verification: webpay.interswitchng.com)&lt;/li&gt;
&lt;li&gt;Set mode: 'LIVE'&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The code doesn't change. only credentials, URL, and mode. What you tested is what ships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;A note on base URLs:&lt;/em&gt;&lt;/strong&gt; Interswitch uses a few sandbox hostnames across their docs and plugins (sandbox.interswitchng.com, newwebpay-sandbox.interswitchng.com, and others). The ones used here match the current Web Checkout documentation, but always confirm the exact base URLs against your Developer Console before going live.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Note on Transaction Verification
&lt;/h2&gt;

&lt;p&gt;For the server-side verification step, you use the gettransaction.json endpoint to confirm status with Interswitch. One thing worth knowing as you architect this: the Transaction Search API does not currently cover IPG payments, so your verification uses IPG's own transaction status check (shown above), not Transaction Search. Keep those two systems distinct, they solve different problems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up...
&lt;/h2&gt;

&lt;p&gt;A real e-commerce checkout isn't the success path; it's the success path plus every way a customer can deviate from it. We built a flow that converts the cart correctly (kobo, unique references), handles the customer who completes payment and the one who closes the tab, and most importantly, verifies server-side that the money is real and the amount is right before shipping a single item.&lt;/p&gt;

&lt;p&gt;The one rule, again, because it's the one that matters: the browser says "I paid," your server confirms "the money is real and correct," and only then do you fulfill.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/quickstart-accept-your-first-payment-in-5-minutes" rel="noopener noreferrer"&gt;QuickStart — Accept Your First Payment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/web-checkout" rel="noopener noreferrer"&gt;Web Checkout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/default-test-credentials" rel="noopener noreferrer"&gt;Default Test Credentials&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/getting-integration-credentials" rel="noopener noreferrer"&gt;Getting Integration Credentials&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Building checkout with Interswitch? Join the Interswitch &lt;a href="https://join.slack.com/t/iswdevelopercommunity/shared_invite/zt-3tef2a52s-0mI470Fh7hJ_R8O9wfHHIw" rel="noopener noreferrer"&gt;Developer Community on Slack&lt;/a&gt;, share what you're building and get help from developers who've shipped it.&lt;/p&gt;

</description>
      <category>interswitchpaymentgateway</category>
      <category>webcheckout</category>
    </item>
    <item>
      <title>Building an Automated POS Settlement Monitor with Interswitch Transaction Search</title>
      <dc:creator>Chizurum Egwunwankwo</dc:creator>
      <pubDate>Tue, 30 Jun 2026 17:04:50 +0000</pubDate>
      <link>https://dev.to/interswitchdevcommunity/building-an-automated-pos-settlement-monitor-with-interswitch-transaction-search-2c4k</link>
      <guid>https://dev.to/interswitchdevcommunity/building-an-automated-pos-settlement-monitor-with-interswitch-transaction-search-2c4k</guid>
      <description>&lt;p&gt;If you run a business with POS terminals - a retail chain, a string of agent locations, a payments business with terminals in the field, you know the evening ritual. Transactions came in all day. Now you need to know which ones actually settled, which are still pending, and whether the money that hit your account matches what your terminals reported. &lt;/p&gt;

&lt;p&gt;This guide does that. We'll build an automated settlement monitor using the &lt;a href="https://docs.interswitchgroup.com/docs/transaction-search" rel="noopener noreferrer"&gt;Interswitch Transaction Search API&lt;/a&gt;; one that takes your terminals, finds the day's transactions, and tells you exactly what settled and what didn't. &lt;/p&gt;

&lt;h2&gt;
  
  
  On Coverage
&lt;/h2&gt;

&lt;p&gt;Before we write a line of code, you need to know what Transaction Search actually covers, because building on the wrong assumption wastes your time.&lt;br&gt;
Per Interswitch's transaction coverage, here's what's fully supported today:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Transaction Type&lt;/th&gt;
&lt;th&gt;Transaction&lt;/th&gt;
&lt;th&gt;Settlement&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Purchase (POS &amp;amp; Web)&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transfer (ATM &amp;amp; POS)&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cash Withdrawal&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agency Banking&lt;/td&gt;
&lt;td&gt;Full&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quickteller Transfers&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The two types we'll build on - POS Purchase and POS Transfer - have full transaction and settlement coverage. That's deliberate. It means every reconciliation lookup in this guide returns complete data.&lt;/p&gt;

&lt;p&gt;One thing to note: &lt;a href="https://interswitchgroup.com/ipg" rel="noopener noreferrer"&gt;Interswitch Payment Gateway (IPG&lt;/a&gt;) purchases are not currently covered by Transaction Search. If you're verifying IPG web checkout payments, that's a different flow. Transaction Search is built for transactions that flow through the switch: POS, ATM, cash withdrawal, transfers. &lt;/p&gt;
&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;A settlement monitor that does three things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Authenticates&lt;/strong&gt; against Interswitch Passport for an access token&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Searches&lt;/strong&gt; each terminal's transactions for a given day&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pulls&lt;/strong&gt; full settlement details for each transaction and flags anything not yet settled&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By the end you'll have a function you can drop into a cron job that runs every evening and emails you a settlement report.&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 1 - Setup Your Project
&lt;/h2&gt;

&lt;p&gt;Get your credentials first:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create an account on the &lt;a href="https://developer.interswitchgroup.com/" rel="noopener noreferrer"&gt;Interswitch Developer Console&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set up a Project and select Transaction Search from the available APIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A test Client ID and Secret Key are generated for you&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step 2 - Authentication
&lt;/h2&gt;

&lt;p&gt;Every Transaction Search call needs a Bearer token, obtained by exchanging your Client ID and Secret against the Interswitch Passport endpoint. Tokens are short-lived - cache and refresh rather than requesting one per call.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;
&lt;span class="c1"&gt;// auth.js&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getAccessToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;credentials&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Buffer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://passport-sandbox.interswitchng.com/passport/oauth/token &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Basic &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;credentials&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/x-www-form-urlencoded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;grant_type=client_credentials&amp;amp;scope=profile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 - Find A Terminal's Transaction
&lt;/h2&gt;

&lt;p&gt;This is where the POS case study comes alive. Quick Search lets you find transactions by terminal_id, exactly the field you have for every one of your POS devices. Combine it with a date and you get every transaction that terminal processed that day.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;terminal_id&lt;/td&gt;
&lt;td&gt;Identifies a terminal belonging to a merchant&lt;/td&gt;
&lt;td&gt;8 chars — you have this for every device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;merchant_code&lt;/td&gt;
&lt;td&gt;Uniquely identifies a registered merchant&lt;/td&gt;
&lt;td&gt;12 chars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;stan&lt;/td&gt;
&lt;td&gt;Transaction number from the terminal&lt;/td&gt;
&lt;td&gt;6 digits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rrn&lt;/td&gt;
&lt;td&gt;Retrieval Reference Number&lt;/td&gt;
&lt;td&gt;12 digits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;masked_pan&lt;/td&gt;
&lt;td&gt;Card number (first 6 + last 4 visible)&lt;/td&gt;
&lt;td&gt;16–19 digits&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;transaction date&lt;/td&gt;
&lt;td&gt;The date the transaction occured (YYYY-MM-DD)&lt;/td&gt;
&lt;td&gt;used in quick start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;transaction_amount&lt;/td&gt;
&lt;td&gt;Amount in lower denomination (₦20 → 2000)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two rules that catch everyone: use transaction_date (YYYY-MM-DD), and transaction_amount is in the lower denomination — ₦200 is 20000, not 200.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// findTerminalTransactions.js&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;searchByTerminal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;terminalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://switch-online-gateway-service.k9.isw.la/switch-online-gateway-service/api/v1/gateway/quick-search?page_size=20&amp;amp;page_number=1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ClientId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;},&lt;/span&gt;
            &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;terminal_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;terminalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;          &lt;span class="c1"&gt;// per docs (YYYY-MM-DD)&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Handling a full day of transactions
&lt;/h2&gt;

&lt;p&gt;A busy terminal does more than 20 transactions a day, and search caps at 20 per page (page_size can't exceed 20). The response tells you totalPages — loop through page_number until you've covered them all.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getAllTerminalTransactions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;terminalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;pageNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;totalPages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="s2"&gt;`https://switch-online-gateway-service.k9.isw.la/switch-online-gateway-service/api/v1/gateway/quick-search?page_size=20&amp;amp;page_number=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pageNumber&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ClientId&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
                &lt;span class="p"&gt;},&lt;/span&gt;
                &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;terminal_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;terminalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transaction_date&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;concat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="nx"&gt;totalPages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;totalPages&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="nx"&gt;pageNumber&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pageNumber&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;totalPages&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 - Pull Settlement Details
&lt;/h2&gt;

&lt;p&gt;Search tells you a transaction happened. To know whether the money settled, take the transaction_id and call Get Transaction Details.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;
&lt;span class="c1"&gt;// getDetails.js&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;getTransactionDetails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;transactionId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;`https://switch-online-gateway-service.k9.isw.la/switch-online-gateway-service/api/v1/gateway/transaction?transaction_id=&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;transactionId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;client_id&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response breaks into four blocks. For settlement reconciliation, the first two are what you need:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"globalOutputData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"PURCHASE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"210000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"transactionDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-10-09T17:47:35.240"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"transactionStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"COMPLETED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"settlementDate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-10-10"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"settlementStatus"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SETTLED"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"transactionData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"terminalId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"20573ZLY"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"stan"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"373758"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"channel"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"POS"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"rrn"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"696843517287"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"responseCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"responseMessage"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Approved or completed successfully"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"merchantCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2057LA200002957"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"settlementData"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"settlementBreakdownList"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;fee&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;breakdown&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;by&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;party&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"settlementDataAvailable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The globalOutputData block answers the two questions your reconciliation is really asking: transaction status (did the payment complete?) and settlement status (did the money move?).&lt;/p&gt;




&lt;h2&gt;
  
  
  The Insight That Saves You: Transaction Status and Settlement Status Are Different
&lt;/h2&gt;

&lt;p&gt;This is the single most important thing in this guide.&lt;/p&gt;

&lt;p&gt;A POS transaction can be COMPLETED but PENDING SETTLEMENT. The customer's card was charged, the purchase succeeded, your terminal printed "approved" but the money has not yet landed in your settlement account. &lt;/p&gt;

&lt;p&gt;These are two independent facts.&lt;/p&gt;

&lt;p&gt;The most common reconciliation mistake is treating "transaction succeeded" as "money received." They are not the same, and the gap between them is exactly what you're monitoring for. A transaction stuck in PENDING SETTLEMENT for longer than expected is the thing you want flagged.&lt;/p&gt;

&lt;p&gt;The statuses you'll see:&lt;em&gt;PENDING, COMPLETED, REVERSED Settlement status: SETTLED, PENDING SETTLEMENT, NO SETTLEMENT, UNSUPPORTED&lt;/em&gt;&lt;br&gt;
And within the transaction data, the response code maps cleanly: 00 is approved, 09 (or none) is pending, anything else (91, 06, 51...) is a failure.&lt;/p&gt;


&lt;h2&gt;
  
  
  Putting It Together: The Settlement Monitor
&lt;/h2&gt;

&lt;p&gt;Here's the whole thing: give it your terminals and a date, get back a clean settlement report flagging anything that hasn't settled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;javascript&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;runSettlementMonitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;terminalIds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getAccessToken&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;settled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="na"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="na"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="na"&gt;notFound&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;terminalId&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;terminalIds&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transactions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getAllTerminalTransactions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;terminalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;date&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

        &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;notFound&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;terminalId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;txn&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;transactions&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;getTransactionDetails&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;txn&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transaction_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;globalOutputData&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

            &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;entry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;terminalId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;transactionStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactionStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;settlementStatus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settlementStatus&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;settlementDate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settlementDate&lt;/span&gt;
            &lt;span class="p"&gt;};&lt;/span&gt;

            &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settlementStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;SETTLED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;record&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactionStatus&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;COMPLETED&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// completed but not yet settled — watch these&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Run it every evening for all your terminals&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;report&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;runSettlementMonitor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;clientId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20573ZLY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;20577C9O&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2TEP5C7W&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2023-10-09&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Settled: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;settled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Pending settlement (watch these): &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pending&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Failed: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;report&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Drop that into a cron job, pipe the output into an email or a Slack webhook, and you've automated reconciliation. The pending bucket is one to watch, those are completed transactions whose money hasn't landed yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  When A Transaction Isn't Found
&lt;/h2&gt;

&lt;p&gt;Interswitch is explicit that Transaction Search hasn't reached 100% coverage. If a POS transaction you know exists doesn't come back, treat the 404 as "not found in search" rather than "doesn't exist," and reconfirm through the &lt;a href="https://help.interswitchng.com" rel="noopener noreferrer"&gt;Interswitch Help Desk&lt;/a&gt;. Build that into your notFound handling rather than letting it break the run.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;We took three API calls: &lt;strong&gt;&lt;em&gt;authenticate, search by terminal, get settlement details&lt;/em&gt;&lt;/strong&gt;, and turned them into an automated settlement monitor for a POS business. &lt;/p&gt;

&lt;p&gt;The key isn't any single call. It's the insight that transaction status and settlement status are different questions, and that the gap between them is exactly what reconciliation is about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/transaction-search-getting-started" rel="noopener noreferrer"&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/transaction-search-overview" rel="noopener noreferrer"&gt;Transaction Search Overview
&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/transaction-set-coverage" rel="noopener noreferrer"&gt;Transaction Set Coverage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/quick-search" rel="noopener noreferrer"&gt;Quick Search Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/get-transaction-details" rel="noopener noreferrer"&gt;Get Transaction Details&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.interswitchgroup.com/docs/swol-response-codes" rel="noopener noreferrer"&gt;Response Codes &amp;amp; Statuses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Running POS terminals and building reconciliation tooling?&lt;a href="https://join.slack.com/t/iswdevelopercommunity/shared_invite/zt-3tef2a52s-0mI470Fh7hJ_R8O9wfHHIw" rel="noopener noreferrer"&gt; Join our community&lt;/a&gt; on Slack and share what you're building.&lt;/p&gt;

</description>
      <category>transactionsearchapi</category>
      <category>interswitchapi</category>
      <category>payment</category>
      <category>api</category>
    </item>
    <item>
      <title>A Guide To Using The Interswitch API Marketplace</title>
      <dc:creator>Chizurum Egwunwankwo</dc:creator>
      <pubDate>Wed, 18 Feb 2026 08:40:20 +0000</pubDate>
      <link>https://dev.to/chizurum/a-guide-to-using-the-interswitch-api-marketplace-m9n</link>
      <guid>https://dev.to/chizurum/a-guide-to-using-the-interswitch-api-marketplace-m9n</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frj9ump8kp6ri4is1qsnj.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frj9ump8kp6ri4is1qsnj.jpg" alt="Interswitch API Marketplace" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two weeks ago, we invited developers from the Interswitch developer community to a build night. The goal was to show - not just tell - the capabilities of our API Marketplace and how it makes discovery and consumption easier. In 3 hours, we had 5 completed projects.&lt;/p&gt;

&lt;p&gt;This isn't just about the event - it's about the purpose of the marketplace: making API discovery easier and integrations seamless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Marketplaces Matter: Solving Discovery and Fragmentation
&lt;/h2&gt;

&lt;p&gt;Marketplaces solve more than just the discovery problem. They're the solution to fragmentation.&lt;/p&gt;

&lt;p&gt;Think about the traditional developer experience:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple API providers for different services&lt;/li&gt;
&lt;li&gt;Separate accounts and credentials for each&lt;/li&gt;
&lt;li&gt;Different authentication schemes&lt;/li&gt;
&lt;li&gt;Scattered documentation&lt;/li&gt;
&lt;li&gt;No centralized billing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://developer.interswitchgroup.com/marketplace" rel="noopener noreferrer"&gt;Interswitch API Marketplace&lt;/a&gt; changes this.&lt;/p&gt;

&lt;p&gt;It's a one-stop shop that brings all the APIs you need into one central place. You no longer have to juggle different providers, create multiple accounts, or manage separate credentials for different APIs needed to build one product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Benefits:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Centralized Discovery: Browse all available APIs in one place&lt;/li&gt;
&lt;li&gt;Unified Authentication: One OAuth 2.0 scheme for all APIs&lt;/li&gt;
&lt;li&gt;Single Sign-Up: One account, one dashboard, one wallet&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  APIs On The Marketplace
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ebahsiqebbgrdrzr9nt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ebahsiqebbgrdrzr9nt.jpg" alt="An overview of some APIs on Interswitch API Marketplace" width="800" height="370"&gt;&lt;/a&gt;&lt;br&gt;
The Interswitch API Marketplace currently hosts 20+ APIs across 3 categories, with more coming soon.&lt;/p&gt;

&lt;p&gt;Here's what's available, what each does, and what you can build with it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Identity &amp;amp; Verification APIs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=6811cca7bec04a536b85d705" rel="noopener noreferrer"&gt;Bank Account Verification API:&lt;/a&gt; For authenticating bank details and verifying account ownership.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=682476229450991869456e42" rel="noopener noreferrer"&gt;BVN Full Details API&lt;/a&gt;: Verification and validation of a Bank Verification Number (BVN) in real-time with complete customer information.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=67bd44165da0515b2a390d05" rel="noopener noreferrer"&gt;BVN Boolean Match API:&lt;/a&gt; Verify the existence and validity of a BVN in real-time (returns true/false without full details).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=67bd419c5da0515b2a390d04" rel="noopener noreferrer"&gt;NIN API&lt;/a&gt;: Verification API that confirms and verifies a person's National Identity Number.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=682477329450991869456e43" rel="noopener noreferrer"&gt;NIN Full Details API&lt;/a&gt;: Authentication and confirmation of a NIN in real-time with complete personal information.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=682475189450991869456e41" rel="noopener noreferrer"&gt;Physical Address API&lt;/a&gt;: Validates and verifies customer-provided addresses by checking them against authoritative databases.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=67bd488f5da0515b2a390d06" rel="noopener noreferrer"&gt;TIN API&lt;/a&gt;: Tax-focused API that authenticates Tax Identification Numbers&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=6811cd7bbec04a536b85d706" rel="noopener noreferrer"&gt;Domestic AML Search API&lt;/a&gt;: Helps businesses screen individuals against local anti-money laundering watchlists.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=6811c71abec04a536b85d704" rel="noopener noreferrer"&gt;Driver's License Verification API&lt;/a&gt;: A verification API that confirms and verifies a person's Driver's License Number with the full details.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=693a043100ccc0c1ec66ea41" rel="noopener noreferrer"&gt;Driver's License Boolean Match API&lt;/a&gt;: Verify the existence and validity of a person's Driver's License Number in real-time (returns true/false without full details).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=682479fa9450991869456e46" rel="noopener noreferrer"&gt;Facial Comparison API&lt;/a&gt;: The Facial Comparison API provides a secure and efficient way for businesses to verify a person's identity by comparing the similarity between two different images.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=68ad2486971fcd6d60a87794" rel="noopener noreferrer"&gt;International Passport Lookup API&lt;/a&gt;: Enables businesses verify the validity of an individual's international passport details.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=68ad23ae971fcd6d60a87793" rel="noopener noreferrer"&gt;Credit History API&lt;/a&gt;: Enables businesses to retrieve comprehensive credit reports of individuals directly from Nigeria's leading credit bureau.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=682479569450991869456e45" rel="noopener noreferrer"&gt;Global Search AML API&lt;/a&gt;: Helps businesses screen individuals against international anti-money laundering watchlists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;B. Transaction &amp;amp; Payment APIs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=6968b0c6a0d6e140ab9bfe24" rel="noopener noreferrer"&gt;Bills Payment API&lt;/a&gt;:Offers the capability to integrate features cable TV subscriptions, utility bills, government services, airtime/data, and more into your application.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;C. Security &amp;amp; Business APIs&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=6824787f9450991869456e44" rel="noopener noreferrer"&gt;Generate SafeToken API&lt;/a&gt;: The SafeToken OTP API provides secure multi-factor authentication and transaction verification for your application.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://developer.interswitchgroup.com/marketplace/api/detail?id=68ad1daa971fcd6d60a87791" rel="noopener noreferrer"&gt;CAC API&lt;/a&gt;: Leverages the Corporate Affairs Commission (CAC) database to enable businesses to retrieve detailed information about a business or company registered with CAC including the company directors, shareholders and secretary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And &lt;a href="https://developer.interswitchgroup.com/marketplace/apis" rel="noopener noreferrer"&gt;many others&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Next, I'll take you through the developer tools we have on the marketplace to make integration hassle-free. &lt;/p&gt;
&lt;h2&gt;
  
  
  Developer Tools
&lt;/h2&gt;

&lt;p&gt;We prioritized developer experience to make integration simple, easy, and seamless. Here are the tools available for developers on the marketplace - &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Postman Collection (Test Before You&amp;nbsp;Code):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not ready to code yet? Explore what APIs return before integrating.&lt;/p&gt;

&lt;p&gt;Our pre-built Postman collection includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;All API endpoints pre-configured&lt;/li&gt;
&lt;li&gt;Example requests for common use cases&lt;/li&gt;
&lt;li&gt;Environment variables template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit any API page in the marketplace&lt;/li&gt;
&lt;li&gt;Click "Test on Postman"&lt;/li&gt;
&lt;li&gt;Import collection to Postman&lt;/li&gt;
&lt;li&gt;Add your API keys to environment variables&lt;/li&gt;
&lt;li&gt;Click "Send" to make test calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Perfect for: Understanding API behavior, debugging issues, prototyping before coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Sandbox Environment:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every API has a separate sandbox for testing:&lt;/li&gt;
&lt;li&gt;Unlimited requests (no charges)&lt;/li&gt;
&lt;li&gt;Test data provided (test BVNs, NINs, account numbers)&lt;/li&gt;
&lt;li&gt;Separate keys from production (can't accidentally process real transactions)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of the test data provided include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BVN Full Details: 11111111111&lt;/li&gt;
&lt;li&gt;NIN Full Details: 11111111111&lt;/li&gt;
&lt;li&gt;Drivers License: AAA00000AA00&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Documentation (Your integration guide):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1q5gpq7tz17f0uvbeey.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1q5gpq7tz17f0uvbeey.png" alt="visit the marketplace, choose your preferred API and click on ''endpoints'' to access documentation + credentials you need" width="800" height="640"&gt;&lt;/a&gt;&lt;br&gt;
Our documentation contains guides, code snippets you can easily copy and troubleshooting guides to make integration seamless. It contains search functionality so you can find what you need fast.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;To get the documentation for any API of your choice -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit the marketplace&lt;/li&gt;
&lt;li&gt;Select the API of your choice&lt;/li&gt;
&lt;li&gt;On the menu, click on ''Endpoint''. You'll find all you need for integration - code snippets, success response, error response, Postman credentials, etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Documentation for all APIs on the marketplace can be found &lt;a href="https://developer.interswitchgroup.com/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Developer Support (Humans Who Actually&amp;nbsp;Help):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you get stuck while building, we've provided these support channels to help get you unblocked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://join.slack.com/t/iswdevelopercommunity/shared_invite/zt-3mq7pguom-XL~xDaGeDOvLt~tBD10tUg" rel="noopener noreferrer"&gt;Slack Community&lt;/a&gt;: (7k+ developers): Real-time help from our support engineers and other developers in our community. The average response time is 5minsand you can join the community using this link.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Office Hours: If you prefer to speak with our developers directly, our monthly live sessions were created for this purpose. You can ask anything, debug live, learn best practices. Become a part of the community to know the timeline for each month and book a meeting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sections below explains how to get started - from account creation to going live.&lt;/p&gt;
&lt;h2&gt;
  
  
  Getting Started: From Sign-Up to First API Call in 15&amp;nbsp;Minutes
&lt;/h2&gt;

&lt;p&gt;Let's walk through the process of getting started from creating an account, a project, getting API credentials, making your first call and viewing logs.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;STEP 1: Create Your&amp;nbsp;Account&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlj8cjp11peaxggaxk4j.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvlj8cjp11peaxggaxk4j.jpg" alt="Use [this url](https://developer.interswitchgroup.com/auth/account/register) to create an account - enter email address, first &amp;amp; last name, a chosen password, read through the privacy policy and check box then, click on ''create account''." width="771" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visit &lt;a href="https://developer.interswitchgroup.com/marketplace" rel="noopener noreferrer"&gt;https://developer.interswitchgroup.com/marketplace&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Click "Sign Up" (top right)&lt;/li&gt;
&lt;li&gt;Enter email address, first name, last name, and password&lt;/li&gt;
&lt;li&gt;Accept privacy policy &amp;amp; terms and conditions&lt;/li&gt;
&lt;li&gt;Click "Create Account"&lt;/li&gt;
&lt;li&gt;Check your email for verification link&lt;/li&gt;
&lt;li&gt;Click the verification link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And, you're in.&lt;/p&gt;

&lt;p&gt;The next step will be to create your first project.&amp;nbsp;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;STEP 2: Create Your First&amp;nbsp;Project&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Think of a project as a container for the APIs you want to use.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After logging in, click "Create Project"&lt;/li&gt;
&lt;li&gt;Select "New Project" and fill in:
A. Project Name: e.g., "My Identity Verification App"
B. Description: e.g., "Testing BVN verification for KYC"&lt;/li&gt;
&lt;li&gt;Select APIs: Choose the APIs you need&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62mhpgnaawdh9ld9s1i1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F62mhpgnaawdh9ld9s1i1.png" alt="Step 1 -3: Create a new project, fill in the name and description for project then add 1 or more APIs for the project." width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click "Create Project"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjj78dwmt5vvzrl3vzdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsjj78dwmt5vvzrl3vzdy.png" alt="And then…create your project!" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The system generates test credentials (Client ID and Client Secret) for your project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;STEP 3: Get Your API Credentials&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F793r0p7dnxpc4zm6zsyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F793r0p7dnxpc4zm6zsyy.png" alt="Getting your credentials - select the ''test keys'' tab to get your ID + secret keys" width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on your newly created project&lt;/li&gt;
&lt;li&gt;Navigate to "Test Keys" tab&lt;/li&gt;
&lt;li&gt;You'll see:
Client ID: IKIA8574C7FB56… (example)
Client Secret: ••••••••• (click "Show" to reveal)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ CRITICAL SECURITY RULE:&lt;br&gt;
Never commit API keys to GitHub. Always use environment variables.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;STEP 4: Make Your First API Call (10&amp;nbsp;minutes)&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
Let's make a real API call. I'll show you using cURL&lt;/p&gt;

&lt;p&gt;Using cURL (Quick&amp;nbsp;Test)&lt;br&gt;
&lt;em&gt;Step I: Get an access token&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Base64 encode your credentials
CREDENTIALS=$(echo -n "YOUR_CLIENT_ID:YOUR_CLIENT_SECRET" | base64)

# Get access token
curl -X POST https://sandbox.interswitchng.com/passport/oauth/token \
  -H "Authorization: Basic $CREDENTIALS" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "access_token": "eyJhbGciOiJSUzI1NiIsInR5...",
  "token_type": "bearer",
  "expires_in": 43199,
  "scope": "profile"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Step II: Make an API call (example: BVN verification)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Replace YOUR_ACCESS_TOKEN with the token from step 1
curl -X POST https://sandbox.interswitchng.com/api/v1/identity/bvn \
  -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "bvn": "22222222226"
  }'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;&lt;strong&gt;STEP 5: View API Call Logs (Monitor Your&amp;nbsp;Usage)&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
After making API calls, track them in your dashboard. Here's how:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log in to the marketplace&lt;/li&gt;
&lt;li&gt;Navigate to "Reports" section&lt;/li&gt;
&lt;li&gt;View:
A. Request: What you sent to the API
B. Response: What the API returned
C. HTTP Status: 200 (success), 400 (client error), 500 (server error)
D. Timestamp: When the call was made
E. API Endpoint: Which API you called&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can filter by:&lt;br&gt;
A. Date range&lt;br&gt;
B. API endpoint&lt;br&gt;
C. Response status (success/failure)&lt;/p&gt;

&lt;p&gt;You can download reports for reconciliation or debugging.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens Next: From Sandbox to Production
&lt;/h2&gt;

&lt;p&gt;You've made your first API call. Here's the path from testing to production:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Phase 1: Build &amp;amp; Test (Sandbox)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Integrate API into your application&lt;/li&gt;
&lt;li&gt;Test all scenarios (success, failure, edge cases)&lt;/li&gt;
&lt;li&gt;Test with multiple data points&lt;/li&gt;
&lt;li&gt;Deploy to staging environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Phase 2: Request to Go&amp;nbsp;Live&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
When you're ready for production:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedry1faf0bio49mbdgca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedry1faf0bio49mbdgca.png" alt="Go live: Navigate to your selected project, click on the API you want to go live with, toggle from ''test'' to ''go live'', view required onboarding docs, submit and get production keys upon approval." width="800" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on your project in the dashboard&lt;/li&gt;
&lt;li&gt;Select the API you want to go live with&lt;/li&gt;
&lt;li&gt;Click "Go Live" button&lt;/li&gt;
&lt;li&gt;System displays business onboarding requirements&lt;/li&gt;
&lt;li&gt;Submit all required documents&lt;/li&gt;
&lt;li&gt;Compliance reviews your request (usually within 1–3 business days)&lt;/li&gt;
&lt;li&gt;Production keys issued upon approval by our Compliance team&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Fund Your Wallet (For Production)&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Once you've tested in sandbox and you're ready to go live:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to "Wallet" section&lt;/li&gt;
&lt;li&gt;You'll see an account number assigned to you&lt;/li&gt;
&lt;li&gt;Transfer funds from your bank app to this account number&lt;/li&gt;
&lt;li&gt;Refresh the wallet page → Balance updates automatically&lt;/li&gt;
&lt;li&gt;API calls deduct from this balance&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Transaction tracking:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Credits: Wallet funding, failed call reversals&lt;/li&gt;
&lt;li&gt;Debits: Successful API consumption&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Phase 3: Production Launch&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Switch from sandbox keys to production keys in your&amp;nbsp;.env:&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Update these values
&lt;/h1&gt;

&lt;p&gt;ISW_PRODUCTION URL= use &lt;a href="https://api-marketplace-routing.k8.isw.la/marketplace-routing" rel="noopener noreferrer"&gt;this production url&lt;/a&gt;&lt;br&gt;
ISW_CLIENT_ID=production_client_id_here&lt;br&gt;
ISW_CLIENT_SECRET=production_client_secret_here&lt;/p&gt;

&lt;p&gt;After switching to production - &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your application will process real transactions.&lt;/li&gt;
&lt;li&gt;Monitor usage in dashboard&lt;/li&gt;
&lt;li&gt;Fund wallet to avoid service interruption&lt;/li&gt;
&lt;li&gt;Set up monitoring and alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Start&amp;nbsp;Building
&lt;/h2&gt;

&lt;p&gt;If you're ready to start experimenting with the APIs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create your free account:[&lt;a href="https://developer.interswitchgroup.com/marketplace" rel="noopener noreferrer"&gt;https://developer.interswitchgroup.com/marketplace&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Read the full documentation:([&lt;a href="https://developer.interswitchgroup.com/" rel="noopener noreferrer"&gt;https://developer.interswitchgroup.com/&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're building a fintech product, onboarding users, or automating verification flows — the marketplace is designed to help you ship faster with fewer moving parts.&lt;/p&gt;

&lt;p&gt;Happy Building!&lt;/p&gt;

</description>
      <category>apimarketplace</category>
      <category>interswitchapimarketplace</category>
      <category>marketplacefordevelopers</category>
    </item>
    <item>
      <title>How Interswitch Payment Gateway Works</title>
      <dc:creator>Chizurum Egwunwankwo</dc:creator>
      <pubDate>Tue, 16 Sep 2025 13:29:25 +0000</pubDate>
      <link>https://dev.to/chizurum/how-interswitch-payment-gateway-works-2p97</link>
      <guid>https://dev.to/chizurum/how-interswitch-payment-gateway-works-2p97</guid>
      <description>&lt;p&gt;Interswitch’s Payment Gateway (IPG)]offers a unified, end-to-end solution for both online and in-store transactions designed to meet the needs of technically savvy developers as well as non-technical business owners / merchants. Irrespective of who you are - a fintech founder building a custom checkout flow or a merchant looking for a simple, easy-to-use plug and play, IPG delivers reliability, security and flexibility.&lt;/p&gt;

&lt;p&gt;Throughout this blog post, we’ll refer to Interswitch payment gateway as simply, IPG.&lt;/p&gt;

&lt;p&gt;Two Approaches To Integrating With Interswitch Payment Gateway&lt;br&gt;
There are 2 main ways to integrating with IPG; &lt;strong&gt;&lt;em&gt;online payments and in-store payments&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Let’s explore these options&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Online payments:&lt;/strong&gt;&lt;br&gt;
This method of integration into IPG is easy for both developers who are technically savvy and non-developers who simply want plug and play. Developers and Merchants have the options of taking the technical path for online payments (card APIs &amp;amp; hosted fields) and the non-technical options (web checkout &amp;amp; technical fields).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Technical Integration Options For Online Payments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- Card APIs:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Direct RESTful APIs let you control every aspect of the payment flow. A PCI-DSS (Payment Card Industry Data Security Standard) certification and PSSP (Payment Solution Service Provider License) is needed, but with this integration method, you have — complete control over UI &amp;amp; UX and a faster processing time.&lt;br&gt;
This method is best for businesses with in-house technical teams who need full control&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- Hosted Fields:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
This is a customizable payment form elements that live within a website while maintaining security. This type of integration offers benefits such as customization options (colors, typography, borders and responsiveness) and secure integration (PCI compliance without burden). This is best for businesses that want brand consistency while maintaining PCI compliance without redirecting customers off-site.&lt;/p&gt;

&lt;p&gt;It is important to note that both card APIs and hosted fields require technical expertise but offer different levels of control and PCI compliance requirements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. Non-technical Integration Options For Online Payments&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- Web Checkout:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
This is a ready-to-use payment page hosted by Interswitch. This option requires no technical expertise; just configure your branding, and you’re ready to accept payments in minutes. Interswitch handles all PCI compliance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- Hosted Fields:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Customizable form elements that live within your website while maintaining security. Key benefits include — full Customization (match your website’s design seamlessly), secure Integration (PCI compliance without technical burden) and seamless UX (your customer stays on your website throughout).&lt;/p&gt;

&lt;p&gt;Note that the web checkout and hosted field options both require minimal technical knowledge and can be set up quickly through the &lt;a href="https://business.quickteller.com/" rel="noopener noreferrer"&gt;Interswitch merchant portal&lt;/a&gt; or with simple embed codes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Instore Payments:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A. For Technically Savvy Users:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- POS Purchase APIs:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Integrate directly with payment processing for real-time, customizable in-store transactions. This method requires PCI DSS compliance, a PSSP license, and technical expertise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- Android POS SDK:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Use ready-made components for card-present transactions, lifecycle management, and error handling.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Benefits:&lt;/em&gt; Full UX control, custom integrations, enterprise-grade security, and optimized performance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. For Non-Technical Users:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;- POS Terminals:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
Plug-and-play devices pre-installed with Interswitch software. Benefits include: no technical setup, automated settlement, instant reporting and lifetime maintenance.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;IPG Supported Payment Methods&lt;/strong&gt;&lt;br&gt;
Interswitch Payment Gateway offers comprehensive online and offline payment options. These include card payments, pay with transfer, USSD and digital wallets. &lt;/p&gt;

&lt;p&gt;Key benefits of using these payment available through IPG include but are not limited to pan African coverage, enhanced security, a unified integration process and a robust, consolidated reporting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IPG-supported payment options and benefits.&lt;/strong&gt;&lt;br&gt;
Beyond the robust online and offline payment methods, Interswitch also offers POS devices for in-store payment hardware solutions. Benefits include, 24/7 technical support, multi-currency support, remote updates and devices are PCI PTS certified.&lt;/p&gt;

&lt;p&gt;There are also in person payment solutions for businesses with IT resources and technically-savvy personnel as well as in person solutions for non-technical users.&lt;/p&gt;

&lt;p&gt;Requirements for the POS purchase APIs are PCI DSS compliance, a PSSP license and tech expertise. The documentation for the Android POS SDK can be accessed on the &lt;a href="https://business.quickteller.com/" rel="noopener noreferrer"&gt;quickteller business website&lt;/a&gt;. These devices offers these benefits to businesses — complete UX control, custom integration paths, enterprise-grade security and optimized performance.&lt;/p&gt;

&lt;p&gt;To get started with POS terminals simply signup, request for POS, choose the devices you need, receive your terminal and begin to use it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;B. In-person Payment Solutions (For Non-Technical Users)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Non-technical users can maximize Interswitch’s ready-to-use POS terminals with pre-installed Interswitch software. For this in-person payment option, no technical setup or integration is required. Merchants also get automatic settlement (funds in your account the next day) and transaction reports, instant reporting (so they can track sales in real time), fraud protection and a lifetime maintenance (both hardware and software support).&lt;/p&gt;

&lt;p&gt;Beyond this, onboarding is super easy! To get started, contact our sales team then select your preferred terminal model, go on to complete your merchant application and receive configured terminal within days.&lt;/p&gt;

&lt;p&gt;Payment types accepted for this option are credit and debit cards, mobile wallets, QR payments, contactless and apply pay.&lt;/p&gt;

&lt;p&gt;The terminal options for the in-person payment solutions include - countertop (fixed -location terminals), mobile POS (wireless connectivity), smart POS (android-based system) and integrated (POS + cash register).&lt;/p&gt;




&lt;p&gt;In the next blog post, I’ll take a deep dive into IPG advanced features like split settlements, recurring billing, and analytics, as well as the resources for merchants and developers.&lt;/p&gt;

&lt;p&gt;Get started with Interswitch Payment Gateway, &lt;a href="https://business.quickteller.com/signup" rel="noopener noreferrer"&gt;here.&lt;/a&gt;&lt;/p&gt;

</description>
      <category>paymentgateway</category>
      <category>interswitch</category>
      <category>payment</category>
    </item>
  </channel>
</rss>
