RO | EN

Documentație API v1 pentru cursul BNR


Prezentare

API-ul returnează cursurile de schimb oficiale publicate de Banca Națională a României (BNR), în lei (RON), pentru ultima zi sau pentru orice dată din trecut, în format JSON. Este gratuit și public; nu este nevoie de cheie de acces.

Versiunea 1 înlocuiește /api/json.php, care continuă să fie funcțională. Diferențele pt fi găsite în secțiunea Trecerea de la json.php.

Adresa de bază

https://www.cursbnr.ro/api/v1

Toate endpoint-urile folosesc metoda GET. Răspunsurile sunt în format JSON (UTF-8), cu excepția cazului în care ceri text simplu cu format=text. Cererile din browser de pe alte site-uri sunt permise (Access-Control-Allow-Origin: *).

Endpoint-uri

EndpointReturnează
/api/v1/ratesCele mai recente cursuri sau, dacă este dat parametrul date, cursurile din acea zi
/api/v1/rates/latestCele mai recente cursuri
/api/v1/rates/YYYY-MM-DDCursurile din acea zi (la fel ca /rates?date=YYYY-MM-DD)
/api/v1/currenciesCodurile valutare acceptate

Parametri pentru /rates

ParametruImplicitDescriere
currencyEUR Un cod valutar sau o listă de coduri separate prin virgulă, de exemplu currency=EUR,USD,GBP. Nu contează dacă scrii cu litere mari sau mici. Vezi Valute acceptate.
alldezactivat Returnează toate valutele pentru care BNR a publicat curs în ziua respectivă, în locul celor din currency: ?all (sau all=1, all=true). Valutele fără curs în acea zi nu apar. Nu poate fi folosit împreună cu currency sau cu format=text.
dateazi Data în formatul YYYY-MM-DD. BNR nu publică cursuri în weekend și în zilele de sărbătoare legală; pentru aceste zile se returnează cele mai recente cursuri anterioare, iar răspunsul arată ambele date (vezi Răspunsul).
formatjson json sau text. Cu text, răspunsul conține doar valoarea, ca text simplu; în acest caz trebuie cerută o singură valută.

Răspunsul

Răspunsul are aceeași structură, fie că ceri o valută, fie mai multe:

{
  "date": "2026-10-16",
  "requested_date": "2026-10-18",
  "quote": "RON",
  "rates": {
    "EUR": 5.3368,
    "USD": 4.743
  }
}
CâmpDescriere
dateData la care BNR a publicat cursurile.
requested_dateApare doar când diferă de date, adică atunci când în ziua cerută nu s-au publicat cursuri și au fost returnate cele anterioare.
quoteMoneda în care sunt exprimate valorile. Este întotdeauna RON: BNR publică cursuri doar față de leu, iar API-ul nu calculează cursuri încrucișate.
ratesCâte o valoare pentru fiecare valută cerută. Fiecare valoare este un număr: câți lei valorează o unitate din acea valută, sau null dacă BNR nu a publicat curs pentru ea în ziua respectivă (de exemplu SKK, înlocuită de euro în 2009). Cu all, aceste valute nu apar deloc. Valorile sunt numere, deci zerourile de la final nu apar (4.7430 este returnat ca 4.743).

Valute cotate la 100 de unități. BNR cotează HUF, JPY, KRW, IDR și ISK la 100 de unități. Poți cere oricare dintre forme:

Cheia din rates este codul pe care l-ai cerut, așa că currency=HUF,100HUF le returnează pe amândouă.

Valute acceptate

EUR, USD, XAU (aur, la gram), AUD, CAD, CHF, CZK, DKK, EGP, GBP, 100HUF, 100JPY, MDL, NOK, PLN, SEK, TRY, XDR, RUB, BGN, SKK, ZAR, BRL, CNY, INR, 100KRW, MXN, NZD, RSD, UAH, AED, THB, HKD, 100IDR, ILS, 100ISK, MYR, PHP, SGD, plus codurile pentru o unitate HUF, JPY, KRW, IDR și ISK.

Aceeași listă este returnată de /api/v1/currencies, împreună cu numărul de unități la care este cotat fiecare cod:

{
  "quote": "RON",
  "currencies": [
    { "code": "EUR", "units": 1 },
    { "code": "100HUF", "units": 100 },
    { "code": "HUF", "units": 1 },
    ...
  ]
}

Exemple

Cel mai recent curs al euro

GET https://www.cursbnr.ro/api/v1/rates
{"date": "2026-10-16", "quote": "RON", "rates": {"EUR": 5.3368}}

Mai multe valute

GET https://www.cursbnr.ro/api/v1/rates?currency=EUR,USD,100HUF
{"date": "2026-10-16", "quote": "RON", "rates": {"EUR": 5.3368, "USD": 4.743, "100HUF": 1.4695}}

Toate valutele

GET https://www.cursbnr.ro/api/v1/rates?all
{"date": "2026-10-16", "quote": "RON", "rates": {"EUR": 5.3368, "USD": 4.743, …}}

Funcționează și cu o dată: /api/v1/rates/2026-10-16?all.

O zi fără cursuri (duminică)

GET https://www.cursbnr.ro/api/v1/rates/2026-10-18?currency=USD
{"date": "2026-10-16", "requested_date": "2026-10-18", "quote": "RON", "rates": {"USD": 4.743}}

Forintul la o unitate și la 100 de unități

GET https://www.cursbnr.ro/api/v1/rates?currency=HUF,100HUF
{"date": "2026-10-16", "quote": "RON", "rates": {"HUF": 0.014695, "100HUF": 1.4695}}

Doar valoarea, ca text simplu

GET https://www.cursbnr.ro/api/v1/rates?currency=USD&format=text
4.743

PHP

$json = file_get_contents('https://www.cursbnr.ro/api/v1/rates?currency=EUR,USD');
$data = json_decode($json, true);
echo $data['rates']['EUR'];

JavaScript

const res = await fetch('https://www.cursbnr.ro/api/v1/rates?currency=EUR,USD');
const data = await res.json();
console.log(data.rates.EUR);

Erori

Erorile folosesc codurile de stare HTTP standard, iar corpul răspunsului este un JSON cu un code ușor de verificat din program și un mesaj message (în engleză):

{
  "error": {
    "code": "invalid_currency",
    "message": "Unknown currency code: XYZ. See /api/v1/currencies for the supported codes."
  }
}
Stare HTTPcodeCând apare
400invalid_dateData nu este o dată validă în formatul YYYY-MM-DD
400invalid_currencyUn cod valutar nu este acceptat, nu a fost dat niciun cod sau au fost date atât currency, cât și all
400invalid_formatformat nu este json sau text, ori format=text a fost folosit cu mai multe valute sau cu all
400invalid_parameterall are altă valoare decât gol, 1, true, 0 sau false
404no_ratesNu există cursuri în data cerută sau înaintea ei, ori (cu format=text) BNR nu a publicat curs pentru acea valută
404not_foundEndpoint-ul nu există
405method_not_allowedA fost folosită altă metodă decât GET
429rate_limitedA fost depășită limita de cereri (vezi mai jos)
503unavailableBaza de date cu cursuri este temporar indisponibilă

Limita de cereri

Fiecare adresă IP poate face 30 de cereri pe minut. Fiecare răspuns include aceste headere:

Peste limită, API-ul răspunde cu HTTP 429 și cu headerul Retry-After, care arată câte secunde trebuie să aștepți. BNR publică cursuri noi o dată pe zi lucrătoare, în jurul orei 13:00 (ora României), așa că rareori are sens să ceri cele mai recente cursuri mai des de câteva minute.

Cache

Răspunsurile conțin headere de cache, astfel încât browserele și clienții HTTP le pot refolosi:

Trecerea de la json.php

json.phpv1
/api/json.php?currency=USD&date=2024-12-31/api/v1/rates?currency=USD&date=2024-12-31 sau /api/v1/rates/2024-12-31?currency=USD
O valută: {"date", "currency", "value"}
Mai multe: {"date", "values"}
Întotdeauna {"date", "quote", "rates"}
Valori ca text: "4.7430"Valori ca numere: 4.743
&number&format=text (&number funcționează în continuare)
Erori cu starea HTTP 200Erori cu starea HTTP 400, 404, 429 sau 503

Ultima actualizare: 21 octombrie 2026

Contact