API курсов валют туроператоров
Внутренние курсы валют российских туроператоров, рейтинги по Яндекс ИКС и курсы валют стран, популярных у российских туристов, — одним JSON-запросом, без парсинга чужих сайтов. Данные по всем крупным туроператорам России сверяются с курсом ЦБ РФ и обновляются ежедневно, включая курсы на завтра.
- Турагентствам считать стоимость тура по курсу оператора внутри своей CRM
- Агрегаторам и медиа публиковать курсы у себя, не чиня парсер каждый месяц
- Туроператорам видеть, по какому курсу работают конкуренты
Быстрый старт
Один запрос, никаких SDK и библиотек.
Запросcurl -H "X-TM-Key: ВАШ_КЛЮЧ" \
"https://tourmometer.ru/api/v1/rates.php"
Ответ{
"ok": true,
"data": {
"rate_date": "2026-09-26",
"base": { "cbr": { "usd": 84.9057, "eur": 96.8859 } },
"operators": [
{
"id": 1,
"alias": "BGO",
"title": "Библио-Глобус",
"usd": { "rate": 90.85, "base": 84.9057, "markup_percent": 7 },
"eur": { "rate": 103.67, "base": 96.8859, "markup_percent": 7 }
}
]
},
"meta": { "count": 24, "plan": "base", "max_date": "2026-09-26", "version": "v1" }
}
Заявка
Заполните форму внизу страницы. Демо-доступ открываем без оплаты — на нём удобно написать и отладить интеграцию.
Ключ
Приходит письмом в течение рабочего дня. Состоит из открытого идентификатора и секрета; секрет у нас не хранится, только его хеш.
Запрос
Ключ передаётся заголовком X-TM-Key. Подойдёт любой HTTP-клиент —
curl, Guzzle, requests, fetch на сервере.
Что отдаёт API
Курсы туроператоров
Курс доллара и евро у каждого оператора на сегодня и на завтра, вместе с базовым курсом ЦБ и процентом наценки, из которого он посчитан. Все крупные туроператоры России, ежедневное обновление.
Рейтинг по Яндекс ИКС
Индекс качества сайта каждого оператора, дата последнего замера и направление изменения. На тарифе «Про» — вся история значений.
Курсы валют популярных у туристов стран
Национальная валюта популярных направлений к евро, доллару и рублю. Валюты, которые ЦБ не котирует, считаются кросс-курсом.
Тарифы
| Что входит | Демо0 ₽ | Базовый3 900 ₽/мес | Про8 900 ₽/мес |
|---|---|---|---|
| Курсы туроператоров | вчерашние | сегодня и завтра | сегодня и завтра |
| Рейтинги по Яндекс ИКС | — | — | есть |
| Курсы валют стран, популярных у российских туристов | — | — | есть |
| Архив и история значений | — | — | есть |
| Вебхуки | — | — | есть |
| Лимит запросов | 50 в сутки | 5 000 в месяц | 200 000 в месяц |
| Привязка ключа к IP | по желанию | по желанию | по желанию |
При оплате за год — два месяца бесплатно. Вы платите за 10 месяцев и пользуетесь 12. Действует на любом платном тарифе.
Демо-тариф бесплатный и бессрочный: он отдаёт те же данные, в том же формате и через те же эндпоинты, но с задержкой на сутки. Переход на платный тариф не требует менять код и не меняет ключ — меняется только то, какие данные он видит.
Документация
Базовый адрес и версии
Все эндпоинты начинаются с https://tourmometer.ru/api/v1/. Номер версии в адресе
означает, что формат ответа внутри неё не меняется: мы можем добавлять новые поля,
но не переименовываем и не убираем существующие. Если когда-нибудь понадобится несовместимое
изменение, выйдет /api/v2/, а первая версия продолжит работать — о сроке её отключения
мы предупредим не менее чем за шесть месяцев.
Авторизация
Ключ передаётся заголовком X-TM-Key в виде идентификатор.секрет:
X-TM-Key: AbCdEfGhIjKlMnOp.a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6
Поддерживается и форма Authorization: Bearer идентификатор.секрет,
если вашему клиенту так удобнее.
Запрашивайте только с сервера. Не обращайтесь к API из браузерного JavaScript: ключ окажется в исходном коде страницы, и его увидит любой посетитель. Запрос делает ваш сервер, а страница получает данные уже от него. По этой же причине API не отдаёт заголовки CORS — из браузера запрос и не пройдёт.
Эндпоинты
| Адрес | Что возвращает | Параметры |
|---|---|---|
GET /api/v1/rates.php |
Курсы валют туроператоров | date — дата в формате ГГГГ-ММ-ДД, работает только с доступом к архиву;operator — коды операторов через запятую |
GET /api/v1/ratings.php |
Рейтинги туроператоров по Яндекс ИКС | operator — коды через запятую;history=1 — добавить историю значений |
GET /api/v1/countries.php |
Курсы валют стран, популярных у российских туристов | country — коды стран через запятую;popular=1 — только популярные направления |
Поддерживается только метод GET. Неизвестные параметры игнорируются, поэтому к адресу можно безопасно добавлять своё — например метку времени для обхода прокси-кеша.
Что означают поля курсов
rate— итоговый курс оператора, по которому он считает тур;base— курс ЦБ РФ, от которого оператор считал;markup_percent— наценка в процентах к курсу ЦБ;actual— фактический курс с сайта оператора, если мы его проверяли; поле появляется не всегда;rate_date— дата, к которой относятся курсы, а не дата запроса.
Числа приходят числами, а не строками: курсы округлены до четырёх знаков, наценки — до трёх.
Если запрошенная дата выпала на выходной или праздник, вернутся ближайшие опубликованные курсы,
и rate_date честно покажет их дату. Пустого ответа в этом случае не будет.
Коды операторов и стран
Коды нужны для параметров operator и country. Отдельный
справочник вести не нужно: актуальный список всегда приходит в самих ответах,
поэтому он не может разойтись с данными. Запросите эндпоинт без фильтра —
код каждого элемента лежит в поле alias.
Коды туроператоровcurl -H "X-TM-Key: ВАШ_КЛЮЧ" \
"https://tourmometer.ru/api/v1/rates.php" \
| jq -r '.data.operators[] | "\(.alias) \(.title)"'
BGO Библио-Глобус
PGS PEGAS Touristik
ANX Anex Tour
COR Coral Travel
...
Коды странcurl -H "X-TM-Key: ВАШ_КЛЮЧ" \
"https://tourmometer.ru/api/v1/countries.php" \
| jq -r '.data.countries[] | "\(.alias) \(.title)"'
turkey Турция
egypt Египет
uae ОАЭ
thailand Таиланд
...
Дальше коды подставляются в фильтр: ?operator=BGO,PGS,ANX
или ?country=turkey,egypt,uae. Если ни один из указанных кодов
не совпал, придёт ответ 404 с кодом NO_DATA.
Курсы стран отдаются в двух видах сразу: rates.rub — сколько рублей стоит одна
единица национальной валюты, rates.per_eur и rates.per_usd — сколько
единиц дают за один евро или доллар, rates.per_rub — сколько за 100 рублей.
Поле currency.nominal показывает, какой номинал принято указывать для этой валюты.
Как часто запрашивать
Курсы меняются раз в сутки, опрашивать чаще смысла нет. Разумная схема: один запрос утром и один после 17:10 по Москве, когда появляются курсы на завтра. Кешируйте ответ у себя — так вы не упираетесь в лимит и не зависите от нашей доступности в момент, когда ваш клиент оформляет заявку.
Если данные нужны в реальном времени — например, вы показываете их на высоконагруженной странице, — запрашивайте раз в час по расписанию, а страницу стройте из своего кеша. Курс, полученный час назад, ничем не отличается от полученного секунду назад.
Лимиты
Остаток квоты приходит в заголовках каждого ответа:
X-RateLimit-Month: 5000
X-RateLimit-Month-Remaining: 4987
Сутки и месяц считаются по московскому времени: суточный лимит обнуляется в полночь МСК, месячный — в полночь первого числа. Ошибочные запросы в лимит не засчитываются — опечатка в параметре не съедает квоту. При исчерпании лимита приходит код 429; повторять запрос до следующего периода бесполезно, лучше взять данные из своего кеша.
Ошибки
Любая ошибка приходит в одном формате, с машиночитаемым кодом:
{
"ok": false,
"error": {
"code": "RATE_LIMIT_MONTH",
"message": "Исчерпан месячный лимит запросов"
}
}
| HTTP | Код | Что произошло и что делать |
|---|---|---|
| 401 | KEY_MISSING | Заголовок с ключом не передан |
| 401 | KEY_INVALID | Ключ не найден или секрет неверен — проверьте, что передаёте его целиком, вместе с точкой |
| 402 | SUBSCRIPTION_EXPIRED | Срок доступа истёк, нужна оплата следующего периода |
| 403 | CLIENT_INACTIVE | Доступ приостановлен — напишите нам |
| 403 | IP_DENIED | Запрос пришёл с адреса вне списка разрешённых; сообщите новый адрес, и мы его добавим |
| 403 | SCOPE_DENIED | Этот раздел данных не входит в ваш тариф |
| 403 | PLAN_DELAY | На демо-тарифе актуальные данные недоступны |
| 404 | NO_DATA | На запрошенную дату данных нет |
| 405 | METHOD_NOT_ALLOWED | Поддерживается только GET |
| 429 | RATE_LIMIT_DAY | Исчерпан суточный лимит |
| 429 | RATE_LIMIT_MONTH | Исчерпан месячный лимит |
| 503 | DB_UNAVAILABLE | Временная недоступность — повторите через минуту |
Примеры кода
PHP$ch = curl_init('https://tourmometer.ru/api/v1/rates.php');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['X-TM-Key: ' . getenv('TM_API_KEY')],
CURLOPT_TIMEOUT => 10,
]);
$raw = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);
$data = json_decode($raw, true);
if ($code !== 200 || empty($data['ok'])) {
// берём последние сохранённые курсы из своего кеша
throw new RuntimeException($data['error']['code'] ?? 'HTTP ' . $code);
}
foreach ($data['data']['operators'] as $op) {
echo $op['alias'], ' USD ', $op['usd']['rate'], PHP_EOL;
}
Pythonimport os
import requests
r = requests.get(
"https://tourmometer.ru/api/v1/rates.php",
headers={"X-TM-Key": os.environ["TM_API_KEY"]},
timeout=10,
)
data = r.json()
if r.status_code != 200 or not data.get("ok"):
raise RuntimeError(data.get("error", {}).get("code", r.status_code))
for op in data["data"]["operators"]:
print(op["alias"], "USD", op["usd"]["rate"])
Когда обновляются данные
ЦБ РФ публикует курсы на следующий рабочий день после 17:00 по Москве. Курсы туроператоров появляются в API в течение нескольких минут после этого. Все даты в ответах — московские.
В выходные и праздники новых значений не выходит: пятничная публикация действует на субботу,
воскресенье и понедельник. Поэтому в понедельник утром rate_date покажет пятницу —
это не ошибка, а то, как работает сам ЦБ.
Безопасность доступа
Ключ можно привязать к одному или нескольким IP-адресам — тогда даже утекший ключ бесполезен с чужого сервера. Это самая действенная мера, и мы рекомендуем её всем, у кого фиксированный адрес сервера. Сообщите адреса при подключении или напишите позже, если они изменятся.
Секрет ключа у нас не хранится — только его необратимый хеш. Потерянный ключ восстановить нельзя, можно только перевыпустить: старый при этом перестаёт работать. Держите секрет в переменных окружения, а не в коде репозитория.
Все обращения логируются: по журналу видно, с какого адреса и когда забирались данные. Если вы подозреваете утечку — напишите нам, мы перевыпустим ключ и покажем, откуда шли запросы.
Оплата
После заявки мы выставляем счёт на оплату по вашим реквизитам. Доступ открывается в течение рабочего дня с момента поступления денег. Оплата авансовая, за выбранный период. Компания работает на упрощённой системе налогообложения, поэтому НДС не начисляется и счета-фактуры не выставляются.
За неделю до окончания оплаченного периода мы напоминаем о продлении. Если оплата не поступит, доступ приостанавливается — ключ при этом сохраняется, и после оплаты всё продолжает работать без изменений в вашем коде.
Условия использования
Данные предоставляются для использования внутри вашего продукта. Передача, перепродажа или публикация массива данных третьим лицам без отдельного письменного соглашения не допускается. База данных Турмометра охраняется как объект смежных прав изготовителя базы данных (ст. 1333–1334 ГК РФ), и извлечение существенной её части является нарушением.
При публикации отдельных значений на своём сайте укажите источник — ссылку на tourmometer.ru. Полные условия — в публичной оферте.
Заявка на подключение
Отвечаем в тот же рабочий день. Демо-доступ открываем без оплаты.
Не хотите заполнять форму — напишите напрямую: