D212 — individuals' unified declaration (declarația unică)¶
The Declarație unică settles, in a single form, a natural person's income
tax and social contributions (CAS pension + CASS health) for a fiscal year.
This file is a completion guide: what the declaration settles, who files it
and when, and how each form section maps onto the XSD attributes anafpy authors —
followed by the technical XSD/DUK layer. ANAF's validator jar
(D212Validator.jar) and published instructions are the authority; this guide is
a distilled bridge, not a re-implementation of the rules. Every instance below
the "Common scenarios" heading was proven hands-on on 2026-07-17 against
D212Validator.jar J13.0.1 (the D212Validator_01082025.zip build; feed
directory D212_40).
Purpose & legal basis¶
The form has a two-chapter design (the two are independent — either, both, or a Cap II-only filing is valid):
- Capitolul I — the definitive settlement of income realized in the prior year: income tax on every category (independent activities, IP rights, rentals, agriculture/forestry/fishing, investments, foreign income, other sources) plus the CAS (pension, art. 148–151 Cod fiscal) and CASS (health, art. 170–180 Cod fiscal) actually owed on that income.
-
Capitolul II — the CASS option for the current year: persons who elect to pay CASS in advance (to keep health coverage) declare the elected base here.
-
Current model: approved by OPANAF 2736/2025 (M.Of. 1.207 bis/29.12.2025), the model for income realized from 2025 and the CASS option from 2026. Statutory basis: Legea 227/2015 (Codul fiscal) — titlul IV (impozit pe venit, the annual return under art. 122), titlul V (CAS art. 137/148–151, CASS art. 155/170–180), and the Fiscal Procedure Code (Legea 207/2015) for rectifications and the verification-reserve rules.
- Version the guide targets — read this before trusting the jar. OPANAF
2736/2025 moved distribution to the DUF web application
(
www.anaf.ro/declaratii/duf) and published no fresh downloadable validator, structure annex or XSD on the static page. The newest downloadable tooling — theJ13.0.1validator, theD212_A1.0.3structure annex, thed212_20250113.xsdschema — is therefore the prior generation (the OPANAF 1929/2025 lineage: realized 2024 / CASS elected 2025, minimum wage 3300). This guide targets what the installedJ13.0.1jar actually validates: the annual DU on the v11 namespace withluna_r=12,an_r=2025, Cap I plafoane baked at 3300. See Special attention & gotchas for the full drift map.
Who files & when¶
- Who: natural persons who, in the reporting year, realized income in Romania or abroad subject to income tax and/or owe mandatory social contributions — and, separately, anyone who opts to pay CASS for the current year (Cap II, including a person with no income). Persons with a severe or accentuated handicap, though income-tax-exempt on independent/IP/agricultural income, still have to declare it.
- Deadline: the 25th of May inclusive of the year following the year the income was realized (instructions §I.1) — i.e. 25 May 2026 for FY2025. The CASS option (Cap II) can be filed any time during the current year.
- How filed: SPV, or e-guvernare.ro with a qualified electronic signature, or on paper at the tax office. anafpy authors/validates/signs locally; portal upload is a later milestone.
- Corrections: the DU has a rectifying flag per chapter —
rectif1(rectifies Cap I) andrectif2(rectifies Cap II);d_recis derived (d_rec = 1iffrectif1orrectif2is 1). A rectifying declaration restates every field of the rectified chapter, not just the changed ones.bifa_conformare="1"marks a rectification filed in response to a conformity notification.anulare_litA/anulare_litBflag the narrow case of a declaration filed after annulment of the verification reserve (art. 105(6) lit. a/b of the Fiscal Procedure Code); ordinary declarations leave both0. - What does NOT go on the D212. Income taxed by final withholding at source is not re-declared: e.g. IP-rights income for which the payer withholds a final tax, or rental income (other than agricultural lease and short-term touristic room rental) paid by a legal entity that keeps accounting records (final taxation). The 3.5% redirection of income tax to non-profits is not part of the D212 — it is a separate form (D230).
Filling guide¶
The document is a small tree, not a flat attribute bag. The root <d212>
carries the header attributes; the numbers ride optional child elements:
| Element | Cardinality | Carries |
|---|---|---|
<oblig_realizat> |
0..1 | Cap I settlement: the CAS/CASS blocks and the per-section aggregates + the "summary of obligations" |
<oblig_estimat> |
0..1 | Cap II: the CASS option (elected base, contribution, dependants) |
<cap11> |
0..n | one per real-system income source (independent activities, IP rights, rentals, agriculture…) |
<cap12> |
0..n | one per norme-de-venit income source (fixed-quota activities) |
<cap14> |
0..n | one per foreign income source |
The chapter checkboxes are the routing table. The ten required
bifa* header flags declare which sections are filled, and the jar enforces the
child element each implies:
| Flag | Meaning | Enforced implication |
|---|---|---|
bifa111 |
Cap I — income tax on RO income (real / cote forfetare) | =1 ⇒ at least one <cap11> MUST EXIST |
bifa112 |
Cap I — income tax on RO income (norme de venit) | =1 ⇒ <cap12> MUST EXIST |
bifa113 |
Cap I — touristic room rental on norme de venit | =1 ⇒ real_camere_inchiriere etc. present |
bifa121 |
Cap I — foreign income | =1 ⇒ <cap14> MUST EXIST |
bifa122 |
Cap I — CAS/CASS on foreign salary-assimilated income | =1 ⇒ str_cas_baza/str_cass_baza present |
bifa131 |
Cap I — CAS owed | =1 ⇒ the cas_* block present |
bifa132 |
Cap I — CASS owed | =1 ⇒ the cass_* block present |
bifa14 |
Cap I — settle income tax on real-system independent-activity income | forced =1 when a cap11 has det_ven_net=1 & categ_venit=1016 & impozit11>0 |
bifa15 |
Cap I — settle income tax on real-system IP-rights income | forced =1 when a cap11 has det_ven_net=1 & categ_venit=1003 |
bifa18 |
Bonificație (early-payment discount) | =1 ⇒ one of the obl*_bonif fields present |
Identification block (required header attributes)¶
| Attribute | Form field | Notes |
|---|---|---|
d_rec |
Declarație rectificativă | 0/1 — derived from rectif1/rectif2 |
rectif1 |
Declarație rectificativă privind Capitolul I | 0/1 |
rectif2 |
Declarație rectificativă privind Capitolul II | 0/1 |
totalPlata_A |
Suma de control | control sum = the digit sum of the CNP, nothing else — see pitfalls |
luna_r |
Luna de raportare | must be 12 for the annual DU — any other value selects a different wire version (see pitfalls) |
an_r |
Anul de raportare | 2025 for the installed jar (XSD range 2025–2100) |
bifa_succesor |
Declarație depusă de succesor (art. 90(4) CPF) | 0/1; cif_succesor required when 1 |
anulare_litA / anulare_litB |
Depunere după anularea rezervei verificării (art. 105(6) a/b) | 0/1 |
bifa_conformare |
Rectificare ca urmare a unei notificări de conformare | 0/1 |
bifa111…bifa18 |
Chapter checkboxes | 0/1, see the routing table above |
nume_c |
Nume Inițiala Prenume | required; letters + - only |
adresa_c |
Adresă | required |
telefon_c / fax_c / email_c |
contact | optional |
cif |
CNP / NIF | the individual's CNP — 13 digits, checksum enforced by the jar |
nerezident |
Bifă nerezident | 0/1; stat_rezidenta + cif_str required when 1 |
cont_bancar |
Cont bancar (IBAN) | optional |
den_i…email_i |
împuternicit / curator fiscal | optional block |
Capitolul I — the settlement blocks (on <oblig_realizat>)¶
CAS (pension) — bifa131=1 (structure annex Section 3.1):
| Attribute | Meaning | Rule |
|---|---|---|
bifa_cas_real |
income band for CAS | 1 = income in [12, 24) min wages; 2 = income ≥ 24 min wages |
cas_total_ven |
total independent-activity + IP income (art. 148(2)) | required when bifa131=1 |
cas_baza |
elected annual CAS base | ≥ 12·3300 if band 1; ≥ 24·3300 if band 2 |
cas_datorat |
CAS owed | = round(cas_baza · 25%) |
cas_retinut_platitor |
CAS withheld by a payer (art. 151(6¹)) | ≤ cas_datorat |
cas_dif_plus |
difference to pay | = cas_datorat − cas_retinut_platitor |
CASS (health) — bifa132=1 (structure annex Section 3.2), split into two
sub-blocks by the flags bifa_cass_datorat_ai (independent activities, art.
155(1)(b)) and bifa_cass_datorat_dpi (IP rights, association, rentals,
agriculture, investments, other sources — art. 155(1)(c)–(h)):
| Attribute | Meaning | Rule |
|---|---|---|
cass_total_ven_ai |
total independent-activity + IP income | required when bifa_cass_datorat_ai=1 |
baza_cass_datorat_ai |
annual CASS base (independent activities) | ≤ 198000 (60·3300 cap) |
cass_datorat_ai |
CASS owed | = round(baza_cass_datorat_ai · 10%) |
cass_retinut_platitor_alin6_ai / _alin7_ai |
CASS withheld by a payer | _alin7_ai path keys on > 19800 (6·3300 floor) |
bifa_cass_real |
income band for the DPI CASS | 0 = < 6 / 1 = [6,12) / 2 = [12,24) / 3 = ≥ 24 min wages (cass_total_ven vs salMin) |
The per-section income-tax aggregates also live on <oblig_realizat>:
real_venit_net_recalculat_ai, real_cas-deduc_ai, real_cass-deductibil_ai,
real_venit_net_impozabil_ai, real_impozit_datorat_ai (the _dpi twins for IP
rights) — the taxable base is the recalculated net minus deductible CAS and
CASS, and the tax is 10% of it. The summary of obligations (Section 7)
totals the settled income-tax legs into oblimpoz_real_total: a source whose
tax is settled through the _ai/_dpi aggregates contributes its
post-deduction real_impozit_datorat_ai/_dpi — its per-source
impozit11 is the preliminary pre-deduction figure and is not re-added
(that would double-count the same source; scenario 2 below carries
oblimpoz_real_total="2610", not 2610 + 4000). Note the installed jar does
not enforce this field at all — see the gotcha on the unenforced summary
total. oblimpoz_real_dif_deplata/_dif_restituit net it against
oblimpoz_real_anticipat (advance payments).
Per-source detail (<cap11> real system)¶
| Attribute | Rd. | Field |
|---|---|---|
reg |
— | regularization flag |
categ_venit |
1 | income category — closed nomenclature (see below); 1016=independent activities, 1003=IP rights, 1014=other sources |
det_ven_net |
2 | 1=sistem real / 2=cote forfetare (forced 1 for 1016) |
forma_org |
3 | 1=individual / 2=asociere fără PJ / 3=transparență fiscală |
caen |
— | closed CAEN list (6201 validates) |
venit_brut / chelt_deduc |
1/2 | gross income / deductible expenses |
venit_net_anual |
3 | = venit_brut − chelt_deduc |
pierdere* |
4–6 | fiscal loss + prior-year loss carry (70% cap) |
venit_recalculat |
7 | net after loss compensation |
impozit11 |
9 | income tax at source level (10%) |
cap12 (norme de venit) and cap14 (foreign income, with dubla_impunere credit
method) mirror this shape with their own prefixes.
Capitolul II — the CASS option (on <oblig_estimat>)¶
| Attribute | Meaning | Rule |
|---|---|---|
bifa_optiune |
"I opt to pay CASS" | =1 |
situatie_optiune |
which situation (A–F) | required when bifa_optiune=1 — see the A–F list below |
baza_optiune |
elected annual CASS base | 24300 (= 6·4050, the 2025 min wage) |
cass_optiune |
CASS owed | = round(baza_optiune · 10%) = 2430 |
totalCassDatorat |
total CASS due | = cass_optiune + totalCassDatoratCoasigurat — v11-only, not in the v9 XSD |
situatie_optiune A–F (structure annex Section II): A — start independent
activities during the year (other than sport contracts); B — independent
activities with a fiscal loss last year; C — independent activities with zero
net income last year; D — IP rights / association / rentals / agriculture /
investments / other sources under art. 155(1)(c)–(h); E — person with no
income; F — income of the art. 155 type on which no CASS is due.
Common scenarios¶
Each instance below validated clean (ok) against D212Validator.jar
J13.0.1 on 2026-07-17, namespace mfp:anaf:dgti:d212:declaratie:v11,
luna_r="12", an_r="2025". The synthetic CNP 1850615123456 (male,
1985-06-15, county 12) is checksum-valid; totalPlata_A="47" is its digit sum and
stays 47 in every instance — for the D212 the control sum is the CNP digit sum
alone, never a total of the amounts.
1 — Nil / "person with no income" (Cap II CASS option). Common case: someone
with no taxable income electing to pay CASS on 6 minimum wages to keep health
coverage. Cap I empty (every bifa11x=0), only <oblig_estimat>:
<?xml version="1.0" encoding="UTF-8"?>
<d212 xmlns="mfp:anaf:dgti:d212:declaratie:v11"
d_rec="0" rectif1="0" rectif2="0" totalPlata_A="47"
luna_r="12" an_r="2025" bifa_succesor="0"
anulare_litA="0" anulare_litB="0" bifa_conformare="0"
bifa111="0" bifa112="0" bifa113="0" bifa121="0" bifa122="0"
bifa131="0" bifa132="0" bifa14="0" bifa15="0" bifa18="0"
nume_c="Popescu Ion" adresa_c="Mun. Bucuresti, Str. Exemplu nr. 1"
cif="1850615123456" nerezident="0">
<oblig_estimat bifa_optiune="1" situatie_optiune="E" baza_optiune="24300"
cass_optiune="2430" totalCassDatorat="2430"/>
</d212>
2 — Independent activity (PFA), real system, with CAS + CASS. A PFA with
60 000 lei gross, 20 000 lei expenses → 40 000 lei net (in the [12·3300,
24·3300) = [39 600, 79 200) band). CAS elected at the 39 600 minimum base
(9 900 owed); CASS on the 40 000 income (4 000 owed); both are deductible, so
the taxable base is 40 000 − 9 900 − 4 000 = 26 100 and the tax is 2 610 —
also the value of oblimpoz_real_total (the per-source impozit11 of 4 000 is
not re-added; the jar does not enforce this field either way — see the
gotchas). bifa14 is forced to 1 by the categ_venit=1016 & impozit11>0 rule:
<?xml version="1.0" encoding="UTF-8"?>
<d212 xmlns="mfp:anaf:dgti:d212:declaratie:v11"
d_rec="0" rectif1="0" rectif2="0" totalPlata_A="47"
luna_r="12" an_r="2025" bifa_succesor="0"
anulare_litA="0" anulare_litB="0" bifa_conformare="0"
bifa111="1" bifa112="0" bifa113="0" bifa121="0" bifa122="0"
bifa131="1" bifa132="1" bifa14="1" bifa15="0" bifa18="0"
nume_c="Popescu Ion" adresa_c="Mun. Bucuresti, Str. Exemplu nr. 1"
cif="1850615123456" nerezident="0">
<oblig_realizat
cas_total_ven="40000" bifa_cas_real="1" cas_baza="39600" cas_datorat="9900"
bifa_cass_datorat_ai="1" cass_total_ven_ai="40000" baza_cass_datorat_ai="40000"
cass_datorat_ai="4000"
real_venit_net_recalculat_ai="40000" real_cas-deduc_ai="9900"
real_cass-deductibil_ai="4000" real_venit_net_impozabil_ai="26100"
real_impozit_datorat_ai="2610" oblimpoz_real_total="2610"/>
<cap11 reg="0" categ_venit="1016" det_ven_net="1" forma_org="1" mod_forma_org="0"
caen="6201" venit_brut="60000" chelt_deduc="20000" venit_net_anual="40000"
venit_recalculat="40000" impozit11="4000"/>
</d212>
3 — Minimal header only (no chapter, e.g. a nil rectification skeleton). Only
the required header; no child elements; totalPlata_A="47". This is the instance
in the v11 section below.
Special attention & gotchas¶
The pitfalls below trace either to direct XSD/validator verification (the
namespace demand, the luna_r-keyed version switch, the CNP-checksum and
control-sum rules, the CAS/CASS plafon figures, the v11-only attributes and the
unenforced Section-7 summary total were each observed against
D212Validator.jar J13.0.1) or to an authoritative source
(OPANAF 2736/2025, the D212_A1.0.3 structure annex, and the Anexa 2 filling
instructions for the reporting-year framing, the option situations, and the
cross-declaration items). No uncorroborated practitioner claim is carried.
- The validator demands namespace
v11, but the newest published XSD declaresv9.d212_20250113.xsdtargets…:d212:declaratie:v9; feeding av9document toJ13.0.1fails with "namespace … incorect … valoarea corectă este xmlns='mfp:anaf:dgti:d212:declaratie:v11'". Two generations of drift, no published v11 schema — the smart PDF is the shape authority (same situation as D101/D112). Author on v11. luna_rselects the wire version.luna_r="12"is the annual DU and resolves tov11. Any other value flips the demanded namespace tov2(observed:luna_r="5"→ "valoarea corectă este xmlns='…:v2'") — a different, intra-year variant with its own schema the DUK pipeline does not carry. For the standard annual filing,luna_ris fixed at12.totalPlata_Ais the CNP digit sum — and nothing else. Rule R4:totalPlata_A = Σ digits(CNP). Unlike the D300 control sum (a total of every numeric row), the D212 control sum ignores the amounts entirely: all three validated instances above — nil, a full PFA settlement, a Cap II option — carry the sametotalPlata_A="47"(the digit sum of1850615123456). Author0, read the expected value from the R4 error, set it.oblimpoz_real_total(Section 7) is validator-tolerated —J13.0.1does not check it. Direct validator verification (2026-07-18), on the scenario-2 instance (impozit11="4000",real_impozit_datorat_ai="2610"): the values2610(excludingimpozit11),6610(including it),0,4000,999999, and omitting the attribute entirely all validate clean — with or withoutoblimpoz_real_anticipat/oblimpoz_real_dif_deplatapresent — while rules like R4 and the CNP checksum still fire on the same instance, so the tolerance is real, not a broken run. (In the same probes a below-floorcas_baza="1000"and a mis-computedreal_impozit_datorat_ai="9999"also passed on this instance — treat the Cap I settlement arithmetic as form-level, enforced by the smart PDF/DUF application, not as jar rules in every configuration.) Conservative authoring choice: setoblimpoz_real_totalto the settled tax —real_impozit_datorat_ai + real_impozit_datorat_dpiplus the tax legs of sources not settled through those aggregates — and never re-add animpozit11already superseded by an_ai/_dpisettlement (double counting).- The
cifCNP checksum is enforced beyond the XSD pattern. The XSD pattern is only[1-9]\d{12}, but the jar runs the standard CNP control-digit check (key279146358279): a wrong check digit fails "cif: CNP invalid" (and, because it changes the digit sum, trips R4 too). Synthetic data needs a checksum-valid CNP (1850615123456and1850615410019both pass). - The plafoane are baked at the prior-generation minimum wage (3300). The
installed
J13.0.1build settles realized-2024 income: CAS elected base≥ 12·3300/≥ 24·3300, CASS independent-activity base capped at198000(60·3300), the 6-min-wage floor at19800(6·3300). The Cap II option, in the current (2025) year, usesbaza_optiune=24300(6·4050). OPANAF 2736/2025's model already quotes the 2025 figures (24.300,243.000) — so a genuine FY2025 declaration expects60·4050 = 243000caps the downloadable jar does not apply. Do not file an FY2025 declaration againstJ13.0.1. an_rvalidates loosely — that is a trap, not a feature. The XSD range is 2025–2100 and the jar structurally acceptsan_r="2026", but its plafoane are the 3300/4050 (2024/2025) figures. Passing schema validation foran_r="2026"does not mean the arithmetic is right for a 2026 filing. Match the jar to the year it was built for (an_r="2025", per the structure annex'san_r = 2025rule).- v11 carries CASS-option attributes the v9 XSD never declared.
<oblig_estimat>needstotalCassDatorat(and, for dependants,bifa_optiune_coasigurat/totalCassDatoratCoasigurat/cassDatoratCoasigurat) — the jar's ruleRcass_estimatrequirestotalCassDatoratCoasigurat + cass_optiune = totalCassDatorat, and a Cap II filing withouttotalCassDatoratis rejected. None of these appear ind212_20250113.xsd; the structure annex (A1.0.3) does list them. Author against the v11 shape (annex), not the v9 XSD. - The 3.5% redirection is not on the D212. There is no redirection/
bursăattribute in the schema — directing up to 3.5% of income tax to a non-profit is a separate form (D230). Don't look for it here. categ_venitandcaenare closed jar nomenclatures.categ_venitis a 13-value closed list (confirmed:1016independent activities,1003IP rights; the jar also references1014"Alte surse", itself absent from the v9 XSD enum — more drift).caenis the standard closed CAEN list carried in the XSD (Rev.2 codes;6201validates). An off-list code fails XSD validation.- Cross-declaration coherence is the real filing risk. Cap I amounts must tie
to the D205 informative returns filed by income payers (IP rights, rentals,
investments, dividends) — ANAF pre-fills and reconciles against them, and a
mismatch surfaces at assessment. The CAS/CASS bands must agree with the income
actually declared (
cas_total_ven/cass_total_ven*drivebifa_cas_real/bifa_cass_real), and a payer's withheld CAS/CASS (*_retinut_platitor*) must not exceed the amount owed.
v11 (live wire format; newest published XSD declares v9)¶
- Soft page URL is irregular:
212.htmlreturns 404 — the page isdeclaratie_unica.html. - Namespace: newest published XSD (
d212_20250113.xsd) declares…:d212:declaratie:v9; the validator demands v11 for the current period (an_r="2025"). Two generations of drift, no published v11 schema — the smart PDF is the authority (same situation as D101/D112). - Root element is
d212(notdeclaratie212). - Required header:
d_rec,rectif1,rectif2,totalPlata_A,luna_r/an_r,bifa_succesor,anulare_litA/anulare_litB,bifa_conformare, the ten chapter checkboxesbifa111…bifa18(which chapters are filled),nume_c,adresa_c,cif(the individual's CNP — 13 digits, checksum enforced),nerezident. totalPlata_Aon an otherwise-empty declaration equals the digit sum of the CNP (rule R4: "totalPlata_A (0) diferit de suma cifrelor CNP (47)") — the control sum includes the CNP's digits, so it is never zero. As everywhere: author0, read the expected value from the error, set it.- Chapters ride optional child elements (
oblig_realizat,oblig_estimat,cap11realized self-employment,cap12income norms,cap14foreign income) — all-optional attributes, not exercised in the minimal pass. - Synthetic CNPs must pass the standard CNP checksum (key
279146358279);1850615123456(male, 1985-06-15, county 12) validates. - Minimal valid instance (FY2025, nothing declared):
<?xml version="1.0" encoding="UTF-8"?>
<d212 xmlns="mfp:anaf:dgti:d212:declaratie:v11"
d_rec="0" rectif1="0" rectif2="0" totalPlata_A="47"
luna_r="12" an_r="2025" bifa_succesor="0"
anulare_litA="0" anulare_litB="0" bifa_conformare="0"
bifa111="0" bifa112="0" bifa113="0" bifa121="0" bifa122="0"
bifa131="0" bifa132="0" bifa14="0" bifa15="0" bifa18="0"
nume_c="Popescu Ion" adresa_c="Mun. Bucuresti, Str. Exemplu nr. 1"
cif="1850615123456" nerezident="0"/>