Решение о том, стоит ли разрабатывать собственный API курсов валют или купить управляемый, — одно из первых реальных архитектурных решений, которое приходится принимать любой команде, работающей с деньгами более чем в одной валюте. На бумаге собственная разработка кажется дешёвой: Европейский центральный банк публикует справочные курсы бесплатно, данные — это всего лишь небольшой XML-файл, и насколько сложно распарсить фид и отдать его по HTTP? На практике именно в разрыве между прототипом выходного дня и готовым к продакшену сервисом курсов скрывается большая часть затрат. Это руководство раскладывает по полочкам реальные компромиссы «создавать или купить» API курсов валют, с честными инженерными цифрами, чтобы вы выбрали путь, который действительно подходит вашей команде.
Создавать или купить: краткий обзор
Вот короткая версия, прежде чем мы углубимся в детали. Выбор редко в том, можете ли вы построить фид курсов — почти любой компетентный инженер может, — а в том, оправданы ли постоянные затраты на владение им по сравнению с парой долларов в месяц.
| Фактор | Создавать (self-hosted) | Купить (управляемый API) |
|---|---|---|
| Первоначальная разработка | Дни или недели | Минуты |
| Источник данных | Вы подключаете фиды ЕЦБ / центробанков | Включено |
| Частота обновления | Какую запланируете | Реальное время или почти реальное |
| Исторические данные | Вы строите и храните их | Доступны по запросу |
| Ответственность за доступность | Ваша | SLA провайдера |
| Охват валют | Ограничен вашими источниками | 170+ из коробки |
| Ежемесячная стоимость | Сервер + время инженеров | $0–$129 для большинства |
| Обслуживание | Постоянное, навсегда | Никакого |
Что на самом деле означает «сделать своё»
Причина, по которой «создавать или купить» сбивает людей с толку, в том, что демо действительно простое, а продакшен-система действительно нет. Разберём, на что вы на самом деле подписываетесь.
Получение исходных данных
Самый распространённый бесплатный источник — Европейский центральный банк, который публикует справочные курсы евро один раз в рабочий день, обычно около 16:00 CET. Это основа многих «бесплатных» фидов курсов, включая open-source-проекты вроде Frankfurter, который теперь объединяет данные 84 центральных банков по 201 валюте.
Две вещи бьют сразу. Во-первых, фид ЕЦБ основан на EUR и обновляется лишь раз в рабочий день — никаких обновлений по выходным, никакого внутридневного движения, никаких курсов в праздники TARGET. Если ваши пользователи совершают операции в воскресенье или ожидают курсы, меняющиеся в течение дня, ежедневного фида в EUR не хватит. Во-вторых, ЕЦБ покрывает около 30 валют. Как только вам понадобится экзотическая пара, металл или курс криптовалюты, вы снова возвращаетесь к самостоятельному поиску и сверке нескольких провайдеров.
Вот «простая» часть, которую все видят, — получить и распарсить ежедневный XML ЕЦБ:
import requests
import xml.etree.ElementTree as ET
URL = "https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml"
NS = {"x": "http://www.ecb.int/vocabulary/2002-08-01/eurofxref"}
resp = requests.get(URL, timeout=10)
root = ET.fromstring(resp.content)
rates = {"EUR": 1.0}
for cube in root.findall(".//x:Cube[@currency]", NS):
rates[cube.attrib["currency"]] = float(cube.attrib["rate"])
print(rates["USD"]) # EUR -> USD reference rateЭто примерно 15 строк. Выглядит готовым. Это не готово.
Парсинг, хранение и отдача
Реальному сервису нужно больше, чем последний снимок. Вам придётся сохранять курсы каждого дня, чтобы отвечать на исторические запросы (подумайте о счетах, возвратах, бухгалтерии и налоговой отчётности, где нужно использовать курс на конкретную дату). Это означает схему базы данных, ежедневную задачу загрузки, логику повторов на случай, когда эндпоинт ЕЦБ медленный или недоступен, и математику конвертации базовой валюты, чтобы ответить «USD к JPY», когда ваш источник даёт только «EUR ко всему».
Конвертация базы через опорную валюту — простая арифметика, но её легко тонко испортить:
def convert(rates, amount, base, quote):
# rates are all relative to EUR
if base != "EUR":
amount = amount / rates[base] # to EUR
return round(amount * rates[quote], 6)
convert(rates, 100, "USD", "JPY")Затем вам нужно выставить это через API с кэшированием, ограничением частоты, аутентификацией и CORS, если его будут вызывать браузеры. Ничто из этого по отдельности не сложно. Всё вместе — это небольшой продукт.
Скрытое бремя обслуживания
Это та часть, которую прототип никогда не показывает. Как только ваш бизнес зависит от фида, вы берёте на себя набор постоянных обязанностей: мониторить задачу загрузки и оповещать, когда она тихо падает; справляться с днями, когда формат или URL источника меняется; заполнять пробелы, когда загрузка пропущена; масштабировать сервис по мере роста трафика; и быть тем, кого поднимают в 2 часа ночи, когда платёжный поток ломается из-за устаревших курсов. Фид курсов — это не функция, которую вы выпускаете один раз. Это система, которую вы эксплуатируете бесконечно.
Истинная стоимость собственной разработки
Команды регулярно недооценивают это, потому что важнейшая статья — время инженеров — не появляется в счёте. Консервативная разбивка для готового к продакшену self-hosted фида выглядит так:
- Первоначальная сборка: загрузка, хранение, конвертация, слой API, аутентификация, тесты — обычно от одной до трёх недель сосредоточенной инженерной работы.
- Инфраструктура: небольшой сервер или контейнер плюс база данных. Скромно в долларах, но никогда не ноль.
- Постоянное обслуживание: реалистично несколько часов в месяц в стабильном состоянии, со всплесками всякий раз, когда источник ломается или растут требования.
- Альтернативные издержки: каждый час, потраченный на эксплуатацию стандартного фида курсов, — это час, не потраченный на продукт, за который ваши клиенты реально платят.
Примените средний инженерный тариф к этим неделям, и «бесплатный» фид тихо обойдётся в тысячи долларов уже за первый квартал — ещё до того, как вы отдадите хоть один курс в реальном времени или один исторический запрос, которого нет у вашего источника. Сравните это с управляемым бесплатным API валют, который начинается с нуля долларов, и платным уровнем, который для большинства команд оказывается заметно ниже $129 в месяц.
Что вы получаете, покупая API валют
Покупка сводит всю эту сборку к одному HTTP-запросу. Управляемый провайдер вроде Finexly берёт на себя источники, нормализацию, конвертацию базы, историческое хранение и доступность, так что вы пользуетесь чистым, согласованным интерфейсом. Та же задача, что выше требовала схемы и пайплайна загрузки, превращается в:
curl "https://api.finexly.com/v1/latest?base=USD&symbols=EUR,GBP,JPY&apikey=YOUR_API_KEY"{
"success": true,
"base": "USD",
"timestamp": 1760000000,
"rates": {
"EUR": 0.9241,
"GBP": 0.7886,
"JPY": 156.32
}
}Любая базовая валюта работает на каждом тарифе — без ограничения только EUR — а исторические данные — это смена одного параметра, а не база данных, которую вы поддерживаете:
curl "https://api.finexly.com/v1/historical?base=USD&symbols=EUR&date=2026-01-15&apikey=YOUR_API_KEY"То, что вы на самом деле покупаете, — это данные, которые вам не нужно искать, конвертации, которые не нужно проверять, и доступность, которой не нужно владеть. Охват 170+ валют, ответы менее 50 мс и обновления в реальном времени — по умолчанию. Полный набор эндпоинтов описан в документации API Finexly, а сравнить провайдеров бок о бок можно с помощью инструмента сравнения.
Когда имеет смысл создавать
Создавать — не всегда неправильный выбор. Самостоятельный хостинг действительно имеет смысл, когда:
- Ваши потребности крошечные и статичные. Ежедневный справочный курс на базе EUR для внутренней панели без исторических требований или реального времени — законная причина обернуть фид ЕЦБ самостоятельно.
- У вас жёсткие требования к резидентности данных или изоляции. Если курсы не могут покидать вашу инфраструктуру по требованиям комплаенса, самостоятельный хостинг open-source-фида вроде Frankfurter может быть обязательным.
- Данные курсов — ваш основной продукт. Если вы строите форекс-платформу, где движок курсов и есть отличительная черта, владение им от и до может оправдать затраты.
Для всех остальных создание стандартного фида курсов — это решение задачи, которая уже решена лучше.
Когда имеет смысл покупать
Покупка побеждает в типичном случае, и сигналы легко заметить:
- Вам нужна любая базовая валюта, не только EUR.
- Вам нужно реальное или внутридневное движение, а не один ежедневный снимок.
- Вам нужны исторические курсы на произвольные даты для выставления счетов, бухгалтерии или отчётности.
- Вам нужен широкий охват, включая экзотику, металлы или крипто.
- Вы предпочитаете выпускать функции продукта, а не эксплуатировать инфраструктуру.
- Вы хотите, чтобы за доступность и SLA отвечал кто-то другой.
Если вы отметили два или более пунктов, расчёты почти всегда в пользу покупки.
Гибридный подход: купите данные, кэшируйте сами
Самые умные продакшен-конфигурации редко бывают чисто «создать» или чисто «купить». Они покупают данные и кэшируют их локально, чтобы контролировать стоимость и задержку. Вы получаете охват и надёжность управляемого провайдера, удерживая при этом объём запросов — и счёт — низким. Вот минимальный слой кэша на Node.js:
const cache = new Map();
const TTL_MS = 60 * 60 * 1000; // refresh hourly
async function getRates(base = "USD") {
const hit = cache.get(base);
if (hit && Date.now() - hit.time < TTL_MS) return hit.rates;
const url = `https://api.finexly.com/v1/latest?base=${base}&apikey=${process.env.FINEXLY_KEY}`;
const res = await fetch(url);
const data = await res.json();
cache.set(base, { rates: data.rates, time: Date.now() });
return data.rates;
}Этот шаблон даёт вам лучшее из обоих миров: вы не эксплуатируете пайплайн загрузки, но и не делаете сетевой вызов при каждом просмотре страницы. Более глубокие шаблоны — в нашем руководстве по лучшим практикам кэширования и обработки ошибок. По мере роста объёма тарифные планы масштабируются вместе с вами, а не вынуждают к перестройке.
Быстрый чек-лист для решения
Честно пройдитесь по этим вопросам:
- Нужно ли мне что-то сверх ежедневного снимка в EUR? Если да — склоняйтесь к покупке.
- Понадобятся ли мне исторические курсы на конкретные даты? Если да — склоняйтесь к покупке.
- Данные курсов — мой основной продукт или вспомогательная функция? Если вспомогательная — склоняйтесь к покупке.
- Есть ли у меня комплаенс-причина, по которой данные не могут покидать мою инфраструктуру? Если да — склоняйтесь к созданию (self-hosting).
- Лучше ли потратить время команды на продукт? Почти всегда да — склоняйтесь к покупке.
Для подавляющего большинства финтех-разработчиков, SaaS-платформ и команд e-commerce ответ указывает в одну сторону: покупайте стандартное, стройте отличительное.
Часто задаваемые вопросы
Дешевле ли создать собственный API курсов валют? Только если ваши потребности тривиальны и никогда не растут. Источник данных может быть бесплатным через ЕЦБ, но инженерное время на создание и поддержку продакшен-фида — загрузка, хранение, конвертация, доступность, мониторинг — обычно стоит в первом квартале больше, чем годы подписки на управляемый API.
Могу ли я просто использовать бесплатный фид ЕЦБ напрямую? Можете, с двумя большими оговорками: он основан на EUR и обновляется лишь раз в рабочий день, без курсов выходных и внутридневных. Для внутренних панелей это нормально; для всего, что обращено к пользователю или транзакционно, обычно нет.
В чём разница между Frankfurter и платным API вроде Finexly? Frankfurter — отличный бесплатный open-source-фид на основе справочных курсов центробанков, без ключа API и без квот, идеален для некритичного или self-hosted использования. Платный API вроде Finexly добавляет конвертацию к любой базе, обновления в реальном времени, 170+ валют, гарантированную доступность/SLA и поддержку — то, что нужно, когда от курсов зависят деньги.
Можно ли совместить оба подхода? Да, и большинство зрелых команд так и делают. Покупайте данные у управляемого API ради охвата и надёжности, затем кэшируйте их локально с разумным TTL, чтобы держать задержку и объём запросов — и стоимость — низкими.
Как мигрировать с самописного фида на управляемый API? Замените источник данных вашей внутренней функции курсов одним вызовом API, сохраните существующий слой кэша и закройте исторические потребности через исторический эндпоинт провайдера. Обычно это несколько часов работы, а не переписывание.
Готовы пропустить разработку и вместо этого выпустить функцию? Получите бесплатный ключ API Finexly — без кредитной карты. Начните с 1000 бесплатных запросов в месяц по 170+ валютам и повышайте тариф, только когда ваш трафик действительно вырастет.
Explore More
Vlado Grigirov
Senior Currency Markets Analyst & Financial Strategist
Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...
View full profile →