CBR-XML-Daily (Bank of Russia rates) API
Free JSON feed of the Bank of Russia official RUB exchange rate fixing, with the previous day's rate on every currency. No key, permissive CORS, tested example included.
Endpoint tested and returned HTTP 200 on 2026-08-21
What is the CBR-XML-Daily (Bank of Russia rates) API?
CBR-XML-Daily republishes the Bank of Russia's official daily exchange rate fixing as JSON at a stable URL, with no key and no registration. Each currency carries its nominal, today's rouble value and the previous published value.
The Bank of Russia itself publishes only XML, from an endpoint that in practice refuses TLS connections from much of the world. This mirror solves both problems: it converts the same fixing to JSON, sends permissive CORS headers, and keeps a dated archive at predictable URLs. It is a community project rather than an official channel, and you should say so wherever the number is shown to users.
Two details make this feed unusually convenient. Every currency object carries `Previous` alongside `Value`, so a day-on-day change needs no second request and no local state. And `PreviousURL` points at the archived file for the prior publication, which turns backfilling a history into a walk down a linked list rather than a date-arithmetic exercise over weekends and Russian holidays.
Quick facts
- Base URL
https://www.cbr-xml-daily.ru- Authentication
- No key or registration. This is an unofficial mirror of the Bank of Russia fixing, not a Bank of Russia service — attribute it as such.
- Rate limit
- No published limit. The file changes once per working day; cache it and honour the returned `Timestamp`.
- Pricing
- Free.
- CORS
- Enabled — callable directly from browser JavaScript
- Official docs
- Read the docs
How to use the CBR-XML-Daily (Bank of Russia rates) API
Every request below was executed against the live API on 2026-08-21, and the response shown is the real body it returned — not an illustration.
1. Today's official RUB fixing for every quoted currency
GET https://www.cbr-xml-daily.ru/daily_json.js
curl 'https://www.cbr-xml-daily.ru/daily_json.js'const res = await fetch("https://www.cbr-xml-daily.ru/daily_json.js");
if (!res.ok) throw new Error(`Request failed: ${res.status}`);
const data = await res.json();
console.log(data);import requests
res = requests.get("https://www.cbr-xml-daily.ru/daily_json.js", timeout=20)
res.raise_for_status()
print(res.json()){
"Date": "2026-08-21T11:30:00+03:00",
"PreviousDate": "2026-08-20T11:30:00+03:00",
"PreviousURL": "//www.cbr-xml-daily.ru/archive/2026/08/20/daily_json.js",
"Timestamp": "2026-08-20T20:00:00+03:00",
"Valute": {
"AUD": {
"ID": "R01010",
"NumCode": "036",
"CharCode": "AUD",
"Nominal": 1,
"Name": "Австралийский доллар",
"Value": 59.3154,
"Previous": 60.1864
},
"AZN": {
"ID": "R01020A",
"NumCode": "944",
"CharCode": "AZN",
"Nominal": 1,
"Name": "Азербайджанский манат",
"Value": 49.0324,
"Previous": 50.0761
},
"DZD": {
"ID": "R01030",
"NumCode": "012",
"CharCode": "DZD",
"Nominal": 100,
"Name": "Алжирских динаров",
"Value": 62.7817,
"Previous": 64.0566
},
"GBP": {
"ID": "R01035",
"NumCode": "826",
"CharCode": "GBP",
"Nominal": 1,
"Name": "Фунт стерлингов",
"Value": 113.4295,
"Previous": 115.2906
},
"AMD": {
"ID": "R01060",
"NumCode": "051",
"CharCode": "AMD",
"Nominal": 100,
"Name": "Армянских драмов",
"Value": 22.8207,
"Previous": 23.3257
},
"BHD": {
"ID": "R01080",
"NumCode": "048",
"CharCode": "BHD",
"Nominal": 1,
"Name": "Бахрейнский динар",
"Value": 221.6409,
"Previous": 226.3588
},
"BYN": {
"ID": "R01090B",
"NumCode": "933",
"CharCode": "BYN",
"Nominal": 1,
"Name": "Белорусский рубль",
"Value": 27.9443,
"Previous": 28.1103Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
(none) | path | Optional | `/daily_json.js` takes no parameters. Dated archives live at `/archive/YYYY/MM/DD/daily_json.js`. |
archive path | path | Optional | Follow `PreviousURL` from any response to reach the previous publication without doing date arithmetic. /archive/2026/08/20/daily_json.js |
Response fields
Datestring- The date the rates take effect, with a +03:00 Moscow offset.
PreviousDate / PreviousURLstring- Timestamp and archive URL of the preceding publication.
Timestampstring- When the Bank of Russia generated this fixing.
Valuteobject- Map keyed by ISO code rather than an array, so `Valute.USD` addresses a currency directly.
Valute.*.Nominalinteger- Units the rate applies to — 1, 10, 100 or 1000. The Algerian dinar is quoted per 100.
Valute.*.Valuenumber- Roubles per `Nominal` units. Divide by `Nominal` for a per-unit rate.
Valute.*.Previousnumber- The same rate at the previous publication, for computing daily change without a second call.
What you can build with the CBR-XML-Daily (Bank of Russia rates) API
- Show the official RUB rate with its day-on-day movement in one request
- Backfill a rouble series by following `PreviousURL` backwards
- Convert rouble-denominated amounts in accounting exports
- Compare the official fixing against market quotes from an exchange API
Common errors and how to fix them
404 on an archive path
No fixing was published that day.
Fix: Weekends and Russian public holidays have no publication. Walk `PreviousURL` instead of constructing dates yourself.
Content-Type is application/javascript
The file is served with a JS content type for historical reasons.
Fix: The body is plain JSON. Parse it as JSON and ignore the header, or strip the check in strict HTTP clients.
Rate looks 100x too large
`Nominal` was ignored.
Fix: Divide `Value` by `Nominal`. Several currencies are quoted per 10, 100 or 1000 units.
CBR-XML-Daily (Bank of Russia rates) API — frequently asked questions
Is this the official Bank of Russia API?
No. It is a community mirror that republishes the Bank of Russia's official daily fixing as JSON, because the bank itself serves only XML from an endpoint that is frequently unreachable outside Russia. Credit the Bank of Russia as the source and the mirror as the transport.
How often does the Bank of Russia rate change?
Once per working day. The `Timestamp` field records when the fixing was generated and `Date` is the day it takes effect, typically the next business day.
Why are currency names in Russian?
The feed passes through the Bank of Russia's own Cyrillic labels. Use the `CharCode` key or the ISO code in `Valute` for anything programmatic and treat `Name` as display text only.
Can I call this from browser JavaScript?
Yes. The mirror returns a permissive Access-Control-Allow-Origin header, so a direct fetch from front-end code works without a proxy.
Tools that pair with this API
Percentage Change Calculator
Work out the percentage increase or decrease between an old and a new value. See the absolute change and whether it went up or down, instantly and privately.
JSON Formatter
Format, beautify and minify JSON online with 2-space, 4-space or tab indentation. Sort keys alphabetically and catch syntax errors instantly — free and private.
Unit Converter
Convert between units of length, weight, temperature, area, volume, speed, time and data storage instantly, with a swap button and common conversion tables.
CBR-XML-Daily (Bank of Russia rates) is an independent third-party service and is not affiliated with ByteTools or ByteVancer. Details on this page were verified on 2026-08-21; always check the official documentation before relying on this API in production, as terms and limits can change.