Paystack Currency Not Supported Error
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".
What the Error Looks Like
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.
Which Currencies Does Paystack Support
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.
Common Causes
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.
How to Check Your Enabled Currencies
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.
The Fix
Follow this checklist:
- Confirm your currency code is correct. It must be an uppercase three-letter ISO 4217 code: "NGN", "GHS", "ZAR", "KES", or "USD". Trim whitespace and convert to uppercase in your code.
- Check your Paystack dashboard for enabled currencies. If the currency you need is not listed, enable it if there is a toggle, or contact Paystack support to request activation.
- Verify both test and live modes. Enable the currency in both modes if you need it in both.
- For multi-country support, consider separate accounts. If you need to accept KES and NGN, you may need a Kenyan account for KES and a Nigerian account for NGN. Use the appropriate secret key for each currency.
- Always specify the currency explicitly. Do not rely on the default. Make your code explicit about which currency it is charging in.
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;
}
Multi-Currency Checkout Pattern
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.
Accepting USD on Paystack
USD is a special case. Most Paystack accounts do not have USD enabled by default. To accept USD:
- Your business must be fully verified on Paystack (KYC complete)
- Contact Paystack support and request USD currency activation
- Paystack may require additional documentation depending on your business type
- Once approved, USD will appear as an available currency in your dashboard
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.
Verification Checklist
After fixing the error:
- Test with your default currency. Initialize a transaction with your account's primary currency (e.g., NGN for Nigerian accounts). Confirm it succeeds.
- Test with a non-default currency you have enabled. If you enabled USD, initialize a transaction with
currency: "USD". Confirm it succeeds. - Test with a currency you have NOT enabled. Send a currency your account does not support. Confirm you get the "Currency not supported" error. Verify your server-side validation catches it before the API call.
- Test with malformed currency codes. Send lowercase "ngn", send "Naira", send an empty string. Confirm your validation normalizes or rejects these.
- Test both test and live modes. Verify the currencies are enabled in both environments.
- For multi-account setups, verify key routing. Confirm that KES transactions use the Kenyan account key and NGN transactions use the Nigerian account key.
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.
Key Takeaways
- ✓Your Paystack account is registered to a specific country and defaults to that country's currency. A Nigerian business account uses NGN. A Ghanaian account uses GHS. A South African account uses ZAR. A Kenyan account uses KES. You cannot charge in a currency your account does not support.
- ✓To enable additional currencies, go to your Paystack dashboard under Settings. Some currencies can be enabled with a toggle. Others require contacting Paystack support. USD acceptance, for example, typically requires additional verification.
- ✓The currency field must be a valid ISO 4217 three-letter code in uppercase: "NGN", "GHS", "ZAR", "KES", "USD". Sending "naira", "ngn" (lowercase), "N", or an empty string will trigger an error.
- ✓If you omit the currency field entirely, Paystack defaults to your account's primary currency. This is fine for single-currency apps but dangerous for multi-currency ones where you might accidentally charge in the wrong currency.
- ✓Test mode and live mode can have different currency configurations. Verify that the currencies you enabled in test mode are also enabled in live mode before going to production.
- ✓When building multi-currency checkout, always validate the currency against your known supported list on the server side before calling Paystack. This prevents the error and lets you show a meaningful message.
Frequently Asked Questions
- Can a Nigerian Paystack account accept KES payments?
- Not directly. A Nigerian Paystack account is configured for NGN by default. To accept KES, you would need a Kenyan Paystack account. Paystack does not allow cross-country currency acceptance on a single account. If you serve customers in multiple African countries, you need separate Paystack accounts for each country.
- What happens if I omit the currency field entirely?
- Paystack uses your account's default currency. For a Nigerian account, it defaults to NGN. This works fine for single-currency applications. For multi-currency apps, always specify the currency explicitly to avoid charging in the wrong currency.
- Is the currency code case-sensitive?
- Yes. Paystack expects uppercase ISO 4217 codes: "NGN", "GHS", "ZAR", "KES", "USD". Lowercase like "ngn" will likely be rejected. Always normalize to uppercase in your code before sending to Paystack.
- How do I enable a new currency on my Paystack account?
- Log in to your Paystack dashboard. Go to Settings and look for the Currencies or Payment Channels section. Some currencies have toggle switches you can enable directly. Others, especially USD, require you to contact Paystack support. They may ask for additional business documentation.
- Can I accept both Naira and Dollars on the same checkout page?
- Yes, if your account supports both currencies. Let the customer choose their preferred currency, then pass that currency code to Paystack when initializing the transaction. Make sure the amount is converted to the correct minor unit for the selected currency (kobo for NGN, cents for USD).
Ready to build real-world apps?
Join the McTaba Labs full-stack marathon (4 months full-time · 6 months part-time). Learn M-Pesa, USSD, and WhatsApp engineering while shipping 8 production apps.
Apply to the McTaba Marathon