{
  "meta": {
    "generated": "2026-09-21",
    "source": "lib/currency-pages.ts, lib/zero-decimal-currencies.ts",
    "idScheme": "currency:<code>"
  },
  "note": "decimals is the number of minor-unit digits. Where it is 0 the amount is sent as whole units, not cents. This is the most common integration error against African rails.",
  "currencies": [
    {
      "id": "currency:xaf",
      "code": "XAF",
      "symbol": "CFA",
      "decimals": 0,
      "amountRule": "XAF has no minor unit. Send whole numbers: 5000 means 5000 XAF, not 50.00. There are no cents to divide by.",
      "status": "live",
      "countries": [
        {
          "name": "Cameroon",
          "iso2": "CM",
          "live": true
        },
        {
          "name": "Gabon",
          "iso2": "GA",
          "live": true
        },
        {
          "name": "Republic of Congo",
          "iso2": "CG",
          "live": true
        },
        {
          "name": "Chad",
          "iso2": "TD",
          "live": false
        }
      ],
      "sharedAcrossCountries": true,
      "chargeableNetworks": [
        "Airtel Money",
        "Express Union",
        "MTN MoMo",
        "Moov Money",
        "Orange Money"
      ],
      "url": "https://ultraner.com/currencies/xaf"
    },
    {
      "id": "currency:xof",
      "code": "XOF",
      "symbol": "CFA",
      "decimals": 0,
      "amountRule": "XOF has no minor unit. Send whole numbers: 5000 means 5000 XOF, not 50.00. There are no cents to divide by.",
      "status": "live",
      "countries": [
        {
          "name": "Benin",
          "iso2": "BJ",
          "live": true
        },
        {
          "name": "Ivory Coast",
          "iso2": "CI",
          "live": true
        },
        {
          "name": "Senegal",
          "iso2": "SN",
          "live": true
        },
        {
          "name": "Burkina Faso",
          "iso2": "BF",
          "live": false
        },
        {
          "name": "Mali",
          "iso2": "ML",
          "live": false
        },
        {
          "name": "Niger",
          "iso2": "NE",
          "live": false
        },
        {
          "name": "Togo",
          "iso2": "TG",
          "live": false
        }
      ],
      "sharedAcrossCountries": true,
      "chargeableNetworks": [
        "Free Money",
        "MTN MoMo",
        "Moov Money",
        "Orange Money",
        "Wave"
      ],
      "url": "https://ultraner.com/currencies/xof"
    },
    {
      "id": "currency:cdf",
      "code": "CDF",
      "symbol": "FC",
      "decimals": 2,
      "amountRule": "CDF has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 CDF.",
      "status": "live",
      "countries": [
        {
          "name": "DR Congo",
          "iso2": "CD",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "Africell Money",
        "Airtel Money",
        "M-Pesa (Vodacom)",
        "Orange Money"
      ],
      "url": "https://ultraner.com/currencies/cdf"
    },
    {
      "id": "currency:kes",
      "code": "KES",
      "symbol": "KES",
      "decimals": 2,
      "amountRule": "KES has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 KES.",
      "status": "live",
      "countries": [
        {
          "name": "Kenya",
          "iso2": "KE",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "Airtel Money",
        "M-Pesa (Safaricom)",
        "T-Kash"
      ],
      "url": "https://ultraner.com/currencies/kes"
    },
    {
      "id": "currency:mzn",
      "code": "MZN",
      "symbol": "MT",
      "decimals": 2,
      "amountRule": "MZN has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 MZN.",
      "status": "live",
      "countries": [
        {
          "name": "Mozambique",
          "iso2": "MZ",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "M-Pesa (Vodacom)",
        "e-Mola",
        "mKesh"
      ],
      "url": "https://ultraner.com/currencies/mzn"
    },
    {
      "id": "currency:rwf",
      "code": "RWF",
      "symbol": "RWF",
      "decimals": 0,
      "amountRule": "RWF has no minor unit. Send whole numbers: 5000 means 5000 RWF, not 50.00. There are no cents to divide by.",
      "status": "live",
      "countries": [
        {
          "name": "Rwanda",
          "iso2": "RW",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "Airtel Money",
        "MTN MoMo"
      ],
      "url": "https://ultraner.com/currencies/rwf"
    },
    {
      "id": "currency:sle",
      "code": "SLE",
      "symbol": "Le",
      "decimals": 2,
      "amountRule": "SLE has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 SLE.",
      "status": "live",
      "countries": [
        {
          "name": "Sierra Leone",
          "iso2": "SL",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "Africell Money",
        "Orange Money"
      ],
      "url": "https://ultraner.com/currencies/sle"
    },
    {
      "id": "currency:tzs",
      "code": "TZS",
      "symbol": "TZS",
      "decimals": 0,
      "amountRule": "TZS has no minor unit. Send whole numbers: 5000 means 5000 TZS, not 50.00. There are no cents to divide by.",
      "status": "live",
      "countries": [
        {
          "name": "Tanzania",
          "iso2": "TZ",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "Airtel Money",
        "AzamPesa",
        "Halopesa",
        "M-Pesa (Vodacom)",
        "Mixx by Yas",
        "TTCL T-Pesa"
      ],
      "url": "https://ultraner.com/currencies/tzs"
    },
    {
      "id": "currency:ugx",
      "code": "UGX",
      "symbol": "UGX",
      "decimals": 0,
      "amountRule": "UGX has no minor unit. Send whole numbers: 5000 means 5000 UGX, not 50.00. There are no cents to divide by.",
      "status": "live",
      "countries": [
        {
          "name": "Uganda",
          "iso2": "UG",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "Airtel Money",
        "MTN MoMo"
      ],
      "url": "https://ultraner.com/currencies/ugx"
    },
    {
      "id": "currency:zmw",
      "code": "ZMW",
      "symbol": "ZK",
      "decimals": 2,
      "amountRule": "ZMW has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 ZMW.",
      "status": "live",
      "countries": [
        {
          "name": "Zambia",
          "iso2": "ZM",
          "live": true
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [
        "Airtel Money",
        "MTN MoMo",
        "Zamtel Kwacha"
      ],
      "url": "https://ultraner.com/currencies/zmw"
    },
    {
      "id": "currency:bif",
      "code": "BIF",
      "symbol": "FBu",
      "decimals": 0,
      "amountRule": "BIF has no minor unit. Send whole numbers: 5000 means 5000 BIF, not 50.00. There are no cents to divide by.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Burundi",
          "iso2": "BI",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/bif"
    },
    {
      "id": "currency:egp",
      "code": "EGP",
      "symbol": "E£",
      "decimals": 2,
      "amountRule": "EGP has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 EGP.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Egypt",
          "iso2": "EG",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/egp"
    },
    {
      "id": "currency:etb",
      "code": "ETB",
      "symbol": "Br",
      "decimals": 2,
      "amountRule": "ETB has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 ETB.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Ethiopia",
          "iso2": "ET",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/etb"
    },
    {
      "id": "currency:ghs",
      "code": "GHS",
      "symbol": "GHS",
      "decimals": 2,
      "amountRule": "GHS has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 GHS.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Ghana",
          "iso2": "GH",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/ghs"
    },
    {
      "id": "currency:gnf",
      "code": "GNF",
      "symbol": "FG",
      "decimals": 0,
      "amountRule": "GNF has no minor unit. Send whole numbers: 5000 means 5000 GNF, not 50.00. There are no cents to divide by.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Guinea",
          "iso2": "GN",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/gnf"
    },
    {
      "id": "currency:lsl",
      "code": "LSL",
      "symbol": "M",
      "decimals": 2,
      "amountRule": "LSL has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 LSL.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Lesotho",
          "iso2": "LS",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/lsl"
    },
    {
      "id": "currency:mad",
      "code": "MAD",
      "symbol": "DH",
      "decimals": 2,
      "amountRule": "MAD has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 MAD.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Morocco",
          "iso2": "MA",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/mad"
    },
    {
      "id": "currency:mwk",
      "code": "MWK",
      "symbol": "MK",
      "decimals": 2,
      "amountRule": "MWK has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 MWK.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Malawi",
          "iso2": "MW",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/mwk"
    },
    {
      "id": "currency:ngn",
      "code": "NGN",
      "symbol": "₦",
      "decimals": 2,
      "amountRule": "NGN has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 NGN.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Nigeria",
          "iso2": "NG",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/ngn"
    },
    {
      "id": "currency:ssp",
      "code": "SSP",
      "symbol": "SSP",
      "decimals": 2,
      "amountRule": "SSP has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 SSP.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "South Sudan",
          "iso2": "SS",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/ssp"
    },
    {
      "id": "currency:szl",
      "code": "SZL",
      "symbol": "E",
      "decimals": 2,
      "amountRule": "SZL has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 SZL.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Eswatini",
          "iso2": "SZ",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/szl"
    },
    {
      "id": "currency:tnd",
      "code": "TND",
      "symbol": "DT",
      "decimals": 2,
      "amountRule": "TND has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 TND.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Tunisia",
          "iso2": "TN",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/tnd"
    },
    {
      "id": "currency:usd",
      "code": "USD",
      "symbol": "$",
      "decimals": 2,
      "amountRule": "USD has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 USD.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "Zimbabwe",
          "iso2": "ZW",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/usd"
    },
    {
      "id": "currency:zar",
      "code": "ZAR",
      "symbol": "R",
      "decimals": 2,
      "amountRule": "ZAR has 2 decimal places. Amounts are sent in the minor unit, so 2500 means 25.00 ZAR.",
      "status": "coming_soon",
      "countries": [
        {
          "name": "South Africa",
          "iso2": "ZA",
          "live": false
        }
      ],
      "sharedAcrossCountries": false,
      "chargeableNetworks": [],
      "url": "https://ultraner.com/currencies/zar"
    }
  ]
}