Skip to content

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

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 (the cota field, see the pitfalls). The form model is cod 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 750 by 25 December of the current year for the next year). The structure annex confirms the same rule as the 25LU shorthand ("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, annual AC dates, ...) 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 (631642), 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. luna carries 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 / temei header 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 112; 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/1required; 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,631642,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"/>
with 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/temei fields 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" or suma_AMEF="50" to a 121 row 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_recN and 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 is bifa_impozit_minim; the substantive D710 delta is that each amount splits into an _I/_C (inițială/corectată) pair — see d710.md. On current D100, <obligatie> is exactly the ten attributes listed above (of which suma_redu is accepted — verified clean).
  • The obligation-code list lives in the jar, not the frozen XSD. The published d100_24022022.xsd enumerates 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's Int_listaCodObligSType enum, for which codes exist and from when. The full current list is in d100-nomenclatoare.md.
  • cod_bugetar is jar-enforced per code — two rules, R14a and R14b. The XSD types it as a free Str10; the jar knows the budget account for each cod_oblig and reports the expected value. Direct validator verification (re-run 2026-07-18): R14a covers the single-account ("contul unic") codes — a wrong value on 604 or 121 fails "R14a: cod bugetar (99999999) trebuie sa fie = 20470101 pt. acest cod_oblig", but the jar accepts both the current 5503 and the legacy 20470101 clean (both verified on 604; 5503 also clean on 121) even though the message names only 20470101. R14b covers the dedicated-account codes and is exact — on 702, 20A333400 validates clean while 5503 fails "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).
  • cota is mandatory for micro (121) and must be 1 from 2026 (rule Rcota/R17). Omitting it fails: "Pt cod obligatie 121, cota trebuie sa fie = 1". The rule is daca cod_oblig=121 si an>2025 atunci cota=1, altfel cota=null — the 1% micro rate baked into the validator by OPANAF 57/2026. Set cota="1" on every 2026 micro line; leave it off every other code.
  • scadenta is a computed business date, not free text. Format is dotted d.m.yyyy. The default is the 25th of the following month, but exceptions are legion (advance profit tax 102/103/105 quarter IV → 25th of the fiscal year-end month; 780/781 → 28/29 July; specific 116/117 quarter IV → 25th of the 3rd/6th following month; health 450/455/456 → 25th of the 2nd month; top-up 131/132Data_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_evid is per obligation row (rule R16), 23 digits. Layout: 10 + 3-digit cod_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 puts cod_oblig in the code slot (not the D300 cod_imp), which the jar checks (rule R16). Compose it with obligation_evidence_number(cod_oblig, month, year, due_date) (MCP: declaratie_nr_evid with form="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 with suma_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, root declaratie100. 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_anulare 0/1, declarant name/function, cui, den, adresa, totalPlata_A; optional temei, succession/dissolution flags) + repeating obligatie rows (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 date d.m.yyyy, e.g. 25.07.2026), nr_evid, plus amounts suma_dat/suma_ded/suma_plata/suma_rest (and cota, suma_redu).
  • cod_bugetar is jar-enforced per obligation code (rules R14a/R14b): the XSD types it as a free Str10, but the validator knows the budget account for each cod_oblig and tells you the expected value. For the contul-unic codes the rule is R14a and its message names only the legacy account — on 604 a wrong value fails "R14a: cod bugetar (…) trebuie sa fie = 20470101 pt. acest cod_oblig" — yet the jar accepts both 20470101 and 5503 clean (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_A formula is explicit here (rule R11b): the message text names Suma(suma_dat + suma_ded + suma_plata + suma_rest) over all obligation rows, but the value the jar actually computes also includes suma_redu (verified: a 121 row with suma_redu="100" forces totalPlata_A up 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_evid per obligation row, same 23-digit layout as D300's (10 + 3-digit code + 01 + MMYY + due date DDMMYY (the scadență — not always the 25th, see the filling guide) + 0000 + 2-digit digit-sum check) but with cod_oblig in the code slot instead of D300's tip_decont-derived cod_imp. Composed by anafpy.declaratii.obligation_evidence_number (shared with D710).
  • cui check 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>