exrate API — gratis JSON för nationalbankernas kurser
Publikt REST-API på api.banks-rates.com. JSON-svar, ingen autentisering, generösa gränser per IP, öppen CORS. Samma data som gränssnittet använder, samma data som MCP-servern ger AI-agenter.
Ändpunkter
| 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.
Varför exrate API i stället för varje centralbanks flöde direkt?
- 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.
Vanliga frågor
Är API:et gratis för kommersiellt bruk?
Ja. Datan är allmän egendom (centralbanker); vår hosting och vårt API är gratis. Källhänvisning uppskattas.
Är exrate en officiell källa?
Nej — vi återpublicerar centralbankernas officiella kurser. Banken förblir den juridiska källan. Vi finns för att vara en enhetlig, parsningsbar, hostad ändpunkt.
Vilket SLA gäller för drifttiden?
Best effort, på Cloudflare Workers. Vi har legat över 99,9 % de senaste månaderna men lämnar inget avtalat SLA på gratisnivån.
Vilka anropsgränser gäller?
Gränser per IP tillämpas vid kanten. Typisk appanvändning slår inte i dem. Tunga batchkonsumenter bör sprida anropen och cacha aggressivt.
Hur integrerar jag med NBP/CNB-flöden?
Anropa /v1/rate med bank=NBP|CNB och ditt datum/valuta. Svarsformatet är identiskt för alla banker — en drop-in-ersättning för direktintegrationer mot varje centralbanks flöde.