Mid-market prices and finalized daily closes & official daily fixings published by central banks.
Exchange rates without the integration pain. One key, one clean JSON envelope, eight endpoints, two kinds of rates:
GET /v1/market?from=EUR # live quotes, all currencies
GET /v1/market?from=EUR&to=USD,GBP # live quotes, selected targets
GET /v1/convert?from=EUR&to=RON&amount=149.99&source=bnr
GET /v1/market/history?from=EUR&to=USD&dateFrom=2026-01-01&dateTo=2026-03-01&fill=previous
GET /v1/market/fluctuation?from=EUR&to=USD&dateFrom=2026-01-01&dateTo=2026-06-01
GET /v1/reference?source=ecb&from=EUR # full ECB board
GET /v1/reference/history?source=bnr&from=EUR&to=RON&dateFrom=2026-01-01&dateTo=2026-03-01
GET /v1/compare?from=EUR&to=RON # market vs ECB vs BNR + spread
GET /v1/currencies
Send your API key in the x-api-key header on every /v1/* request. That's the whole setup.
basis field tells you exactly how the number was built.meta.freshness tells you whether today's fix is out (current),
still pending (not_published_yet), or not expected at all (weekends). No guessing, no stale
data passed off as fresh./v1/compare puts the live mid-market quote next to
the ECB and BNR fixings and computes the spread - see exactly what the market costs you
versus the official rate.fill=previous turns sparse business-day history into a
dense daily series (weekends/holidays carry the last value, flagged filled), without
ever fabricating a not-yet-final close or fix.Every success is { data, meta }. meta always carries requestId and apiVersion, plus
per-endpoint fields such as source, rateKind, freshness. Every error is
{ error: { code, message, status, requestId } } with stable, machine-readable codes such as
UNSUPPORTED_PAIR (400) and RATE_UNAVAILABLE (404).