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

MethodPathDescription
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.