Money and currencies

Amounts are integers in the currency's minor unit. Learn the exponent of each supported currency.

Every amount in the API (amount, amount_refunded, commission, net…) is an integer in the currency's minor unit, sent together with an ISO 4217 currency code. There are no decimals and no floats anywhere in the API.

{ "amount": 1500, "currency": "KWD" }

means 1.500 KWD (one dinar and 500 fils), because the Kuwaiti dinar has three decimal places.

Supported currencies

CurrencyCodeExponent (decimal places)Minor unitExample: amount → value
Kuwaiti dinarKWD3fils1500 → 1.500 KWD
Bahraini dinarBHD3fils2750 → 2.750 BHD
Omani rialOMR3baisa10000 → 10.000 OMR
Jordanian dinarJOD3fils500 → 0.500 JOD
Saudi riyalSAR2halala9999 → 99.99 SAR
UAE dirhamAED2fils25000 → 250.00 AED
Qatari riyalQAR2dirham1050 → 10.50 QAR
Egyptian poundEGP2piastre100000 → 1,000.00 EGP

Watch the three-decimal currencies

100 is 1.00 SAR but only 0.100 KWD. Always convert with the currency's exponent, never with a fixed factor of 100.

Three-decimal amounts ending in 0

On some accounts, including UAE accounts, KWD, BHD, OMR and JOD amounts must end in 0: 1250 is accepted, 1255 returns 422 validation_error with details.fields.amount = "unsupported". Rounding three-decimal prices to the nearest 10 works on every account. See Three-decimal amounts.

Converting

To minor units: minor = round(major × 10^exponent). To display: major = minor / 10^exponent, formatted with exactly exponent decimals.

Avoid floating-point arithmetic for money: parse decimal strings or use a decimal library, and keep integers in your database.

const EXPONENTS = { KWD: 3, BHD: 3, OMR: 3, JOD: 3, SAR: 2, AED: 2, QAR: 2, EGP: 2 };

// "12.5" KWD -> 12500
function toMinor(value, currency) {
  const exp = EXPONENTS[currency];
  const [whole, frac = ''] = String(value).split('.');
  if (frac.length > exp) throw new Error(`Too many decimals for ${currency}`);
  return Number(whole) * 10 ** exp + Number(frac.padEnd(exp, '0') || 0);
}

// 12500 KWD -> "KWD 12.500" (pass locale "ar-KW" for Arabic digits)
function format(minor, currency, locale = 'en') {
  const exp = EXPONENTS[currency];
  return new Intl.NumberFormat(locale, {
    style: 'currency',
    currency,
    minimumFractionDigits: exp,
    maximumFractionDigits: exp,
  }).format(minor / 10 ** exp);
}

Currency and payment methods

The currency you choose affects which payment methods appear at checkout. On accounts that support local methods, KNET is offered for KWD, mada for SAR and Benefit for BHD. Cards, Apple Pay and Google Pay work across currencies on every account. Which methods you get depends on your account: see Payment methods and your account. Your account's enabled currencies are shown in the dashboard settings.