NBR versus ECB quotation
The same day, the same currency, two official sources — with the difference computed and the status of each figure declared.
Only EUR is a direct comparison. The NBR publishes RON/EUR, the ECB publishes RON per EUR: the same quantity, both published. Measured across the 5,426 common days (2005 → today): mean difference 0.0029 lei (0.0695%), maximum 0.0685; identical on only 155 days, that is 2.9%. Since 2020 the mean has fallen to 0.00117 lei.
For the other currencies the comparison is indirect, and the deviation doubles. The ECB does not publish RON/USD; the figure is obtained as (RON/EUR) ÷ (USD/EUR), that is a cross rate computed by us. The mean deviation rises from 0.07% to 0.12–0.18%, with maxima of 2–4% (JPY: 4.03%). That is why bce.statut says on every request whether the figure is publicat or derivat, and for a derived one the components it came from are included too — otherwise the larger deviation on USD would look as if one of the sources were worse.
Neither is wrong, and that can be shown. The mean SIGNED difference is −0.00045, a fifth of the absolute mean: the NBR is higher on 2,328 days and lower on 2,943. No systematic bias — it is momentary fixing noise, not a different convention. Exactly the conclusion this route exists to prevent.
Only days on which both published are compared. The calendars differ — Romanian holidays are not the TARGET2 ones — and two quotations from different days can be subtracted numerically without meaning anything. A requested day with no publication at both falls back to the last common day, flagged through exact.
The multipliers are normalised. The NBR publishes HUF, IDR, ISK, JPY and KRW per 100 units, the ECB per one; without normalisation the difference would come out a hundred times larger. bnr.publicat keeps the figure exactly as published, with its own multiplier.
Eight NBR currencies are not quoted by the ECB — AED, EGP, MDL, RSD, UAH, plus XAU and XDR, which are not currencies at all. Requested here, they get a refusal that says why, not an empty comparison.
Query parameters
YYYY-MM-DD. Defaults to the last day both published. Cannot be in the future.
e.g. 2024-06-15
How it behaves
- The same day, the same currency, two official sources — with the difference computed and the status of each figure declared.
- Only EUR is a direct comparison. The NBR publishes RON/EUR, the ECB publishes RON per EUR: the same quantity, both published. Measured across the 5,426 shared days (2005 → today): mean difference 0.0029 lei (0.0695%), maximum 0.0685; identical on only 155 days, or 2.9%. Since 2020 the mean has fallen to 0.00117 lei.
- For every other currency the comparison is indirect, and the gap doubles. The ECB does not publish RON/USD; the figure comes from
(RON/EUR) ÷ (USD/EUR), a cross rate we compute. The mean deviation rises from 0.07% to 0.12–0.18%, with maxima of 2–4% (JPY: 4.03%). That is whybce.statutsays on every request whether the figure ispublicatorderivat, and derived figures carry the components they came from — otherwise the larger gap on USD would look like one source being worse. - Neither is wrong, and it can be shown. The SIGNED mean difference is −0.00045, a fifth of the absolute mean: the NBR is higher on 2,328 days and lower on 2,943. No systematic bias — it is fixing-time noise, not a differing convention. Precisely the conclusion this route exists to prevent.
- Only days when both published are compared. The calendars differ — Romanian holidays are not the TARGET2 ones — and two quotations from different days can be subtracted numerically without meaning anything. A requested day without publication on both sides falls back to the last shared day, flagged by
exact; at most ten days back are searched. - Multipliers are normalised. The NBR publishes HUF, IDR, ISK, JPY and KRW per 100 units, the ECB per one; without normalising, the difference would come out a hundred times too large.
bnr.publicatkeeps the figure exactly as published, with its multiplier. - Unit values carry six decimals, not four. For currencies published per 100 units the unit rate is of order 0.028, and a real difference of 0.000032 would round to 0.0000 and read as "identical".
- Eight NBR currencies are not quoted by the ECB — AED, EGP, MDL, RSD, UAH, plus XAU and XDR, which are not currencies at all. Requested here, they get a refusal that says why, not an empty comparison.
What it is for
- Checking an exchange-rate figure when the source is unknown.
- Documenting, for a file, the gap between the two fixings on a given day.
- Choosing the right source for a contract that does not name one.
Response structure
true only if the day returned is the day requested.
publicat for EUR, derivat for the rest.
null when published.
null when published.
NBR − ECB, in lei, to six decimals.
data is null and this says why. No exchange-rate data in the database. The NBR quotes it, the ECB does not. No day in the last ten with publication on both sides.
fara_date is prose and may be rephrased, this is not.
Response examples
{
"data": {
"valuta": "EUR",
"data": "2026-09-21",
"data_ceruta": "2026-09-21",
"exact": true,
"bnr": {
"valoare": "5.264900",
"publicat": {
"valoare": "5.2649",
"multiplicator": 1
},
"sens": "RON pentru o unitate de EUR",
"statut": "publicat"
},
"bce": {
"valoare": "5.264700",
"sens": "RON pentru o unitate de EUR",
"statut": "publicat",
"formula": null,
"componente": null
},
"diferenta": {
"absoluta": "0.000200",
"procent": "0.0038",
"sens": "BNR − BCE"
}
},
"meta": {
"surse": {
"bnr": "Banca Naţională a României — cursul de referinţă.",
"bce": "Banca Centrală Europeană — cursul de referinţă (seria EXR)."
},
"nota_statut": "Ambele cifre sunt publicate ca atare: EUR e singura valută pentru care cele două surse cotează aceeaşi mărime.",
"nota_diferenta": "Niciuna dintre surse nu e greşită. Pe 5.426 de zile comune, BNR e mai mare în 2.328 şi mai mic în 2.943, iar media diferenţei cu semn (−0,00045) e o cincime din media absolută (0,0029): zgomot de moment al fixingului, nu o convenţie diferită.",
"nomenclator": "/financiar/v1/valute"
}
}
{
"data": {
"valuta": "USD",
"data": "2026-09-21",
"data_ceruta": "2026-09-21",
"exact": true,
"bnr": {
"valoare": "4.586700",
"publicat": {
"valoare": "4.5867",
"multiplicator": 1
},
"sens": "RON pentru o unitate de USD",
"statut": "publicat"
},
"bce": {
"valoare": "4.581984",
"sens": "RON pentru o unitate de USD",
"statut": "derivat",
"formula": "RON/USD = (RON/EUR) ÷ (USD/EUR)",
"componente": {
"ron_per_eur": "5.2647",
"USD_per_eur": "1.1490"
}
},
"diferenta": {
"absoluta": "0.004716",
"procent": "0.1029",
"sens": "BNR − BCE"
}
},
"meta": {
"surse": {
"bnr": "Banca Naţională a României — cursul de referinţă.",
"bce": "Banca Centrală Europeană — cursul de referinţă (seria EXR)."
},
"nota_statut": "Cifra BCE e DERIVATĂ, nu publicată: BCE cotează totul faţă de euro, deci RON/USD se obţine ca raport a două cotaţii ale ei, din aceeaşi zi. Abaterea faţă de BNR e în medie de două ori mai mare decât la EUR tocmai din cauza asta.",
"nota_diferenta": "Niciuna dintre surse nu e greşită. Pe 5.426 de zile comune, BNR e mai mare în 2.328 şi mai mic în 2.943, iar media diferenţei cu semn (−0,00045) e o cincime din media absolută (0,0029): zgomot de moment al fixingului, nu o convenţie diferită.",
"nomenclator": "/financiar/v1/valute"
}
}
{
"data": {
"valuta": "EUR",
"data": "2024-06-14",
"data_ceruta": "2024-06-15",
"exact": false,
"bnr": {
"valoare": "4.977100",
"publicat": {
"valoare": "4.9771",
"multiplicator": 1
},
"sens": "RON pentru o unitate de EUR",
"statut": "publicat"
},
"bce": {
"valoare": "4.977300",
"sens": "RON pentru o unitate de EUR",
"statut": "publicat",
"formula": null,
"componente": null
},
"diferenta": {
"absoluta": "-0.000200",
"procent": "-0.0040",
"sens": "BNR − BCE"
}
},
"meta": {
"surse": {
"bnr": "Banca Naţională a României — cursul de referinţă.",
"bce": "Banca Centrală Europeană — cursul de referinţă (seria EXR)."
},
"nota_statut": "Ambele cifre sunt publicate ca atare: EUR e singura valută pentru care cele două surse cotează aceeaşi mărime.",
"nota_diferenta": "Niciuna dintre surse nu e greşită. Pe 5.426 de zile comune, BNR e mai mare în 2.328 şi mai mic în 2.943, iar media diferenţei cu semn (−0,00045) e o cincime din media absolută (0,0029): zgomot de moment al fixingului, nu o convenţie diferită.",
"nota_zi": "Ziua cerută n-are publicare la ambele surse; s-a folosit ultima zi comună. Calendarele diferă: sărbătorile româneşti nu sunt cele TARGET2.",
"nomenclator": "/financiar/v1/valute"
}
}
Error codes
| Code | Slug | When it occurs |
|---|---|---|
| 401 | neautentificat | Token missing, invalid, expired or revoked. |
| 403 | feature_indisponibil | The current plan does not include the feature the route depends on. |
| 404 | negasit | The NBR does not quote it. |
| 422 | validare | A malformed currency code or a future date. |
| 429 | cota_depasita | The plan's monthly quota has been exceeded (see Retry-After). |
All errors share the same shape. eroare.cod is stable and is the value you should branch on in code — not the text in mesaj, which may change.
{
"eroare": {
"cod": "validare",
"mesaj": "A malformed currency code or a future date.",
"detalii": {
"valuta": [
"The value sent does not satisfy the parameter rule."
]
}
}
}