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.
Query parameters
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
meta.zone, because they cannot be guessed.
max 120 car.
caen — 1, 2 or 3 — when its form is ambiguous (4932 means different things in Rev.2 and Rev.3).
123
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
zonaparameter filters on the label the county published;meta.zonelists 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
zonais 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_acoperitelists the counties in the database (today 19 of 42, Bucharest included). For a county that is not there, the answer is 200 withmeta.fara_date_cod = judet_neacoperitand 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 inact_normativwhere the source prints it. - The activity is requested as everywhere on the platform.
caentakes 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
null where the source did not number it.
null where the county publishes only Rev.3.
de_verificat.
true across the whole set — see the note on automatic reading.
meta.total_e_limita_de_jos is the word to switch on in code.
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").
data is null and the reason is here.
judet_neacoperit or set_nepopulat.
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.
caen_versiune, otherwise the first it exists in.
sectiune, subsectiune, diviziune, grupa, clasa or agregat.
Response examples
{
"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."
}
}
meta.zone lists the values zona accepts for the county you asked about — they cannot be guessed.
{
"data": {
"an": 2026,
"norme": [
{
"judet_cod": "DJ",
"nr_crt": 1,
"activitate": "Boiangerie Comerţ cu amănuntul in magazine nespecializate, cu vanzare predominanta de produse alimentare, bauturi si tutun",
"zona": "COMUNE",
"caen": "1330",
"caen_rev3": null,
"norma_lei": 48600,
"act_normativ": "Norme publicate de ANAF pentru 2026 (Dolj), 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": 471,
"pagini": 95
},
"ani_acoperiti": [
2026
],
"judete_acoperite": [
"B",
"BR",
"CJ",
"CT",
"CV",
"DJ",
"GL",
"GR",
"HR",
"IL",
"IS",
"MM",
"MS",
"SB",
"SJ",
"SM",
"TL",
"TR",
"VN"
],
"zone": [
"COMUNE",
"MUNICIPIUL CRAIOVA",
"ORASE"
],
"nota_acoperire": "Ce perioade acoperă fiecare set şi ce e neconfirmat: /financiar/v1/fiscal/acoperire."
}
}
Write the label as the county published it; diacritics and case do not matter.
{
"data": {
"an": 2026,
"norme": [
{
"judet_cod": "DJ",
"nr_crt": 1,
"activitate": "Boiangerie Comerţ cu amănuntul in magazine nespecializate, cu vanzare predominanta de produse alimentare, bauturi si tutun",
"zona": "COMUNE",
"caen": "1330",
"caen_rev3": null,
"norma_lei": 48600,
"act_normativ": "Norme publicate de ANAF pentru 2026 (Dolj), 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": 157,
"pagini": 32
},
"ani_acoperiti": [
2026
],
"judete_acoperite": [
"B",
"BR",
"CJ",
"CT",
"CV",
"DJ",
"GL",
"GR",
"HR",
"IL",
"IS",
"MM",
"MS",
"SB",
"SJ",
"SM",
"TL",
"TR",
"VN"
],
"zone": [
"COMUNE",
"MUNICIPIUL CRAIOVA",
"ORASE"
],
"nota_acoperire": "Ce perioade acoperă fiecare set şi ce e neconfirmat: /financiar/v1/fiscal/acoperire."
}
}
{
"data": {
"an": 2026,
"norme": [
{
"judet_cod": "B",
"nr_crt": 6,
"activitate": "Comerţ cu îmbrăcăminte şi încălţăminte nouă şi uzată",
"zona": "AS1FP Centru A Zona 0",
"caen": "4772",
"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": 155,
"pagini": 31
},
"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.",
"caen": {
"cerut": "4772",
"versiune_cerut": "Rev.3",
"nivel": "clasa",
"denumire": "Comerț cu amănuntul al încălțămintei și articolelor din piele"
}
}
}
200 with meta.fara_date_cod = judet_neacoperit, NOT an empty list: the gap is in our reading, not in the norms.
{
"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": 100,
"total": 5400,
"pagini": 54
},
"ani_acoperiti": [
2026
],
"judete_acoperite": [
"B",
"BR",
"CJ",
"CT",
"CV",
"DJ",
"GL",
"GR",
"HR",
"IL",
"IS",
"MM",
"MS",
"SB",
"SJ",
"SM",
"TL",
"TR",
"VN"
],
"zone": [
"AS1FP Centru A Zona 0",
"AS1FP Periferie C+D Zona II+III",
"AS1FP Semicentru B Zona I",
"AS2FP Centru A Zona 0",
"AS2FP Periferie C+D Zona II+III",
"AS2FP Semicentru B Zona I",
"AS3FP Centru A Zona 0",
"AS3FP Periferie C+D Zona II+III",
"AS3FP Semicentru B Zona I",
"AS4FP Centru A Zona 0",
"AS4FP Periferie C+D Zona II+III",
"AS4FP Semicentru B Zona I",
"AS5FP Centru A Zona 0",
"AS5FP Periferie C+D Zona II+III",
"AS5FP Semicentru B Zona I",
"AS6FP Centru A Zona 0",
"AS6FP Periferie C+D Zona II+III",
"AS6FP Semicentru B Zona I"
],
"nota_acoperire": "Ce perioade acoperă fiecare set şi ce e neconfirmat: /financiar/v1/fiscal/acoperire."
}
}
Error codes
| Code | Slug | When it occurs |
|---|---|---|
| 401 | neautentificat | Missing or invalid token. |
| 403 | feature_indisponibil | financiar.fiscal_referinta is not in the current plan. |
| 404 | caen_inexistent | The code does not exist in any NACE revision. |
| 422 | validare | a judet that is not a county registration code, a caen that is not NACE-shaped, or caen_versiune without caen. |
| 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 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."
]
}
}
}