Currency exchange rates from central banks
Exchange rates for a currency pair from the European Central Bank or the Bank of Russia, with the publishing bank and the publication date in every answer.
curl "https://agent-helper.org/fx/eur/usd"
1.1537
# EUR/USD
# type: reference-data
# source: European Central Bank
# as-of: 2026-09-16T14:15+02:00 (ECB concertation; published around 16:00 CET)
# note: reference rate, published for information only; using it for transactions is strongly discouraged by the ECB
# license: https://www.ecb.europa.eu/services/using-our-site/disclaimer/html/index.en.html
The trap
There is no single correct exchange rate. Currencies trade continuously, at different prices in different places, and a reference rate is one institution's snapshot of that market, taken at one moment for its own purposes.
The European Central Bank sets its euro reference rates once per working day, from a concertation between central banks in the early afternoon, and publishes them around 16:00 Central European Time. The Bank of Russia sets an official rouble rate for each currency, effective from the following day and used for accounting, customs and tax in Russia. Ask both for the euro against the dollar and the two numbers differ in the third or fourth decimal place. Neither is a mistake: they are snapshots of different moments made by different methods, and the Bank of Russia does not publish that pair at all, so it has to be derived through the rouble.
Trouble starts when a rate from a free service is treated as the rate. A reference rate is not a price anyone will trade at, and the ECB says its rates are published for information only; a bank or card network converts at its own rate, with its own margin. Accounting rules pull the other way and often name one official source, so a rate from a different bank is wrong for that purpose even when it is close.
Dates hide a second problem. Central banks publish nothing on weekends or on their own holidays, so the rate for a Saturday is either Friday's rate or no rate, depending on who is asking. The Bank of Russia publishes tomorrow's rate today, which makes today's rate ambiguous in the evening. A service that returns a number for any date without naming the publication it came from makes all of these differences invisible.
Cross rates are the third. Most pairs are computed from two published rates, and rounding happens twice before anyone sees the result.
What this endpoint does
Every answer names the bank, the publication used and the date that publication applies to. The ECB is the default source and source=cbr selects the Bank of Russia; a currency one bank does not publish is refused with a 400 that points to the other. A date without a publication, such as a weekend, is answered with the last publication before it, and a note says so. A pair the bank does not publish directly is computed through the euro or the rouble, and the answer shows the two published rates it used. With amount=, the converted amount is given at the rate shown, not rounded to currency units.
Rates are copied from each bank on a schedule and served from that copy, so a request never reaches the bank.
Parameters
| Name | Required | Meaning and values | Default | Limit |
|---|
base | yes | ISO 4217 code, e.g. EUR | — | 1024 bytes (path segment) |
quote | yes | ISO 4217 code, e.g. USD | — | 1024 bytes (path segment) |
source | no | ecb (reference rates, default) or cbr (Bank of Russia official rates) one of ecb, cbr | ecb | 1024 bytes |
date | no | YYYY-MM-DD; default: the latest rate in effect today | — | 40 characters |
amount | no | optional amount of base to convert | — | 1000 characters |
The whole path and query together are capped at 2048 bytes. Every parameter has the same meaning under /v1/fx/{base}/{quote}.
Examples
The same pair from the other central bank
curl "https://agent-helper.org/fx/eur/usd?source=cbr"
1.1539
# EUR/USD
# type: reference-data
# source: Bank of Russia
# as-of: 2026-09-17 (official rate effective from this date, Moscow time)
# note: official rate set by the Bank of Russia for accounting and customs; banks exchange at their own rates
# note: cross rate computed here via RUB from EUR/RUB 97.1275 and USD/RUB 84.1732; not published by the Bank of Russia; rounded to 6 significant digits
# license: https://www.cbr.ru/about/ (no explicit data licence found)
A Saturday, when the ECB publishes nothing
curl "https://agent-helper.org/fx/eur/usd?date=2026-08-22"
1.1699
# EUR/USD
# type: reference-data
# source: European Central Bank
# as-of: 2026-08-21T14:15+02:00 (ECB concertation; published around 16:00 CET)
# note: reference rate, published for information only; using it for transactions is strongly discouraged by the ECB
# note: no ECB reference rates for 2026-08-22 (weekend, TARGET holiday, or not yet published at 16:00 CET); these are from 2026-08-21, the last publication before it
# license: https://www.ecb.europa.eu/services/using-our-site/disclaimer/html/index.en.html
A currency the ECB no longer publishes (error)
curl "https://agent-helper.org/fx/usd/rub"
error: 400 bad parameter 'source'
parameter: source
problem: the ECB has not published a euro reference rate for RUB since 2022-03-01
hint: source=cbr gives the Bank of Russia official rate; the two banks publish different values
example: /fx/usd/rub?source=cbr
[the rest of this error repeats the parameter list above]
Converting an amount
curl "https://agent-helper.org/fx/eur/usd?amount=250"
1.1537
# EUR/USD
# type: reference-data
# source: European Central Bank
# as-of: 2026-09-16T14:15+02:00 (ECB concertation; published around 16:00 CET)
# amount: 250 EUR = 288.425 USD (at the rate shown, not rounded to currency units)
# note: reference rate, published for information only; using it for transactions is strongly discouraged by the ECB
# license: https://www.ecb.europa.eu/services/using-our-site/disclaimer/html/index.en.html
Limits and provenance
Rate class static (cacheable data: documentation, reference tables, rates, holidays, feeds, current time): 600 requests a minute per address, bursts of 100; wider limits apply per network and per autonomous system. Current values: /limits.
Answers are marked # type: reference-data; successful ones are served with Cache-Control: public, max-age=3600.
Data comes from a copy refreshed on a schedule, never fetched on your request:
- European Central Bank (European Central Bank), refreshed every 3 hours. Reproduce accurately and name the ECB as source. Reference rates are for information only; use for transactions is strongly discouraged. A paid product must tell buyers the same data is free at the ECB.
- Bank of Russia (Central Bank of the Russian Federation), refreshed every 3 hours. No explicit licence for the data was found. Official rates are published as public information; terms of the site to be confirmed before launch.
Freshness of each copy and full terms: /sources.
Related
- Public holidays by country: Is a date a day off in a country or region, and why? A public holiday, an observed day off and a transferred working day are three different questions.
- Convert time between timezones: Convert a local time between IANA timezones. Times that never happen, or happen twice, when clocks change are refused with a reason instead of guessed.
- Reference tables: ISO country, currency and language codes, IANA timezones, TLDs, ports, media types, HTTP registries, CODATA constants and airports, each with its source.
Every endpoint in this group
/fx/{base}/{quote}?[source=]&[date=]&[amount=]
Exchange rate for a currency pair, with the publishing central bank and date
base: ISO 4217 code, e.g. EUR; quote: ISO 4217 code, e.g. USD; source (optional): ecb (reference rates, default) or cbr (Bank of Russia official rates); date (optional): YYYY-MM-DD; default: the latest rate in effect today; amount (optional): optional amount of base to convert
curl "https://agent-helper.org/fx/eur/usd"
/fx/rates?[source=]&[date=]&[base=]
All rates from one central bank for a date
source (optional): ecb (reference rates, default) or cbr (Bank of Russia official rates); date (optional): YYYY-MM-DD; default: the latest rate in effect today; base (optional): express rates per 1 unit of this currency (default EUR for ecb, RUB for cbr)
curl "https://agent-helper.org/fx/rates"
/fx/currencies?[source=]
Currencies each central bank publishes
source (optional): ecb (reference rates, default) or cbr (Bank of Russia official rates)
curl "https://agent-helper.org/fx/currencies"