Currency Exchange Rates API - ECB & Central Bank FX Rates
Pricing
from $0.15 / 1,000 results
Currency Exchange Rates API - ECB & Central Bank FX Rates
Currency exchange rates API with official central bank FX rates (ECB, NBP Poland, CNB Czech, Bank of Canada, Norges Bank): latest or historical daily rates, 150+ currencies, any base currency. One row = date, pair, rate, inverse rate, source bank. No API key. $0.15 per 1,000 rates.
Pricing
from $0.15 / 1,000 results
Rating
0.0
(0)
Developer
Giovanni Rich
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 hours ago
Last modified
Categories
Security
Limited permissionsShare
Exchange rates API and currency rates scraper that pulls official central bank exchange rates straight from five central banks (European Central Bank, National Bank of Poland, Czech National Bank, Bank of Canada and Norges Bank): latest or historical exchange rates back to 1999 and earlier, for 150+ currencies and any base currency. Accounting, invoicing and VAT often require the central bank's ECB reference rate (or NBP/CNB rate); this actor gives you the bank's own published figure, labels every row with its source and how it was calculated, and runs over plain HTTP with no API key, no browser and no login.
What you get
- Official rates from five central banks, each labeled with the bank, its home currency, and the exact figure and convention the bank published (e.g.
1 EUR = x USD,100 JPY = x CZK). - Any base currency. Rates always read "1 base = x quote", with the inverse rate. Pairs that don't involve the bank's own currency are calculated as cross rates from that bank's same-day fixing and marked
cross rate via EUR(or PLN, CZK, ...). - 150+ currencies. NBP table B adds weekly rates for exotic currencies (African, Latin American, Central Asian and more) that most free APIs skip.
- History: ECB since 1999, NBP since 2002, CNB since 1991, Bank of Canada since 2017, Norges Bank since 1980. Long ranges are split into chunks automatically (e.g. NBP's 93-day limit).
- Compare sources. Pick several banks and you get the same pair from each one on the same date, handy for audits and rate-difference checks.
- Clean latest mode. Discontinued series are dropped automatically.
Sample output
Real rows from a test run with baseCurrency: "USD" (24 Sep 2026).
| date | pair | rate | inverseRate | source | calculation |
|---|---|---|---|---|---|
| 2026-09-24 | USD/EUR | 0.8797396 | 1.1367 | ecb | official |
| 2026-09-24 | USD/PLN | 3.857 | 0.25926886 | nbp | official |
| 2026-09-24 | USD/JPY | 158.83146 | 0.0062959819 | boc | cross rate via CAD |
Use cases
- Accounting and bookkeeping: convert invoices and expenses at the official daily rate
- VAT and tax: EU and Polish/Czech rules often require the ECB, NBP or CNB rate for a specific date
- Finance apps, dashboards and spreadsheets that need a reliable daily FX feed
- E-commerce: reprice catalogs in local currencies every morning
- Research and backtesting with decades of official daily history
Pricing
$0.15 per 1,000 rates (pay per result; failed requests are never charged). Apify platform usage is included in that price (no proxy is needed). Other exchange-rate actors on the Store mostly cover one source each (live Apify Store search, 9 November 2026): paid ECB-only actors charge $0.10 to $50 per 1,000 (most $0.20-$1.50, several with a start fee), and the single-bank Egypt actors charge $15 per 1,000. Here one price covers five central banks, history and cross rates.
| You scrape | You pay |
|---|---|
| 100 rates | $0.02 |
| 1,000 rates | $0.15 |
| 10,000 rates | $1.50 |
| 100,000 rates | $15.00 |
Start fee $0.00005 per run. The Apify free plan's $5 monthly credit covers about 33,000 rates. A daily ECB feed of 30 currencies (about 900 rows a month) is about $0.14 a month; ten years of daily EUR/USD (about 2,550 rows) is about $0.38. The prefilled input (5 currencies against USD, latest ECB rates) costs under $0.001 and took about 10 seconds in a cloud run on 24 October (512 MB, start-up included).
Why this one
- Five central banks in one run: ECB, NBP (Poland), CNB (Czechia), Bank of Canada and Norges Bank, with the source bank on every row.
- Any base currency: set
baseCurrency: "USD"and every row becomes "1 USD = x". Cross rates are computed and marked as such (calculation), never mixed up with official ones. - History included: any date range the banks publish, not only today's rates.
- Five banks for less than almost every paid single-bank actor (live Apify Store search, 9 November 2026): $0.15 per 1,000 rates, against $0.20 (pushbuild, chorelet + start fee, sterlingverify, yadroo + start fee), $0.30 (pankajbhatia + start fee), $0.35 (steadydata), $0.40 (chrisp1211), $0.49-$0.50 for the multi-bank ones (bakos_bence, sysco32 for MNB / NBP / CNB, both with a start fee), $0.50 (gio21, mediapro-tools, actose, hipersoft, sashasecrier, sfoln, silverninja, alaudinburki and others), $0.60 (scrapesage), $1.00-$1.67 for most other ECB-only actors (cynix_dev $1.67 + start fee) and $15 for the Egypt ones. Cheaper per row, said plainly: two ECB-only actors (lepidata, thatmike1) charge $0.10, a Thai-banks-only actor (cliqtomedia) $0.05, a Moldova-only actor (blameless_rumor) $0.01 + a start fee, and akash9078's exchangerate-api wrapper $0.01 + a start fee + $7.50 per 1,000 on its rates-fetched event (each with 1 user in 30 days). Free actors exist too: ryanclinton (3 users), naimurhasanrwd, gentle_cloud and libor.vachal (0-1 users). No API key and no proxy cost.
- Fast default run: the prefilled input (5 currencies against USD, latest ECB rates) finished in about 10 seconds in a cloud run (24 October, start-up included).
FAQ
Is this legal? Where does the data come from? Every number comes from the central banks' own public data services (ECB Data Portal, NBP Web API, CNB fixing files, Bank of Canada Valet API, Norges Bank SDMX API), which publish these rates for public use. No commercial rate provider and no personal data. Check each bank's terms if you redistribute the data commercially. This is not legal advice.
Do I need an API key, login or proxy? No. These are open-data APIs; the actor runs without a key, login or proxy.
How fast is it and how many rows will I get?
Fetching the latest ECB rates took about 2 seconds in a cloud test (September), about 10 s for the whole run with start-up. In local tests (September) a 5-bank latest run returned 267 rates in 7.6 s, and an 8-month, 3-bank range for 2 pairs returned 950 rates in 5.8 s. One row = one pair, one day, one bank. Weekends and holidays have no rates, and a currency a bank doesn't publish is skipped. Use currencies and maxResults to cap rows. For one specific date, set startDate and endDate to the same day.
Can I schedule it as a daily FX feed or call it via API? Yes. A daily Apify Schedule gives you a free-standing daily exchange rate feed; you can also start runs from the Apify API, the JavaScript/Python clients, Make, Zapier, n8n, Google Sheets or the Apify MCP server.
Why not call the ECB or NBP API myself?
You can: the five banks' APIs are free and official, and this actor reads exactly those. What it saves you is five different formats (SDMX, XML, CSV, JSON), five quoting conventions (1 EUR = x, 100 JPY = x CZK), per-bank range limits (NBP's 93 days), cross rates to any base and holiday gaps, all turned into one row shape with the source on every row, plus schedules, exports and integrations without code.
How much does a typical job cost? A daily 30-currency ECB feed is about $0.14 a month. A monthly VAT check of 10 invoice dates against NBP is well under $0.01. Ten years of daily EUR/USD from one bank is about $0.38, and the same pair from all five banks at most about $1.90 (Bank of Canada data starts in 2017).
Will it get blocked?
No blocks in testing: these are official APIs built for machine access. Failed requests are retried with exponential backoff (5 times by default), a failure at one bank doesn't stop the others, and RUN_SUMMARY lists any failed request. These are daily reference rates, not live market quotes, so don't use them for trading.
Example inputs for common jobs
Copy one into the JSON tab of the input and adjust.
Daily ECB reference rates for a spreadsheet or app (schedule it daily; about 29 rows, about $0.005):
{ "sources": ["ecb"] }
The official rate for one invoice date (here NBP for Polish VAT; use ecb or cnb for other rules):
{ "sources": ["nbp"], "currencies": ["EUR", "USD"], "startDate": "2026-10-15", "endDate": "2026-10-15" }
Ten years of daily EUR/USD for backtesting or charts (about 2,550 rows, about $0.38):
{ "sources": ["ecb"], "currencies": ["USD"], "startDate": "2016-01-01", "endDate": "2025-12-31" }
Audit: the same pair from all five banks for a month, USD as base:
{ "sources": ["ecb", "nbp", "cnb", "boc", "norgesbank"], "baseCurrency": "USD", "currencies": ["EUR"], "startDate": "2026-09-01", "endDate": "2026-09-30" }
Exotic currencies most free APIs skip (NBP table B, weekly), quoted per US dollar:
{ "sources": ["nbp"], "baseCurrency": "USD", "currencies": ["NGN", "KES", "KZT", "VND"] }
How to use
- Pick one or more Central banks (ECB is the default).
- Optionally set a Base currency (e.g.
USD) and the Quote currencies you need (e.g.EUR, GBP, JPY). - Leave the dates empty for the latest published rates, or set a Start date / End date for history.
- Click Start and download the rates as JSON, CSV or Excel, or call the actor from the Apify API. A latest-rates run took about 10 seconds in a cloud test, start-up included.
Input example
| Field | Default | Description |
|---|---|---|
sources | ["ecb"] | ecb, nbp, cnb, boc, norgesbank |
baseCurrency | each bank's own | e.g. USD: every row becomes "1 USD = x quote" |
currencies | all | Quote currencies to keep, e.g. ["EUR","GBP","JPY"] |
startDate / endDate | latest | YYYY-MM-DD. Empty start date = latest published rates only |
maxResults | 0 (no limit) | Cap on total rows |
Example:
{"sources": ["ecb", "nbp", "cnb", "boc", "norgesbank"],"baseCurrency": "USD","currencies": ["EUR", "JPY", "GBP", "PLN", "CAD"],"startDate": "2026-09-01","endDate": "2026-09-24"}
Output example
One row per currency pair, per day, per bank. These are real rows from the run above (24 Sep 2026):
[{"date": "2026-09-24","base": "USD","quote": "EUR","rate": 0.8797396,"inverseRate": 1.1367,"pair": "USD/EUR","quoteName": "Euro","source": "ecb","sourceName": "European Central Bank (euro foreign exchange reference rates)","sourceHomeCurrency": "EUR","calculation": "official","sourcePublishedRate": 1.1367,"sourceQuoteConvention": "1 EUR = x USD","nbpTable": null,"scrapedAt": "2026-09-25T05:17:16.274Z"},{"date": "2026-09-24","base": "USD","quote": "PLN","rate": 3.857,"pair": "USD/PLN","source": "nbp","calculation": "official","sourcePublishedRate": 3.857,"sourceQuoteConvention": "1 USD = x PLN","nbpTable": "A 186/A/NBP/2026"},{"date": "2026-09-24","base": "USD","quote": "JPY","rate": 158.83146,"pair": "USD/JPY","source": "boc","calculation": "cross rate via CAD","sourcePublishedRate": null}]
On that day the five banks' USD/JPY came out at 158.48 (NBP), 158.83 (Bank of Canada), 158.85 (CNB), 158.85 (ECB) and 158.86 (Norges Bank). Each bank fixes at a different time of day, so small differences are normal.
The dataset has an Overview view: date, pair, rate, inverse, bank, official/cross, and the rate as published.
Coverage (real test runs)
| Bank | Currencies (latest run) | Fixing | History from |
|---|---|---|---|
| ECB | 29 vs EUR | Daily, ~16:00 CET | 1999 |
| NBP | 148 vs PLN (32 daily in table A + ~116 weekly in table B) | Daily / Wednesdays | 2002 |
| CNB | 30 vs CZK | Daily, after 14:30 CET | 1991 |
| Bank of Canada | 24 vs CAD | Daily, 16:30 ET | 2017 |
| Norges Bank | 36 vs NOK | Daily, ~16:00 CET | 1980 |
In local tests (September) a 5-bank latest run returned 267 rates in 7.6 s; a 5-bank, 18-business-day history run with USD as base returned 445 rates in 3.4 s; an 8-month, 3-bank range for 2 pairs returned 950 rates in 5.8 s. Zero failed requests.
API example
Python (pip install apify-client):
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("rel8ble/central-bank-exchange-rates").call(run_input={"sources": ["ecb"], "baseCurrency": "USD", "currencies": ["EUR", "GBP", "JPY"], "startDate": "2026-01-01"})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item["date"], item["pair"], item["rate"])
One HTTP call that runs the actor and returns the rows (curl):
curl -X POST "https://api.apify.com/v2/acts/rel8ble~central-bank-exchange-rates/run-sync-get-dataset-items?token=<YOUR_APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"sources": ["ecb", "boc"], "baseCurrency": "USD", "currencies": ["EUR", "CAD", "JPY"]}'
Integrations
- Make, Zapier and n8n: run it every morning and push the new rates to your accounting tool, CRM or database.
- Google Sheets: export rates straight into a sheet and use them in
VLOOKUPs, or refresh on a schedule. - Apify API: run it and fetch results over REST, or with the official JavaScript and Python clients.
- Webhooks: trigger your own pipeline when fresh rates land.
- Schedules: a daily Schedule in Apify Console gives you a free-standing daily FX feed.
- MCP for AI agents: through the Apify MCP server (https://mcp.apify.com), Claude, ChatGPT, Cursor and other agents can fetch official exchange rates with this actor.
Limits
- Business days only. Central banks don't publish on weekends or bank holidays, so those dates have no rows. For a weekend date, most accounting rules use the previous business day's rate.
- Fixing times differ. Each bank fixes at a different time of day, so the same pair differs slightly between banks. Use the bank your rules name.
- NBP table B is weekly (Wednesdays), so exotic currencies appear once a week.
- Cross rates are calculated, not published. They're exact arithmetic on the same day's official fixing, and every one is marked
cross rate via .... If you need a strictly official figure, set the base currency to the bank's own (EUR for ECB, PLN for NBP, and so on). - Daily reference rates, not live market quotes. Don't use them for trading.
How it works (for developers)
Each bank has a small adapter that builds its official API URLs (ECB SDMX CSV, NBP JSON tables A/B in 93-day windows, CNB daily/yearly text files, Bank of Canada Valet JSON, Norges Bank SDMX CSV) and parses them into "home currency per 1 unit" observations. Rates are then re-expressed for your base currency using the same bank's same-day figures. Requests run through Crawlee's HttpCrawler with retries and a session pool; results are pushed in batches and charged per row.
npm installnpm test # parser + cross-rate testsAPIFY_LOCAL_STORAGE_DIR=./storage node src/main.js # input in storage/key_value_stores/default/INPUT.json
Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble