CC API
Рыночные курсы 340+ фиатных валют, криптовалют, стейблкоинов и металлов, история курса и сколько на самом деле получит адресат через каждый сервис перевода после всех комиссий. JSON по HTTPS, бесплатно, без ключа.
https://currency-backend.currency-backend.workers.dev/v1Быстрый старт
Каждый метод — обычный GET-запрос. Попробуйте в терминале:
Ни регистрации, ни ключа. Ответы — JSON, ошибки везде в одном формате (см. «Ошибки»). Запросы из браузера тоже работают: CORS открыт.
curl "https://currency-backend.currency-backend.workers.dev/v1/convert?from=USD&to=EUR&amount=100"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/convert?from=USD&to=EUR&amount=100"); const { result } = await res.json(); console.log(result); // 89.05
import requests r = requests.get("https://currency-backend.currency-backend.workers.dev/v1/convert", params={"from": "USD", "to": "EUR", "amount": "100"}) print(r.json()["result"])
{
"from": "USD",
"to": "EUR",
"amount": 100,
"rate": 0.89046402,
"result": 89.05,
"updated_at": "2026-10-17T22:17:28.819Z"
}Лимиты
API бесплатный, поэтому у него жёсткие лимиты. Они держат сервис быстрым и доступным для всех:
| Лимит | Значение |
|---|---|
| Запросов в минуту с одного IP | 30 |
| Запросов в сутки с одного IP | 1,000 |
| Запросов в сутки от всех пользователей вместе | 20,000 |
Сутки считаются по UTC: все счётчики обнуляются в 00:00 UTC. В каждом ответе — заголовки X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset (время сброса, Unix).
Сверх лимита приходит HTTP 429 с заголовком Retry-After. Подождите, а не повторяйте запрос в цикле: отказы тоже считаются.
Как пользоваться бережно
- Курсы обновляются раз в 15 минут — кешируйте ответы хотя бы на 5 минут.
- Один вызов /v1/rates отдаёт все валюты: используйте его вместо запроса на каждую пару.
- Вызывайте API со своего сервера и кешируйте там, а не из браузера каждого посетителя.
Ошибки
Ошибка приходит с HTTP-статусом и JSON с объектом error:
| Статус | type | code | Когда |
|---|---|---|---|
| 400 | invalid_request_error | missing_parameter | Нет обязательного параметра. |
| 400 | invalid_request_error | unknown_currency | Кода валюты нет в /v1/currencies. |
| 400 | invalid_request_error | invalid_amount, invalid_parameter | Число вне допустимого диапазона. |
| 404 | not_found_error | not_found, history_unavailable | Нет такого метода или нет истории у пары. |
| 429 | rate_limit_error | rate_limited | Больше 30 запросов в минуту. |
| 429 | rate_limit_error | daily_limit_exceeded | 1,000 запросов с вашего IP за сутки. |
| 429 | rate_limit_error | daily_budget_exhausted | Общий суточный лимит исчерпан. |
| 503 | api_error | rates_unavailable | Свежего курса сейчас нет; повторите через минуту. |
{
"error": {
"type": "invalid_request_error",
"code": "unknown_currency",
"message": "Unknown currency 'XYZ'. See /v1/currencies.",
"param": "to",
"docs": "https://ccvia.app/developers"
}
}/v1/ratesКурсы
Рыночные курсы всех валют к одной базовой. Каждый курс — медиана нескольких открытых источников (центробанки, биржи), обновляется раз в 15 минут.
Параметры
baseнеобязательныйВалюта, к которой считаются курсы. По умолчанию USD.
symbolsнеобязательныйКоды через запятую. По умолчанию — все валюты.
Ответ
baseБазовая валюта.
updated_atКогда обновлены курсы (ISO 8601, UTC).
ratesСколько единиц каждой валюты за 1 базовую, 8 значащих цифр.
curl "https://currency-backend.currency-backend.workers.dev/v1/rates?base=USD&symbols=EUR,GBP,JPY"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/rates?base=USD&symbols=EUR,GBP,JPY"); const data = await res.json(); console.log(data.rates.EUR); // 0.89046402
import requests r = requests.get("https://currency-backend.currency-backend.workers.dev/v1/rates", params={"base": "USD", "symbols": "EUR,GBP,JPY"}) print(r.json()["rates"]["EUR"])
{
"base": "USD",
"updated_at": "2026-10-17T22:17:28.819Z",
"rates": {
"EUR": 0.89046402,
"GBP": 0.75063241,
"JPY": 159.29975
}
}/v1/convertКонвертация
Пересчитывает сумму по рыночному курсу — тому, по которому банки торгуют между собой, без комиссий и наценки.
Параметры
fromобязательныйВалюта, которая есть.
toобязательныйВалюта, которая нужна.
amountнеобязательныйСумма в from. По умолчанию 1.
Ответ
rateСколько to за 1 from.
resultamount × rate, округлено до обычной точности валюты.
updated_atКогда обновлён курс.
curl "https://currency-backend.currency-backend.workers.dev/v1/convert?from=USD&to=EUR&amount=100"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/convert?from=USD&to=EUR&amount=100"); const { result } = await res.json(); console.log(result); // 89.05
import requests r = requests.get("https://currency-backend.currency-backend.workers.dev/v1/convert", params={"from": "USD", "to": "EUR", "amount": "100"}) print(r.json()["result"])
{
"from": "USD",
"to": "EUR",
"amount": 100,
"rate": 0.89046402,
"result": 89.05,
"updated_at": "2026-10-17T22:17:28.819Z"
}/v1/quoteСравнение сервисов перевода
Сколько получит адресат через каждый сервис перевода, биржу и кошелёк, которые мы отслеживаем, — после их комиссий и наценок на курс. От лучшего к худшему. Если пару напрямую не меняет ни один сервис, придут цепочки из 2–3 сервисов (RUB → USDT → USDS), самая выгодная первой.
Параметры
fromобязательныйВалюта отправителя.
toобязательныйВалюта получателя.
amountнеобязательныйСумма отправки в from. По умолчанию — около 100 USD.
chainsнеобязательный1 — вернуть цепочки и при наличии прямых сервисов. Без прямых цепочки приходят всегда.
langнеобязательныйЯзык: en, es, pt, fr, de, it, ru, tr, ar, hi, id, zh, ja, ko. По умолчанию en.
Ответ
mid_rateРыночный курс для сравнения.
providers[].receivedСколько получит адресат, в to.
providers[].fee_pctВся стоимость перевода к рыночному курсу, в % от суммы отправки.
providers[].estimatetrue, если часть стоимости — наша оценка, а не опубликованный тариф.
providers[].urlСсылка на сервис.
chains[]Если пару напрямую не меняет ни один сервис (или с chains=1): до 3 путей через 2–3 сервиса — через USDT, USDC, USD, EUR, BTC или ETH, самый выгодный первым. Три шага — только если двух не хватает.
chains[].pathВалюты по пути, например RUB, USDT, USDS.
chains[].received, fee_pctСколько получит адресат в конце и вся стоимость к рыночному курсу пары.
chains[].legs[]Каждый шаг: from, to, amount, received, fee_pct и провайдер (id, name, url). Каждый шаг — обмен внутри сервиса; следующий начинается ровно с того, что выплатил предыдущий.
converter_urlТо же сравнение в приложении CC.
curl "https://currency-backend.currency-backend.workers.dev/v1/quote?from=USDT&to=EUR&amount=500"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/quote?from=USDT&to=EUR&amount=500"); const { providers } = await res.json(); const best = providers[0]; console.log(`${best.name}: ${best.received} EUR (−${best.fee_pct}%)`);
import requests r = requests.get("https://currency-backend.currency-backend.workers.dev/v1/quote", params={"from": "USDT", "to": "EUR", "amount": "500"}) for p in r.json()["providers"]: print(p["name"], p["received"], p["fee_pct"])
{
"from": "USDT",
"to": "EUR",
"amount": 500,
"mid_rate": 0.89046402,
"mid_result": 445.23,
"updated_at": "2026-10-17T22:17:28.819Z",
"providers": [
{
"id": "etherfi",
"name": "Ether.fi",
"website": "ether.fi",
"received": 444.56,
"fee_pct": 0.15,
"estimate": false,
"best": true,
"url": "https://ccvia.app/go/etherfi?from=USDT&to=EUR&src=api"
},
{
"id": "kucoin",
"name": "KuCoin",
"website": "kucoin.com",
"received": 443.65,
"fee_pct": 0.35,
"estimate": false,
"best": false,
"url": "https://ccvia.app/go/kucoin?from=USDT&to=EUR&src=api"
}
],
"converter_url": "https://ccvia.app/?from=USDT&to=EUR&amount=500"
}{
"from": "RUB",
"to": "USDS",
"amount": 10000,
"mid_rate": 0.01196115,
"mid_result": 119.61,
"updated_at": "2026-10-18T12:17:28.819Z",
"providers": [],
"chains": [
{
"received": 113.62,
"fee_pct": 5.01,
"estimate": false,
"best": true,
"path": [
"RUB",
"USDT",
"USDS"
],
"legs": [
{
"from": "RUB",
"to": "USDT",
"amount": 10000,
"received": 115.02,
"fee_pct": 3.84,
"estimate": false,
"provider": {
"id": "altyn",
"name": "Altyn Wallet",
"website": "altyn.one",
"url": "https://ccvia.app/go/altyn?from=RUB&to=USDT&src=api"
}
},
{
"from": "USDT",
"to": "USDS",
"amount": 115.02,
"received": 113.62,
"fee_pct": 1.22,
"estimate": false,
"provider": {
"id": "kucoin",
"name": "KuCoin",
"website": "kucoin.com",
"url": "https://ccvia.app/go/kucoin?from=USDT&to=USDS&src=api"
}
}
]
}
],
"converter_url": "https://ccvia.app/?from=RUB&to=USDS&amount=10000"
}/v1/historyИстория курса
Рыночный курс по дням за год или по неделям (по четвергам) за пять лет.
Параметры
fromобязательныйБазовая валюта.
toобязательныйВалюта котировки.
daysнеобязательныйГлубина, от 1 до 1825 дней. До 365 — по дням, больше — по неделям. По умолчанию 30.
Ответ
intervalday или week. Недельная история есть не у всех пар — тогда придут дневные точки за последний год.
pointsdate (ГГГГ-ММ-ДД, UTC) и rate (сколько to за 1 from), от старых к новым.
curl "https://currency-backend.currency-backend.workers.dev/v1/history?from=USD&to=EUR&days=7"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/history?from=USD&to=EUR&days=7"); const { points } = await res.json(); console.log(points.at(-1)); // { date, rate }
import requests r = requests.get("https://currency-backend.currency-backend.workers.dev/v1/history", params={"from": "USD", "to": "EUR", "days": "7"}) for p in r.json()["points"]: print(p["date"], p["rate"])
{
"from": "USD",
"to": "EUR",
"interval": "day",
"points": [
{
"date": "2026-10-14",
"rate": 0.891987
},
{
"date": "2026-10-15",
"rate": 0.890861
},
{
"date": "2026-10-16",
"rate": 0.88987
}
]
}/v1/currenciesВалюты
Все поддерживаемые валюты с названием и типом.
Параметры
langнеобязательныйЯзык названий: en, es, pt, fr, de, it, ru, tr, ar, hi, id, zh, ja, ko. По умолчанию en.
Ответ
codeКод для остальных методов (регистр не важен).
typefiat, crypto, stablecoin или metal.
decimalsСколько знаков обычно показывают у суммы.
curl "https://currency-backend.currency-backend.workers.dev/v1/currencies"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/currencies"); const { currencies } = await res.json(); console.log(currencies.length);
import requests r = requests.get("https://currency-backend.currency-backend.workers.dev/v1/currencies") print(len(r.json()["currencies"]))
{
"currencies": [
{
"code": "USD",
"name": "Dollar",
"type": "fiat",
"decimals": 2
},
{
"code": "BTC",
"name": "Bitcoin",
"type": "crypto",
"decimals": 8
},
{
"code": "USDT",
"name": "Tether",
"type": "stablecoin",
"decimals": 2
},
{
"code": "XAU",
"name": "Gold",
"type": "metal",
"decimals": 4
}
]
}/v1/providersПровайдеры
Сервисы перевода, биржи и кошельки, которые сравнивает /v1/quote, и валюты, которые каждый принимает и выплачивает.
Ответ
sendИз каких валют можно отправить.
receiveВ каких валютах выплачивают.
urlСсылка на сервис.
curl "https://currency-backend.currency-backend.workers.dev/v1/providers"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/providers"); const { providers } = await res.json(); console.log(providers.map(p => p.name));
import requests r = requests.get("https://currency-backend.currency-backend.workers.dev/v1/providers") print([p["name"] for p in r.json()["providers"]])
{
"providers": [
{
"id": "kucoin",
"name": "KuCoin",
"website": "kucoin.com",
"url": "https://ccvia.app/go/kucoin?src=api",
"send": [
"EUR",
"USDT",
"BTC"
],
"receive": [
"EUR",
"USDT",
"BTC"
]
}
]
}/v1/usageРасход
Сколько из сегодняшних лимитов израсходовал ваш IP. Сам вызов тоже считается запросом.
Ответ
per_ipВаши запросы за сегодня и ваш суточный лимит.
sharedЗапросы всех пользователей за сегодня и общий лимит.
reset_atКогда обнулятся счётчики.
curl "https://currency-backend.currency-backend.workers.dev/v1/usage"
const res = await fetch("https://currency-backend.currency-backend.workers.dev/v1/usage"); const { per_ip } = await res.json(); console.log(per_ip.limit - per_ip.used, "requests left today");
import requests u = requests.get("https://currency-backend.currency-backend.workers.dev/v1/usage").json() print(u["per_ip"]["limit"] - u["per_ip"]["used"], "requests left today")
{
"date": "2026-10-17",
"reset_at": "2026-10-18T00:00:00.000Z",
"per_ip": {
"used": 12,
"limit": 1000
},
"shared": {
"used": 4810,
"limit": 20000
},
"per_minute": 30
}Условия
- Бесплатно для личных и коммерческих проектов. Пожалуйста, укажите CC со ссылкой на ccvia.app рядом с данными.
- Курсы — ориентировочные рыночные, не оферта. Комиссии провайдеров оценены по их опубликованным тарифам и нашим замерам; итоговую сумму показывает приложение провайдера.
- Лимиты могут меняться. Несовместимые изменения выйдут новой версией (/v2), v1 продолжит работать.
- Без гарантий: стройте продукт так, чтобы он пережил несколько минут без курсов.
OpenAPI
Машиночитаемое описание API (OpenAPI 3.1): импортируйте в Postman, Insomnia или генератор клиентов.