oneapi
Sign in
Financiar v1 / Inflatie

Labour productivity

Productivity per person employed and per hour worked, by branch, from 1995 to 2025 — one of the longest series in the module.

⚠️ Productivity per person × employment gives gross value added, NOT gross domestic product. Anyone multiplying by GDP is off by some 9%. The route checks the relation on every request.

GET
https://oneapi.ro/api/financiar/v1/productivitate

Query parameters

NameTypeDescriptionAccepted values
clasificareoptional string | null Optional: rev2 (default, 1995-2025) or rev1 (1999-2008). rev1rev2
de_laoptional integer | null Optional, a year, from 1995. 1995 – 2100
pana_laoptional integer | null Optional, a year. 1995 – 2100
caen_versiuneoptional string | null Optional: the revision of the caen code — 1, 2 or 3 — when its form is ambiguous (4932 means different things in Rev.2 and Rev.3). Without it, the code is looked up in the series revision first. 123
masuralistoptional text Optional: pe_persoana, pe_ora. pe_persoanape_ora
caenlistoptional text Optional, codes separated by commas: any CAEN code — section (C), division (62), group, class (6201) — from any revision. It is brought to in rev2 the A10 branch that contains it (C → industrie); in rev1 the published section, subsection or division; what was used is in meta.caen. e.g. R
gruparelistoptional text Optional, separated by commas: the source aggregates that are not CAEN codes — total, celelalte (Rev.1) or the A10 sum branches requested directly. Not sent together with caen. e.g. administratie_educatie_sanatatee.g. comert_transport_horecae.g. industrie

How it behaves

  • Labour productivity per employed person and per hour worked, by branch — 1,322 values, from TEMPO matrices CON110A, CON110C, CON110E and CON110F. The Rev.2 series covers 1995-2025, 31 years — one of the longest in the module; the Rev.1 one only 1999-2008.
  • ⚠️ Productivity per person × employed population gives gross value added, NOT gross domestic product. Multiplying by GDP is off by some 9%. In 2023: 171,042.4 lei per person × 8,493.2 thousand = 1,452,697.3, against gross value added of 1,452,697.1 at /financiar/v1/conturi-integrate.
  • The relation is checked on every request, but it is declared for what it is: a concordance between three separately published matrices, not an accounting identity. Measured across all 31 years, the maximum relative gap is 0.004%; in one single year (2017) it exceeds the bound implied by the published decimals, which points to a revision rather than an error. The tolerance is therefore relative, not absolute.
  • Hourly productivity times hours worked gives the same thing with far less precision: it is published to one decimal in lei (95.7 in 2023), and multiplied by 15 million hours the rounding alone amounts to a few hundred million.
  • ⚠️ Rev.1 and Rev.2 do not join: different nomenclatures, only partly overlapping periods. Rev.1 additionally mixes sections, subsections and divisions in the same nomenclature.
  • The denominator — employed population and hours worked — is at /financiar/v1/ocupare-conturi, with the same branch slugs.
  • Activity is requested the same way across the platform. caen takes any CAEN code, at any level and from any revision, and the route brings it to what the series publishes — climbing to a parent or translating it through the official INS correspondence; meta.caen states the requested code, the one used and whether it was climbed or converted. grupare is for the source aggregates that are not CAEN codes.

What it is for

  • The productivity growth of a branch over 30 years.
  • Comparing per-person with per-hour productivity — it shows how much is hours and how much is efficiency.
  • Checking your own value-added computation, starting from employment.

Response structure

FieldTypeDescription
data.clasificare string The classification the values are broken down by.
data.de_la integer Start of the interval the response covers.
data.pana_la integer End of the interval the response covers, inclusive.
data.filtre array The filters actually applied, as the route understood them — useful when a value was normalised.
data.ani array Years for which values exist.
data.serii[].masura string The measure reported — what the value actually counts or sums.
data.serii[].unitate string lei / persoana ocupata or lei / ora lucrata — two different measures that do not compare directly.
data.serii[].clasificare string The classification the values are broken down by.
data.serii[].activitate string The economic activity the value refers to.
data.serii[].denumire_activitate string
data.serii[].nivel_activitate string In Rev.1: sectiune, subsectiune, diviziune, rest. They do not add together.
data.serii[].valori object The values of the series, by period.
data.identitati.identitate string The identity being checked — which sum must equal which total.
data.identitati.nota string A note on how to read the data — a pitfall, a convention or a limit of the source.
data.identitati.toleranta_relativa string The bound is relative, because the three quantities come from separately published matrices.
data.identitati.verificari integer How many combinations were checked.
data.identitati.inchise integer How many checks closed within tolerance.
meta.sursa string The official source the data comes from, with its licence where one is required.
meta.acoperire.de_la integer The first period we have data for.
meta.acoperire.pana_la integer The last period we have data for.
meta.serii_returnate integer How many series were actually returned, after filters and the cell ceiling.
meta.nota_vab string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_identitate string How the identity above is checked and what it means when it does not close.
meta.nota_ocupare string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.fara_date data is null and this says why. The projection over the INS data is empty for the requested classification. The list is at /ocupare-conturi/activitati. As on the other series.
meta.fara_date_cod The short, STABLE word for the reason, for clients that branch on it in code: fara_date is prose and may be rephrased, this is not.
meta.caen[] object[] How the caen parameter was understood: the requested code, the revision it was read in and the code the route used. For a list of codes, one object per code.
meta.caen[].cerut string The CAEN code sent, normalised (upper case, no dots).
meta.caen[].versiune_cerut string The revision the code sent was read in: the one in caen_versiune, otherwise the first it exists in.
meta.caen[].folosit string The code the series used: the requested one, its first published parent or the source aggregate that contains it (02-03).
meta.caen[].cod string The CAEN code the key used stands for, when the series names its activities differently (agricultura = 01) or the key is an aggregate (62-63).
meta.caen[].nivel string The level of the code used — on company routes, of the requested code: sectiune, subsectiune, diviziune, grupa, clasa or agregat.
meta.caen[].denumire string The name of the code, from the CAEN nomenclature.
meta.caen[].versiune_serie string The CAEN revision the series is published in.
meta.caen[].conversie boolean true when the code was translated from one revision to another through the official INS correspondence.
meta.caen[].urcat boolean true when the series does not publish the requested code and a higher level was used.

Response examples

GEThttps://oneapi.ro/api/financiar/v1/productivitate?per_pagina=3
{
    "data": {
        "clasificare": "rev2",
        "de_la": 1995,
        "pana_la": 2025,
        "filtre": [],
        "ani": [
            1995,
            1996,
            1997,
            1998,
            1999,
            2000,
            2001,
            2002,
            2003,
            2004,
            2005,
            2006,
            2007,
            2008,
            2009,
            2010,
            2011,
            2012,
            2013,
            2014,
            2015,
            2016,
            2017,
            2018,
            2019,
            2020,
            2021,
            2022,
            2023,
            2024,
            2025
        ],
        "serii": [
            {
                "masura": "pe_ora",
                "unitate": "lei / ora lucrata",
                "clasificare": "rev2",
                "activitate": "administratie_educatie_sanatate",
                "denumire_activitate": "ADMINISTRATIE PUBLICA SI APARARE; ASIGURARI SOCIALE DIN SISTEMUL PUBLIC; INVATAMANT; SANATATE SI ASISTENTA SOCIALA",
                "nivel_activitate": "ramura",
                "valori": {
                    "1995": "0.3",
                    "1996": "0.4",
                    "1997": "1",
                    "1998": "1.5",
                    "1999": "3.1",
                    "2000": "5.1",
                    "2001": "7",
                    "2002": "9.2",
                    "2003": "11.2",
                    "2004": "9.8",
                    "2005": "13",
                    "2006": "14.7",
                    "2007": "16.7",
                    "2008": "22.8",
                    "2009": "21.3",
                    "2010": "28.4",
                    "2011": "26.5",
                    "2012": "30",
                    "2013": "33.3",
                    "2014": "39.6",
                    "2015": "32.6",
                    "2016": "39.6",
                    "2017": "48.7",
                    "2018": "59.7",
                    "2019": "68.1",
                    "2020": "74.5",
                    "2021": "71.1",
                    "2022": "76.2",
                    "2023": "94.4",
                    "2024": "102.4",
                    "2025": "103.5"
                }
            }
        ],
        "identitati": {
            "identitate": "`pe_persoana` × populaţia ocupată = valoarea adăugată brută",
            "nota": "⚠️ E valoarea adăugată brută, NU produsul intern brut — cine înmulţeşte cu PIB-ul greşeşte cu vreo 9%. Nu e o identitate contabilă, ci o concordanţă între trei matrici publicate separat: verificată pe toţi cei 31 de ani, cu abaterea relativă maximă de 0,004%. În 2023: 171.042,4 lei/persoană × 8.493,2 mii = 1.452.697,3, faţă de 1.452.697,1 la /financiar/v1/conturi-integrate.",
            "toleranta_relativa": "0.0001",
            "verificari": 31,
            "inchise": 31
        }
    },
    "meta": {
        "sursa": "Institutul Naţional de Statistică — productivitatea muncii pe persoană ocupată şi pe oră (TEMPO, matricile CON110A, CON110C, CON110E şi CON110F).",
        "acoperire": {
            "de_la": 1995,
            "pana_la": 2025
        },
        "serii_returnate": 22,
        "nota_vab": "`pe_persoana` × populaţia ocupată = valoarea adăugată brută",
        "nota_identitate": "Verificat pe acest răspuns: productivitatea înmulţită cu ocuparea dă valoarea adăugată brută în 31 din 31 ani.",
        "nota_ocupare": "Numitorul acestei productivităţi — populaţia ocupată şi orele lucrate — e la /financiar/v1/ocupare-conturi."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatMissing or invalid token.
403feature_indisponibilfinanciar.indici is not in the current plan.
404caen_nepublicatNeither the code nor its parents are published in the series; detalii.disponibile lists the keys. grupare_nepublicata — the grouping is not in the series; the response lists them.
422caen_inexistentThe code in caen exists in no CAEN revision; it is a bad FILTER value, hence 422, not 404. A classification, measure, activity or year outside the expected form. caen and grupare sent together, caen_versiune without caen, or a code that is not CAEN-shaped.
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": "caen_inexistent",
        "mesaj": "The code in caen exists in no CAEN revision; it is a bad FILTER value, hence 422, not 404. A classification, measure, activity or year outside the expected form. caen and grupare sent together, caen_versiune without caen, or a code that is not CAEN-shaped.",
        "detalii": {
            "clasificare": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}