oneapi
Sign in
Financiar v1 / Indici

Interest rates on loans and deposits

What banks actually pay on deposits and charge on loans — 57 dimensions for each of the three currencies the NBR publishes, monthly since January 2007.

In June 2026, in lei: new deposits 5.33%, new loans 7.93%. In euro 1.63% and 4.65%; in dollars 3.02% and 6.39%.

marja is computed by us, and it is the figure nobody has to hand. New loans minus new deposits: 3.39 points in June 2008, 5.06 in 2016, 2.60 in June 2026 — the lowest level in the series. Today the margin is smaller in lei than in euro (3.02) or dollars (3.37), which is not intuitive.

The margin is computed only from values of the SAME month. The series have different coverage — the nominal rate on consumer loans stops in April 2026, while the APR runs to June — and anyone comparing the „last value" of two series is in fact comparing different months, with nothing looking amiss.

The APR is not the nominal rate. On consumer loans: 10.5% annual percentage rate against 9.57% nominal, almost a point. The APR is the figure legally required towards the consumer, so the dimensions carrying it are flagged with dae, not left among the rest.

The class has no table headers, unlike credit risk, so the grouping is neither inherited from the source nor invented: tip, moment and sector are derived from the names, with verified rules — 57 out of 57 for type, 53 out of 57 for moment, 51 out of 57 for sector. What does not match stays null; for sector, null means an aggregate across all sectors, not a failed classification.

Coverage differs a lot between currencies: 55 dimensions have data in lei, 53 in euro and only 41 in dollars. are_date says so on each dimension.

The filters narrow serii, but do not touch principale: a „deposits only" filter must not be allowed to make the margin disappear.

GET
https://oneapi.ro/api/financiar/v1/dobanzi-bancare

Query parameters

NameTypeDescriptionAccepted values
masuraoptional string | null Optional, defaults to rata — the measure the route served before it had two. With volum it returns how much money was lent or deposited, instead of at what rate. ratavolum
monedaoptional string | null Optional, defaults to lei. Or euro, dolari. Coverage differs: 55, 53 and 41 dimensions with data respectively. leieurodolari
de_laoptional string | null Optional, YYYY-MM. Without it, the last published month. e.g. 2024-06-15
pana_laoptional string | null Optional, YYYY-MM. At most 120 months. e.g. 2024-06-15
tipoptional string | null Optional: credite or depozite. creditedepozite
momentoptional string | null Optional: sold (outstanding contracts) or nou (new contracts). soldnou
sectoroptional string | null Optional: gospodarii (households) or societati (non-financial corporations). Aggregates across all sectors carry no sector and appear under no filter. gospodariisocietati

How it behaves

  • The same indicators also come with a volume measure. masura=volum returns the amounts, not the rates: in June 2026, new loans in lei are 14.79 billion at a rate of 7.93% — the same month, the same indicator, two faces of it. Volumes cover 29 of the 31 indicators the rates have.
  • The 28 dimensions that exist only for rates are stock indicators — existing loans and deposits — which have no "new" volume. It is a logical asymmetry, not a gap: of the four headline rates, only depozite_noi and credite_noi remain for volumes.
  • marja does not appear for volumes. The difference between new loans and new deposits is a net flow, not a margin; it would be a figure with a different meaning under the same name.
  • The unit of volumes is the currency itself — lei, euro or dollars — not a common denominator. A total across the three would be meaningless, so none is offered. Rates stay percent per annum across all currencies.
  • Volume coverage drops sharply for dollars: all 31 dimensions have data in lei, 30 in euro, but only 19 in dollars.
  • What banks actually pay on deposits and charge on loans — 57 dimensions for each of the three currencies the NBR publishes, monthly since January 2007.
  • In June 2026, in lei: new deposits 5.33%, new loans 7.93%. In euro 1.63% and 4.65%; in dollars 3.02% and 6.39%.
  • marja is computed by us, and it is the figure nobody has at hand. New loans minus new deposits: 3.39 points in June 2008, 5.06 in 2016, 2.60 in June 2026 — the lowest in the series. Today the margin is smaller in lei than in euro (3.02) or dollars (3.37), which is far from intuitive.
  • The margin is computed only from values in the SAME month. The series have different coverage — the nominal rate on consumer loans stops in April 2026 while the APR runs to June — and anyone comparing the "latest value" of two series is in fact comparing different months, with nothing looking wrong. Where a component is missing for a month, the margin is null.
  • The APR is not the nominal rate. For consumer loans in lei: 10.5% annual percentage rate against 9.57% nominal, almost a full point. The APR is the figure legally owed to the consumer, so the dimensions carrying it are flagged with dae rather than left among the others.
  • This class has no table headings, unlike the credit-risk one — verified, no value-less series marking a section. So the grouping is not inherited from the source and is not invented: tip, moment and sector are derived from the names, with rules checked across all 57 series — 57 of 57 for type, 53 of 57 for moment, 51 of 57 for sector.
  • The four series without a moment do not carry "noi" in their name, and each has a twin that does: the absence of the word is the signal for stock, verified across every pair. For sector, null means aggregate across all sectors, not a failed classification — those are the six totals.
  • Coverage differs substantially between currencies: 55 dimensions carry data in lei, 53 in euro and only 41 in dollars. are_date says so per dimension, so an absence does not read as a hole in the data.
  • Filters narrow serii, not principale: a filter on "deposits only" must not make the margin disappear, because the margin is the anchor of the response.
  • Without an interval, the last published month is returned — the natural question is "where is it now", not "the whole series". The cap is 120 months.

What it is for

  • What deposits pay today, by currency and maturity.
  • The real market rate for a loan, instead of a guessed one at /calcul/rata-credit.
  • The banking margin and how it has moved — how much of the spread stays with the bank.

Response structure

FieldTypeDescription
data.masura string The measure reported — what the value actually counts or sums.
data.moneda string Currency the values are expressed in.
data.cod_moneda string
data.unitate string Always procent_pe_an.
data.de_la string Start of the interval the response covers.
data.pana_la string End of the interval the response covers, inclusive.
data.perioade array The months that actually carry values, in order.
data.principale object The four headline rates — deposits and loans, outstanding and new — plus marja. Never filtered.
data.principale.depozite_sold object
data.principale.depozite_noi object
data.principale.credite_sold object
data.principale.credite_noi object
data.principale.marja object New loans − new deposits, in percentage points, from the same month.
data.filtre array The filters actually applied, as the route understood them — useful when a value was normalised.
data.serii[].cod string Code from the source code list — the key you filter on.
data.serii[].denumire string The name, exactly as the source publishes it.
data.serii[].tip string credite or depozite, derived from the name.
data.serii[].moment string sold or nou.
data.serii[].sector null gospodarii, societati, or null for aggregates across all sectors.
data.serii[].dae null consum or locuinte for dimensions carrying the annual percentage rate. null for the rest.
data.serii[].are_date boolean false for dimensions the NBR does not publish for the requested currency.
data.serii[].valori object One value per month. null = not published that month, not zero.
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.luni integer Number of months covered.
meta.dimensiuni integer
meta.dimensiuni_returnate integer
meta.dimensiuni_fara_date integer
meta.nota_masura string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_unitate string What to know about the unit of measure before comparing or summing values.
meta.nota_marja string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_dae string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_fatete string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_acoperire string Why the total is a lower bound, in prose. meta.total_e_limita_de_jos is the word to switch on in code.
meta.nota_filtre string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_null string Why some values are missing: the source did not publish, did not compute, or suppressed them.
meta.calculator string
meta.fara_date data is null and this says why. No values in the database for the requested currency. The interval falls entirely outside the coverage. It overlaps the coverage but holds no values.
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/dobanzi-bancare
{
    "data": {
        "masura": "rata",
        "moneda": "lei",
        "cod_moneda": "RON",
        "unitate": "procent_pe_an",
        "de_la": "2026-07",
        "pana_la": "2026-07",
        "perioade": [
            "2026-07"
        ],
        "principale": {
            "depozite_sold": {
                "2026-07": "5.15"
            },
            "depozite_noi": {
                "2026-07": "5.29"
            },
            "credite_sold": {
                "2026-07": "8.09"
            },
            "credite_noi": {
                "2026-07": "8.10"
            },
            "marja": {
                "2026-07": "2.81"
            }
        },
        "filtre": [],
        "serii": [
            {
                "cod": "N14RL_DS",
                "denumire": "Depozite la termen existente în sold",
                "tip": "depozite",
                "moment": "sold",
                "sector": null,
                "dae": null,
                "are_date": true,
                "valori": {
                    "2026-07": "5.15"
                }
            }
        ]
    },
    "meta": {
        "sursa": "BNR — ratele dobânzii la credite şi depozite, serii lunare (clasa 580).",
        "acoperire": {
            "de_la": "2007-01",
            "pana_la": "2026-07"
        },
        "luni": 1,
        "dimensiuni": 57,
        "dimensiuni_returnate": 57,
        "dimensiuni_fara_date": 2,
        "nota_masura": "Aceiaşi indicatori au şi o măsură de volum: `masura=volum` dă câţi bani s-au acordat sau depus, în loc de la ce dobândă.",
        "nota_unitate": "Ratele sunt procent pe an, aceeaşi unitate pe toate monedele.",
        "nota_marja": "`marja` e calculată de noi: credite noi minus depozite noi, din valori din ACEEAŞI lună. Seriile au acoperiri diferite, iar o marjă făcută din ultima valoare a fiecăreia ar scădea cifre din luni diferite. Unde o componentă lipseşte, marja e `null`.",
        "nota_dae": "Dimensiunile marcate cu `dae` poartă dobânda anuală efectivă — cifra obligatorie legal către consumator, nu rata nominală. Diferă real: 10,5% faţă de 9,57% la creditele de consum în lei.",
        "nota_fatete": "`tip`, `moment` şi `sector` sunt derivate din denumirile sursei, care n-are capete de tabel pentru clasa asta. La `sector`, `null` înseamnă agregat pe toate sectoarele, nu clasificare ratată.",
        "nota_acoperire": "Acoperirea diferă între monede: 55 de dimensiuni au date în lei, 53 în euro, 41 în dolari. `are_date` o spune pe fiecare.",
        "nota_filtre": "Filtrele restrâng `serii`, nu `principale`: marja rămâne calculabilă indiferent ce s-a filtrat.",
        "nota_null": "`null` într-o lună înseamnă că dimensiunea n-a fost publicată atunci, nu zero.",
        "calculator": "/financiar/v1/calcul/rata-credit"
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareinterval_prea_lung beyond 120 months, or filters outside the lists. moneda_necunoscuta — the NBR publishes only lei, euro and dollars.
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": "interval_prea_lung beyond 120 months, or filters outside the lists. moneda_necunoscuta — the NBR publishes only lei, euro and dollars.",
        "detalii": {
            "masura": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}