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.
Query parameters
YYYY-MM-DD. The drawdown date; defaults to today. Reported in meta.implicit when filled in by the server.
e.g. 2026-10-07
anuitate (default, equal monthly instalment) or principal_egal (declining instalments).
anuitateprincipal_egal
efectiva (default, actual days / 365) or 30/360.
efectiva30/360
index and marja.
e.g. 6.5
ircc, robor1m, robor3m, robor6m or robor12m. Requires marja.
irccrobor1mrobor3mrobor6mrobor12m
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_realeandmeta.luni_proiectategive the split;luni_proiectate: 0is 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_ziuaand 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/360on 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
dobandaORindex+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
intreprinderi or unitati_locale — two different concepts, never summed.
true when the month is in the future and the index is frozen at the last known value.
0.
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).
fara_date is prose and may be rephrased, this is not.
Response examples
{
"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"
}
}
}
{
"data": {
"suma": "200000.00",
"luni": 360,
"de_la": "2026-10-07",
"pana_la": "2056-10-06",
"tip": "anuitate",
"baza_zile": "efectiva",
"dobanda": {
"fel": "indexata",
"index": "ircc",
"marja": "2.50"
},
"total_principal": "200000.00",
"total_dobanda": "332244.35",
"total_platit": "532244.35",
"rate": [
{
"numar": 1,
"de_la": "2026-10-07",
"pana_la": "2026-11-06",
"zile": 31,
"rata_dobanzii": "8.07",
"sursa_ratei": {
"index": "ircc",
"valoare_index": "5.57",
"trimestru": "2026-T4",
"calculat_din": "2026-T2"
},
"proiectat": false,
"principal": "106.51",
"dobanda": "1370.79",
"total_plata": "1477.30",
"sold_ramas": "199893.49"
}
]
},
"meta": {
"sursa": "BNR — serii zilnice ROBOR / IRCC din baza de date interactivă.",
"luni_reale": 1,
"luni_proiectate": 359,
"nota_proiectie": "359 luni din grafic sunt PROIECTATE: indicele viitor nu se ştie, iar acele rânduri folosesc ultima valoare cunoscută, îngheţată. Sunt marcate cu `proiectat: true`.",
"nota_reala": "1 luni folosesc valorile REALE ale indicelui de la datele respective, nu o medie sau o valoare îngheţată.",
"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"
}
}
}
{
"data": {
"suma": "200000.00",
"luni": 240,
"de_la": "2026-10-07",
"pana_la": "2046-10-06",
"tip": "principal_egal",
"baza_zile": "efectiva",
"dobanda": {
"fel": "fixa",
"valoare": "6.50"
},
"total_principal": "200000.00",
"total_dobanda": "130627.63",
"total_platit": "330627.63",
"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": "833.33",
"dobanda": "1104.11",
"total_plata": "1937.44",
"sold_ramas": "199166.67"
}
]
},
"meta": {
"sursa": "Calcul propriu; dobânda e cea dată de client.",
"luni_reale": 240,
"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": "Principalul e constant; rata scade pe măsură ce scade soldul."
},
"dae": "Nu se calculează: cere comisioane, asigurări şi costuri de acordare, care nu sunt în datele noastre.",
"implicit": {
"de_la": "2026-10-07"
}
}
}
{
"data": {
"suma": "100000.00",
"luni": 60,
"de_la": "2026-10-07",
"pana_la": "2031-10-06",
"tip": "anuitate",
"baza_zile": "30/360",
"dobanda": {
"fel": "indexata",
"index": "robor3m",
"marja": "2.00"
},
"total_principal": "100000.00",
"total_dobanda": "21199.44",
"total_platit": "121199.44",
"rate": [
{
"numar": 1,
"de_la": "2026-10-07",
"pana_la": "2026-11-06",
"zile": 30,
"rata_dobanzii": "7.84",
"sursa_ratei": {
"index": "robor3m",
"valoare_index": "5.84",
"din_ziua": "2026-09-21",
"resetare_la": "2026-10-07",
"tine_luni": 3
},
"proiectat": false,
"principal": "1366.66",
"dobanda": "653.33",
"total_plata": "2019.99",
"sold_ramas": "98633.34"
}
]
},
"meta": {
"sursa": "BNR — serii zilnice ROBOR / IRCC din baza de date interactivă.",
"luni_reale": 1,
"luni_proiectate": 59,
"nota_proiectie": "59 luni din grafic sunt PROIECTATE: indicele viitor nu se ştie, iar acele rânduri folosesc ultima valoare cunoscută, îngheţată. Sunt marcate cu `proiectat: true`.",
"nota_reala": "1 luni folosesc valorile REALE ale indicelui de la datele respective, nu o medie sau o valoare îngheţată.",
"conventii": {
"baza_zile": "Fiecare lună are 30 de zile, anul are 360.",
"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
| Code | Slug | When it occurs |
|---|---|---|
| 401 | neautentificat | Token missing, invalid, expired or revoked. |
| 403 | feature_indisponibil | The current plan does not include the feature the route depends on. |
| 422 | validare | Invalid amount or term; missing, doubled, or margin-less rate rule; unknown index. |
| 429 | cota_depasita | The 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."
]
}
}
}