Перейти к основному содержимому

API и машиночитаемые сервисы Банка России

Зачем и для кого

Инструкция для аналитиков и разработчиков, которым нужны официальные курсы валют и ряды статистики Банка России без ручного копирования с HTML-страниц. ЦБ не ведёт исполнение бюджета по КБК: данные здесь дополняют анализ макроокружением (ставка, ликвидность, внешний сектор, курсы).

Входные данные

  • Дата для ежедневного списка курсов — параметр date_req в формате ДД/ММ/ГГГГ (например 11/05/2026 для 11 мая 2026 г.). В выходные и праздники сервис может вернуть ближайший торговый день — сверяйте атрибут Date в корне XML.
  • Коды валют — трёхбуквенный CharCode (например USD, EUR) и внутренний ID валюты в XML; для статистики — идентификаторы показателей из базы данных показателей и документации сервиса получения данных.
  • Зафиксируйте дату выгрузки и URL в ноутбуке или пайплайне — состав показателей и иногда адреса разделов меняются.

Инструменты

  • Браузер — для чтения документации на cbr.ru и ручной проверки таблиц.
  • Python 3 с пакетом requests (или httpx) и стандартной библиотекой xml.etree.ElementTree для разбора курсов.
  • Для объёмных рядов статистики — по документации сервиса: REST/SOAP-клиент или экспорт из hd_base (CSV/XLSX/XML), если API избыточен.

Шаги

  1. Определите тип данных: только курсы официального списка на дату, один показатель из статистики через API, или массовая выгрузка из базы показателей / файлов раздела Статистика.
  2. Выберите канонический URL на домене cbr.ru / www.cbr.ru (см. карточку источника); не подменяйте первоисточник сторонними зеркалами курсов, если важна ссылка на официальную публикацию.
  3. Выполните запрос с разумным timeout (например 30 с), при необходимости — с повтором при временных сбоях сети.
  4. Декодируйте ответ: для классического XML курсов задайте кодировку windows-1251 (см. объявление в начале файла).
  5. Закешируйте ответы на стороне клиента (курсы на дату меняются не чаще одного раза в день по смыслу публикации; статистика — по календарю выхода ряда).

Воспроизводимый пример

Официальный ежедневный файл курсов (XML) за указанную дату и разбор пары полей:

import requests
import xml.etree.ElementTree as ET
from datetime import date

date_req = date.today().strftime("%d/%m/%Y")
url = "https://www.cbr.ru/scripts/XML_daily.asp"
response = requests.get(url, params={"date_req": date_req}, timeout=30)
response.raise_for_status()
response.encoding = "windows-1251"

root = ET.fromstring(response.text)
print("Дата набора в XML:", root.attrib.get("Date"))
for valute in root.findall("Valute"):
code = valute.findtext("CharCode")
if code in ("USD", "EUR"):
nominal = valute.findtext("Nominal")
value = valute.findtext("Value")
print(f"{code}: {value} руб. за {nominal} ед.")

Для статистических рядов параметры запросов и форматы ответа берите из страницы сервиса получения данных и сопутствующих PDF на сайте ЦБ — перечень показателей и протокол обновляются независимо от этого howto.

Проверка результата

  • Сверьте Date в XML с ожидаемой календарной датой: при несовпадении учтите нерабочий день на рынке иностранной валюты.
  • Для выборочной проверки откройте на сайте ЦБ раздел курсов и сравните значение и номинал для той же валюты и даты.
  • Для статистики — сопоставьте последнюю точку ряда с таблицей или файлом в разделе статистики для того же показателя и даты публикации.

Ограничения и типовые ошибки

  • Кодировка: ответ XML_daily.asp в windows-1251; при «кракозябрах» проверьте response.encoding, а не только UTF-8 по умолчанию.
  • Нет торгов — другая дата в файле: не трактуйте date_req как гарантию даты курса без чтения атрибута Date.
  • Лимиты и условия использования сервисов ЦБ — в официальной документации на портале; избегайте агрессивного опроса без кеша.
  • Путь https://cbr.ru/opendata/ не является стабильной витриной (по проверкам в корпусе даёт 404); опирайтесь на разделы статистики, hd_base и data-service — см. сайт Банка России.

Связанные страницы