oneapi
Sign in
Financiar v1 / Inflatie

Earnings structure by occupation

What each ISCO-08 major occupational group earns — from managers to elementary occupations — by NACE activity, sex and form of ownership, annually since 2013. 162,102 values.

It is the only place in the module where earnings are seen by occupation, not just by activity. It comes from the structure of earnings survey and covers only full-time employees paid for the whole month — so it is not the general average from /financiar/v1/salariati but a „clean" one, without partial months.

Three indicators, two of which are averages. numar is people and is additive; salariu_baza and venit_brut are monthly averages in lei and are not additive — not across occupations, not across sexes, not across forms of ownership.

✅ Verified on the number of employees, with zero deviation: total = male + female (17,389 of 17,389), total = public + private (13,222 of 13,222) and total = the sum of the nine occupational groups (2,034 of 2,034). On earnings, the same identity comes out 0 of 6,141, with the sum of the groups 7.77 times the average — which is why the route does not run it there.

The difference between the two money indicators is precisely the value of the supplements. Gross earnings realised include bonuses, allowances and overtime; the basic wage does not. The ratio between them is computed on every series, in raport_venit_baza. Overall, in 2024: base 6,553 lei, earnings 8,374 lei — supplements add 28%. The average across all cells is 1.307.

⚠️ In 56 of the 54,034 cells, earnings come out BELOW the basic wage, the lowest at 0.674. They are small cells — 68 employees on average — scattered over six years, peaking in 2013 (27 cases) and 2020 (13). Those years are flagged in raport_venit_baza.ani_sub_baza.

GET
https://oneapi.ro/api/financiar/v1/castiguri/structura

Query parameters

NameTypeDescriptionAccepted values
indicatoroptional string | null Optional: venit_brut (default), salariu_baza, numar. numarsalariu_bazavenit_brut
de_laoptional integer | null Optional, a year, from 2013. 2013 – 2100
pana_laoptional integer | null Optional, a year. 2013 – 2100
caenoptional string | null Optional: any CAEN code — section (C), division (62), group, class (6201) — from any revision. It is brought to the published section, division or range (CAEN Rev.2); what was used is in meta.caen. e.g. 62
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
grupareoptional string | null Optional: the source aggregates that are not CAEN codes — total, industrie (B–E) or the ranges (02-03, 62-63). Not sent together with caen. e.g. 02-03e.g. 38-39e.g. 59-60
ocupatielistoptional text Optional: total (default) or major ISCO-08 groups 1 to 9, comma-separated. total123456789
sexlistoptional text Optional: total (default), masculin, feminin. totalmasculinfeminin
formalistoptional text Optional: total (default), publica, privata. totalpublicaprivata

How it behaves

  • What each major ISCO-08 occupational group earns — from managers to elementary occupations — by CAEN activity, sex and form of ownership, annually from 2013 to 2024. 162,102 values from TEMPO matrix FOM121A.
  • This is the only place in the module where earnings appear by occupation, not just by activity. It comes from the structure of earnings survey and covers only full-time employees paid for the whole month — so it is not the general average from /financiar/v1/salariati, but a "clean" one, without partial months.
  • What the data shows, across all activities in 2024: specialists outearn managers — 12,365 lei gross against 12,250 — with a general average of 8,374 lei. At the other end, elementary occupations 5,367 lei and service workers 5,196.
  • Three indicators, two of which are averages. numar are people and add up; salariu_baza and venit_brut are monthly averages in lei and do not add up — not across occupations, not across sexes, not across ownership forms.
  • ✅ Verified on employee counts, with zero deviation: total = male + female (17,389 of 17,389), total = public + private (13,222 of 13,222) and total = the sum of the nine occupational groups (2,034 of 2,034). On earnings the same identity comes out 0 of 6,141, with the sum of groups at 7.77 times the average — which is why the route does not run it there, returning identitati.aplicabile = false with the reason.
  • The gap between the two money indicators is exactly the value of bonuses. Gross realised income includes premiums, bonuses and overtime; the base wage does not. The ratio comes computed on each series, in raport_venit_baza: on the total for 2024, a base of 6,553 lei against income of 8,374 lei, meaning bonuses add 28%. The average across the whole projection is 1.307.
  • ⚠️ In 56 of the 54,034 cells income comes out BELOW the base wage, as low as 0.674. These are small cells — 68 employees on average — scattered over six years, peaking in 2013 (27 cases) and 2020 (13). Example: service workers in public air transport, men, in 2020 — base 3,262 lei, income 2,198. Those years are flagged in raport_venit_baza.ani_sub_baza.
  • Occupations are coded with the major ISCO-08 groups, 1 to 9, because the source spells them out and a slug from the wording would exceed a hundred characters. denumire_ocupatie states them in words.
  • 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

  • What an occupation pays in a given sector — a benchmark for a pay scale.
  • How much of earnings comes from bonuses rather than base pay.
  • The public-private earnings gap, within the same occupation.

Response structure

FieldTypeDescription
data.indicator string The statistical indicator the value refers to.
data.denumire string The name, exactly as the source publishes it.
data.natura string numar or medie — decides whether the series can be summed.
data.unitate string The unit of the values. Read it before plotting or adding them up.
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.ocupatie array
data.filtre.sex array Sex of the people the value refers to.
data.filtre.forma array Legal form or form of organisation.
data.ani array Years for which values exist.
data.serii[].caen string The CAEN (NACE) code of the activity, in the series revision.
data.serii[].nivel string Level in the classification hierarchy — the deeper, the more detailed.
data.serii[].denumire string The name, exactly as the source publishes it.
data.serii[].ocupatie string The major ISCO-08 group, 1-9, or total.
data.serii[].denumire_ocupatie string
data.serii[].sex string Sex of the people the value refers to.
data.serii[].forma string Legal form or form of organisation.
data.serii[].unitate string Unit of measure of the values. Read it before plotting or summing them.
data.serii[].ani_publicati integer Years the source actually published for this series.
data.serii[].valori object The values of the series, by period.
data.serii[].raport_venit_baza object Gross income divided by base wage — how much bonuses add.
data.serii[].raport_venit_baza.nota string A note on how to read the data — a pitfall, a convention or a limit of the source.
data.serii[].raport_venit_baza.valori object The values of the series, by period.
data.identitati.aplicabile boolean false on average-type indicators, with the reason and figures.
data.identitati.motiv string
data.identitati.nota string A note on how to read the data — a pitfall, a convention or a limit of the source.
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_populatie string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_natura 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_sporuri string A note on how to read the response: a caveat, a convention or a limit of the source.
meta.nota_ocupatii string A note on how to read the response: a caveat, a convention or a limit of the source.
data.serii[].raport_venit_baza.ani_sub_baza Years where income falls below the base wage.
meta.fara_date data is null and this says why. The projection over the INS data is empty. 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/castiguri/structura?per_pagina=3
{
    "data": {
        "indicator": "venit_brut",
        "denumire": "Venitul brut realizat",
        "natura": "medie",
        "unitate": "lei pe lună",
        "de_la": 2013,
        "pana_la": 2024,
        "filtre": {
            "ocupatie": [
                "total"
            ],
            "sex": [
                "total"
            ],
            "forma": [
                "total"
            ]
        },
        "ani": [
            2013,
            2015,
            2016,
            2017,
            2018,
            2019,
            2020,
            2021,
            2022,
            2023,
            2024
        ],
        "serii": [
            {
                "caen": "01",
                "nivel": "diviziune",
                "denumire": "01 Agricultura, vanatoare si servicii anexe",
                "ocupatie": "total",
                "denumire_ocupatie": "Toate ocupaţiile",
                "sex": "total",
                "forma": "total",
                "unitate": "lei pe lună",
                "ani_publicati": 11,
                "valori": {
                    "2013": "1539",
                    "2015": "1875",
                    "2016": "2162",
                    "2017": "2491",
                    "2018": "3301",
                    "2019": "3728",
                    "2020": "3948",
                    "2021": "4247",
                    "2022": "4748",
                    "2023": "4989",
                    "2024": "5718"
                },
                "raport_venit_baza": {
                    "nota": "Venitul brut realizat împărţit la salariul brut de bază: cât adaugă sporurile, primele şi orele suplimentare.",
                    "valori": {
                        "2013": "1.192",
                        "2015": "1.188",
                        "2016": "1.204",
                        "2017": "1.214",
                        "2018": "1.210",
                        "2019": "1.223",
                        "2020": "1.210",
                        "2021": "1.232",
                        "2022": "1.189",
                        "2023": "1.163",
                        "2024": "1.193"
                    }
                }
            }
        ],
        "identitati": {
            "aplicabile": false,
            "motiv": "indicatorul_e_medie",
            "nota": "Salariul de bază şi venitul brut sunt medii, nu totaluri: nu se adună nici peste ocupaţii, nici peste sexe, nici peste forme de proprietate. Măsurat, suma celor nouă grupe de ocupaţii iese de 7,77 ori media, iar identitatea se închide în 0 din 6.141 de celule. Pentru identităţi verificabile, cere `indicator=numar`."
        }
    },
    "meta": {
        "sursa": "Institutul Naţional de Statistică — ancheta de structură a câştigurilor salariale (TEMPO, matricea FOM121A).",
        "acoperire": {
            "de_la": 2013,
            "pana_la": 2024
        },
        "serii_returnate": 67,
        "nota_populatie": "Ancheta acoperă doar salariaţii cu program complet care au fost plătiţi întreaga lună — de aceea cifrele diferă de mediile generale din /financiar/v1/salariati.",
        "nota_natura": "Numărul de salariaţi se însumează; salariul de bază şi venitul brut sunt medii şi nu se adună pe nicio dimensiune.",
        "nota_identitate": "Salariul de bază şi venitul brut sunt medii, nu totaluri: nu se adună nici peste ocupaţii, nici peste sexe, nici peste forme de proprietate. Măsurat, suma celor nouă grupe de ocupaţii iese de 7,77 ori media, iar identitatea se închide în 0 din 6.141 de celule. Pentru identităţi verificabile, cere `indicator=numar`.",
        "nota_sporuri": "Diferenţa dintre venitul brut realizat şi salariul de bază e valoarea sporurilor, primelor şi orelor suplimentare. `raport_venit_baza` o dă calculată, iar `ani_sub_baza` marchează anii în care venitul iese sub bază.",
        "nota_ocupatii": "Ocupaţiile sunt grupele majore ISCO-08, codificate `1`–`9`; `denumire_ocupatie` le spune în cuvinte."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatToken missing, invalid, expired or revoked.
403feature_indisponibilThe current plan does not include the feature the route depends on.
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. prea_multe_serii — beyond 1,200; all occupations × sexes × forms exceed the limit on their own. interval_prea_lung — beyond 20 years. Plus an indicator, occupation, sex or form outside the list. 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. prea_multe_serii — beyond 1,200; all occupations × sexes × forms exceed the limit on their own. interval_prea_lung — beyond 20 years. Plus an indicator, occupation, sex or form outside the list. caen and grupare sent together, caen_versiune without caen, or a code that is not CAEN-shaped.",
        "detalii": {
            "indicator": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}