oneapi
Sign in
Financiar v1 / Calendar

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.

GET
https://oneapi.ro/api/financiar/v1/norma-lucru

Query parameters

NameTypeDescriptionAccepted values
lunaoptional string | null Optional: the month, YYYY-MM (years 1990–2100). Without it, the current month. e.g. 2024-05e.g. 2026-05
sectoroptional string | null Optional: privat (default) or public. They differ by the government bridge days. privatpublic
ore_pe_zioptional integer | null Optional, defaults to 8. Between 1 and 24, for part-time. 1 – 24

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 why ore_pe_zi always 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_zi accepts 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. provizoriu declares 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

FieldTypeDescription
data.an integer The year the data refers to.
data.luna integer The month the data refers to.
data.perioada string The period the value refers to.
data.de_la string Start of the interval the response covers.
data.pana_la string End of the interval the response covers, inclusive.
data.sector string Institutional or economic sector.
data.ore_pe_zi integer The convention used. Always present, so the figure cannot be misread.
data.zile_lucratoare integer The days the norm comes from.
data.ore_norma integer The month's norm, for the requested sector and hours.
data.defalcare object Calendar days, weekends, holidays on working days, bridges subtracted.
data.defalcare.zile_calendaristice integer All days in the interval, both ends included.
data.defalcare.zile_weekend integer How many Saturdays and Sundays fall in the interval.
data.defalcare.sarbatori_in_zile_lucratoare integer Public holidays falling Monday to Friday. Only these reduce the count.
data.defalcare.punti_hg_scazute integer Government bridge days subtracted. Always 0 with sector=privat.
data.privat object Days and norm for the private sector.
data.privat.zile_lucratoare integer How many working days the period has.
data.privat.ore_norma integer
data.public object Days and norm for the public sector.
data.public.zile_lucratoare integer How many working days the period has.
data.public.ore_norma integer
data.anual object The whole year's norm, as a reference.
data.anual.zile_lucratoare integer How many working days the period has.
data.anual.ore_norma integer
data.punti_stabilite integer How many government bridge days are published for this year.
data.provizoriu string true when the year is current or future and no bridge day has been published yet.
meta[] string[] The response envelope: the source, the freshness and the notes that go with the data.

Response examples

GEThttps://oneapi.ro/api/financiar/v1/norma-lucru
{
    "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"
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
422validareA month written other than YYYY-MM or outside the years 1990–2100, a sector outside the list, or ore_pe_zi outside 1–24.
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": "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."
            ]
        }
    }
}