oneapi
Sign in
Financiar v1 / Credit

Loan amortisation schedule

The monthly schedule of a loan: principal, interest and remaining balance, with a fixed or indexed rate (IRCC or ROBOR + margin).

The rate is not a single figure applied throughout. It is resolved month by month from the real data — daily ROBOR since 1995, IRCC since 2018 — and whatever falls beyond the coverage is flagged proiectat: true, on every row. A calculator that freezes the index produces, for the past portion, figures that never happened: plausible and false.

IRCC changes quarterly, with a lag: the rate for quarter Q is the average of quarter Q−2 — the same rule as at /ircc, verified on 30 quarters out of 30. ROBOR resets at the index maturity counted from the disbursement date, with the quotation of the last banking day before the reset. Every row says which value it used and from which day.

The APR is not computed and is explicitly null: it requires fees, insurance and origination costs, which we do not have. A figure called APR without them would be lower than the real one and would look official.

GET
https://oneapi.ro/api/financiar/v1/calcul/rata-credit

Query parameters

NameTypeDescriptionAccepted values
sumarequired string Required. The principal, decimal point, at most 2 decimals. e.g. 200000e.g. 100000
lunirequired integer Required, 1–480 (forty years). 1 – 480
de_laoptional string | null Optional, YYYY-MM-DD. The drawdown date; defaults to today. Reported in meta.implicit when filled in by the server. e.g. 2026-10-07
tipoptional string | null anuitate (default, equal monthly instalment) or principal_egal (declining instalments). anuitateprincipal_egal
bazaoptional string | null efectiva (default, actual days / 365) or 30/360. efectiva30/360
dobandaoptional string | null The fixed rate, percent per annum. Excludes index and marja. e.g. 6.5
indexoptional string | null ircc, robor1m, robor3m, robor6m or robor12m. Requires marja. irccrobor1mrobor3mrobor6mrobor12m
marjaoptional string | null The bank's margin, percentage points over the index. Zero is a valid value. e.g. 2.5e.g. 2

How it behaves

  • The monthly schedule of a loan: principal, interest and remaining balance, with a fixed or indexed rate (IRCC or ROBOR + margin).
  • The rate is not a single figure applied across the whole term. It is resolved month by month from REAL data — daily ROBOR since 1995, IRCC since 2018 — and whatever falls beyond coverage is marked proiectat: true, on every row. A calculator that freezes the index produces, for the past portion, figures that never happened: plausible and false.
  • The common case is neither purely past ("what did I pay") nor purely future ("what will I pay"), but a loan in progress — half the schedule real, half projected. meta.luni_reale and meta.luni_proiectate give the split; luni_proiectate: 0 is present even when nothing is projected, because "zero" is information.
  • IRCC changes quarterly, with a lag: the rate of quarter Q is the average of quarter Q−2 — the same rule as /ircc, verified across all 30 published quarters. A schedule that takes the value labelled with the current quarter uses the rate of the wrong quarter.
  • ROBOR resets at the index TENOR, not monthly. A loan indexed to ROBOR 3M changes its rate every three months, counted from the drawdown date, using the quote of the last banking day before the reset. Re-read every month, the schedule would track the index far more closely than a real contract does — on RON 250,000 over 24 months, the measured difference is RON 825. Every row declares resetare_la, din_ziua and how many months the quote holds.
  • The difference between indices is real, not theoretical: the same RON 250,000 loan over 24 months, starting in January 2022, costs RON 20,435 in interest on ROBOR 3M + 2 and RON 13,736 on IRCC + 2. The IRCC two-quarter lag was worth nearly RON 6,700 during a period of rising rates.
  • Conventions, declared in the response: actual calendar days over a 365-day year (366 when the period spans 29 February), or 30/360 on request. With an annuity, the monthly instalment is RECOMPUTED at every rate change, over the remaining balance and months — exactly what a bank does at an index reset. The calculation is in exact decimal arithmetic; rounding to the cent happens only for display, and the final instalment closes the balance exactly.
  • The annual percentage rate (DAE) is not computed and is declared absent. It requires fees, insurance and origination costs, which are not in our data. A figure labelled DAE without them would be lower than the real one and would look official.
  • The rate is given in exactly one of two forms: a fixed dobanda OR index + marja. With both, it is unclear which rule wins; with neither, there is nothing to compute.

What it is for

  • Reconstructing what was actually paid on a loan taken in the past.
  • Comparing an IRCC loan with a ROBOR loan over the same real period.
  • Simulating a new loan, with the projected part marked as such.
  • Checking the schedule received from a bank.

Response structure

FieldTypeDescription
data.suma string Sum of the values, in the unit indicated alongside.
data.luni integer Number of months covered.
data.de_la string Start of the interval the response covers.
data.pana_la string End of the interval the response covers, inclusive.
data.tip string intreprinderi or unitati_locale — two different concepts, never summed.
data.baza_zile string
data.dobanda.fel string
data.dobanda.valoare string The value published by the source for the combination above.
data.total_principal string
data.total_dobanda string Total interest over the whole term.
data.total_platit string
data.rate[].numar integer Number of items counted.
data.rate[].de_la string Start of the covered interval.
data.rate[].pana_la string End of the covered interval, inclusive.
data.rate[].zile integer The days actually used to compute that month's interest.
data.rate[].rata_dobanzii string The annual rate applied to that month — index plus margin, or the fixed rate.
data.rate[].sursa_ratei object Where the rate comes from: for ROBOR, the index value, the quote day, the reset date and how many months it holds; for IRCC, the applicable quarter and the one it was computed from.
data.rate[].sursa_ratei.fel string
data.rate[].proiectat boolean true when the month is in the future and the index is frozen at the last known value.
data.rate[].principal string
data.rate[].dobanda string
data.rate[].total_plata string
data.rate[].sold_ramas string The balance after the payment. The final month closes it exactly at zero.
meta.sursa string The official source the data comes from, with its licence where one is required.
meta.luni_reale integer How many months use real index values.
meta.luni_proiectate integer How many months are projected. Present even when 0.
meta.conventii.baza_zile string
meta.conventii.rotunjire string
meta.conventii.anuitate string
meta.dae string Deliberately absent, with the reason — see the note.
meta.implicit.de_la string Start of the covered interval.
meta.fara_date data is null and this says why. No values for the requested index at the schedule dates (IRCC applies from Q2 2019, ROBOR from August 1995).
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/calcul/rata-credit?suma=200000&luni=360&dobanda=6.5
{
    "data": {
        "suma": "200000.00",
        "luni": 360,
        "de_la": "2026-10-07",
        "pana_la": "2056-10-06",
        "tip": "anuitate",
        "baza_zile": "efectiva",
        "dobanda": {
            "fel": "fixa",
            "valoare": "6.50"
        },
        "total_principal": "200000.00",
        "total_dobanda": "255376.09",
        "total_platit": "455376.09",
        "rate": [
            {
                "numar": 1,
                "de_la": "2026-10-07",
                "pana_la": "2026-11-06",
                "zile": 31,
                "rata_dobanzii": "6.50",
                "sursa_ratei": {
                    "fel": "fixa"
                },
                "proiectat": false,
                "principal": "160.03",
                "dobanda": "1104.11",
                "total_plata": "1264.14",
                "sold_ramas": "199839.97"
            }
        ]
    },
    "meta": {
        "sursa": "Calcul propriu; dobânda e cea dată de client.",
        "luni_reale": 360,
        "luni_proiectate": 0,
        "conventii": {
            "baza_zile": "Zile calendaristice efective, an de 365 (366 când perioada cuprinde 29 februarie).",
            "rotunjire": "Calculul e în aritmetică zecimală exactă; rotunjirea la doi bani se face doar la afişare. Ultima rată închide soldul exact.",
            "anuitate": "Rata lunară se recalculează la fiecare schimbare de dobândă, pe soldul şi lunile rămase — ca la o bancă, la resetarea indicelui."
        },
        "dae": "Nu se calculează: cere comisioane, asigurări şi costuri de acordare, care nu sunt în datele noastre.",
        "implicit": {
            "de_la": "2026-10-07"
        }
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareInvalid amount or term; missing, doubled, or margin-less rate rule; unknown index.
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": "Invalid amount or term; missing, doubled, or margin-less rate rule; unknown index.",
        "detalii": {
            "suma": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}