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.
Corpul cererii
Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.
AAAA-LL-ZZ; implicit ziua curentă. Determină toate cotele folosite.
intreaga (implicit) ori partiala.
intreagapartiala
it, constructii, agroalimentar. Trebuie să fie activă la data cerută.
{
"brut": 5000
}
{
"brut": 4000,
"persoane_intretinere": 2
}
{
"brut": 4050
}
{
"brut": 15000,
"facilitate": "it",
"la_data": "2023-06-15"
}
{
"brut": 2500,
"norma": "partiala"
}
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
GETar ajunge în logurile de acces ale serverului, în istoricul browserului şi în antetulRefereral 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:
netvinenullşi alături stănet_intervalcu 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, înmeta, 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.avertismentece 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
meta.total_e_limita_de_jos e cuvântul pe care comuţi în cod.
net e null.
scade_din_baza_impozabila la deducerea personală, scade_din_toate_bazele la partea netaxabilă din salariul minim.
data e null, iar aici stă motivul. Cotele nu acoperă data cerută; răspunsul spune ce lipseşte. Sectorul n-are facilitate activă atunci.
fara_date e proză şi se poate reformula, ăsta nu.
Exemple de răspuns
body: {"brut": 5000}
{
"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."
}
}
body: {"brut": 4000, "persoane_intretinere": 2}
{
"data": {
"brut": 4000,
"net": 2470,
"la_data": "2026-10-07",
"facilitate": null,
"componente": [
{
"cod": "cas",
"denumire": "Contribuţia de asigurări sociale",
"baza_de_calcul": 4000,
"cota": "25%",
"valoare": 1000,
"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."
}
}
body: {"brut": 4050}
{
"data": {
"brut": 4050,
"net": 2455,
"la_data": "2026-10-07",
"facilitate": null,
"componente": [
{
"cod": "cas",
"denumire": "Contribuţia de asigurări sociale",
"baza_de_calcul": 4050,
"cota": "25%",
"valoare": 1013,
"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."
}
}
body: {"brut": 15000, "facilitate": "it", "la_data": "2023-06-15"}
{
"data": {
"brut": 15000,
"net": 9425,
"la_data": "2023-06-15",
"facilitate": {
"sector": "it",
"denumire": "Scutire de impozit pe venit pentru crearea de programe pentru calculator",
"act_normativ": "OG 16/2022, art. I pct. 24 (modifică art. 60 pct. 2 din Legea 227/2015), aplicabil veniturilor din ianuarie 2023",
"de_verificat": false
},
"componente": [
{
"cod": "cas",
"denumire": "Contribuţia de asigurări sociale",
"baza_de_calcul": 15000,
"cota": "25%",
"valoare": 3750,
"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.",
"avertismente": [
"Brutul depăşeşte plafonul facilităţii (10000 lei). Partea de deasupra nu beneficiază de nicio facilitate: se impozitează şi poartă cotele generale de CAS şi CASS, în timp ce partea de dedesubt păstrează cotele facilităţii. Baza impozabilă a părţii de deasupra e calculată scăzând contribuţiile aferente ei — interpretare a textului, nu citat din el."
],
"nota_acoperire": "Ce e acoperit şi ce nu: /financiar/v1/fiscal/acoperire."
}
}
body: {"brut": 2500, "norma": "partiala"}
{
"data": {
"brut": 2500,
"net": 1549,
"la_data": "2026-10-07",
"facilitate": null,
"componente": [
{
"cod": "cas",
"denumire": "Contribuţia de asigurări sociale",
"baza_de_calcul": 2500,
"cota": "25%",
"valoare": 625,
"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.",
"avertismente": [
"Norma parţială e declarată, dar brutul trimis e luat ca atare: sursa nu dă o regulă de proratare a deducerii personale pe fracţiune de normă, aşa că nu inventăm una."
],
"nota_acoperire": "Ce e acoperit şi ce nu: /financiar/v1/fiscal/acoperire."
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă sau invalid. |
| 403 | feature_indisponibil | financiar.fiscal_calcul nu e în planul curent. |
| 422 | deducere_neacoperita | 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. |
| 429 | cota_depasita | Cota 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."
}
}