oneapi
Sign in
Financiar v1 / Curs

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.

GET
https://oneapi.ro/api/financiar/v1/curs/comparat

Query parameters

NameTypeDescriptionAccepted values
valutarequired string Required, 3-letter code. max 3 car.
dataoptional string | null Optional, 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 why bce.statut says on every request whether the figure is publicat or derivat, 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.publicat keeps 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

FieldTypeDescription
data.valuta string ISO 4217 currency code.
data.data string
data.data_ceruta string The date the client asked for, before alignment to a day that has data.
data.exact boolean true only if the day returned is the day requested.
data.bnr.valoare string The NBR rate for ONE unit, to six decimals.
data.bnr.publicat object The figure exactly as the NBR publishes it, with its multiplier.
data.bnr.publicat.valoare string The value published by the source for the combination above.
data.bnr.publicat.multiplicator integer Factor the value is multiplied by to reach the base unit.
data.bnr.sens string Direction of the operation.
data.bnr.statut string The state the item is in at the source.
data.bce.valoare string The ECB rate for one unit, in the same direction.
data.bce.sens string Direction of the operation.
data.bce.statut string publicat for EUR, derivat for the rest.
data.bce.formula null How the derived figure was obtained. null when published.
data.bce.componente null The two ECB quotations the ratio came from. null when published.
data.diferenta.absoluta string NBR − ECB, in lei, to six decimals.
data.diferenta.procent string The same difference, relative to the ECB figure.
data.diferenta.sens string Direction of the operation.
meta.surse.bnr string
meta.surse.bce string
meta.nota_statut string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_diferenta string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nomenclator string
meta.fara_date 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.
meta.fara_date_cod The short, STABLE word for the reason, for clients that branch on it in code: fara_date is prose and may be rephrased, this is not.

Response examples

GEThttps://oneapi.ro/api/financiar/v1/curs/comparat?valuta=EUR
{
    "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"
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404negasitThe NBR does not quote it.
422validareA malformed currency code or a future date.
429cota_depasitaThe 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."
            ]
        }
    }
}