Skip to content

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).

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 — the J13.0.1 validator, the D212_A1.0.3 structure annex, the d212_20250113.xsd schema — is therefore the prior generation (the OPANAF 1929/2025 lineage: realized 2024 / CASS elected 2025, minimum wage 3300). This guide targets what the installed J13.0.1 jar actually validates: the annual DU on the v11 namespace with luna_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 chapterrectif1 (rectifies Cap I) and rectif2 (rectifies Cap II); d_rec is derived (d_rec = 1 iff rectif1 or rectif2 is 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_litB flag 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 both 0.
  • 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 =1real_camere_inchiriere etc. present
bifa121 Cap I — foreign income =1<cap14> MUST EXIST
bifa122 Cap I — CAS/CASS on foreign salary-assimilated income =1str_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/1derived 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
bifa111bifa18 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_iemail_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 + totalCassDatoratCoasiguratv11-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 declares v9. d212_20250113.xsd targets …:d212:declaratie:v9; feeding a v9 document to J13.0.1 fails 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_r selects the wire version. luna_r="12" is the annual DU and resolves to v11. Any other value flips the demanded namespace to v2 (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_r is fixed at 12.
  • totalPlata_A is 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 same totalPlata_A="47" (the digit sum of 1850615123456). Author 0, read the expected value from the R4 error, set it.
  • oblimpoz_real_total (Section 7) is validator-tolerated — J13.0.1 does not check it. Direct validator verification (2026-07-18), on the scenario-2 instance (impozit11="4000", real_impozit_datorat_ai="2610"): the values 2610 (excluding impozit11), 6610 (including it), 0, 4000, 999999, and omitting the attribute entirely all validate clean — with or without oblimpoz_real_anticipat/oblimpoz_real_dif_deplata present — 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-floor cas_baza="1000" and a mis-computed real_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: set oblimpoz_real_total to the settled tax — real_impozit_datorat_ai + real_impozit_datorat_dpi plus the tax legs of sources not settled through those aggregates — and never re-add an impozit11 already superseded by an _ai/_dpi settlement (double counting).
  • The cif CNP 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 (key 279146358279): 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 (1850615123456 and 1850615410019 both pass).
  • The plafoane are baked at the prior-generation minimum wage (3300). The installed J13.0.1 build settles realized-2024 income: CAS elected base ≥ 12·3300 / ≥ 24·3300, CASS independent-activity base capped at 198000 (60·3300), the 6-min-wage floor at 19800 (6·3300). The Cap II option, in the current (2025) year, uses baza_optiune=24300 (6·4050). OPANAF 2736/2025's model already quotes the 2025 figures (24.300, 243.000) — so a genuine FY2025 declaration expects 60·4050 = 243000 caps the downloadable jar does not apply. Do not file an FY2025 declaration against J13.0.1.
  • an_r validates loosely — that is a trap, not a feature. The XSD range is 2025–2100 and the jar structurally accepts an_r="2026", but its plafoane are the 3300/4050 (2024/2025) figures. Passing schema validation for an_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's an_r = 2025 rule).
  • v11 carries CASS-option attributes the v9 XSD never declared. <oblig_estimat> needs totalCassDatorat (and, for dependants, bifa_optiune_coasigurat / totalCassDatoratCoasigurat / cassDatoratCoasigurat) — the jar's rule Rcass_estimat requires totalCassDatoratCoasigurat + cass_optiune = totalCassDatorat, and a Cap II filing without totalCassDatorat is rejected. None of these appear in d212_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_venit and caen are closed jar nomenclatures. categ_venit is a 13-value closed list (confirmed: 1016 independent activities, 1003 IP rights; the jar also references 1014 "Alte surse", itself absent from the v9 XSD enum — more drift). caen is the standard closed CAEN list carried in the XSD (Rev.2 codes; 6201 validates). 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* drive bifa_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.html returns 404 — the page is declaratie_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 (not declaratie212).
  • Required header: d_rec, rectif1, rectif2, totalPlata_A, luna_r/an_r, bifa_succesor, anulare_litA/anulare_litB, bifa_conformare, the ten chapter checkboxes bifa111bifa18 (which chapters are filled), nume_c, adresa_c, cif (the individual's CNP — 13 digits, checksum enforced), nerezident.
  • totalPlata_A on 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: author 0, read the expected value from the error, set it.
  • Chapters ride optional child elements (oblig_realizat, oblig_estimat, cap11 realized self-employment, cap12 income norms, cap14 foreign 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"/>