exrate API — безкоштовний JSON для курсів національних центробанків
Публічний REST API на api.banks-rates.com. JSON-відповіді, без авторизації, щедрі ліміти на IP, CORS відкритий. Ті самі дані, що використовує інтерфейс, і ті самі, що MCP-сервер повертає AI-агентам.
Ендпоінти
| Method | Path | Description |
|---|---|---|
GET | /v1/banks | List all supported banks with metadata. |
GET | /v1/banks/{id} | Per-bank detail (currencies, schedule, history range). |
GET | /v1/rate | Convert amount at a bank's rate. Params: bank, date, from, to, amount. |
GET | /v1/cross | Cross-rate via a bank's national currency. Params: bank, date, from, to, amount. |
GET | /v1/rates/series | Historical series. Params: bank, currency, from, to (dates). |
GET | /v1/status | Per-bank freshness: latest rate date, currency count, updated-at timestamp. |
GET | /v1/openapi.json | Full OpenAPI 3.1 spec. |
GET | /v1/reference | Interactive API reference (Scalar) with per-language code samples. |
Examples
curl
curl -s "https://api.banks-rates.com/v1/rate?bank=NBP&date=2026-04-20&from=USD&to=PLN&amount=100" Python
import requests
r = requests.get("https://api.banks-rates.com/v1/rate", params={
"bank": "NBP", "date": "2026-04-20",
"from": "USD", "to": "PLN", "amount": 100,
})
r.raise_for_status()
print(r.json()) JavaScript / TypeScript
const url = new URL("https://api.banks-rates.com/v1/rate");
url.searchParams.set("bank", "NBP");
url.searchParams.set("date", "2026-04-20");
url.searchParams.set("from", "USD");
url.searchParams.set("to", "PLN");
url.searchParams.set("amount", "100");
const res = await fetch(url);
const data = await res.json(); Go
req, _ := http.NewRequest("GET", "https://api.banks-rates.com/v1/rate", nil)
q := req.URL.Query()
q.Set("bank", "NBP"); q.Set("date", "2026-04-20")
q.Set("from", "USD"); q.Set("to", "PLN"); q.Set("amount", "100")
req.URL.RawQuery = q.Encode()
res, _ := http.DefaultClient.Do(req) Authentication & rate limits
The API works without authentication at the free per-IP limits (12 requests/hour, 256/day). For higher limits (16/min, 800/hour, 16,000/day), issue an API key in the console and send it as a bearer token:
curl -s "https://api.banks-rates.com/v1/rate?bank=NBP&date=2026-04-20&from=USD&to=PLN&amount=100" \
-H "Authorization: Bearer brk_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
Every response carries X-RateLimit-Limit, X-RateLimit-Remaining
and X-RateLimit-Reset. Exceeding a limit returns 429 with a
Retry-After header and a JSON body
{ "error": "rate_limited", "scope": "hour", "limit": 12 }. Schema and docs
endpoints (e.g. /v1/openapi.json) have a separate flat 5 req/sec per-IP limit.
Навіщо exrate API, а не фід кожного центробанку напряму?
- One unified JSON shape across every supported central bank — no per-bank parser needed.
- Built-in previous-business-day fallback for invoicing and tax filings.
- Hosted on Cloudflare's edge — sub-100ms response globally.
- No XML parsing, no CSV mangling, no scraping. JSON, every endpoint.
- Free for commercial use — no key required; add one only to raise rate limits.
Часті запитання
API безкоштовний для комерційного використання?
Так. Дані загальнодоступні (це центробанки), а наш хостинг і API — безкоштовні. Будемо вдячні за зазначення джерела.
Чи є exrate офіційним джерелом?
Ні — ми републікуємо офіційні курси центробанків. Сам банк залишається юридичним джерелом. Ми існуємо як єдиний, придатний для парсингу, хостований ендпоінт.
Який SLA щодо аптайму?
Best-effort на Cloudflare Workers. За останні місяці тримаємо >99.9%, але контрактного SLA на безкоштовному тарифі немає.
Які ліміти на запити?
Ліміти на IP на рівні edge. Типові клієнтські навантаження в них не впираються. Важким batch-споживачам варто розпаралелювати запити й агресивно кешувати.
Як інтегруватися з потоками NBP/CNB?
Викликайте /v1/rate з bank=NBP|CNB і потрібною датою/валютою. Структура відповіді однакова для всіх банків — drop-in заміна прямих інтеграцій із фідами центробанків.