oneapi
Sign in
Financiar v1 / Calcul

Late-payment interest, general regime

The statutory penalty interest due on an unpaid amount, under Government Ordinance 13/2011: the reference rate plus 4 percentage points, with neprofesional=1 for the 20% reduction in art. 3(3).

The period is sliced at every NBR monetary policy decision and at every calendar year boundary, and the response shows each slice with the days, the rate and the base used.

For relations between professionals, Law 72/2013 applies, with a different margin and a different anchoring: /calcul/penalitati/profesionisti.

GET
https://oneapi.ro/api/financiar/v1/calcul/penalitati/civile

Query parameters

NameTypeDescriptionAccepted values
sumarequired string Required. The unpaid debt, positive, at most 2 decimals. e.g. 1000e.g. 2500.75e.g. 5000
scadentarequired string Required, YYYY-MM-DD. The day the amount was due; interest runs from the following day. e.g. 2024-06-15e.g. 2023-01-15
pana_laoptional string | null Optional, defaults to the current day. Cannot be in the future. e.g. 2024-01-15
neprofesionaloptional boolean | null With 1, the rate is reduced by 20% (art. 3(3)). e.g. true

How it behaves

  • ⚠️ A due date falling on a non-working day is postponed. Article 2554 of the Civil Code: a term expiring on a non-working day is deemed to expire at the end of the first working day that follows. A due date of 25 December 2024 therefore moves to 27 December, and interest runs from the 28th, not the 26th. When it applied, the response carries scadenta_prorogata; otherwise the field is absent.
  • The statutory penalty interest owed on an unpaid amount, from the due date up to a given date.
  • The rate is the one in GO 13/2011 art. 3(2): the NBR reference plus 4 percentage points. With neprofesional=1 the 20% reduction under art. 3(3) applies, for relations not arising from the operation of a for-profit undertaking.
  • The period is cut at two kinds of points, and both are necessary: at every NBR monetary policy DECISION, because the rate changes, and at every calendar YEAR boundary, because the denominator changes (366 in a leap year). Slicing only on rates would mix 365- and 366-day bases within one term; slicing only on years would apply an old rate after NBR had changed it. Both mistakes produce plausible figures.
  • Each slice is shown with its days, the reference, the rate applied, the day basis and its own interest — the result can be redone with pencil and paper.
  • The conventions, verified: calendar days, starting the day AFTER the due date; interest = amount × rate × days / days_in_year; SIMPLE interest, without compounding, because art. 8 of GO 13/2011 prohibits anatocism.
  • Rounding happens once, at the end. The slices shown are rounded to the cent and may not add up exactly to the total, by one cent; the dobanda_exacta on each slice adds up exactly to penalitati_exacte.
  • Periods starting before 2011-09-01 are refused: at that time the reference rate was the official discount rate, a distinct series. The policy rate is not extrapolated backwards.
  • For relations between professionals, Law 72/2013 applies, with a different margin and different anchoring — see /calcul/penalitati/profesionisti.

What it is for

  • Interest on an amount owed between private individuals.
  • Statutory interest in a civil dispute.

Response structure

FieldTypeDescription
data.debit string The principal the interest is computed on, as submitted.
data.scadenta string
data.scadenta_prorogata string
data.de_la string Start of the interval the response covers.
data.pana_la string End of the interval the response covers, inclusive.
data.zile integer Number of days covered.
data.regim string The regime applied: profesionisti.
data.neprofesional boolean Whether the reduction for non-professional relationships was applied.
data.penalitati string Total interest, rounded to the cent.
data.penalitati_exacte string Unrounded interest — the exact sum of the slices.
data.total string Debt plus interest.
data.perioade[].de_la string Start of the covered interval.
data.perioade[].pana_la string End of the covered interval, inclusive.
data.perioade[].zile integer Number of days covered.
data.perioade[].referinta string The central bank reference rate in force for the slice.
data.perioade[].rata string Rate, expressed as a percentage.
data.perioade[].baza_zile_an integer 365 or 366, depending on the year the slice falls in.
data.perioade[].dobanda string Interest for the slice, rounded.
data.perioade[].dobanda_exacta string The unrounded value of the slice. These add up to penalitati_exacte.
meta.temei string The legal basis for the values or for the way they are computed.
meta.feliere string Why the interval is cut where it is cut.
meta.convenții.zile string Number of days covered.
meta.convenții.baza string
meta.convenții.capitalizare string
meta.convenții.rotunjire string
meta.atentie string
meta.avertisment string A warning about a limit of the data that changes its interpretation.
meta.fara_date data is null and this says why. The rate is missing for part of the requested period.
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/penalitati/civile?suma=1000&scadenta=2024-06-15
{
    "data": {
        "debit": "1000.00",
        "scadenta": "2024-06-15",
        "scadenta_prorogata": "2024-06-17",
        "de_la": "2024-06-18",
        "pana_la": "2026-10-07",
        "zile": 842,
        "regim": "civila",
        "neprofesional": false,
        "penalitati": "242.55",
        "penalitati_exacte": "242.5493113255",
        "total": "1242.55",
        "perioade": [
            {
                "de_la": "2024-06-18",
                "pana_la": "2024-07-07",
                "zile": 20,
                "referinta": "7.00",
                "rata": "11.00",
                "baza_zile_an": 366,
                "dobanda": "6.01",
                "dobanda_exacta": "6.0109289617"
            }
        ]
    },
    "meta": {
        "temei": "OG 13/2011 art. 3 alin. (2): rata de referinţă plus 4 puncte procentuale",
        "feliere": "Perioada e tăiată la fiecare decizie de politică monetară a BNR şi la fiecare graniţă de an calendaristic.",
        "convenții": {
            "zile": "Calendaristice, din ziua următoare scadenţei până la data cerută inclusiv.",
            "baza": "365 de zile, sau 366 în anii bisecţi — de aceea perioada se taie şi la graniţa de an.",
            "capitalizare": "Niciuna. Dobânda se calculează pe debitul iniţial: art. 8 OG 13/2011 interzice anatocismul.",
            "rotunjire": "O singură dată, la final. Feliile afişate sunt rotunjite la doi bani şi pot să nu se adune exact la total; `dobanda_exacta` de pe fiecare felie se adună exact la `penalitati_exacte`."
        },
        "atentie": "În raporturile dintre profesionişti şi între aceştia şi autorităţile contractante se aplică Legea 72/2013 — referinţă + 8 puncte, cu rata ancorată la prima zi a semestrului. Vezi /financiar/v1/calcul/penalitati/profesionisti.",
        "avertisment": "Rezultatul e un calcul aritmetic pe date publice, nu o consultanţă juridică: regimul aplicabil, data scadenţei şi eventualele clauze contractuale de penalitate le stabileşte cine cunoaşte dosarul."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
404alt_regim_juridicThe period starts before 2011-09-01.
422validareMalformed amount, due date missing or in the future, pana_la before the due date or in the future.
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": "Malformed amount, due date missing or in the future, pana_la before the due date or in the future.",
        "detalii": {
            "suma": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}