Назад к блогу

Создавать или купить: стоит ли разрабатывать собственный API курсов валют?

V
Vlado Grigirov
June 12, 2026
API Comparison Currency API Exchange Rates Build vs Buy Developer Tools Finexly

Решение о том, стоит ли разрабатывать собственный 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 фида выглядит так:

  1. Первоначальная сборка: загрузка, хранение, конвертация, слой API, аутентификация, тесты — обычно от одной до трёх недель сосредоточенной инженерной работы.
  2. Инфраструктура: небольшой сервер или контейнер плюс база данных. Скромно в долларах, но никогда не ноль.
  3. Постоянное обслуживание: реалистично несколько часов в месяц в стабильном состоянии, со всплесками всякий раз, когда источник ломается или растут требования.
  4. Альтернативные издержки: каждый час, потраченный на эксплуатацию стандартного фида курсов, — это час, не потраченный на продукт, за который ваши клиенты реально платят.

Примените средний инженерный тариф к этим неделям, и «бесплатный» фид тихо обойдётся в тысячи долларов уже за первый квартал — ещё до того, как вы отдадите хоть один курс в реальном времени или один исторический запрос, которого нет у вашего источника. Сравните это с управляемым бесплатным 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;
}

Этот шаблон даёт вам лучшее из обоих миров: вы не эксплуатируете пайплайн загрузки, но и не делаете сетевой вызов при каждом просмотре страницы. Более глубокие шаблоны — в нашем руководстве по лучшим практикам кэширования и обработки ошибок. По мере роста объёма тарифные планы масштабируются вместе с вами, а не вынуждают к перестройке.

Быстрый чек-лист для решения

Честно пройдитесь по этим вопросам:

  1. Нужно ли мне что-то сверх ежедневного снимка в EUR? Если да — склоняйтесь к покупке.
  2. Понадобятся ли мне исторические курсы на конкретные даты? Если да — склоняйтесь к покупке.
  3. Данные курсов — мой основной продукт или вспомогательная функция? Если вспомогательная — склоняйтесь к покупке.
  4. Есть ли у меня комплаенс-причина, по которой данные не могут покидать мою инфраструктуру? Если да — склоняйтесь к созданию (self-hosting).
  5. Лучше ли потратить время команды на продукт? Почти всегда да — склоняйтесь к покупке.

Для подавляющего большинства финтех-разработчиков, 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+ валютам и повышайте тариф, только когда ваш трафик действительно вырастет.

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 →