D100 — payment obligations to the state budget¶
Monthly/quarterly return of self-assessed and withheld state-budget taxes
(withheld income tax on dividends/interest/prizes, micro-enterprise tax,
corporate-tax advance payments, non-resident withholding, excise, gambling
taxes, resource royalties, ...). This file is a completion guide: what the
declaration settles, who files it and when, and how each form row maps onto the
XSD attribute anafpy authors — followed by the technical XSD/DUK layer. ANAF's
validator jar (D100Validator.jar) and published instructions are the
authority; this guide is a distilled bridge, not a re-implementation of the
rules. The obligation-type code list is large (100+ active codes) and lives in
the separate annex d100-nomenclatoare.md. Everything
below the "Common scenarios" instances was proven hands-on on 2026-07-17 against
D100Validator.jar J21.0.6 (feed directory D100_75).
Purpose & legal basis¶
D100 is the Declarație privind obligațiile de plată la bugetul de stat — the
periodic self-assessment through which a taxpayer declares the state-budget
taxes it owes or has withheld at source. It is not a single tax: each line is
one budget obligation picked from ANAF's Nomenclatorul obligațiilor de
plată la bugetul de stat (anexa nr. 11 to the order), identified by a 3-digit
cod_oblig. The instructions open with exactly this: "Declarația privind
obligațiile de plată la bugetul de stat se completează și se depune de către
contribuabilii cărora le revin, potrivit legislației în vigoare, obligațiile
declarative și de plată pentru impozitele și taxele cuprinse în Nomenclatorul
obligațiilor de plată la bugetul de stat, prevăzut în anexa nr. 11 la ordin."
- Current model: approved by OPANAF 57/2026 (M.Of. 55/23.01.2026),
which amends the base order OPANAF 587/2016. OPANAF 57/2026 added two
nomenclator positions — 113 (
cod 702, taxa logistică) and 114 (cod 247, accize tutun mestecat/nazal) — and fixed the micro-tax rate at 1% from reporting year 2026 (thecotafield, see the pitfalls). The form model iscod 14.13.01.99/bs; the rectificative sibling is D710 (cod 14.13.01.00/r), which shares this same XSD structure and structure annex. - Periodicity is per obligation code, not per taxpayer — most withholdings
are monthly, corporate-tax advances / micro / royalties are quarterly, a few
are annual/semiannual or 15/18-month. The reporting period is carried by
luna+an(see the mapping), never by a rectificative flag on D100.
Who files & when¶
- Who: any taxpayer to whom a nomenclator obligation applies for the period. D100 covers state-budget self-assessed and source-withheld taxes; it does not carry payroll income tax or the social contributions withheld from salaries — those go on D112 (see the D100 ↔ D112 boundary in the pitfalls).
- Deadline: "până la data de 25 inclusiv a lunii următoare perioadei de
raportare" — the 25th (inclusive) of the month following the reporting
period — for the monthly (pct. 1.1) and quarterly (pct. 1.2) obligations, and
"la alte termene" for the special obligations at pct. 1.3 (e.g. the
prospecting tax
cod 750by 25 December of the current year for the next year). The structure annex confirms the same rule as the25LUshorthand ("25 a lunii următoare perioadei de raportare") on the overwhelming majority of codes — the two sources agree. Per-code exceptions (25LS, 25LU2, 25L6, 15/18-month, annualACdates, ...) are tabulated in the annex. - Monthly vs quarterly is fixed by the obligation code, per the instructions:
- Monthly (pct. 1.1): withheld income tax on arendă/dividende PF (
604)/ dobânzi (605)/premii (608)/jocuri de noroc (621)/alte surse (690)/ transfer proprietăți imobiliare (620), excise, non-resident withholding (631–642), vărsăminte handicap (810), gambling taxes, health contributions, monopol-natural tax. - Quarterly (pct. 1.2): corporate-tax advance payments (
102/103/105), impozit pe veniturile microîntreprinderilor (121), mining/oil royalties (755/756), redevențe concesiune terenuri agricole.lunacarries the last month of the quarter (3/6/9/12). - Corrections: D100 has no rectificative flag. The instructions are
explicit: "Corectarea obligațiilor declarate eronat în formular se face prin
depunerea formularului 710 'Declarație rectificativă', cod 14.13.01.00/r" —
errors are fixed by filing a D710, not by re-filing D100. The
d_anulare/temeiheader flags on D100 are for the narrow case of a declaration filed after annulment of the verification reserve (art. 105(6) of the Fiscal Procedure Code, Legea 207/2015), not for ordinary corrections. Also: omitting an obligation's table equals not declaring it — "Necompletarea tabelului corespunzător ... echivalează cu nedeclararea obligației respective."
Filling guide¶
Shape: unlike D300 (one attributes-only element), D100 is a header element
with repeating <obligatie> children — one child per budget obligation, up to
1300. One declaration covers one reporting period (luna/an) and may
carry many obligation lines for that period.
<declaratie100 luna an d_anulare … totalPlata_A …>
<obligatie cod_oblig cod_bugetar scadenta nr_evid suma_dat … /> ← one per tax
<obligatie … />
</declaratie100>
The obligation record is exactly ten attributes. The published 2022 XSD and
the jar both fix <obligatie> to cod_oblig, cod_bugetar, scadenta,
nr_evid, suma_dat, suma_ded, suma_plata, suma_rest, cota,
suma_redu — nothing else. The combined D100/D710 structure annex additionally
lists suma_spons, suma_AMEF, suma_bonif, bifa_impozit_minim, Data_I,
Data_IC, d_nInf, d_bonif and a Zona-710 block, but those are rejected on
current D100 — they are historical on both forms; of them, only
bifa_impozit_minim survives on current D710 (verified against its jar —
see d710.md). See the pitfalls.
Identification block (header attributes)¶
| Attribute | Form field | Notes |
|---|---|---|
luna |
Perioada de raportare — Luna | 1–12; the last month of the period (3/6/9/12 for a quarter) |
an |
Perioada de raportare — An | reporting year (jar accepts ≥ 2016) |
d_anulare |
Declarație depusă/corectată după anularea rezervei verificării | 0/1 — required; 0 for an ordinary filing |
temei |
Temeiul legal (only when d_anulare=1) |
enum 2 on D100 (art. 105(6) lit. b, Legea 207/2015); must be null when d_anulare=0 |
d_succ / cifS |
Declarație depusă de succesor (art.90(4) L207/2015) + CIF succesor | optional; cifS required (CUI/CNP-validated) when d_succ=1 |
d_dizolv |
PJ care se dizolvă cu/fără lichidare | 0/1; shifts some scadențe |
nume_declar / prenume_declar / functie_declar |
Declarant nume / prenume / funcție | required text |
cui |
Cod de identificare fiscală | required; jar enforces the CUI check digit |
den |
Denumire / Nume și prenume | required |
adresa |
Adresă domiciliu fiscal | required |
telefon / fax / mai |
contact | optional (note the attribute is mai, not mail) |
totalPlata_A |
Suma de control | required; control sum — not the amount payable (see pitfalls) |
Obligation record (<obligatie>) → attributes¶
| Attribute | Rd. (instructions) | Field | Notes |
|---|---|---|---|
cod_oblig |
— | Cod obligație | 3-digit code from the nomenclator (annex); jar-enforced enum |
cod_bugetar |
— | Cod bugetar | budget account; jar-enforced per code (rules R14a/R14b) |
scadenta |
— | Scadența plății | dotted d.m.yyyy (e.g. 25.07.2026); jar-computed business date |
nr_evid |
— | Nr. de evidență a plății | 23 digits; checksum (rule R16) |
suma_dat |
Rândul 1 "Suma datorată" | tax owed for the period | ≥ 0 |
suma_ded |
Rândul 3 "Suma deductibilă / datorată anterior / de recuperat" | deductible / prior-period leg | ≥ 0; excise / health / specific taxes |
suma_plata |
Rândul 2 "Suma de plată" | amount to pay | computed per the model below |
suma_rest |
Rândul 4 "Suma de restituit" | refundable amount | ≥ 0 |
cota |
— | Cota impozit micro (1%) | micro (121) only; must be 1 for an ≥ 2026, null otherwise |
suma_redu |
— | Reducere impozit (OUG 153/2020) | 121/130 only; 0 ≤ suma_redu ≤ suma_dat |
Completion models (the suma_* relationship per code family)¶
The nomenclator assigns each code a completion model (1#…10#) that fixes
how the amounts relate. The jar enforces the model for the code. The common ones:
| Model | Applies to (examples) | Relationship |
|---|---|---|
1# / 8# |
most withholdings + profit taxes (150,604,605,608,621,620,690,631–642,810,750,780; 102,103,105) |
suma_plata = suma_dat; suma_ded = suma_rest = 0 |
2# |
107,127 (scutit — exempt) |
suma_plata = 0 |
5# |
excise (211,212,…,245,246,247) |
suma_plata = suma_dat − suma_ded ≥ 0; suma_rest ≥ 0 |
6# |
504 (jocuri), 701 (construcții) |
suma_plata = suma_dat − suma_ded ≥ 0 |
7# |
450,455,456 (medicamente), 116,117 (specific/IMCA), 494 |
suma_plata = suma_dat − suma_ded ≥ 0; suma_rest = suma_ded − suma_dat ≥ 0 |
9# |
121 (micro) |
suma_plata = suma_dat − suma_ded − suma_redu ≥ 0; suma_rest = 0; cota = 1 (the annex's suma_spons/suma_AMEF terms are D710/historical — rejected on current D100) |
10# |
130 (specific, historical ≤ 12.2023) |
suma_plata = suma_dat − suma_redu ≥ 0; suma_rest = 0 |
totalPlata_A (rule R11a) is the sum, over all obligation rows, of every
filled amount attribute (suma_dat + suma_ded + suma_plata + suma_rest +
suma_redu). It is a control sum, not the money owed (that is the sum of the
suma_plata legs). An all-zero declaration has totalPlata_A="0".
Common scenarios¶
Each instance below validated clean (ok) against D100Validator.jar
J21.0.6 on 2026-07-17, for a June-2026 period. The synthetic cui="1234565"
is check-digit valid; each nr_evid is composed with the D100 layout (see the
nr_evid note in the v2 section) and passes rule R16.
1 — Single withholding (Model 1#): 80 RON dividend tax withheld from an
individual (cod 604), due 25.07.2026.
<?xml version="1.0" encoding="UTF-8"?>
<declaratie100 xmlns="mfp:anaf:dgti:d100:declaratie:v2"
luna="6" an="2026" d_anulare="0"
nume_declar="Popescu" prenume_declar="Ion" functie_declar="Administrator"
cui="1234565" den="EXEMPLU TEST SRL" adresa="Mun. Bucuresti, Str. Exemplu nr. 1"
totalPlata_A="160">
<obligatie cod_oblig="604" cod_bugetar="5503" scadenta="25.07.2026"
nr_evid="10604010626250726000048" suma_dat="80" suma_plata="80"/>
</declaratie100>
2 — Micro-enterprise tax, Q2 (Model 9#): 1 000 RON micro tax for the
second quarter (cod 121, quarterly, luna="6"), cota="1" is mandatory:
<obligatie cod_oblig="121" cod_bugetar="5503" scadenta="25.07.2026"
nr_evid="10121010626250726000042" cota="1"
suma_dat="1000" suma_ded="0" suma_plata="1000" suma_rest="0"/>
totalPlata_A="2000" (1000 + 0 + 1000 + 0).
3 — Typical SME period, two obligations: the Q2 micro tax (121) plus a
June dividend withholding (604) in one declaration. Both lines share the
period luna="6"/an="2026"; the monthly 604 and the quarterly 121 both
fall due 25.07.2026:
<?xml version="1.0" encoding="UTF-8"?>
<declaratie100 xmlns="mfp:anaf:dgti:d100:declaratie:v2"
luna="6" an="2026" d_anulare="0"
nume_declar="Popescu" prenume_declar="Ion" functie_declar="Administrator"
cui="1234565" den="EXEMPLU TEST SRL" adresa="Mun. Bucuresti, Str. Exemplu nr. 1"
totalPlata_A="2160">
<obligatie cod_oblig="121" cod_bugetar="5503" scadenta="25.07.2026"
nr_evid="10121010626250726000042" cota="1"
suma_dat="1000" suma_ded="0" suma_plata="1000" suma_rest="0"/>
<obligatie cod_oblig="604" cod_bugetar="5503" scadenta="25.07.2026"
nr_evid="10604010626250726000048" suma_dat="80" suma_plata="80"/>
</declaratie100>
totalPlata_A="2160" = (1000+0+1000+0) + (80+0+80+0).
4 — Correction: there is no D100 correction instance — re-declare the
period on a D710 (same structure, <declaratie710> root). Do not toggle a
flag on D100.
Special attention & gotchas¶
The pitfalls below trace either to direct XSD/validator verification (the
attribute set, the cota and cod_bugetar rules, the newer-code acceptance,
and the suma_spons/suma_AMEF rejection were each observed against
D100Validator.jar J21.0.6) or to an authoritative source (the D100
instructions and OPANAF 57/2026 for the deadline, D710 corrections, periodicity,
and the D112 boundary). No uncorroborated practitioner claim is carried.
- Corrections go through D710, never a D100 flag. The instructions route all
error corrections to formularul 710. The
d_anulare/temeifields are only for the post-verification-reserve-annulment case, not everyday fixes. Author a<declaratie710>for a correction. - The structure annex is a combined D100/D710 document — not every field it
lists is valid on current D100. Direct validator verification: adding
suma_spons="200"orsuma_AMEF="50"to a121row fails with "eroare atribut: suma_spons: atributul cu valoarea '200' nu trebuie sa existe aici". The bonificatie/sponsorship/AMEF fields,Data_I,Data_IC,d_nInf,d_bonif,d_recNand the whole "Zona 710" are historical on both forms — rejected on current D100 and on current D710 (the latter verified against its jar). The only one of these that survives on current D710 isbifa_impozit_minim; the substantive D710 delta is that each amount splits into an_I/_C(inițială/corectată) pair — seed710.md. On current D100,<obligatie>is exactly the ten attributes listed above (of whichsuma_reduis accepted — verified clean). - The obligation-code list lives in the jar, not the frozen XSD. The
published
d100_24022022.xsdenumerates 72 codes; the jar (J21.0.6) carries 100+. Direct verification:cod_oblig="702"(added by OPANAF 57/2026, absent from the 2022 enum) validates through to the business rules rather than being rejected as unknown. Trust the structure annex + jar nomenclator, not the XSD'sInt_listaCodObligSTypeenum, for which codes exist and from when. The full current list is ind100-nomenclatoare.md. cod_bugetaris jar-enforced per code — two rules, R14a and R14b. The XSD types it as a freeStr10; the jar knows the budget account for eachcod_obligand reports the expected value. Direct validator verification (re-run 2026-07-18): R14a covers the single-account ("contul unic") codes — a wrong value on604or121fails "R14a: cod bugetar (99999999) trebuie sa fie = 20470101 pt. acest cod_oblig", but the jar accepts both the current5503and the legacy20470101clean (both verified on604;5503also clean on121) even though the message names only20470101. R14b covers the dedicated-account codes and is exact — on702,20A333400validates clean while5503fails "R14b: cod bugetar (5503) trebuie sa fie = 20A333400 pt. acest cod_oblig". Authoring workflow: put a placeholder, run DUK once, copy the R14a/R14b expected value (for a contul-unic code either accepted account works).cotais mandatory for micro (121) and must be1from 2026 (rule Rcota/R17). Omitting it fails: "Pt cod obligatie 121, cota trebuie sa fie = 1". The rule isdaca cod_oblig=121 si an>2025 atunci cota=1, altfel cota=null— the 1% micro rate baked into the validator by OPANAF 57/2026. Setcota="1"on every 2026 micro line; leave it off every other code.scadentais a computed business date, not free text. Format is dottedd.m.yyyy. The default is the 25th of the following month, but exceptions are legion (advance profit tax102/103/105quarter IV → 25th of the fiscal year-end month;780/781→ 28/29 July; specific116/117quarter IV → 25th of the 3rd/6th following month; health450/455/456→ 25th of the 2nd month; top-up131/132→Data_I+ 15/18 months; excise → any day of the reporting month). The(cod_oblig, scadenta)pair must be unique in a declaration — except excise codes, which may appear on several<obligatie>rows with different scadențe ("Accizele se pot incarca de mai multe ori in D100 dar cu scadente diferite"). The full scadență table is in the annex.nr_evidis per obligation row (rule R16), 23 digits. Layout:10+ 3-digitcod_oblig+01+MMYY(period end) +DDMMYY(scadență) +0+0+00+ 2-digit control (last two digits of the sum of the first 21). Note this putscod_obligin the code slot (not the D300cod_imp), which the jar checks (rule R16). Compose it withobligation_evidence_number(cod_oblig, month, year, due_date)(MCP:declaratie_nr_evidwithform="D100",cod_oblig,scadenta) — never by hand; a mismatched checksum fails as "cifra control eronata".- A nil period for a tax still needs its
<obligatie>row. Because omitting the table equals non-declaration, a period with a declarative obligation but no amount is filed withsuma_dat/suma_plata= 0, not by dropping the row. - D100 ↔ D112 boundary — do not double-declare. D100 carries state-budget
self-assessed/withheld taxes owed by the payer (dividend/interest/prize
withholding to individuals, micro tax, corporate-tax advances, non-resident
withholding, excise, ...). It does not carry the income tax and social
contributions (CAS/CASS) withheld from salaries — those are D112's.
Salary income tax on D100 is an error; dividend/interest withholding (
604/605) on D112 is an error. The instructions' pct. 1.1(a) scope enumerates the non-salary withholdings precisely, which is the boundary to check before filing. - "Contul unic" split. Section B is presented as two tables — pct. I
"Impozite și taxe care se plătesc în contul unic" (nomenclator positions
1–15, 17–20, 24, 26) and pct. II "…care nu se plătesc în contul unic"
(positions 16, 21–23, 25, 27–64). In the XML they are all
<obligatie>rows; the split matters for which account the payment lands in, not for the structure.
v2 (current; XSD d100_24022022.xsd, jar J21.0.6)¶
- Namespace
mfp:anaf:dgti:d100:declaratie:v2, rootdeclaratie100. The XSD dates from 2022 while the jar is at J21.0.6 (2026) — the nomenclature updates live in the jar, not the schema, so expect the jar to be stricter than the XSD. - Shape: header attributes (
luna,an,d_anulare0/1, declarant name/function,cui,den,adresa,totalPlata_A; optionaltemei, succession/dissolution flags) + repeatingobligatierows (max 1300). obligatie:cod_oblig(closed 72-code enum in the XSD — the tax nomenclature, e.g.604= dividend tax withheld for individuals),cod_bugetar,scadenta(dotted dated.m.yyyy, e.g.25.07.2026),nr_evid, plus amountssuma_dat/suma_ded/suma_plata/suma_rest(andcota,suma_redu).cod_bugetaris jar-enforced per obligation code (rules R14a/R14b): the XSD types it as a freeStr10, but the validator knows the budget account for eachcod_obligand tells you the expected value. For the contul-unic codes the rule is R14a and its message names only the legacy account — on604a wrong value fails "R14a: cod bugetar (…) trebuie sa fie = 20470101 pt. acest cod_oblig" — yet the jar accepts both20470101and5503clean (verified 2026-07-18); dedicated-account codes fail under R14b and are enforced exactly (see the pitfalls). Authoring workflow: put anything plausible, run DUK once, copy the code from the R14a/R14b message.totalPlata_Aformula is explicit here (rule R11b): the message text namesSuma(suma_dat + suma_ded + suma_plata + suma_rest)over all obligation rows, but the value the jar actually computes also includessuma_redu(verified: a121row withsuma_redu="100"forcestotalPlata_Aup by 100 even though R11b's printed formula omits it). Author it as the sum of all filled amount attributes —suma_dat + suma_ded + suma_plata + suma_rest + suma_redu— as the Filling guide states. Unlike D300/D390, the control sum is at least partly spelled out in the message.nr_evidper obligation row, same 23-digit layout as D300's (10+ 3-digit code +01+MMYY+ due dateDDMMYY(the scadență — not always the 25th, see the filling guide) +0000+ 2-digit digit-sum check) but withcod_obligin the code slot instead of D300'stip_decont-derivedcod_imp. Composed byanafpy.declaratii.obligation_evidence_number(shared with D710).cuicheck digit enforced by the jar.- Minimal valid instance (80 RON dividend tax withheld in June 2026):
<?xml version="1.0" encoding="UTF-8"?>
<declaratie100 xmlns="mfp:anaf:dgti:d100:declaratie:v2"
luna="6" an="2026" d_anulare="0"
nume_declar="Popescu" prenume_declar="Ion" functie_declar="Administrator"
cui="1234565" den="EXEMPLU TEST SRL" adresa="Mun. Bucuresti, Str. Exemplu nr. 1"
totalPlata_A="160">
<obligatie cod_oblig="604" cod_bugetar="20470101" scadenta="25.07.2026"
nr_evid="10604010626250726000048" suma_dat="80" suma_plata="80"/>
</declaratie100>