oneapi
Sign in
Financiar v1 / Fiscal

Annual income norms

The income norms by county and NACE code, for a year.

⚠️ The set is not populated yet and the route says so openly (data: null with the reason in meta.fara_date), instead of returning an empty list that could pass for „this county has no norms". There are thousands of combinations set by annual orders of the ANAF regional directorates; they come through the platform's usual route — source, file, import — they are not reconstructed from memory.

GET
https://oneapi.ro/api/financiar/v1/fiscal/norme-venit

Query parameters

NameTypeDescriptionAccepted values
anoptional integer | null Optional, defaults to the current year. 2018 – 2100
judetoptional string | null Optional, the county registration code — CJ, DJ, B for Bucharest. An unknown code returns 422, not an empty list. A county that EXISTS but is not in the set returns 200 with judet_neacoperit. e.g. DJe.g. B
zonaoptional string | null Optional: the zone label as the county published it ("Comune", "Municipiul Craiova", "Zona rurală"). Diacritics and case do not matter. The values accepted for a county are in meta.zone, because they cannot be guessed. max 120 car.
caenoptional string | null Optional: any NACE code, at any level and from any revision — matched against both published revisions. An unknown code is 404. e.g. 4772
caen_versiuneoptional string | null Optional: the revision of the code in caen — 1, 2 or 3 — when its form is ambiguous (4932 means different things in Rev.2 and Rev.3). 123
per_paginaoptional text Optional, between 1 and 500; defaults to 100. e.g. 5
paginaoptional text Page, counted from 1. e.g. 1

How it behaves

  • The annual income norms for self-employed activities taxed on a norm basis — by county, activity, NACE code and the zone where the activity is carried out.
  • ⚠️ A norm does not have one value, it has one per ZONE. That is what the law requires ("at the place where the activity is carried out") and how the counties publish it, in columns. In Dolj, veterinary activities are 52,974 lei in Craiova and 48,600 in towns and communes. The zona parameter filters on the label the county published; meta.zone lists the values it accepts for the county you asked about.
  • ⚠️ Zones are NOT a fixed list — each county defines its own. Dolj: "Municipiul Craiova / Oraşe / Comune". Cluj separates county-seat municipalities from the others. Mureş names them after towns: "TÂRGU MUREŞ / REGHIN / … / Zona rurală". Bucharest has 18, three per sector tax office: "AS1FP Centru A Zona 0", "AS1FP Semicentru B Zona I", "AS1FP Periferie C+D Zona II+III", and so on through AS6FP. That is why zona is text, exactly as the county published it, and not a code.
  • ⚠️ The granularity differs too. Dolj publishes one norm per ACTIVITY: "Comerţ cu produse agricole şi alimentare" lists six NACE codes and carries a single value per zone. Cluj publishes one per CODE: under "Confecţionare şi/sau comercializare de încălţăminte", code 1520 is 51,700 lei and code 4772 is 86,400, in the same zone. The response brings both to one shape — one row per activity × code × zone — so you do not need to know which county publishes which way.
  • ⚠️ The set is PARTIAL, and the route says so. meta.judete_acoperite lists the counties in the database (today 19 of 42, Bucharest included). For a county that is not there, the answer is 200 with meta.fara_date_cod = judet_neacoperit and the reason — NOT an empty list, which would read as "there are no norms here". The cause is at the source: ANAF publishes one PDF per county, some of them image scans with no text layer, and in others the header gives no distinct zone labels — a norm placed on the wrong zone is a wrong tax base, so we prefer a declared gap. The seven counties missing from the central page are fetched from the DGRFP Ploieşti regional portal; three of them came in that way.
  • ⚠️ Every value is flagged de_verificat. They are read automatically from hand-made PDF tables, each county laid out differently. The flag is not a formality: anyone computing tax from them should check the figure against the county document, whose decision number is in act_normativ where the source prints it.
  • The activity is requested as everywhere on the platform. caen takes any code, at any level and from any revision, and is matched against BOTH published revisions (the 2026 norms carry Rev.2 and Rev.3 in separate columns) — because the client cannot know which revision their code was published in.

What it is for

  • The income norm applicable to a self-employed activity taxed on a norm basis, in the locality where it is carried out.
  • Comparing norms between zones of the same county — the gap between a municipality and a commune can be 10-30%.
  • Comparing norms between counties for the same NACE code.

Response structure

FieldTypeDescription
data.an integer The year the data refers to.
data.norme[].judet_cod string Links to the counties in /locations/v1.
data.norme[].nr_crt integer The activity number in the county table — makes a row traceable against the published document. null where the source did not number it.
data.norme[].activitate string The activity name, exactly as the county published it.
data.norme[].zona string The zone the norm applies to, as the county published it.
data.norme[].caen string The Rev.2 code, linked to the NACE nomenclature in /business/v1. null where the county publishes only Rev.3.
data.norme[].caen_rev3 null The Rev.3 code, published from the 2026 norms onward.
data.norme[].norma_lei integer The annual norm, in lei. The legal minimum is 12 × the gross minimum wage (48,600 lei for 2026).
data.norme[].act_normativ string The legal basis: the regional directorate decision number, where the document prints it. Where it does not, the basis is the published file and the row is de_verificat.
data.norme[].de_verificat boolean Currently true across the whole set — see the note on automatic reading.
meta.sursa string The official source the data comes from, with its licence where one is required.
meta.paginare.pagina integer Current page, counted from 1.
meta.paginare.per_pagina integer How many records a page holds.
meta.paginare.total integer Total matching records, beyond the current page.
meta.paginare.pagini integer How many pages the list has.
meta.ani_acoperiti array The years for which norms exist.
meta.judete_acoperite array The counties in the database. A missing county is NOT a county without norms.
meta.nota_acoperire string Why the total is a lower bound, in prose. meta.total_e_limita_de_jos is the word to switch on in code.
meta.zone array The zones of the requested county, i.e. the values zona accepts. Absent when no county was requested. Bucharest has 18: 6 sector tax offices × 3 zones each, named as the source prints them ("AS1FP Centru A Zona 0").
meta.fara_date data is null and the reason is here.
meta.fara_date_cod The short, STABLE word for the reason, for clients branching on it in code: judet_neacoperit or set_nepopulat.
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.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.

Response examples

GEThttps://oneapi.ro/api/financiar/v1/fiscal/norme-venit?an=2026&per_pagina=5
{
    "data": {
        "an": 2026,
        "norme": [
            {
                "judet_cod": "B",
                "nr_crt": 1,
                "activitate": "Boiangerie",
                "zona": "AS1FP Centru A Zona 0",
                "caen": "1330",
                "caen_rev3": null,
                "norma_lei": 53000,
                "act_normativ": "Norme publicate de ANAF pentru 2026 (Bucuresti), fără număr de decizie în document",
                "de_verificat": true
            }
        ]
    },
    "meta": {
        "sursa": "Legislaţia fiscală, curatată manual, cu act normativ pe fiecare valoare. Cotele, pragurile şi salariul minim se citesc din registrul comun `business_indicatori_fiscali`.",
        "paginare": {
            "pagina": 1,
            "per_pagina": 5,
            "total": 11115,
            "pagini": 2223
        },
        "ani_acoperiti": [
            2026
        ],
        "judete_acoperite": [
            "B",
            "BR",
            "CJ",
            "CT",
            "CV",
            "DJ",
            "GL",
            "GR",
            "HR",
            "IL",
            "IS",
            "MM",
            "MS",
            "SB",
            "SJ",
            "SM",
            "TL",
            "TR",
            "VN"
        ],
        "nota_acoperire": "Ce perioade acoperă fiecare set şi ce e neconfirmat: /financiar/v1/fiscal/acoperire."
    }
}

Error codes

CodeSlugWhen it occurs
401neautentificatMissing or invalid token.
403feature_indisponibilfinanciar.fiscal_referinta is not in the current plan.
404caen_inexistentThe code does not exist in any NACE revision.
422validarea judet that is not a county registration code, a caen that is not NACE-shaped, or caen_versiune without caen.
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 judet that is not a county registration code, a caen that is not NACE-shaped, or caen_versiune without caen.",
        "detalii": {
            "an": [
                "The value sent does not satisfy the parameter rule."
            ]
        }
    }
}