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.

By Madhushan, Founder & Lead Developer ·

Malaysia flag In one line: the official Bank Negara Malaysia table for 27 currencies, TT boards from five Malaysian banks and the live MYR market rate, from one REST API in JSON, CSV or Excel. Start with a free key. No card.

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

NeedRate the rule points toDateEndpoint
Sales tax or service tax invoice in a foreign currencyA selling rate from BNM, a bank in Malaysia, a news agency or a foreign central bank, used consistentlyWhen 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 goodsRate issued by the Director General of CustomsIn force when duty is payableNot served by this API
Income tax, foreign-currency transactionsAccountant General's rate based on BNM, or the entity's bank rateTransaction date/api/v1/central-bank/bnm/{date}
Tax return, non-RM functional currencyMFRS 121 translation rate, or the Accountant General's average rate based on BNMDate of the statement of financial position/api/v1/central-bank/bnm/history
MyInvois e-Invoice exchange rate fieldWhatever the tax rule requires, otherwise internal policyOnly when an RM equivalent is required/api/v1/central-bank/bnm/{date}
Year-end closingClosing rate from one documented sourcePeriod end/api/v1/central-bank/bnm/{date}
Pricing, checkout, dashboards, FX exposureLive mid-market rateEvery 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

This summary describes the rules as written; confirm the treatment for your facts with your tax agent.

Endpoints used on this page

EndpointReturnsPlan
/api/v1/central-bank/bnm/latestToday's official BNM tableFree
/api/v1/bank-rates/myAll five Malaysian boards next to the BNM rateFree
/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=MYRLive mid-market rate, optional amountFree
/api/v1/central-bank/bnm/{date}The BNM table for a past datePaid
/api/v1/central-bank/bnm/historyBNM rates for any date rangePaid

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