Если вы когда-нибудь пытались показать курс Wise внутри собственного продукта, то, вероятно, обнаружили, что API курсов валют Wise — не совсем то, чего вы ожидали. Wise действительно публикует превосходные данные о среднерыночном курсе и отдаёт их через REST-эндпоинт, но доступ закрыт процедурой одобрения партнёров, сам эндпоинт живёт внутри платёжного API, а не API рыночных данных, и возвращаемый курс намеренно не является ценой, которую заплатит ваш пользователь.
В этом руководстве разобрано, что именно открывает Wise, как проходить аутентификацию, что на самом деле возвращает каждый эндпоинт и какие пять структурных ограничений решают, подходит ли Wise как источник для вашего проекта. А также честный ответ на вопрос, который большинство и задаёт по существу: если вам просто нужны надёжные среднерыночные курсы в приложении — Wise ли это инструмент?
Чем на самом деле является API курсов валют Wise
Wise — компания денежных переводов. Её API под брендом Wise Platform построен для того, чтобы двигать деньги: создавать котировки, регистрировать получателей, финансировать переводы, сверять балансы, выпускать карты. Курсы появляются в этом API потому, что без них невозможно рассчитать стоимость перевода, а не потому, что Wise продаёт рыночные данные.
Эта рамка объясняет почти все сюрпризы, с которыми сталкиваются разработчики. Курсы — небольшой модуль внутри платёжной платформы, ограниченный теми валютными маршрутами, которые Wise реально обслуживает.
Три разные поверхности, три разных пути доступа
Главный источник путаницы в том, что «API курсов Wise» означает как минимум три разные вещи:
GET /rates— эндпоинт курсов. Возвращает среднерыночный курс Wise для валютной пары, текущий или исторический. Именно его большинство и имеет в виду.POST /quotes— эндпоинт котировок. Возвращает оценённый по цене перевод: курс, комиссию, ожидаемое время доставки и отметку истечения курса.GET /comparisons— эндпоинт сравнения. Возвращает оценки цены и скорости для Wise и конкурирующих провайдеров и банков на заданном маршруте.
Все три задокументированы в одном справочнике, используют разные схемы аутентификации и отвечают на очень разные вопросы. Обращение не к тому эндпоинту — типичная причина вопроса «почему этот курс отличается от того, что показывает wise.com?».
Как получить доступ к данным о курсах Wise
Самостоятельной выдачи API-ключа нет. Доступ делится на два трека:
Партнёры платформы. Вы проходите онбординг как партнёр Wise Platform и аутентифицируетесь по OAuth 2.0 (client ID и client secret), получая токен. В справочнике /rates отмечено, что эндпоинт «поддерживает только Bearer-аутентификацию для непартнёров-аффилиатов», через User Token или Personal Token.
Партнёры-аффилиаты. Вы вступаете в партнёрскую программу Wise, затем пишете на partnerwise@wise.com с запросом учётных данных. Wise рассматривает заявку и в случае одобрения выдаёт учётные данные Basic auth, открывающие ровно два эндпоинта: Exchange Rates List и Get Temporary Quote. Ничего больше.
Здесь и проходит развилка. Если вы делаете сайт-сравнение, виджет для тревел-блога или маркетинговую страницу финтех-проекта, аффилиатский трек создан именно для вас. Если же вы делаете продуктовую функцию — мультивалютные цены, выставление счетов, экран конвертации, внутренний отчёт — вы просите команду платёжных партнёрств одобрить вам доступ к рыночным данным, а этого не хочет от таких отношений ни одна из сторон.
Учтите также, что Wise зашивает версию API в путь URL: продакшн — https://api.wise.com/2026Q3/rates, песочница — https://api.wise-sandbox.com/2026Q3/rates. Устаревшая аффилиатская документация всё ещё ссылается на /v1/rates на api.transferwise.com. Версия в пути означает, что ваша интеграция тихо стареет, пока кто-то не возьмёт на себя обновление.
Вызов эндпоинта курсов Wise
Как только токен получен, сам эндпоинт устроен чисто и продуманно. Документированы четыре формы вызова:
# Latest rates for every supported currency
curl -X GET 'https://api.wise.com/2026Q3/rates' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
# Latest rate for a single pair
curl -X GET 'https://api.wise.com/2026Q3/rates?source=EUR&target=USD' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
# Rate at a specific historical moment
curl -X GET 'https://api.wise.com/2026Q3/rates?source=EUR&target=USD&time=2019-02-13T14:53:01' \
-H 'Authorization: Bearer <YOUR_TOKEN>'
# A time series, grouped by day, hour or minute
curl -X GET 'https://api.wise.com/2026Q3/rates?source=EUR&target=USD&from=2019-02-13&to=2019-03-13&group=day' \
-H 'Authorization: Bearer <YOUR_TOKEN>'Ответ — массив, по одному объекту на интервал:
[
{
"rate": 1.166,
"source": "EUR",
"target": "USD",
"time": "2018-08-31T10:43:31+0000"
}
]Две детали стоит отметить. Во-первых, group принимает day, hour или minute — поминутная история необычно щедра и действительно полезна для бэктестинга. Во-вторых, ответ всегда массив, даже для одной пары, поэтому разбирайте соответственно:
import requests
TOKEN = "<YOUR_TOKEN>"
BASE = "https://api.wise.com/2026Q3"
def wise_rate(source: str, target: str) -> float:
r = requests.get(
f"{BASE}/rates",
params={"source": source, "target": target},
headers={"Authorization": f"Bearer {TOKEN}"},
timeout=10,
)
r.raise_for_status()
payload = r.json()
if not payload:
raise LookupError(f"No rate returned for {source}/{target}")
return payload[0]["rate"] # array, even for one pair
print(wise_rate("EUR", "USD"))Ещё одна ловушка, хорошо задокументированная на практике: если отправить time и from/to в одном запросе, параметры диапазона побеждают, а time игнорируется. Это вызвало длительный баг в ноде Wise для n8n, исправленный патчем в апстриме. Отправляйте либо одно, либо другое, но никогда оба сразу.
Среднерыночный курс — не та цена, которую платит пользователь
Эндпоинт /rates Wise возвращает среднерыночный курс (mid-market rate) — середину между ценой покупки и продажи на межбанковском рынке. Это «настоящий» курс, и именно на нём строится маркетинг Wise. И это же, по определению, курс, по которому никто не совершает сделок.
Если нужно узнать, сколько перевод стоит на самом деле, нужен /quotes:
curl -X POST 'https://api.wise.com/2026Q3/quotes' \
-H 'Authorization: Bearer <YOUR_TOKEN>' \
-H 'Content-Type: application/json' \
-d '{
"sourceCurrency": "GBP",
"targetCurrency": "USD",
"sourceAmount": 100
}'Ответ котировки несёт поля, которые действительно нужны логике ценообразования: rate, rateType (например, FIXED), rateExpirationTime, разбивку fee, feePercentage и массив paymentOptions с estimatedDelivery по каждому способу пополнения. Он также возвращает notices — в собственном примере Wise есть предупреждение, что клиент может держать не более трёх открытых переводов с гарантированным курсом, после чего последующие переходят на живой курс.
Практическое следствие: котировка — короткоживущий объект с состоянием, привязанный к переводу, а не запрос курса, который можно опрашивать по расписанию. Если ваш сценарий — «показать сегодняшнюю цену в USD на странице тарифов», котировки здесь неверный примитив, а курсы — верный. Если сценарий — «точно сказать пользователю, сколько он получит», одни курсы завысят сумму. Путаница в этом различии — частый источник расхождений при округлении и сверке, описанных в нашем руководстве по округлению валют и десятичным разрядам.
Что на самом деле возвращает Comparison API
Эндпоинт сравнения — самая интересная и самая недопонятая часть платформы. Он возвращает по каждому провайдеру оценки цены и скорости для банков и сервисов переводов на маршруте:
curl -X GET 'https://api.wise.com/2026Q3/comparisons?sourceCurrency=GBP&targetCurrency=EUR&sendAmount=10000&filter=POPULAR'Прежде чем что-то на этом строить, внимательно прочитайте методологическую заметку самой Wise. Wise указывает, что собирает объявленные курсы и комиссии со сторонних сайтов, вычисляет наценку каждого провайдера к среднерыночному курсу на момент сбора, а затем применяет эту сохранённую наценку к текущему среднерыночному курсу, получая то число, которое вы видите. Сбор выполняется примерно раз в час.
Иначе говоря, цены конкурентов из этого эндпоинта — смоделированные оценки на основе почасовых сборов, а не живые котировки. Wise говорит об этом прямо, что делает ей честь, но это значит, что данные непригодны там, где вам пришлось бы отвечать за цифру конкурента. Кроме того, Wise ограничивает оценки только банковским переводом на входе и выходе и отмечает, что многие провайдеры совсем иначе тарифицируют карты и наличные.
Структурно ответ денормализован: один провайдер может вернуть несколько котировок по одной валютной паре, потому что цена и скорость зависят от страны назначения. Вы получаете массив providers, у каждого — массив quotes, и свести это к одной ключевой цифре на провайдера — ваша задача, а не API.
Пять ограничений, которые стоит знать до того, как строить на курсах Wise
- Доступ — это деловые отношения, а не регистрация. Одобрение аффилиата или онбординг в Platform предшествует каждому вызову. Нет панели, где ключ выдаётся за тридцать секунд.
- Покрытие следует за маршрутами переводов. Wise поддерживает валюты, в которых он умеет двигать деньги. Специализированный поставщик данных покрывает валюты, которые умеет оценивать, — множество шире. Finexly охватывает более 170 валют, включая те, для которых не существует ни одного коридора переводов.
- Курсы — один модуль в платёжном API. Вокруг него котировки, получатели, KYC, карты и вебхуки. Это большая и чувствительная к безопасности интеграция, которую придётся поддерживать, когда всё, что вам было нужно, — одно число.
- Нет опубликованной квоты. Справочник
/ratesдокументирует ответ429, но не публикует лимит запросов, поэтому вы планируете ёмкость против необъявленного предела. Сравните с явной моделью, где заголовки приходят в каждом ответе. - Две валюты на вызов.
/ratesпринимает по одномуsourceиtarget. Цены в восьми валютах — это восемь вызовов либо загрузка всей таблицы и фильтрация на клиенте.
Ничто из перечисленного не является дефектом. Так и выглядит платёжный API, когда его используют как API данных.
Когда Wise — правильный выбор, а когда нет
| Ваш сценарий | Лучший вариант | Почему |
|---|---|---|
| Сайт-сравнение или аффилиатский контент «банки против Wise» | Comparison API Wise | Это единственный источник таких данных, и аффилиатский трек существует именно для него |
| Реально отправлять деньги через Wise | Quotes + Transfers Wise | Нужен оценённый и истекающий объект котировки |
| Показывать брендированный курс Wise, потому что этого просят пользователи | /rates Wise | Атрибуция бренда и есть весь смысл |
| Мультивалютные цены, оформление заказа или экран конвертации | Специализированный валютный API | Нужны широта, мгновенный ключ и простой контракт |
| Счета, биллинг и отчётность по выручке | Специализированный валютный API | Нужен стабильный исторический ряд и аудиторский след |
| Бэктестинг или аналитика | И то, и другое | Поминутная история Wise сильна; API данных получить проще |
Использовать вместо этого специализированный API курсов
API данных переворачивает компромисс: никакого созвона по онбордингу, шире покрытие, явная квота и ответ, в котором нет ничего, кроме курса.
curl -H "Authorization: Bearer YOUR_API_KEY" \
"https://api.finexly.com/v1/rate?from=EUR&to=USD"{ "pair": "EUR_USD", "rate": 1.0852 }Цены сразу в нескольких валютах — один обход туда-обратно вместо вызова на каждую пару:
const apiKey = process.env.FINEXLY_API_KEY;
async function priceTable(base, quotes) {
const q = quotes.map((c) => `${base}_${c}`).join(',');
const res = await fetch(`https://api.finexly.com/v1/convert?q=${q}`, {
headers: { Authorization: `Bearer ${apiKey}` },
});
if (!res.ok) throw new Error(`Finexly ${res.status}`);
return res.json();
}
const rates = await priceTable('USD', ['EUR', 'GBP', 'JPY', 'CAD', 'AUD']);
// { "USD_EUR": { "rate": 0.9215 }, "USD_GBP": { "rate": 0.7892 }, ... }А когда нужна пересчитанная сумма, а не множитель, пусть арифметику делает API — чтобы округление происходило в одном месте:
import requests
def convert(amount, src, dst, api_key):
r = requests.get(
"https://api.finexly.com/v1/convert-amount",
params={"from": src, "to": dst, "amount": amount},
headers={"Authorization": f"Bearer {api_key}"},
timeout=10,
)
r.raise_for_status()
return r.json()["result"]
print(convert(100, "USD", "EUR", "YOUR_API_KEY"))Каждый ответ несёт X-RateLimit-Limit, X-RateLimit-Used и X-RateLimit-Units, так что квота наблюдаема, а не выводится догадками. Курсы обновляются каждую минуту в рыночные часы. Бесплатный тариф даёт 1 000 запросов в месяц при 10 запросах в минуту, платные планы — от $6,99 в месяц за 3 500 запросов и до 100 000 на плане Professional; полная разбивка — на странице тарифов.
Короткая заметка про объёмы: 1 000 запросов в месяц звучит скромно, пока вы не включите кеш. Одна плановая задача, обновляющая всю таблицу курсов каждые пятнадцать минут, расходует около 2 900 вызовов в месяц; каждые шестьдесят минут — примерно 730. Кеширование превращает объём вызовов в функцию времени, а не трафика, и именно это делает небольшой тариф жизнеспособным на любом масштабе. Паттерны описаны в материале кеширование и обработка ошибок для валютных API.
Миграция с /rates Wise
Если вы переносите существующую интеграцию, соответствие почти один к одному:
| Wise | Эквивалент | Примечание |
|---|---|---|
GET /rates | GET /v1/currencies, затем /v1/rate | Голый /rates у Wise возвращает всё; список валют получите один раз |
GET /rates?source=X&target=Y | GET /v1/rate?from=X&to=Y | Возвращает объект, а не массив из одного элемента |
| Несколько пар — несколько вызовов | GET /v1/convert?q=X_Y,X_Z | Один запрос |
Ручное amount * rate | GET /v1/convert-amount | Округление на стороне сервера |
Историческая точка ?time= | Исторический эндпоинт | Требуется платный план; см. руководство по историческим курсам |
| Токен Basic или OAuth | Authorization: Bearer | Ключ из панели, без шага одобрения |
И напоследок: пожалуйста, не занимайтесь скрейпингом wise.com. Несколько листингов на маркетплейсах предлагают ровно это, и они хрупкие, юридически мутные и ломаются при первом же изменении вёрстки страницы. Если вам нужна именно цифра Wise, идите аффилиатским треком и получайте её из API как положено. Если нужна какая-то цифра, возьмите API, построенный для того, чтобы её отдавать. Наше сравнение бесплатных валютных API и руководство по альтернативам Frankfurter подробнее разбирают варианты без ключа.
Часто задаваемые вопросы
Бесплатен ли API курсов валют Wise? Опубликованной платы за запрос для эндпоинта курсов нет, но доступ не открыт. Нужно быть одобренным партнёром Wise Platform или одобренным аффилиатом, а это заявка и рассмотрение, а не форма регистрации. Для большинства проектов цена — время, а не деньги.
Можно ли пользоваться API Wise без аккаунта?
Нет. Оба задокументированных трека требуют учётных данных: Bearer-токены для партнёров платформы, client ID и secret по Basic auth для аффилиатов. Единственный эндпоинт, в чьём документированном примере нет заголовка авторизации, — /comparisons, и строить на этом продакшн-трафик было бы неразумно.
Возвращает ли API Wise тот же курс, что показан на wise.com?
/rates возвращает среднерыночный курс — ту самую заглавную цифру, которую рекламирует Wise. Сумма, которую клиент получает на деле, приходит из /quotes и включает комиссию Wise. Если ваши числа не сходятся с сайтом, вы почти наверняка сравниваете среднерыночный курс с оценённой котировкой.
Как далеко назад уходит история курсов Wise?
Эндпоинт принимает произвольные метки from/to с группировкой по day, hour или minute; Wise не публикует в справочнике фиксированную самую раннюю дату, поэтому тестируйте нужный вам диапазон, а не предполагайте покрытие.
Какая лучшая альтернатива API курсов валют Wise? Зависит от того, что вы заменяете. Для сравнения цен конкурентов альтернативы нет — Comparison API Wise уникален. Для среднерыночных курсов внутри продукта специализированный API валютных данных даёт более широкое покрытие, мгновенные ключи и явную квоту. Сравните варианты на нашей странице сравнения API.
Могу ли я законно показывать курс Wise своим пользователям? Если вы одобренный аффилиат или партнёр платформы — да, в рамках этого соглашения. Скрейпинг публичного сайта ради тех же цифр — другое дело, и это не то, на чём мы советовали бы строить бизнес.
Готовы пропустить партнёрский онбординг и просто получать курсы? Получите бесплатный API-ключ Finexly — без кредитной карты. Начните с 1 000 бесплатных запросов в месяц по 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 →