Exchange Rate API for Malaysia: BNM Official Rates, Bank TT Boards, SST and e-Invoice Rules
One exchange rate API for Malaysia: the official Bank Negara Malaysia table for 27 currencies with history from 2020, TT buying and selling boards from Maybank, Public Bank, CIMB, RHB and HSBC Malaysia, the rates SST, IRBM and e-Invoice rules point to, and live MYR market rates. JSON, CSV, XLSX. Free key.
Malaysian rules rarely fix one rate. For SST invoices the Royal Malaysian Customs Department accepts the selling rate from Bank Negara Malaysia (BNM), a bank in Malaysia, a news agency or a foreign central bank, as long as it is used consistently. IRBM accepts a BNM-based rate or your own bank's rate for income tax, and the e-Invoice guideline defers to those rules. Import valuation is the exception: it uses the rate issued by the Director General of Customs. This API returns the BNM table for any date, the banks' TT boards beside it, and the live market rate.
Which MYR rate applies to what
| Need | Rate the rule points to | Date | Endpoint |
|---|---|---|---|
| Sales tax or service tax invoice in a foreign currency | A selling rate from BNM, a bank in Malaysia, a news agency or a foreign central bank, used consistently | When the service is provided or the goods are sold | /api/v1/bank-rates/my/{bank} or /api/v1/central-bank/bnm/{date} |
| Customs value of imported goods | Rate issued by the Director General of Customs | In force when duty is payable | Not served by this API |
| Income tax, foreign-currency transactions | Accountant General's rate based on BNM, or the entity's bank rate | Transaction date | /api/v1/central-bank/bnm/{date} |
| Tax return, non-RM functional currency | MFRS 121 translation rate, or the Accountant General's average rate based on BNM | Date of the statement of financial position | /api/v1/central-bank/bnm/history |
| MyInvois e-Invoice exchange rate field | Whatever the tax rule requires, otherwise internal policy | Only when an RM equivalent is required | /api/v1/central-bank/bnm/{date} |
| Year-end closing | Closing rate from one documented source | Period end | /api/v1/central-bank/bnm/{date} |
| Pricing, checkout, dashboards, FX exposure | Live mid-market rate | Every 60 seconds | /api/v1/rates |
The BNM table is read from the publisher's own page and never revised afterwards, so a figure fetched for a past date is the figure an auditor will find.
BNM official daily table
Bank Negara Malaysia sets ringgit rates from the Kuala Lumpur interbank market on each business day. The API stores the official middle rate for 27 currencies, usually available by 06:15 UTC (14:15 in Kuala Lumpur). Every rate is returned per one unit of foreign currency.
# Official Bank Negara Malaysia table for today
curl "https://allratestoday.com/api/v1/central-bank/bnm/latest" \
-H "Authorization: Bearer art_live_your_key" {
"bank": "bnm",
"rate_date": "2026-11-13",
"cadence": "daily",
"available_by_utc": "06:15",
"publisher_timezone": "Asia/Kuala_Lumpur",
"rates": [
{ "base": "USD", "quote": "MYR", "type": "middle", "value": 4.085 },
{ "base": "EUR", "quote": "MYR", "type": "middle", "value": 4.519 },
{ "base": "SGD", "quote": "MYR", "type": "middle", "value": 3.1757 },
{ "base": "CNY", "quote": "MYR", "type": "middle", "value": 0.6124 },
{ "base": "JPY", "quote": "MYR", "type": "middle", "value": 0.025549 }
]
} In Google Sheets, one formula puts today's US dollar row in a sheet:
=QUERY(IMPORTDATA("https://allratestoday.com/api/open/central-bank/bnm?format=csv"),
"select * where Col2 = 'USD'", 1) Dated tables and history from 2020
The SST, income tax and closing rules above all need a rate for a past date or an average over
a period. A dated request returns the table for that day, with rate_date showing the
earlier table when the day was a weekend or a public holiday. A history request returns the
daily series for a range, from which a monthly or yearly average is a few lines of code.
# the BNM table for an invoice date or a closing date
curl "https://allratestoday.com/api/v1/central-bank/bnm/2025-12-31" \
-H "Authorization: Bearer art_live_your_key"
# a year of daily USD rates as CSV, for averages and month-end figures
curl "https://allratestoday.com/api/v1/central-bank/bnm/history?symbol=USD&from=2025-01-01&to=2025-12-31&format=csv" \
-H "Authorization: Bearer art_live_your_key"
Malaysian bank boards: Maybank, Public Bank, CIMB, RHB and HSBC
BNM's rate is a middle rate; a bank buys below it and sells above it. The API reads the board of five Malaysian banks every hour and returns the TT buying rate and the TT/OD selling rate in MYR per one unit, with the mid, the spread and the BNM rate beside each row. Rows the banks quote per 100 units are converted. Board rates are retail prices, not official rates: banks revise them through the day and may quote differently for large amounts.
Because the SST ruling accepts a selling rate from any commercial bank in Malaysia, a bank's
TT/OD selling rate at the time of supply is one documented way to fill the ringgit amounts on
a foreign-currency invoice. Add ?date=YYYY-MM-DD to get the board stored for a
past day.
# Maybank TT board, one currency
curl -H "Authorization: Bearer YOUR_API_KEY" "https://allratestoday.com/api/v1/bank-rates/my/maybankmy?ccy=USD"
# all five Malaysian boards side by side with the BNM rate
curl -H "Authorization: Bearer YOUR_API_KEY" "https://allratestoday.com/api/v1/bank-rates/my"
# the board stored for a past day (Malaysian history starts 2026-11-13)
curl -H "Authorization: Bearer YOUR_API_KEY" "https://allratestoday.com/api/v1/bank-rates/my/cimb?ccy=USD&date=2026-11-13" Live MYR market rates
For pricing and conversion the mid-market rate is refreshed every 60 seconds for MYR against
160+ currencies, in either direction. A free key covers it; add amount to get the
converted figure in the same response. The central banks of Singapore, Indonesia, Thailand and
the Philippines are on the same key for regional work.
# Live mid-market USD/MYR, refreshed every 60 seconds (free key)
curl "https://allratestoday.com/api/v1/rates?source=USD&target=MYR&amount=1000" \
-H "Authorization: Bearer art_live_your_key"
The SDKs for JavaScript, Python, PHP, Go and Rust wrap the same call,
and the bnm-exchange-rate package wraps
the BNM table.
Malaysian rules that name a rate
- Service Tax Regulations 2018, regulation 10, and Sales Tax Regulations 2018, regulation 7: any amount in another currency is also shown in ringgit at the selling rate of exchange prevailing in Malaysia at the time of supply or sale.
- JKDM Ketetapan Umum Bil. 3/2026 (in force 28 July 2026): the selling rate may come from BNM, any commercial bank in Malaysia or other bank registered under BNM, international news agencies, or foreign central banks such as the European Central Bank and the Federal Reserve Bank of New York. It must be used consistently for at least one year from the end of the accounting period; any other source needs the Director General's approval in writing. It replaces Ketetapan Umum Bil. 1/2026.
- Customs (Rules of Valuation) Regulations 1999, regulation 13: customs value in ringgit, converted at the rate of exchange issued by the Director General, in force when duty is payable.
- IRBM Guidelines on Tax Treatment Related to the Implementation of MFRS 121 (revised 16 May 2019): spot rate on the transaction date, from the Accountant General's Department rate based on BNM or from the entity's bank (paragraph 2.5). A non-RM functional currency is translated into RM for the tax return at the MFRS 121 translation rate or the Accountant General's average rate based on BNM (paragraph 3.2). Revenue exchange differences count only when realised.
- IRBM e-Invoice Specific Guideline, version 4.9, section 13: the exchange rate field is filled when the e-Invoice must be converted into an RM equivalent, following any Customs or IRBM requirement first and internal policy otherwise.
- MFRS 121: a foreign-currency transaction is first recorded at the spot rate on its date, and monetary items are retranslated at the closing rate at the end of each reporting period.
This summary describes the rules as written; confirm the treatment for your facts with your tax agent.
Endpoints used on this page
| Endpoint | Returns | Plan |
|---|---|---|
/api/v1/central-bank/bnm/latest | Today's official BNM table | Free |
/api/v1/bank-rates/my | All five Malaysian boards next to the BNM rate | Free |
/api/v1/bank-rates/my/{bank} | One bank's TT board, one currency with ?ccy=, a past day with ?date= | Free |
/api/v1/rates?source=&target=MYR | Live mid-market rate, optional amount | Free |
/api/v1/central-bank/bnm/{date} | The BNM table for a past date | Paid |
/api/v1/central-bank/bnm/history | BNM rates for any date range | Paid |
Every table endpoint accepts &format=json|csv|xml|xlsx. The /api/open/ endpoints are
CORS-open and can be called from a browser or a spreadsheet; the keyed ones are for servers.
Full reference in the documentation.
Frequently asked questions
Which exchange rate goes on a foreign-currency SST invoice?
The Service Tax Regulations 2018 (regulation 10) and the Sales Tax Regulations 2018 (regulation 7) require any amount in another currency to be shown in ringgit as well, at the selling rate of exchange prevailing in Malaysia when the service is provided or the goods are sold. Ketetapan Umum Bil. 3/2026 from the Royal Malaysian Customs Department lists the accepted sources: Bank Negara Malaysia, any commercial bank in Malaysia or other bank registered under BNM, international news agencies, and foreign central banks such as the European Central Bank and the Federal Reserve Bank of New York. The chosen rate must be used consistently in reporting and accounting for at least one year from the end of the accounting period.
Which exchange rate does Malaysian Customs use for import valuation?
Regulation 13 of the Customs (Rules of Valuation) Regulations 1999 says the customs value is calculated in ringgit, any currency conversion uses the rate of exchange issued by the Director General of Customs, and the rate is the one in force when duty is payable. That rate comes from Customs, not from BNM or a bank, and this API does not serve it.
Which rate does IRBM accept for income tax on foreign-currency transactions?
The IRBM guideline on MFRS 121 (revised 16 May 2019) says a transaction is first recorded at the spot rate on the transaction date, and lets the entity use either the Accountant General’s Department rate, which is based on the rate published by Bank Negara Malaysia, or the exchange rate used by its own bank. Revenue exchange differences are taxable or deductible only when realised.
Does a MyInvois e-Invoice need an exchange rate?
Only when the e-Invoice has to be converted into an RM equivalent. The e-Invoice Specific Guideline (version 4.9) says the supplier first follows any legal or tax requirement from the relevant authority, such as the Royal Malaysian Customs Department or IRBM, and otherwise may use the rate in its internal policy. For self-billed e-Invoices on imported goods, the internal rate may be used.
How many currencies does the BNM table cover?
27 currencies against the ringgit on each business day, usually available in the API by 06:15 UTC (14:15 in Kuala Lumpur). The API returns every rate per one unit of foreign currency.
How far back does the history go?
The BNM series in the API starts in 2020. The bank boards are stored daily from 13 November 2026.
Is there a free plan?
A free API key covers live rates and conversion, with no card. Dated tables and history need a paid plan, from €4.99 a month.
Start with the Malaysia endpoints
Live MYR rates with a free key in 30 seconds.
Get a free API key See today's BNM table