<?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: Frankcdr</title>
    <description>The latest articles on DEV Community by Frankcdr (@frankcdr__1325e131e4a8390).</description>
    <link>https://dev.to/frankcdr__1325e131e4a8390</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%2F4055876%2Fb9a2ec13-0398-4cb9-a558-4e5925f1031e.png</url>
      <title>DEV Community: Frankcdr</title>
      <link>https://dev.to/frankcdr__1325e131e4a8390</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/frankcdr__1325e131e4a8390"/>
    <language>en</language>
    <item>
      <title>Building an Open Source SDK for MTN Mobile Money (React Native/TypeScript)</title>
      <dc:creator>Frankcdr</dc:creator>
      <pubDate>Fri, 31 Jul 2026 02:59:28 +0000</pubDate>
      <link>https://dev.to/frankcdr__1325e131e4a8390/building-an-open-source-sdk-for-mtn-mobile-money-react-nativetypescript-5756</link>
      <guid>https://dev.to/frankcdr__1325e131e4a8390/building-an-open-source-sdk-for-mtn-mobile-money-react-nativetypescript-5756</guid>
      <description>&lt;p&gt;Mobile money is the dominant way people pay for things across most of Africa. In Rwanda alone, MTN Mobile Money (MoMo) has over 3 million active users, and it’s the first payment method most local businesses reach for, not cards, not bank transfers.&lt;br&gt;
MTN opened up their MoMo API to third-party developers a few years ago, and since then a handful of server-side wrappers have popped up (Node, PHP, Python). What was missing was a client-side SDK for React Native — something a mobile app could use directly, with proper TypeScript types and none of the boilerplate of wiring up OAuth2, sandbox provisioning, and error handling from scratch every time.&lt;br&gt;
So I built one: openbank-africa-sdk.&lt;/p&gt;

&lt;p&gt;What it does&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Handles MTN MoMo sandbox provisioning (API user + API key creation) automatically&lt;/li&gt;
&lt;li&gt;OAuth2 authentication with automatic token refresh&lt;/li&gt;
&lt;li&gt;Collections: Request to Pay, transaction status, account balance&lt;/li&gt;
&lt;li&gt;Disbursements: send money to users, check transfer status&lt;/li&gt;
&lt;li&gt;Typed errors, mapped from MTN’s own error reference (no more guessing what INTERNAL_PROCESSING_ERROR means at 2am)&lt;/li&gt;
&lt;li&gt;Zero runtime dependencies — works identically in a Node.js backend or a React Native app&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quick example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;OpenBankClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openbank-africa-sdk&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;OpenBankClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;adapter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mtn-momo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;subscriptionKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MTN_SUBSCRIPTION_KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;callbackHost&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://my-app.com/webhooks/momo&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sandbox&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;authenticate&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;payment&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;requestToPay&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="mi"&gt;5000&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;RWF&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;250788123456&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;externalId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order-123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;payerMessage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Payment for order #123&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;status&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;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;collections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;referenceId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. No manual UUID generation, no manually building the Basic Auth header for token requests, no digging through the API docs to remember which header goes where.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why “OpenBank Africa” and not just “MoMo SDK”&lt;/strong&gt;&lt;br&gt;
The architecture is built around adapters on purpose. MTN MoMo is the first one, but the goal is to eventually support Airtel Money and other providers under the same interface, so a developer building a payments feature for an app targeting multiple African markets doesn’t have to learn a different SDK for each provider.&lt;/p&gt;

&lt;p&gt;Try it&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/francedermaz/openbank-africa-sdk" rel="noopener noreferrer"&gt;https://github.com/francedermaz/openbank-africa-sdk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/openbank-africa-sdk" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/openbank-africa-sdk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s MIT licensed, free, and open to contributions. If you’re building something with MTN MoMo, especially in Rwanda, I’d love feedback, issues, or PRs. Airtel Money support is next on the roadmap.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>reactnative</category>
      <category>fintech</category>
      <category>africa</category>
    </item>
  </channel>
</rss>
