The "Currency not supported" error means your Paystack account is not enabled for the currency you sent in the request. Each Paystack account is tied to a country and has a default currency. Nigerian accounts default to NGN. To accept GHS, KES, ZAR, or USD, you need to enable those currencies in your Paystack dashboard or contact Paystack support. Also check that your currency code is a valid uppercase ISO 4217 string like "NGN", not "naira" or "ngn".
When you initialize a transaction with a currency your account does not support, Paystack responds with:
HTTP/1.1 400 Bad Request
Content-Type: application/json
{
"status": false,
"message": "Currency not supported"
}
You may also see variations like "Currency not supported for this business" or "Invalid currency" if the currency code itself is malformed. The HTTP status is always 400.
This error fires on /transaction/initialize, /charge, and any other endpoint where you specify a currency. It means Paystack recognized your API key and authenticated you, but the currency you requested is not in the list of currencies your account can use.
Paystack supports different currencies depending on the country your business is registered in. As of July 2026:
| Business country | Default currency | Additional currencies (may require activation) |
|---|---|---|
| Nigeria | NGN | USD, GHS (with approval) |
| Ghana | GHS | USD (with approval) |
| South Africa | ZAR | USD (with approval) |
| Kenya | KES | USD (with approval) |
This table represents common configurations. Paystack continues to expand, so check the official documentation for the latest list. Some currencies require additional business verification or a specific account type.
If you are building for multiple African markets, you may need separate Paystack accounts for each country. A Nigerian account cannot charge in KES directly. You would need a Kenyan Paystack account for KES transactions.
Get weekly developer tips
Join 25,000+ developers. Practical guides, job tips, and new content — straight to your inbox.
No spam. Unsubscribe anytime.
1. Your account is not activated for that currency
This is the most common cause. You have a Nigerian Paystack account and you sent currency: "KES". Your account only supports NGN by default. You need either a separate Kenyan account or to contact Paystack about multi-currency support.
2. Wrong country account
You registered your Paystack account in Nigeria but your customers are in Kenya. You send currency: "NGN" but your customers' cards are Kenyan. The transaction might fail not because of the currency error but because of geographic restrictions. Make sure your account country matches your target market.
3. Currency code format is wrong
// WRONG: lowercase
{ currency: "ngn" }
// WRONG: full name
{ currency: "naira" }
// WRONG: symbol
{ currency: "N" }
// WRONG: with extra whitespace
{ currency: " NGN " }
// RIGHT: uppercase ISO 4217
{ currency: "NGN" }
Paystack expects the ISO 4217 three-letter currency code in uppercase. Anything else triggers an error.
4. Currency enabled in test mode but not live mode
You tested your integration in test mode where USD was enabled. You switch to live mode and get "Currency not supported" because your live account has not been approved for USD transactions yet. Test and live currency settings are independent.
5. Omitting currency and expecting Paystack to guess
If you omit the currency field, Paystack uses your account's default currency. If your account default is NGN but you intended to charge in GHS, the amounts will be wrong. Always specify the currency explicitly.
There are two ways to check which currencies your account supports:
1. Paystack dashboard
Log in to your Paystack dashboard. Go to Settings. Look for the Currencies or Payment Channels section. You will see a list of currencies that are enabled for your account. Some may have toggle switches, others may show "Contact support to enable".
2. Test with the API
The quickest way to test is to initialize a small transaction in the currency you want to verify:
// Test if KES is enabled on your account
const response = await fetch('https://api.paystack.co/transaction/initialize', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.PAYSTACK_SECRET_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: 'test@example.com',
amount: 10000,
currency: 'KES',
}),
});
const data = await response.json();
console.log(data);
// If KES is not enabled: { status: false, message: "Currency not supported" }
// If KES is enabled: { status: true, data: { authorization_url: "...", ... } }
Run this in test mode with your test secret key. If the currency is supported, you will get an authorization URL. If not, you will get the error message.
Follow this checklist:
Here is a server-side validation function that catches currency issues before calling Paystack:
const SUPPORTED_CURRENCIES = ['NGN', 'GHS', 'ZAR', 'KES', 'USD'] as const;
type SupportedCurrency = typeof SUPPORTED_CURRENCIES[number];
function validateCurrency(currency: string): SupportedCurrency {
const normalized = currency.trim().toUpperCase();
if (!SUPPORTED_CURRENCIES.includes(normalized as SupportedCurrency)) {
throw new Error(
`Currency "${currency}" is not supported. Supported currencies: ${SUPPORTED_CURRENCIES.join(', ')}`
);
}
return normalized as SupportedCurrency;
}
// Map each currency to its Paystack secret key (for multi-country setups)
const PAYSTACK_KEYS: Record = {
NGN: process.env.PAYSTACK_SECRET_KEY_NG!,
KES: process.env.PAYSTACK_SECRET_KEY_KE!,
GHS: process.env.PAYSTACK_SECRET_KEY_GH!,
ZAR: process.env.PAYSTACK_SECRET_KEY_ZA!,
};
function getPaystackKeyForCurrency(currency: SupportedCurrency): string {
const key = PAYSTACK_KEYS[currency];
if (!key) {
throw new Error(`No Paystack key configured for currency ${currency}`);
}
return key;
}
If your application serves customers in multiple countries, you need a pattern for selecting the right currency and Paystack account. Here is a clean approach:
interface PaymentConfig {
secretKey: string;
currency: string;
minimumAmount: number; // in minor units
}
const PAYMENT_CONFIGS: Record = {
NG: {
secretKey: process.env.PAYSTACK_SECRET_KEY_NG!,
currency: 'NGN',
minimumAmount: 10000,
},
KE: {
secretKey: process.env.PAYSTACK_SECRET_KEY_KE!,
currency: 'KES',
minimumAmount: 100,
},
GH: {
secretKey: process.env.PAYSTACK_SECRET_KEY_GH!,
currency: 'GHS',
minimumAmount: 100,
},
ZA: {
secretKey: process.env.PAYSTACK_SECRET_KEY_ZA!,
currency: 'ZAR',
minimumAmount: 100,
},
};
async function initializePayment(
email: string,
amountInMinorUnit: number,
countryCode: string
) {
const config = PAYMENT_CONFIGS[countryCode];
if (!config) {
throw new Error(`Payments not available in country: ${countryCode}`);
}
if (amountInMinorUnit < config.minimumAmount) {
throw new Error(
'Amount below minimum for ' + config.currency + '. ' +
'Minimum: ' + (config.minimumAmount / 100) + ' ' + config.currency
);
}
const response = await fetch('https://api.paystack.co/transaction/initialize', {
method: 'POST',
headers: {
Authorization: `Bearer ${config.secretKey}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
email,
amount: amountInMinorUnit,
currency: config.currency,
}),
});
return response.json();
}
The country code can come from the user's profile, their IP address (via a geolocation service), or a manual selection on your checkout page. Use whatever makes sense for your product.
USD is a special case. Most Paystack accounts do not have USD enabled by default. To accept USD:
When you charge in USD, Paystack handles the conversion and settles to your local account in your default currency. The settlement amount will reflect the exchange rate at the time of settlement, not at the time of charge. This means there is exchange rate risk between the charge and settlement dates.
If you are accepting USD from international customers, make sure your checkout clearly displays prices in USD and confirms the currency before the customer pays. Accidentally charging someone in NGN when they expected USD (or vice versa) is a quick way to get chargebacks.
After fixing the error:
currency: "USD". Confirm it succeeds.For related amount errors, see Paystack Amount Too Low Error and Paystack Invalid Amount Error and Kobo Confusion. For the complete error reference, see Paystack Errors and Troubleshooting: The Complete Reference.
KES 2,999
The definitive guide to building payment systems with Paystack — from your first transaction to production-grade payment infrastructure across Africa. 9 modules, 47 lessons. Free preview available.
Start Paystack Course