A year's calendar
The twelve-month table of a year, in a single request: calendar days, weekends, holidays, bridge days, working days — plus where the holidays and bridges fall, not just how many there are.
Why it is a route and not /zile-lucratoare called twelve times: there the question is „how many are there between two dates", and the answer is a number with a breakdown. Here the shape of the response is an annual table, and the reason anyone asks for it is to see the distribution. In 2026, January has 18 working days and July has 23 — the difference does not show in a total.
Bridge days make the public sector figure PROVISIONAL for future years. They come from Government Decisions, and for a year whose decision has not been issued yet the table shows zero bridges — which does not mean there will be none. The provizoriu field says so, and punti_stabilite gives the number of those already published. A response giving the same number for both sectors without declaring this would end up being used to plan holidays on a figure that moves.
Both totals come anyway, zile_lucratoare_privat and zile_lucratoare_public, so that the difference between sectors does not require a second request. sector only chooses which of them lands in the main field.
The breakdown is checked for every month, not just for the year: calendar days − weekends − holidays falling on working days − bridges = working days.
Query parameters
YYYY (1990–2100). Without it, the current year.
1990 – 2100
privat (default) or public. They differ by the government bridge days.
privatpublic
How it behaves
- A year's twelve-month table in a single request: calendar days, weekends, public holidays, government bridge days, working days — plus where the holidays and bridges fall, not merely how many there are.
- Why this is a route and not
/zile-lucratoarecalled twelve times: there the question is "how many between two dates", and the answer is a number with a breakdown. Here the shape of the answer is an annual table, and the reason anyone asks for it is the distribution. In 2026, January has 18 working days and July has 23 — a total does not show that. - Bridge days make the public-sector figure PROVISIONAL for future years. They come from government decisions, and for a year whose decision has not been issued yet the table shows zero bridges — which does not mean there will be none.
provizoriusays so, andpunti_stabilitegives the number published. A response giving the same number for both sectors without declaring this would be used to plan leave against a figure that moves. - For closed years the figure is final and the difference shows: 2024 has 252 working days in the private sector and 249 in the public one, from three bridges; 2025 has 248 and 247, from a single one.
- Both totals come back anyway —
zile_lucratoare_privatandzile_lucratoare_public— so the gap between sectors does not require a second request.sectoronly decides which of them lands in the headline field. - The breakdown checks out for every month, not only for the year: calendar days − weekends − holidays falling on working days − bridges = working days. A bridge landing on a weekend or on a holiday subtracts nothing, having already been counted.
- A single day can carry two holidays — 1 June 2026 is both Children's Day and Whit Monday. That is why
sarbatoriis a list of DAYS, each with its holidays, rather than a list of holidays. - Holidays are computed, not read from a table, and the rules are versioned by the year they took effect — hence coverage of 1990–2100 with no import behind it. Bridge days, by contrast, are legal acts and exist only from the moment they were issued.
- Working hours are not here: they are at
/norma-lucru?luna=YYYY-MM, with a different unit and the 8-hour convention stated explicitly.
What it is for
- Planning a year: where the holidays and bridges fall, month by month.
- The working-day norm for a staffing budget.
- Comparing the private and public sectors without two requests.
Response structure
true when the year is current or future and no bridge has been published yet — the public-sector figure may still change.
Response examples
{
"data": {
"an": 2026,
"sector": "privat",
"zile_lucratoare": 250,
"total": {
"zile_calendaristice": 365,
"zile_weekend": 104,
"sarbatori_in_zile_lucratoare": 11,
"punti_hg_scazute": 0,
"zile_lucratoare_privat": 250,
"zile_lucratoare_public": 250
},
"punti_stabilite": 0,
"provizoriu": true,
"luni": [
{
"luna": 1,
"perioada": "2026-01",
"de_la": "2026-01-01",
"pana_la": "2026-01-31",
"zile_lucratoare": 18,
"defalcare": {
"zile_calendaristice": 31,
"zile_weekend": 9,
"sarbatori_in_zile_lucratoare": 4,
"punti_hg_scazute": 0
},
"zile_lucratoare_privat": 18,
"zile_lucratoare_public": 18,
"sarbatori": [
{
"data": "2026-01-01",
"sarbatori": [
{
"cod": "anul_nou_1",
"denumire": "Anul Nou",
"mobila": false
}
]
}
],
"punti": []
}
]
},
"meta": {
"temei": "Sărbătorile legale: art. 139 din Codul Muncii. Punţile: hotărâri de Guvern, act cu act.",
"nota_defalcare": "Pe fiecare lună: calendaristice − weekend − sărbători în zile lucrătoare − punţi = zile lucrătoare. Punţile care cad în weekend sau peste o sărbătoare nu scad nimic, fiind deja numărate.",
"nota_sector": "Punţile de HG se aplică, de regulă, doar instituţiilor publice. `zile_lucratoare` urmează `sector`; ambele totaluri vin oricum în răspuns.",
"nota_provizoriu": "Pentru 2026 nu există încă nicio punte publicată prin HG, deci cifra pe sectorul public coincide azi cu cea pe privat şi se poate schimba. Nu înseamnă că nu vor fi punţi.",
"nota_suprapuneri": "O zi poate purta două sărbători (1 iunie 2026: Ziua Copilului şi a doua zi de Rusalii). De aceea `sarbatori` e o listă de ZILE, fiecare cu sărbătorile ei.",
"sarbatorile_anului": "/financiar/v1/sarbatori?an=2026",
"puntile_anului": "/financiar/v1/punti?an=2026"
}
}
{
"data": {
"an": 2024,
"sector": "public",
"zile_lucratoare": 249,
"total": {
"zile_calendaristice": 366,
"zile_weekend": 104,
"sarbatori_in_zile_lucratoare": 10,
"punti_hg_scazute": 3,
"zile_lucratoare_privat": 252,
"zile_lucratoare_public": 249
},
"punti_stabilite": 3,
"provizoriu": false,
"luni": [
{
"luna": 1,
"perioada": "2024-01",
"de_la": "2024-01-01",
"pana_la": "2024-01-31",
"zile_lucratoare": 20,
"defalcare": {
"zile_calendaristice": 31,
"zile_weekend": 8,
"sarbatori_in_zile_lucratoare": 3,
"punti_hg_scazute": 0
},
"zile_lucratoare_privat": 20,
"zile_lucratoare_public": 20,
"sarbatori": [
{
"data": "2024-01-01",
"sarbatori": [
{
"cod": "anul_nou_1",
"denumire": "Anul Nou",
"mobila": false
}
]
}
],
"punti": []
}
]
},
"meta": {
"temei": "Sărbătorile legale: art. 139 din Codul Muncii. Punţile: hotărâri de Guvern, act cu act.",
"nota_defalcare": "Pe fiecare lună: calendaristice − weekend − sărbători în zile lucrătoare − punţi = zile lucrătoare. Punţile care cad în weekend sau peste o sărbătoare nu scad nimic, fiind deja numărate.",
"nota_sector": "Punţile de HG se aplică, de regulă, doar instituţiilor publice. `zile_lucratoare` urmează `sector`; ambele totaluri vin oricum în răspuns.",
"nota_suprapuneri": "O zi poate purta două sărbători (1 iunie 2026: Ziua Copilului şi a doua zi de Rusalii). De aceea `sarbatori` e o listă de ZILE, fiecare cu sărbătorile ei.",
"sarbatorile_anului": "/financiar/v1/sarbatori?an=2024",
"puntile_anului": "/financiar/v1/punti?an=2024"
}
}
{
"data": {
"an": 2024,
"sector": "privat",
"zile_lucratoare": 252,
"total": {
"zile_calendaristice": 366,
"zile_weekend": 104,
"sarbatori_in_zile_lucratoare": 10,
"punti_hg_scazute": 3,
"zile_lucratoare_privat": 252,
"zile_lucratoare_public": 249
},
"punti_stabilite": 3,
"provizoriu": false,
"luni": [
{
"luna": 1,
"perioada": "2024-01",
"de_la": "2024-01-01",
"pana_la": "2024-01-31",
"zile_lucratoare": 20,
"defalcare": {
"zile_calendaristice": 31,
"zile_weekend": 8,
"sarbatori_in_zile_lucratoare": 3,
"punti_hg_scazute": 0
},
"zile_lucratoare_privat": 20,
"zile_lucratoare_public": 20,
"sarbatori": [
{
"data": "2024-01-01",
"sarbatori": [
{
"cod": "anul_nou_1",
"denumire": "Anul Nou",
"mobila": false
}
]
}
],
"punti": []
}
]
},
"meta": {
"temei": "Sărbătorile legale: art. 139 din Codul Muncii. Punţile: hotărâri de Guvern, act cu act.",
"nota_defalcare": "Pe fiecare lună: calendaristice − weekend − sărbători în zile lucrătoare − punţi = zile lucrătoare. Punţile care cad în weekend sau peste o sărbătoare nu scad nimic, fiind deja numărate.",
"nota_sector": "Punţile de HG se aplică, de regulă, doar instituţiilor publice. `zile_lucratoare` urmează `sector`; ambele totaluri vin oricum în răspuns.",
"nota_suprapuneri": "O zi poate purta două sărbători (1 iunie 2026: Ziua Copilului şi a doua zi de Rusalii). De aceea `sarbatori` e o listă de ZILE, fiecare cu sărbătorile ei.",
"sarbatorile_anului": "/financiar/v1/sarbatori?an=2024",
"puntile_anului": "/financiar/v1/punti?an=2024"
}
}
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 year outside 1990–2100, or a sector outside the list. |
| 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 year outside 1990–2100, or a sector outside the list.",
"detalii": {
"an": [
"The value sent does not satisfy the parameter rule."
]
}
}
}