Назад к блогу

Альтернативы API Frankfurter в 2026 году: честное сравнение для разработчиков

V
Vlado Grigirov
August 28, 2026
Currency API Exchange Rates Frankfurter API Comparison Free API Developer Guide

Если вы ищете альтернативы API Frankfurter, вы почти наверняка уже что-то выпустили с ним в продакшн. Frankfurter — это бесплатный API курсов валют по умолчанию для целого поколения пет-проектов: без API-ключа, без регистрации, без квоты, с чистым REST-интерфейсом и открытым кодом, который читается за один вечер. А потом что-то меняется — вопрос по комплаенсу, баг на выходных, клиент, которому нужны внутридневные курсы, — и вы начинаете думать, что ещё есть на рынке.

Это руководство честно смотрит на такое решение. В нём разобрано, что Frankfurter реально умеет в 2026 году (большинство сравнительных статей опираются на устаревшие данные), пять конкретных ограничений, из-за которых команды уходят, и три реалистичных пути: развернуть у себя, перейти на коммерческий API с ключом или собрать гибрид. В конце — пример миграции.

Что такое Frankfurter на самом деле в 2026 году

Почти все подборки «лучших бесплатных валютных API» до сих пор описывают Frankfurter как «курсы ЕЦБ, около 30 валют, нет данных за выходные». Годами это было правдой. Больше это не так.

API v2 на frankfurter.dev отслеживает дневные курсы от 84 центральных банков, охватывает 201 валюту, а история уходит вглубь до 1948 года. Он действительно бесплатен для коммерческого использования, не требует аутентификации, не публикует ни месячных, ни дневных квот и отдаёт вывод в CSV и NDJSON помимо JSON. Есть спецификация OpenAPI, файл llms.txt и MCP-сервер для агентных сценариев. Можно развернуть у себя через Docker.

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

Остальная часть статьи — о случаях, когда не справляется.

Пять ограничений, из-за которых команды ищут альтернативы API Frankfurter

1. Дневные справочные курсы — это не живые курсы

Это структурное ограничение, и это не баг: такова природа источника данных. Справочные курсы центральных банков публикуются один раз за рабочий день. ЕЦБ, например, публикует свои справочные курсы евро каждый рабочий день около 16:00 по центральноевропейскому времени. Frankfurter добросовестно отдаёт именно эти цифры.

Значит, курс, полученный в 09:00, и курс, полученный в 15:00, — это одно и то же число, даже если рынок за это время сдвинулся на 1,2%. Для конвертера, который просто показывает цифру, этого никто не заметит. Для страницы оплаты, расчёта выплаты или любого места, где клиент сверяет ваше число с Google, эта задержка превращается в тикет в поддержку.

Если продукту нужны курсы, которые меняются в течение дня, вам нужен источник рыночных данных, а не источник справочных курсов. API Finexly обновляется каждую минуту в рыночные часы по 170+ валютам — это другая модель данных, а не улучшенная версия той же самой. Различие подробнее разобрано в материале о том, откуда API курсов берут свои данные.

2. Нет строк за выходные и праздники

Центральные банки не публикуют курсы в субботу, воскресенье и национальные праздники. Поэтому запрос на 2026-08-23 не вернёт ничего полезного, а месячный временной ряд будет содержать около 21 строки, а не 31.

Каждая команда спотыкается одинаково: ночная задача отрабатывает в воскресенье, получает пустой или смещённый результат и либо падает, либо — что гораздо хуже — молча записывает null в учётную книгу. Если вы строите систему на дневных курсах любого центробанковского источника, вам нужна явная политика протягивания последнего значения, и её нужно зафиксировать письменно, потому что «взять последний опубликованный курс» и «пропустить строку» дают разную отчётность.

3. Смешанные курсы могут измениться после публикации

По умолчанию Frankfurter смешивает курсы всех участвующих источников. Его собственный FAQ освежающе прямо говорит о последствии: последние знаки после запятой могут сдвигаться по мере поступления новых данных, и для комплаенса следует фильтровать по конкретному поставщику.

Для общего применения это совершенно разумный дизайн. Проблемой он становится, если вы сохраняете курс, показываете его пользователю, а позже сверяете с повторным запросом: вы найдёте мелкие расхождения, которые крайне трудно объяснить аудитору. Решение на стороне Frankfurter — передавать providers=ECB (или тот орган, который вас регулирует), а не принимать смесь. Решение в вашей системе — сохранять тот курс, который вы фактически использовали в момент транзакции, и никогда не выводить его заново. Это правило применимо к любому поставщику, и мы разбираем его в руководстве по курсам и налоговой отчётности.

4. Нет API-ключа — значит, нет квоты и нет видимости

«API-ключ не нужен» — лучшая черта Frankfurter и его самый недооценённый риск. Поскольку ключа нет:

  • У вас нет квоты на приложение. Вы делите публичный ограничитель со всем интернетом, включая того, кто прямо сейчас долбит его из плохо написанного цикла.
  • У вас нет телеметрии использования. Никакая панель не сообщит, что во вторник ваш объём вызовов утроился.
  • У вас нет отношений поддержки. Есть страница статуса и трекер задач на GitHub — это больше, чем предлагают многие бесплатные сервисы, — но нет SLA и некому позвонить.

Собственная рекомендация проекта звучит однозначно: при большом объёме кэшируйте ответы, разворачивайте у себя или обращайтесь к наборам данных напрямую. Это честный совет — и одновременно момент, когда многие команды начинают оценивать альтернативы API Frankfurter. Не потому что данные неверны, а потому что они взяли продакшн-зависимость без какого-либо договора за ней.

5. Нет эндпоинта конвертации

Frankfurter документирует это намеренно: получите курс и умножьте. Это три строки кода.

Это также три строки кода, которые окажутся написаны чуть по-разному в шести местах вашей кодовой базы, и в одном из них будет деление там, где нужно умножение. Отдельный эндпоинт convert — не техническая необходимость; это способ иметь ровно одну реализацию правил округления и направления. Если вы когда-нибудь выпускали баг, где EUR→USD и USD→EUR расходились на 0,3%, вы понимаете, почему это важно. Остальную часть этого минного поля покрывает наше руководство по округлению и знакам после запятой.

Альтернативы API Frankfurter: сравнение

Данные о бесплатных тарифах ниже — те, что публиковали сами поставщики на момент написания. Проверьте их перед тем, как выбирать: бесплатные тарифы меняются чаще, чем документация.

APIБесплатный тарифЧастота обновленияАутентификацияБазовая валютаКому подходит
FrankfurterБез лимита (антизлоупотребительное ограничение, без SLA)Ежедневно, рабочие дниНетЛюбаяПет-проекты, бухгалтерия, исторические исследования
Frankfurter у себяБесплатно + стоимость вашей инфраструктурыЕжедневно, рабочие дниВашаЛюбаяКомандам, которым нужен контроль и у которых уже есть Docker
Finexly1 000 запросов/месКаждую минуту в рыночные часыBearer-ключЛюбая (своя база на старших тарифах)Продуктам, которым нужны внутридневные курсы и канал поддержки
ExchangeRate-API~1 500 запросов/месЕжедневноКлючЛюбаяДашбордам с обновлением раз в сутки
Open Exchange Rates1 000 запросов/месЕжечасноКлючТолько USD на бесплатномСерверным приложениям, которым хватает базы USD
Fixer.io100 запросов/месЕжечасноКлючТолько EUR на бесплатномУнаследованным интеграциям
Выделяются две вещи. Во-первых, по квоте Frankfurter не обойти никому, потому что квоты у него попросту нет. Если ваше ограничение — сырой объём вызовов к дневным курсам, ответ в том, чтобы развернуть Frankfurter у себя, а не покупать меньшую квоту где-то ещё. Во-вторых, платные варианты продают не те же данные в более красивой обёртке — они продают другую частоту обновления и отношения поддержки. Если ни то, ни другое не является вашей проблемой, переход будет шагом назад.

Несколько из них разобраны бок о бок в сравнении валютных API и в нашем сравнении API курсов в реальном времени.

Вариант 1: развернуть Frankfurter у себя

Самый недооценённый ответ. Frankfurter публикует Docker-образ, и собственный запуск убирает две вещи, которые действительно беспокоят продакшн-команды: общий ограничитель запросов и отсутствие контроля.

docker run -d -p 8080:8080 --name frankfurter \
  lineofflight/frankfurter

Что вы получаете: неограниченные внутренние вызовы, собственную судьбу по доступности и возможность зафиксировать источник. Что вы берёте на себя: контейнер, базу данных, мониторинг и человека, который заметит, что сбор данных сверху сломался в банковский праздник. Это реальная цена — по сути тот же довод, что и в нашем анализе «сделать или купить», применённый к коду, который кто-то уже написал.

Свой хостинг оправдан, когда объём высок, требования к задержкам жёсткие, а дневных справочных курсов действительно достаточно. Он совершенно не помогает, если проблема в потребности во внутридневных курсах: вы просто будете крутить собственную копию тех же дневных данных.

Вариант 2: перейти на API с ключом и внутридневными курсами

Если вы здесь из-за свежести курсов, покрытия экзотических пар или необходимости, чтобы кто-то отвечал на письма, честный ответ — коммерческий API с ключом.

Вот одна и та же задача на обеих сторонах. Сначала Frankfurter:

curl "https://api.frankfurter.dev/v2/rate/USD/EUR"

И эквивалент Finexly:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.finexly.com/v1/rate?from=USD&to=EUR"
{ "pair": "USD_EUR", "rate": 0.9215 }

Сопоставление эндпоинтов

ЗадачаFrankfurter v2Finexly v1
Список валютGET /v2/currenciesGET /v1/currencies
Одна параGET /v2/rate/EUR/USDGET /v1/rate?from=EUR&to=USD
Несколько парGET /v2/rates?base=USD&quotes=EUR,GBPGET /v1/convert?q=USD_EUR,USD_GBP
Конвертация суммы(нет — умножайте сами)GET /v1/convert-amount?from=USD&to=EUR&amount=100
ИсторияGET /v2/rates?date=1999-01-04Платные тарифы — см. руководство по историческим курсам
Главное различие в форме — вызов на несколько пар. Frankfurter использует одну базу и список котируемых валют; Finexly принимает список явных пар BASE_QUOTE, что позволяет получить USD_EUR и GBP_JPY в одном запросе без кросс-деления.

Обёртка для миграции

Не рассыпайте новый клиент по всей кодовой базе. Поместите оба за одним интерфейсом, чтобы возврат назад был изменением конфигурации:

import os
import requests

FINEXLY_KEY = os.environ["FINEXLY_API_KEY"]

def get_rate(base: str, quote: str, provider: str = "finexly") -> float:
    """Return the mid-market rate for base->quote."""
    if provider == "frankfurter":
        r = requests.get(
            f"https://api.frankfurter.dev/v2/rate/{base}/{quote}",
            timeout=5,
        )
        r.raise_for_status()
        return float(r.json()["rate"])

    r = requests.get(
        "https://api.finexly.com/v1/rate",
        params={"from": base, "to": quote},
        headers={"Authorization": f"Bearer {FINEXLY_KEY}"},
        timeout=5,
    )
    r.raise_for_status()
    return float(r.json()["rate"])

print(get_rate("USD", "EUR"))

Две детали стоит перенять. API-ключ берётся из окружения, никогда из исходников — документация Finexly отмечает, что ключи, переданные параметром запроса, могут утечь через журналы доступа сервера и заголовки HTTP Referrer, поэтому в продакшне используется заголовок Authorization. И у каждого вызова есть таймаут, потому что значение по умолчанию у большинства HTTP-клиентов — «ждать вечно».

Следите за заголовками ответа X-RateLimit-Limit, X-RateLimit-Used и X-RateLimit-Units, чтобы видеть расход квоты в реальном времени. Именно эту телеметрию нельзя получить от API без аутентификации, и часто она и есть настоящая причина перехода.

Вариант 3: гибрид — кэшировать один, откатываться на другой

Схема, к которой сходится большинство боевых систем. Используйте основного поставщика, кэшируйте агрессивно и держите бесплатный API без аутентификации как последний рубеж:

const CACHE = new Map();
const TTL_MS = 60_000;

async function getRate(base, quote) {
  const key = `${base}_${quote}`;
  const hit = CACHE.get(key);
  if (hit && Date.now() - hit.at < TTL_MS) return hit.rate;

  let rate;
  try {
    const res = await fetch(
      `https://api.finexly.com/v1/rate?from=${base}&to=${quote}`,
      { headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` } }
    );
    if (!res.ok) throw new Error(`HTTP ${res.status}`);
    rate = (await res.json()).rate;
  } catch (err) {
    // Degrade to daily reference rates rather than failing the request
    const res = await fetch(`https://api.frankfurter.dev/v2/rate/${base}/${quote}`);
    rate = (await res.json()).rate;
  }

  CACHE.set(key, { rate, at: Date.now() });
  return rate;
}

Кэш на 60 секунд при бесплатном тарифе в 1 000 запросов с запасом покрывает небольшое приложение, потому что объём вызовов становится функцией времени, а не трафика. Помечайте резервные ответы в логах, чтобы тихая деградация до вчерашнего курса не осталась незамеченной неделю. Подробнее о выборе TTL и поведении повторных попыток — в нашем руководстве по кэшированию и обработке ошибок.

Чек-лист решения

Идите по списку и останавливайтесь на первом «да»:

  1. Должны ли курсы меняться в течение торгового дня? → Нужен API рыночных данных, а не справочных курсов.
  2. Это регулируемый или аудируемый процесс? → Зафиксируйте конкретного поставщика, храните использованный курс, никогда не выводите его заново.
  3. Объём вызовов большой, но дневных курсов хватает? → Разверните Frankfurter у себя.
  4. Нужен кто-то, кто ответит, когда всё сломается? → Нужен тариф с ключом и уровнем поддержки.
  5. Ничего из перечисленного? → Оставайтесь на Frankfurter. Закэшируйте, обработайте пробел на выходных и потратьте время на другое.

Большинство команд, отправившихся искать альтернативы API Frankfurter, на шаге 5 обнаруживают, что настоящей проблемой были отсутствующий кэш и необработанное воскресенье.

Часто задаваемые вопросы

API Frankfurter действительно бесплатен для коммерческого использования? Да. Проект заявляет, что он бесплатен для коммерческого использования, без месячных и дневных квот — запросы ограничиваются только для предотвращения злоупотреблений. Плата за это — отсутствие SLA и договора поддержки, так что риск на вас.

Frankfurter отдаёт только курсы ЕЦБ? Уже нет. API v2 смешивает данные 84 центральных банков по 201 валюте, и вы можете сузить выборку до одного источника параметром providers. Распространённое описание «только ЕЦБ, 30 валют» относится к старым версиям.

Почему Frankfurter не возвращает данные по выходным? Потому что центральные банки не публикуют справочные курсы в нерабочие дни. У любого API на данных центробанков тот же пробел. Либо вы протягиваете последний опубликованный курс, либо переходите на источник рыночных данных с непрерывной котировкой.

Какая лучшая бесплатная альтернатива Frankfurter? Зависит от того, что должно дать вам «бесплатно». Для неограниченных дневных курсов Frankfurter не обойти — разверните его у себя. Для бесплатного тарифа с внутридневными обновлениями и настоящим API-ключом бесплатный план Finexly даёт 1 000 запросов в месяц по 170+ валютам. Более широкую картину смотрите в нашем руководстве по бесплатным валютным API.

Можно ли использовать Frankfurter и платный API вместе? Да, и это разумная архитектура. Направляйте обычный трафик к основному поставщику, а при ошибке откатывайтесь на Frankfurter, как в гибридном примере выше. Только обязательно логируйте резервные ответы, так как у них другие гарантии свежести.

Начать работу

Если дневных справочных курсов достаточно для того, что вы строите, оставайтесь на Frankfurter — это хороший проект, и он не будет вам ничего стоить. Если нужны курсы, меняющиеся в течение дня, покрытие шире справочных наборов центробанков или заголовки использования, которые действительно можно мониторить, получите бесплатный API-ключ Finexly — без банковской карты. Начните с 1 000 запросов в месяц по 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 →