A month's working-time norm
The month's working days multiplied by the hours in a day — the figure from the timesheet and from the salary calculation. For 2026, private sector: 144 hours in January, 184 in July, 2,000 for the year.
Why it is not a field inside /zile-lucratoare: it has a different unit, and multiplying by 8 is not a formality — it is a convention (art. 112 of the Labour Code, 8 hours a day and 40 a week) that must be declared, not silently assumed inside a field bolted on elsewhere. That is why ore_pe_zi appears in the response.
And that is why it can be changed: a part-time contract — 4 or 6 hours — needs the same figure with a different multiplier. ore_pe_zi accepts any value between 1 and 24, and the one used always comes back in the response, so the result cannot be misread.
The public sector figure is provisional for future years, as in /calendar?an=: it depends on the bridge days set by Government Decision, and a year with no decision issued shows zero bridges — which does not mean there will be none. provizoriu declares it.
Both sectors come back anyway, plus the annual norm as a reference point and the breakdown the days follow from.
Query parameters
YYYY-MM (years 1990–2100). Without it, the current month.
e.g. 2024-05e.g. 2026-05
privat (default) or public. They differ by the government bridge days.
privatpublic
How it behaves
- The month's working days multiplied by the hours in a day — the figure used in timesheets and payroll. For 2026, private sector: 144 hours in January, 184 in July, 2,000 for the year.
- Why this is not a field on
/zile-lucratoare: it has a different unit, and multiplying by 8 is not a formality — it is a convention (art. 112 of the Labour Code, 8 hours a day and 40 a week) that must be stated, not silently assumed inside a field bolted onto something else. That is whyore_pe_zialways appears in the response. - And that is why it can be changed. A part-time contract — 4 or 6 hours — needs the same figure with a different multiplier; otherwise whoever holds one would redo the calculation from days themselves.
ore_pe_ziaccepts anything from 1 to 24, and the value used comes back in the response so the result cannot be misread. - The public-sector norm is PROVISIONAL for future years, as with
/calendar?an=: it depends on the bridge days set by government decision, and a year without one shows zero bridges — which does not mean there will be none.provizoriudeclares it. - For closed years the difference is real and visible: May 2024 has 160 hours in the private sector and 152 in the public one, from a single bridge day.
- Both sectors come back anyway, plus the annual norm as a reference and the breakdown the days come from: calendar days − weekends − holidays on working days − bridges.
What it is for
- The monthly norm for timesheets and payroll.
- Deriving an hourly wage from a monthly one, or the reverse.
- An hours budget for a team, with part-time contracts accounted for.
Response structure
0 with sector=privat.
true when the year is current or future and no bridge day has been published yet.
Response examples
{
"data": {
"an": 2026,
"luna": 10,
"perioada": "2026-10",
"de_la": "2026-10-01",
"pana_la": "2026-10-31",
"sector": "privat",
"ore_pe_zi": 8,
"zile_lucratoare": 22,
"ore_norma": 176,
"defalcare": {
"zile_calendaristice": 31,
"zile_weekend": 9,
"sarbatori_in_zile_lucratoare": 0,
"punti_hg_scazute": 0
},
"privat": {
"zile_lucratoare": 22,
"ore_norma": 176
},
"public": {
"zile_lucratoare": 22,
"ore_norma": 176
},
"anual": {
"zile_lucratoare": 250,
"ore_norma": 2000
},
"punti_stabilite": 0,
"provizoriu": true
},
"meta": {
"temei": "Art. 112 din Codul Muncii: durata normală a timpului de muncă e de 8 ore pe zi şi 40 pe săptămână. Sărbătorile legale: art. 139.",
"formula": "zile_lucratoare × ore_pe_zi. Zilele se obţin ca la /financiar/v1/zile-lucratoare: calendaristice − weekend − sărbători în zile lucrătoare − punţi.",
"nota_conventie": "Cele 8 ore pe zi sunt o convenţie declarată, nu o proprietate a lunii. Pentru normă parţială, dă `ore_pe_zi`; cifra folosită vine mereu în răspuns.",
"nota_sector": "Punţile de HG se aplică, de regulă, doar instituţiilor publice. `ore_norma` urmează `sector`; ambele variante vin oricum.",
"nota_provizoriu": "Pentru 2026 nu există încă nicio punte publicată prin HG, deci norma pe sectorul public coincide azi cu cea pe privat şi se poate schimba.",
"calendarul_anului": "/financiar/v1/calendar?an=2026"
}
}
{
"data": {
"an": 2024,
"luna": 5,
"perioada": "2024-05",
"de_la": "2024-05-01",
"pana_la": "2024-05-31",
"sector": "public",
"ore_pe_zi": 8,
"zile_lucratoare": 19,
"ore_norma": 152,
"defalcare": {
"zile_calendaristice": 31,
"zile_weekend": 8,
"sarbatori_in_zile_lucratoare": 3,
"punti_hg_scazute": 1
},
"privat": {
"zile_lucratoare": 20,
"ore_norma": 160
},
"public": {
"zile_lucratoare": 19,
"ore_norma": 152
},
"anual": {
"zile_lucratoare": 249,
"ore_norma": 1992
},
"punti_stabilite": 3,
"provizoriu": false
},
"meta": {
"temei": "Art. 112 din Codul Muncii: durata normală a timpului de muncă e de 8 ore pe zi şi 40 pe săptămână. Sărbătorile legale: art. 139.",
"formula": "zile_lucratoare × ore_pe_zi. Zilele se obţin ca la /financiar/v1/zile-lucratoare: calendaristice − weekend − sărbători în zile lucrătoare − punţi.",
"nota_conventie": "Cele 8 ore pe zi sunt o convenţie declarată, nu o proprietate a lunii. Pentru normă parţială, dă `ore_pe_zi`; cifra folosită vine mereu în răspuns.",
"nota_sector": "Punţile de HG se aplică, de regulă, doar instituţiilor publice. `ore_norma` urmează `sector`; ambele variante vin oricum.",
"calendarul_anului": "/financiar/v1/calendar?an=2024"
}
}
{
"data": {
"an": 2026,
"luna": 5,
"perioada": "2026-05",
"de_la": "2026-05-01",
"pana_la": "2026-05-31",
"sector": "privat",
"ore_pe_zi": 6,
"zile_lucratoare": 20,
"ore_norma": 120,
"defalcare": {
"zile_calendaristice": 31,
"zile_weekend": 10,
"sarbatori_in_zile_lucratoare": 1,
"punti_hg_scazute": 0
},
"privat": {
"zile_lucratoare": 20,
"ore_norma": 120
},
"public": {
"zile_lucratoare": 20,
"ore_norma": 120
},
"anual": {
"zile_lucratoare": 250,
"ore_norma": 1500
},
"punti_stabilite": 0,
"provizoriu": true
},
"meta": {
"temei": "Art. 112 din Codul Muncii: durata normală a timpului de muncă e de 8 ore pe zi şi 40 pe săptămână. Sărbătorile legale: art. 139.",
"formula": "zile_lucratoare × ore_pe_zi. Zilele se obţin ca la /financiar/v1/zile-lucratoare: calendaristice − weekend − sărbători în zile lucrătoare − punţi.",
"nota_conventie": "Cele 6 ore pe zi sunt o convenţie declarată, nu o proprietate a lunii. Pentru normă parţială, dă `ore_pe_zi`; cifra folosită vine mereu în răspuns.",
"nota_sector": "Punţile de HG se aplică, de regulă, doar instituţiilor publice. `ore_norma` urmează `sector`; ambele variante vin oricum.",
"nota_provizoriu": "Pentru 2026 nu există încă nicio punte publicată prin HG, deci norma pe sectorul public coincide azi cu cea pe privat şi se poate schimba.",
"calendarul_anului": "/financiar/v1/calendar?an=2026"
}
}
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 | A month written other than YYYY-MM or outside the years 1990–2100, a sector outside the list, or ore_pe_zi outside 1–24. |
| 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": "A month written other than YYYY-MM or outside the years 1990–2100, a sector outside the list, or ore_pe_zi outside 1–24.",
"detalii": {
"luna": [
"The value sent does not satisfy the parameter rule."
]
}
}
}