oneapi
Autentificare
Financiar v1 / Fiscal

Salariu brut la net

Netul care rămâne dintr-un brut, cu descompunerea pe componente: fiecare contribuţie separat,
cu baza ei de calcul, cota aplicată şi actul normativ al cotei. Un contabil nu poate folosi un
număr pe care nu-l poate justifica.

⚠️ POST, nu GET, şi cu retenţie zero. Intrarea e salariul cuiva: într-un GET ar ajunge în
logurile de acces, în istoricul browserului şi în antetul Referer. Nimic din ce trimiţi nu se
scrie nicăieri — nici în bază, nici în cache, nici în log.

⚠️ Ordinea contează şi rotunjirea şi ea. CAS şi CASS se calculează pe brutul întreg, fiecare
rotunjit separat la leu; abia apoi se scade deducerea personală şi se aplică impozitul. Rotunjită
doar la sfârşit, cifra iese cu un leu diferit faţă de fluturaş la o parte din salarii.

⚠️ Deducerea personală e acoperită pe toată grila din art. 77 alin. (4) — cele 41 de tranşe,
pe cinci coloane de persoane în întreţinere, transcrise de pe portalul legislativ. Tranşa se alege
după cât depăşeşte brutul salariul minim, iar procentul se aplică la salariul minim, nu la brut.
Peste salariul minim + 2.000 de lei deducerea e zero prin lege.

⚠️ Dacă totuşi o tranşă ar lipsi — azi nu lipseşte niciuna — răspunsul nu presupune zero, ci
întoarce un interval: net vine null şi alături stă net_interval cu capetele, care rămân
exacte. Mecanismul e păstrat ca plasă de siguranţă, nu fiindcă ar fi nevoie de el.

⚠️ Dacă vreo cotă folosită e marcată de_verificat, răspunsul o spune la nivel de răspuns,
nu îngropat în descompunere.

POST
https://oneapi.ro/api/financiar/v1/calcul/salariu/brut-la-net

Corpul cererii

Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.

NumeTipDescriereValori acceptate
brutobligatoriu integer | null Obligatoriu, în lei întregi. 1 – 100000000
la_dataopțional string | null Opţional, AAAA-LL-ZZ; implicit ziua curentă. Determină toate cotele folosite.
normaopțional string | null Opţional: intreaga (implicit) ori partiala. intreagapartiala
facilitateopțional string | null Opţional: it, constructii, agroalimentar. Trebuie să fie activă la data cerută.
persoane_intretinereopțional integer | null Opţional, 0-20; peste 4 se aplică tot pragul de 4, ca în lege. 0 – 20
deducere_personalaopțional integer | null Opţional, în lei. Portiţa pentru tranşa netranscrisă: dacă o dai, se foloseşte ca atare. 0 – 100000
5.000 lei brut Corpul cererii
{
    "brut": 5000
}
Cu două persoane în întreţinere Corpul cererii
{
    "brut": 4000,
    "persoane_intretinere": 2
}
Salariul minim Corpul cererii
{
    "brut": 4050
}
Cu scutirea IT, în 2023 Corpul cererii
{
    "brut": 15000,
    "facilitate": "it",
    "la_data": "2023-06-15"
}
Normă parţială Corpul cererii
{
    "brut": 2500,
    "norma": "partiala"
}

Parametri de interogare

Ruta nu acceptă parametri de interogare.

Cum se comportă

  • Netul care rămâne dintr-un brut, cu descompunerea pe componente: fiecare contribuţie separat, cu baza ei de calcul, cota aplicată şi actul normativ al cotei. Un contabil nu poate folosi un număr pe care nu-l poate justifica, deci descompunerea nu e opţională.
  • ⚠️ POST, nu GET, şi cu retenţie zero. Intrarea e salariul cuiva: într-un GET ar ajunge în logurile de acces ale serverului, în istoricul browserului şi în antetul Referer al paginii următoare. Nimic din ce trimiţi nu se scrie nicăieri — nici în bază, nici în cache, nici în log.
  • ⚠️ Ordinea contează, şi rotunjirea la fel. CAS şi CASS se calculează pe brutul întreg, fiecare rotunjit separat la leu; abia apoi se scade deducerea personală şi se aplică impozitul pe ce rămâne. Rotunjită doar la sfârşit, cifra iese cu un leu diferit faţă de fluturaş la o parte din salarii.
  • ⚠️ Deducerea personală e acoperită pe toată grila. Tabelul din art. 77 alin. (4) — un rând pentru venitul până la salariul minim şi 41 de tranşe din 50 în 50 de lei peste el, pe cinci coloane de persoane în întreţinere — e transcris de pe portalul legislativ. Tranşa se alege după cât depăşeşte brutul salariul minim, iar procentul se aplică la salariul minim, nu la brut. Peste salariul minim + 2.000 de lei deducerea e zero prin lege. Exemplu verificabil de mână: brut 4.500 lei la 1 martie 2025, salariul minim 4.050, deci 450 lei peste el → tranşa +401..+450 → 15,5% × 4.050 = 628 lei deducere, iar netul iese 2.695 lei.
  • ⚠️ Dacă totuşi o tranşă ar lipsi — azi nu lipseşte niciuna — răspunsul nu presupune zero, ci întoarce un interval: net vine null şi alături stă net_interval cu capetele, care rămân exacte, iar contribuţiile rămân cifre. Mecanismul e păstrat ca plasă de siguranţă.
  • ⚠️ Dacă vreo valoare folosită e marcată de_verificat, răspunsul o spune la nivel de răspuns, în meta, nu îngropat în descompunere.
  • ⚠️ Facilitatea cu plafon (IT, construcţii şi agroalimentar, din ianuarie 2023): legea spune că „partea din venitul brut lunar ce depăşeşte plafonul nu beneficiază de facilităţi fiscale" — la plural. Deci partea de deasupra se impozitează şi poartă cotele generale de CAS şi CASS, în timp ce partea de dedesubt păstrează cota redusă ori scutirea. Interpretarea aplicată bazei impozabile a părţii de deasupra e semnalată în răspuns, fiindcă e o interpretare, nu un text citat.
  • ⚠️ Partea netaxabilă din salariul minim (200 ori 300 de lei, după perioadă) se scade din TOATE bazele — impozit, CAS, CASS —, nu doar din cea impozabilă. Fără ea, netul la salariul minim ieşea mai mic cu circa 80 de lei. Condiţiile legii privesc contractul (salariu de bază exact la minimul garantat, normă întreagă, funcţia de bază), iar cererea conţine doar brutul lunar: ruta aplică regula când brutul e între salariul minim şi plafonul perioadei şi spune în meta.avertismente ce a presupus. Verificabil: la 4.050 lei brut în martie 2025 netul e 2.574 lei; la 4.325 lei în septembrie 2026, 2.699 lei.

La ce folosește

  • Netul unui salariu la o dată din trecut, cu justificarea fiecărei reţineri.
  • Verificarea unui fluturaş de salariu, componentă cu componentă.
  • Efectul unei facilităţi sectoriale asupra netului, la aceeaşi valoare brută.

Structura răspunsului

CâmpTipDescriere
data.brut integer Cel mai mic brut întreg care dă exact netul cerut.
data.net integer Poziţia netă calculată: totalul activelor minus totalul pasivelor.
data.la_data string Data la care sunt valabile valorile întoarse.
data.facilitate null
data.componente[].cod string Codul din nomenclatorul sursei — cheia pe care se filtrează.
data.componente[].denumire string Denumirea, aşa cum o publică sursa.
data.componente[].baza_de_calcul integer Suma pe care s-a aplicat cota — la impozit e baza impozabilă, nu brutul.
data.componente[].cota string
data.componente[].valoare integer Valoarea publicată de sursă pentru combinaţia de mai sus.
data.componente[].act_normativ string Temeiul cotei aplicate componentei.
data.componente[].de_verificat boolean
meta.sursa string Sursa oficială din care vin datele, cu licenţa ei acolo unde e cerută.
meta.retentie string Confirmarea că intrarea nu s-a scris nicăieri.
meta.nota_acoperire string De ce totalul e o limită de jos, în proză. meta.total_e_limita_de_jos e cuvântul pe care comuţi în cod.
meta.de_verificat Ce valori folosite nu sunt confirmate legal. Gol înseamnă că toate sunt.
data.net_interval Prezent doar când deducerea cade în tranşa netranscrisă: capetele între care stă sigur netul. Când e prezent, net e null.
data.componente[].valoare_interval Acelaşi lucru pe componentă — apare doar la cele care depind de deducere.
data.componente[].semn scade_din_baza_impozabila la deducerea personală, scade_din_toate_bazele la partea netaxabilă din salariul minim.
meta.fara_date data e null, iar aici stă motivul. Cotele nu acoperă data cerută; răspunsul spune ce lipseşte. Sectorul n-are facilitate activă atunci.
meta.fara_date_cod Cuvântul scurt şi STABIL al motivului, pentru clienţii care comută pe el în cod: fara_date e proză şi se poate reformula, ăsta nu.

Exemple de răspuns

body: {"brut": 5000}

POSThttps://oneapi.ro/api/financiar/v1/calcul/salariu/brut-la-net
{
    "data": {
        "brut": 5000,
        "net": 2981,
        "la_data": "2026-10-07",
        "facilitate": null,
        "componente": [
            {
                "cod": "cas",
                "denumire": "Contribuţia de asigurări sociale",
                "baza_de_calcul": 5000,
                "cota": "25%",
                "valoare": 1250,
                "act_normativ": "Codul Fiscal art.138",
                "de_verificat": false
            }
        ]
    },
    "meta": {
        "sursa": "Cotele vin din registrul comun `business_indicatori_fiscali`; facilităţile şi grila deducerii, din `Modules/Financiar/resources/fiscal`, cu act normativ pe fiecare valoare.",
        "retentie": "Zero. Intrarea nu se scrie nicăieri — nici în bază, nici în cache, nici în log.",
        "nota_acoperire": "Ce e acoperit şi ce nu: /financiar/v1/fiscal/acoperire."
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă sau invalid.
403feature_indisponibilfinanciar.fiscal_calcul nu e în planul curent.
422deducere_neacoperitaDoar pentru la_data înainte de 2023, unde regimul deducerii nu e transcris. Din 2023 încoace grila e completă. brut_lipsa. Plus valori în afara formei aşteptate.
429cota_depasitaCota lunară a planului a fost depăşită (vezi Retry-After).

Toate erorile au aceeași formă. eroare.cod e stabil și e cel după care trebuie să ramifici în cod — nu după textul din mesaj, care se poate schimba.

{
    "eroare": {
        "cod": "deducere_neacoperita",
        "mesaj": "Doar pentru la_data înainte de 2023, unde regimul deducerii nu e transcris. Din 2023 încoace grila e completă. brut_lipsa. Plus valori în afara formei aşteptate."
    }
}