oneapi
Sign in
Financiar v1 / Curs

NBR reference exchange rate

The quotations of the most recent day published by the NBR, for all currencies or only the ones requested. The NBR publishes only on banking days, generally after 13:00 — the response always says which day the rate belongs to (data) and whether that is the current day (este_azi).

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

Query parameters

NameTypeDescriptionAccepted values
datarequired string Required: the day, YYYY-MM-DD. Cannot be in the future. e.g. 2024-06-14e.g. 2024-06-15
valutalistoptional text Optional filter: ?valuta=EUR,USD or ?valuta[]=EUR&valuta[]=USD. Without it, every currency quoted on that day is returned. e.g. EUR

How it behaves

  • ?data= is required, and the response always has the same shape: data (the day you asked for), valoare (filled ONLY if we have that exact day) and ultima (the last day published on or before it, with its value). valoare stays empty DELIBERATELY when the requested day has no publication — a figure from another day sits separately, under ultima, so it cannot be used by mistake in a calculation. Missing data is no longer an error: the response is 200, and comparing data with ultima.data tells you everything.
  • The quotes for the most recent day published by the National Bank of Romania. The rate is RON per multiplicator units of currency (moneda_baza: "RON") — the inverse of the ECB, which quotes currency per 1 EUR.
  • NBR publishes on banking days only, generally after 13:00. There is no rate for weekends, public holidays, or the morning of a banking day. The route returns the last published day and declares it in data; it never invents a quote for a day without publication.
  • Five currencies are published per 100 units (HUF, JPY, KRW, IDR, ISK). Use valoare_unitara if you multiply directly, or valoare + multiplicator if you must cite the official figure.
  • Amounts are decimal strings, not JSON numbers, so that no float rounding errors appear.

What it is for

  • Displaying the day's exchange rate.
  • Converting a foreign-currency invoice at the official rate.

Response structure

FieldTypeDescription
data.data string The banking day for which NBR published the quotes in the response.
data.valoare.moneda_baza string The currency the quote is expressed in. Always RON on this route.
data.valoare.cotatii[].valuta string ISO 4217 currency code.
data.valoare.cotatii[].valoare string The figure published by NBR, for multiplicator units of currency.
data.valoare.cotatii[].multiplicator integer How many units of currency valoare covers (1 or 100).
data.valoare.cotatii[].valoare_unitara string RON for ONE unit of currency, already divided by the multiplier.
data.ultima object The last day published on or before data, with its quotes: {data, valoare}. null only if nothing exists before the requested day.
data.ultima.data string
data.ultima.valoare.moneda_baza string
data.ultima.valoare.cotatii[].valuta string ISO 4217 currency code.
data.ultima.valoare.cotatii[].valoare string The quotes for the requested day: {moneda_baza, cotatii[]}. null if that day has no publication.
data.ultima.valoare.cotatii[].multiplicator integer Factor the value is multiplied by to reach the base unit.
data.ultima.valoare.cotatii[].valoare_unitara string The value per single unit.
meta.sursa string The official source the data comes from, with its licence where one is required.
meta.cotatii integer How many quotations the response covers.
meta.nota string A note on how to read the response — a pitfall, a convention or a limit of the source.
meta.nota_publicare string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.necotate Currencies requested through the filter that have NO quote on that day. It appears only when something is missing — otherwise a partial response would pass unnoticed.

Response examples

GEThttps://oneapi.ro/api/financiar/v1/curs?data=2024-06-14
{
    "data": {
        "data": "2024-06-14",
        "valoare": {
            "moneda_baza": "RON",
            "cotatii": [
                {
                    "valuta": "AED",
                    "valoare": "1.268",
                    "multiplicator": 1,
                    "valoare_unitara": "1.268"
                }
            ]
        },
        "ultima": {
            "data": "2024-06-14",
            "valoare": {
                "moneda_baza": "RON",
                "cotatii": [
                    {
                        "valuta": "AED",
                        "valoare": "1.268",
                        "multiplicator": 1,
                        "valoare_unitara": "1.268"
                    }
                ]
            }
        }
    },
    "meta": {
        "sursa": "Banca Naţională a României",
        "cotatii": 31,
        "nota": "Valoare publicată în ziua cerută.",
        "nota_publicare": "Curs de referinţă, publicat în zilele bancare, în general după ora 13: 00."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareMissing, malformed or future date; a currency code that is not 3 letters.
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": "Missing, malformed or future date; a currency code that is not 3 letters.",
        "detalii": {
            "data": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}