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.
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 | Returnează |
|---|---|
/api/v1/rates | Cele mai recente cursuri sau, dacă este dat parametrul date, cursurile din acea zi |
/api/v1/rates/latest | Cele mai recente cursuri |
/api/v1/rates/YYYY-MM-DD | Cursurile din acea zi (la fel ca /rates?date=YYYY-MM-DD) |
/api/v1/currencies | Codurile valutare acceptate |
| Parametru | Implicit | Descriere |
|---|---|---|
currency | EUR |
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. |
all | dezactivat | 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. |
date | azi | 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). |
format | json |
json sau text. Cu text, răspunsul conține doar valoarea, ca text simplu; în acest caz trebuie cerută o singură valută. |
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âmp | Descriere |
|---|---|
date | Data la care BNR a publicat cursurile. |
requested_date | Apare doar când diferă de date, adică atunci când în ziua cerută nu s-au publicat cursuri și au fost returnate cele anterioare. |
quote | Moneda în care sunt exprimate valorile. Este întotdeauna RON: BNR publică cursuri doar față de leu, iar API-ul nu calculează cursuri încrucișate. |
rates | Câ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:
100HUF (la fel 100JPY, 100KRW, 100IDR, 100ISK) returnează cursul BNR pentru 100 de unități: "100HUF": 1.4695 înseamnă că 100 de forinți valorează 1,4695 lei.HUF (la fel JPY, KRW, IDR, ISK) returnează cursul pentru o unitate, adică cursul BNR împărțit la 100: "HUF": 0.014695.Cheia din rates este codul pe care l-ai cerut, așa că currency=HUF,100HUF le returnează pe amândouă.
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 },
...
]
}
GET https://www.cursbnr.ro/api/v1/rates
{"date": "2026-10-16", "quote": "RON", "rates": {"EUR": 5.3368}}
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}}
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.
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}}
GET https://www.cursbnr.ro/api/v1/rates?currency=HUF,100HUF
{"date": "2026-10-16", "quote": "RON", "rates": {"HUF": 0.014695, "100HUF": 1.4695}}
GET https://www.cursbnr.ro/api/v1/rates?currency=USD&format=text
4.743
$json = file_get_contents('https://www.cursbnr.ro/api/v1/rates?currency=EUR,USD');
$data = json_decode($json, true);
echo $data['rates']['EUR'];
const res = await fetch('https://www.cursbnr.ro/api/v1/rates?currency=EUR,USD');
const data = await res.json();
console.log(data.rates.EUR);
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 HTTP | code | Când apare |
|---|---|---|
| 400 | invalid_date | Data nu este o dată validă în formatul YYYY-MM-DD |
| 400 | invalid_currency | Un cod valutar nu este acceptat, nu a fost dat niciun cod sau au fost date atât currency, cât și all |
| 400 | invalid_format | format nu este json sau text, ori format=text a fost folosit cu mai multe valute sau cu all |
| 400 | invalid_parameter | all are altă valoare decât gol, 1, true, 0 sau false |
| 404 | no_rates | Nu există cursuri în data cerută sau înaintea ei, ori (cu format=text) BNR nu a publicat curs pentru acea valută |
| 404 | not_found | Endpoint-ul nu există |
| 405 | method_not_allowed | A fost folosită altă metodă decât GET |
| 429 | rate_limited | A fost depășită limita de cereri (vezi mai jos) |
| 503 | unavailable | Baza de date cu cursuri este temporar indisponibilă |
Fiecare adresă IP poate face 30 de cereri pe minut. Fiecare răspuns include aceste headere:
X-RateLimit-Limit: numărul de cereri permise pe minut (30)X-RateLimit-Remaining: câte cereri mai rămân în minutul curentX-RateLimit-Reset: momentul în care se termină minutul curent, ca timestamp UnixPeste 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.
Răspunsurile conțin headere de cache, astfel încât browserele și clienții HTTP le pot refolosi:
ETag; trimite-l înapoi în If-None-Match, iar API-ul răspunde cu 304 Not Modified dacă nu s-a schimbat nimic.| json.php | v1 |
|---|---|
/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 200 | Erori cu starea HTTP 400, 404, 429 sau 503 |
Ultima actualizare: 21 octombrie 2026