Thai Bank Exchange Rates Scraper (THB, all banks) avatar

Thai Bank Exchange Rates Scraper (THB, all banks)

Pricing

from $0.05 / 1,000 rate rows

Go to Apify Store
Thai Bank Exchange Rates Scraper (THB, all banks)

Thai Bank Exchange Rates Scraper (THB, all banks)

Compare today's Thai baht (THB) exchange rates at 13 Thai banks and the SuperRich and Twelve Victory exchangers: cash buy/sell per banknote size, transfer (T/T) rates, best-rate flags and update time. No login.

Pricing

from $0.05 / 1,000 rate rows

Rating

0.0

(0)

Developer

Cliqto Media

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Categories

Security

Limited permissions

Share

Get today's Thai baht (THB) exchange rates from 13 Thai banks and 2 Bangkok money exchangers (SuperRich, Twelve Victory) in one table: cash buy and sell for each banknote size, transfer (T/T) and sight-bill rates, the best cash rate per currency and the bank's own update time.

Use it to compare where to buy or sell USD, EUR, CNY or other cash in Thailand, or to feed bank rates into a sheet or app. No login or API key. The smallest run (3 banks × 3 currencies) takes about 5 seconds and costs about $0.001.

Thai Bank Exchange Rates Scraper: 15 providers, cash rates per banknote size, transfer rates and best-rate flags in one table

Table of contents

What it does

The Actor reads the public exchange rate boards of Thai banks and exchangers at the moment you run it. It returns one row for each currency at each provider, and one row for each banknote size when the provider quotes cash by note size (for example USD 50-100, 5-20 and 1-2).

All rates are THB for 1 unit of the foreign currency. Some banks quote JPY, IDR, KRW and other currencies per 100 units; the Actor divides those, so you can compare rows directly. The field unit shows what the source used.

Providers:

CodeProviderTypeCash rates
bblBangkok Bankbankyes
kbankKasikornbankbankyes
ktbKrungthai Bankbankyes
scbSiam Commercial Bankbankyes
bayKrungsri (Bank of Ayudhya)bankyes
ttbttb (TMBThanachart Bank)bankyes
gsbGovernment Savings Bankbankyes
cimbCIMB Thaibankno
uobUOB Thailandbankno
lhbLH Bankbankno
tcrbThai Credit Bankbankno
icbcICBC (Thai)bankfew currencies
ibankIslamic Bank of Thailandbankyes
superrichSuperRich Thailandexchangeryes
twelvevictoryTwelve Victory Exchangeexchangeryes

kkp (Kiatnakin Phatra), exim (EXIM Thailand) and citi (Citibank) do not publish a readable current rate board. You can still request them: each gives one free row with status unsupported.

Good fit

  • Find the bank or exchanger that pays the most THB for your USD, EUR or CNY cash today.
  • Track bank buy/sell spreads for a currency during the day (ttb, CIMB Thai, LH Bank and Thai Credit Bank publish several rounds).
  • Put current Thai bank rates into a spreadsheet, a travel or remittance app, or a daily report.

👉 Try it now: open the input form

How it works

  1. The Actor reads the current rate board of each provider you chose.
  2. It takes the latest rate round, converts all rates to THB per 1 unit, adds the mid rate and cash spread, and marks the best cash buy and sell rate for each currency and note size.
  3. It saves one row per currency and note size to the Dataset, and a short run report (RUN_SUMMARY) to the key-value store.

On weekends and Thai holidays banks publish no new rates. The Actor then returns each provider's rates from its last working day, with the real date in rateDate and freshness: last_trading_day.

If one provider fails, you still get the rates from the others, and a free row tells you which provider failed and why.

👉 Try it now: open the input form

Quick start

Input form: box 1 is the Banks and exchangers field with three banks, box 2 is the Currencies list with USD, EUR and CNY

  1. Open the Input tab. Banks and exchangers already has Krungthai Bank, ttb and GSB (box 1). Add or remove banks, or clear the list to read all 15 providers.

  2. Currencies already has USD, EUR and CNY (box 2). Clear it to get every currency.

  3. Keep the other settings. By default you get one row per banknote size and only the latest rate round.

  4. Click Start at the bottom of the page.

  5. When the run ends, open the Output tab. Each row shows the currency, the provider, the note size, cash and transfer rates, the best-rate flags and whether the rate is from today or the last trading day.

    Output table: currency, provider, note size, cash buy and sell, transfer rates, best-rate flags and freshness

Expected result: about 16 rows in 5 seconds, sorted by currency, with bestBuyCash = true on the provider that pays the most THB for each currency and note size.

👉 Try it now: open the input form

Use cases

Buyer jobInput pathOutput entityKey fieldsNext integration
Where to sell my USD cash for the most THB todaycurrencies: ["USD"], all banksone row per provider and note sizeprovider, denomination, buyCash, bestBuyCashGoogle Sheets export
Compare bank transfer rates for a remittancecurrencies, includeDenominations: falseone row per provider and currencybuyTransfer, sellTransfer, midAPI / webhook to your app
Track how a bank changes rates during the daybanks: ["ttb"], allRounds: trueone row per roundround, updatedAt, buyCash, sellCashApify schedule + dataset
Show current bank rates in a travel or money appbanks, currenciesone row per provider and currencybuyCash, sellCash, cashSpreadPct, updatedAtAPI or MCP

👉 Try it now: open the input form

Input

Input fields

FieldPlain nameTypeRequiredDefault / prefillAllowed valuesEffectExampleRecommendation
banksBanksarray of stringsnoempty = all 15 working providers; form prefill ktb, ttb, gsbcodes from the provider table, any casewhich providers to read["kbank", "superrich"]leave empty to compare all
currenciesCurrenciesarray of stringsnoempty = every currency; form prefill USD, EUR, CNY3- or 4-letter codes (USD, SCOT)which currencies to keep["USD", "JPY"]name only the ones you need
includeDenominationsRates per banknote sizebooleannotruetrue / falseon: one row per note size; off: one row per currency with the largest notes' ratesfalseturn off for one simple row per currency
allRoundsAll rate rounds todaybooleannofalsetrue / falseon: also earlier rounds of todaytruefor intraday tracking only
locationsLocationsarrayno["main"]main, allproviders publish one rate for all branches, so both give the same rates["main"]keep main
proxyConfigurationProxyobjectnooffApify Proxy or your proxy URLsnot neededoffkeep it off

Duplicate codes are removed. Codes can be in any case or one comma-separated string ("KTB, gsb"). An unknown bank code or a code like US$ stops the run before any request with an Invalid input message.

Input examples

Small comparison (form prefill)

{
"banks": ["ktb", "ttb", "gsb"],
"currencies": ["USD", "EUR", "CNY"]
}

Expected behavior: reads 3 banks. Expected output: about 16 rows with buyCash, sellCash, buyTransfer, bestBuyCash. Cost note: about $0.001.

All banks, one row per currency

{
"currencies": ["USD"],
"includeDenominations": false
}

Expected behavior: reads all 15 providers. Expected output: one USD row per provider. It can take up to about a minute because some sites are slow.

👉 Try it now: open the input form

Output

The Dataset has two views: rates (currency, provider, note size, cash and transfer rates, best-rate flags, update time, status, note) and all (every field).

Output fields

FieldMeaningTypeCan be empty?Example / enumSource / notes
currencycurrency codestringnoUSD; * on provider error rowsprovider board
provider, providerName, providerTypewho quotes the ratestringnoktb, Krungthai Bank, bank / exchanger
denominationbanknote sizestringyes50-100; null when the provider has one cash rateprovider board
unitunit the source quoted innumberno1, 100rates are already divided to 1 unit
buyCash, sellCashTHB the provider pays / charges for 1 unit of banknotesnumberyes32.95null at CIMB Thai, UOB, LH Bank, Thai Credit Bank
buyTransfer, sellTransfertransfer (T/T) ratesnumberyes33.31
buySightBillsight bill / cheque buying ratenumberyes
midmiddle ratenumberyesaverage of transfer buy and sell; if the provider has no transfer pair, average of cash buy and sell
cashSpreadPctcash spread in % of midnumberyes8.47
bestBuyCash, bestSellCashbest cash rate for this currency and note size in this runbooleannotrueties are all marked
rateDate, round, updatedAtrate board date, round of the day, provider update timestring / integeryes2026-10-30, 4, 2026-10-30T17:08:00+07:00provider's own date and time; on weekends and holidays the last working day
freshnessare these today's rates?stringyestoday, last_trading_day; null on error rows and when the provider gives no date (SuperRich)last_trading_day: the provider has no rates today yet (weekend, holiday, early morning)
statusrow statusstringnook, not_quoted, source_error, unsupported
notecaveat or error reasonstringyes
sourceUrlpage the rate was read fromstringno
fetchedAtwhen the Actor read itstringno2026-10-30T14:29:48.511ZUTC

Output entities and surfaces

SituationWhereResult shapeUser action
Normal rowDatasetstatus: ok, rates filleduse the rates
Provider lists the currency without a rateDatasetstatus: not_quoted, rates null, freechoose another provider
No row matchesDataset empty, RUN_SUMMARY.status: NO_RESULTScheck currencies; a code no provider lists gives a CURRENCY_NOT_FOUND warning
One provider failedDataset + RUN_SUMMARY.status: PARTIALone free source_error row with currency: * and the reason in noterun again later; other rows are valid
All providers failedrun fails, RUN_SUMMARY.status: ERRORfree source_error rowsrun again later
Spending limit reachedRUN_SUMMARY.status: CAPPED, reason CHARGE_LIMITrows up to the limitraise the limit

RUN_SUMMARY (key-value store) also lists each provider's status, rate date, warnings, counts and timing.

Output example

{
"currency": "CNY",
"provider": "ktb",
"providerName": "Krungthai Bank",
"providerType": "bank",
"location": null,
"denomination": null,
"unit": 1,
"buyCash": 4.75,
"sellCash": 5.18,
"buyTransfer": 4.9896,
"sellTransfer": 5.1626,
"buySightBill": 4.9548,
"mid": 5.0761,
"cashSpreadPct": 8.4711,
"bestBuyCash": false,
"bestSellCash": true,
"rateDate": "2026-10-30",
"round": 4,
"updatedAt": "2026-10-30T17:08:00+07:00",
"freshness": "today",
"status": "ok",
"note": null,
"fetchedAt": "2026-10-30T14:29:48.511Z"
}

This is one row from the prefill run (sourceUrl left out). A null rate means the provider does not publish that rate type.

👉 Try it now: open the input form

Pricing

Pricing unit

This Actor uses pay per event. You pay:

  • Rate row: $0.05 per 1,000 saved ok rows ($0.00005 a row).
  • Actor start: $0.00005 once per run. Apify charges the start event per GB of run memory; this Actor uses at most 512 MB, so it is always one start event.
  • Apify platform usage (compute, traffic, storage) of your run, at your plan's usual rates. A small run uses about $0.0003, an all-providers run about $0.003.

The price is the same on every Apify plan.

Rows with status not_quoted, source_error and unsupported are free. A run with no matching rows, or a run where every provider fails, costs only the start fee and its platform usage.

Cost examples

ScenarioInput scopeRowsPrice with platform usageStop/cap behavior
No matching rowsa currency no provider quotes0about $0.0004run ends NO_RESULTS
Medium10 rows10about $0.0009
Prefill3 banks × USD, EUR, CNY16about $0.0012
Large100 rows100about $0.006
All providers, all currencies{}about 390about $0.023
Hourly app feed, 08:00–19:00 on weekdays{} every hourabout 390 per runabout $0.27 a day, about $6 a month

If you set a maximum cost per run, the Actor stops saving rows when the start and row charges reach that limit and the run ends CAPPED. Platform usage is billed on top of the limit.

👉 Try it now: open the input form

Limits

  • Current rates only. No history: run the Actor on a schedule to build your own.
  • On weekends and holidays you get the last working day's rates (freshness: last_trading_day); new rates come on the next working morning.
  • These are the providers' published board rates. The rate at a branch counter can be different.
  • kkp, exim and citi have no readable public board (unsupported rows).
  • A provider's site can be down or change its page. Then you get a source_error row for it and the run is PARTIAL.
  • Each run reads the sources for at most 240 seconds. A provider that does not answer in time gets a source_error row.
  • Some sites are slow (Kasikornbank can take 30–40 seconds), so an all-banks run can take up to about a minute.

👉 Try it now: open the input form

API, export and integrations

  • API: start the run with POST https://api.apify.com/v2/acts/cliqtomedia~thai-bank-exchange-rates-scraper/runs and the input JSON; read rows from the run's default Dataset.
  • Export: download the Dataset as JSON, CSV, Excel or HTML from the Output tab or the API.
  • Scheduling: create an Apify schedule (for example every morning at 9:00 Bangkok time) to collect rates every day.
  • Webhooks / no-code: use Apify integrations (Make, Zapier, Google Sheets) to send new rows to your tools after each run.

Use with AI agents (MCP)

  • MCP server with only this Actor: https://mcp.apify.com?tools=cliqtomedia/thai-bank-exchange-rates-scraper
  • Smallest useful input: {"banks": ["ktb", "ttb", "gsb"], "currencies": ["USD", "EUR", "CNY"]}
  • Key output fields: provider (bank code), denomination (note size), buyCash (THB paid for 1 unit of cash), sellCash (THB charged for 1 unit), bestBuyCash (best rate in this run).
  • A small run takes about 5 seconds and costs about $0.001. All 15 providers can take up to about a minute.

👉 Try it now: open the input form

Troubleshooting

A provider has a source_error row

Symptom: the run is PARTIAL and one row has currency: * and status: source_error. Likely reason: the provider did not answer or changed its rate board. The note gives the reason code. Action: run again later. The other providers' rows are valid. You do not pay for the error row.

No rows for my currency

Symptom: the run is NO_RESULTS, or a currency is missing. Likely reason: no requested provider quotes that currency, or the code has a typo. RUN_SUMMARY.warnings shows CURRENCY_NOT_FOUND for a code that no answering provider lists. Action: check the code (ISO, for example CNY, not RMB) or clear banks to ask all providers.

Cash rates are empty

Symptom: buyCash and sellCash are null. Likely reason: CIMB Thai, UOB, LH Bank and Thai Credit Bank publish no cash rates. Other banks show some currencies without a rate (not_quoted). Action: use the transfer rates or choose another provider.

👉 Try it now: open the input form

FAQ

Do I need a bank account, login or API key?

No. Choose banks and currencies and start the run.

How fresh are the rates?

They are the latest rates on each provider's board at the moment of the run. updatedAt shows when the provider says it updated them; banks usually update several times a day on working days.

What do I get on weekends and holidays?

Thai banks publish no new rates then. Each row carries the provider's last working day rates with that day in rateDate and freshness: last_trading_day, and the note says so. On a working day freshness is today. Some providers publish their first rates of the day after 8:30, so an early run can also show last_trading_day.

Why is the mid rate different from the Bank of Thailand rate?

mid is the provider's own middle rate: the average of its transfer buy and sell rates, or of its cash rates when it has no transfer pair. The Bank of Thailand publishes a separate average of all banks.

Why do I pay for a row that has only one rate?

A row is ok when the provider publishes at least one real rate for that currency. Rows without any rate are not_quoted and free.

👉 Try it now: open the input form

👉 Try it now: open the input form

Support

For a bug, question or feature request, open the Issues tab of this Actor on Apify. Add the run ID, your input and the note or warning text. Never send tokens or passwords.

👉 Try it now: open the input form