oneapi
Sign in
Financiar v1 / CursIstoric

Historic exchange rate (old-leu era)

The NBR quotation of a currency on a day in the period 1998-01-05 → 2004-12-31, when the national currency was the old leu (ROL).

The figures are in OLD LEI. A rate of 638 does not compare with one of 5.25 today: there are four orders of magnitude between them. Every response declares denominare: "ROL" and also carries the new-leu equivalent, in echivalent_ron, so that an amount from old documents can be brought to today's unit.

It covers 30 currencies, 13 of which no longer exist: ATS, BEF, DEM, ESP, FIM, FRF, GRD, IEP, ITL, NLG, PTE (national currencies replaced by the euro), TRL (the Turkish lira before redenomination) and XEU (the ECU). For dates after 2005 use /curs/{valuta}?data=.

GET
https://oneapi.ro/api/financiar/v1/curs-istoric/{valuta}

Path parameters

NameTypeDescriptionExample
valutarequired string ISO 4217 code of the currency searched in the historical series.

Query parameters

NameTypeDescriptionAccepted values
datarequired string Required: the day, ?data=YYYY-MM-DD, between 1998-01-05 and 2004-12-31. e.g. 1998-06-15e.g. 2001-03-15e.g. 1999-01-15

How it behaves

  • The NBR quote for a currency on a day between 1998-01-05 and 2004-12-31, when the national currency was the old leu (ROL).
  • The figures are in OLD LEI and do not compare with today's. A rate of 638 (Austrian schilling, 1998) and one of 5.25 (euro, today) are four orders of magnitude apart. That is why the response declares denominare: "ROL" and also carries echivalent_ron — the same quote brought into new lei, so an amount from old documents can be used without remembering the ratio.
  • A separate route from /curs, not a parameter of it. Placed in the same field, the two units would be indistinguishable: nothing in the shape of a number says which leu it is in. When you request /curs/{valuta}?data= with a date before 2005, the response points you here, with the full path.
  • Covers 30 currencies, 13 of which no longer exist: ATS, BEF, DEM, ESP, FIM, FRF, GRD, IEP, ITL, NLG, PTE — the national currencies replaced by the euro between 1999 and 2002 — plus TRL (the Turkish lira before the 2005 redenomination) and XEU (the ECU, the unit of account that preceded the euro). Their names are in the response: nobody remembers what IEP or NLG was.
  • XEU is not a currency, but a basket — like XDR on the modern series. este_moneda: false separates it, so it does not end up in a currency picker next to the Deutsche Mark.
  • Days without publication receive the last preceding quote, marked with exact: false and zile_inapoi — the same vocabulary as /curs. The search never crosses the era boundary: a request for 2004-12-31 cannot fall back on a quote from 2005, because that one is in a different unit.
  • The boundary follows the source's convention, not the legal calendar. The denomination took place on 1 July 2005, but NBR expresses its archive in new lei from 1 January 2005 — which is why the ROL series stops at 2004-12-31. It is the same ambiguous window /calcul/denominare declares, and the two routes say the same thing.
  • The date is REQUIRED, unlike /curs/{valuta} where omitting it means "today". There is no "today" in the ROL archive: the era ended in 2004, and any default would be arbitrary.

What it is for

  • Reconstructing a rate for a contract or dispute predating 2005.
  • Converting an amount from an old document, in steps: the rate of the day, then the denomination.
  • Recovering the quote of a currency that no longer exists (Deutsche Mark, Italian lira).

Response structure

FieldTypeDescription
data.valuta string ISO 4217 currency code.
data.denumire string The currency name; for those replaced by the euro, with the year of changeover.
data.este_moneda boolean false for XEU, which was a unit of account, not a currency.
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 requested day has a publication of its own.
data.zile_inapoi integer How many days were stepped back to find a quote. At most 10.
data.denominare string Always ROL on this route. The unit valoare is expressed in.
data.moneda_baza string Always ROL: the quote is old lei per unit of currency.
data.valoare string The figure published by NBR, in old lei.
data.multiplicator integer Factor the value is multiplied by to reach the base unit.
data.valoare_unitara string Old lei for ONE unit of currency. Every multiplier in the ROL archive is 1, so it equals valoare.
data.echivalent_ron.valoare_unitara string The same quote in NEW lei — valoare_unitara divided by 10,000.
data.echivalent_ron.raport_denominare integer Always 10,000 (Law 348/2004).
data.echivalent_ron.temei string
meta.sursa string The official source the data comes from, with its licence where one is required.
meta.acoperire.de_la string The first period we have data for.
meta.acoperire.pana_la string The last period we have data for.
meta.temei_denominare string
meta.nota_unitate string What to know about the unit of measure before comparing or summing values.
meta.nota_fereastra string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.dupa_2005 string
meta.fara_date data is null and this says why. The requested date is before 1998-01-05, outside coverage.
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-istoric/USD?data=1998-06-15
{
    "data": {
        "valuta": "USD",
        "denumire": "Dolar american",
        "este_moneda": true,
        "data": "1998-06-15",
        "data_ceruta": "1998-06-15",
        "exact": true,
        "zile_inapoi": 0,
        "denominare": "ROL",
        "moneda_baza": "ROL",
        "valoare": "8556",
        "multiplicator": 1,
        "valoare_unitara": "8556",
        "echivalent_ron": {
            "valoare_unitara": "0.8556",
            "raport_denominare": 10000,
            "temei": "Legea 348/2004 — 1 RON = 10.000 ROL, în vigoare de la 1 iulie 2005."
        }
    },
    "meta": {
        "sursa": "BNR — arhiva cursului de schimb în lei vechi (baza de date interactivă).",
        "acoperire": {
            "de_la": "1998-01-05",
            "pana_la": "2004-12-31"
        },
        "temei_denominare": "Legea 348/2004: 1 RON = 10.000 ROL, în vigoare de la 1 iulie 2005.",
        "nota_unitate": "Cifrele din `valoare` sunt în LEI VECHI. Nu se compară cu cursul de azi fără trecerea prin raportul de denominare; `echivalent_ron` o face deja.",
        "nota_fereastra": "Seria ROL se încheie la 2004-12-31 fiindcă BNR îşi exprimă arhiva în lei noi din 1 ianuarie 2005, deşi denominarea legală a fost la 1 iulie 2005. Aceeaşi fereastră ambiguă e declarată şi de `/calcul/denominare`.",
        "dupa_2005": "Pentru date de după denominare: /financiar/v1/curs/USD?data=AAAA-LL-ZZ."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404negasitalta_epoca = the date is after 2004-12-31, and the response gives the path to /curs; negasit = the currency was never quoted in the ROL era; iesita_din_circulatie = it was quoted, but not on the requested date (the response gives the period when it was).
422validareA currency code that is not three letters, or a missing/malformed 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 currency code that is not three letters, or a missing/malformed date.",
        "detalii": {
            "valuta": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}