Registry entry
Serbia — Tax Return on Calculated Annual Personal Income Tax (Form ПП ГПДГ / PP GPDG)
The Tax Administration's (Пореска управа, under the Ministarstvo finansija / Ministry of Finance) "Пореска пријава о обрачунатом годишњем порезу на доходак грађана" (Tax return on calculated annual personal income tax of citizens), Form ПП ГПДГ (PP GPDG), filed by resident individuals (on income earned in Serbia and abroad) and non-resident individuals (on income earned in Serbia) whose calendar-year income exceeds three times the average annual salary per employee paid in the Republic of Serbia for the relevant tax year, per data of the republic statistics authority. Filed no later than 15 May of the year following the tax year, exclusively electronically through the Tax Administration's e-Porezi portal using a qualified electronic certificate — there is no paper-filing channel and no static downloadable blank PDF form; the portal either presents taxpayers with a returns the Tax Administration itself pre-fills from official records (which the taxpayer must review, correct if needed, and sign-and-submit) or, when no pre-filled return is available, lets the taxpayer complete one from scratch via a "Text entry" or "XML entry" option. This is a disclosed substitution. GOV-2760's own screening pass (continuing GOV-2753's cycle) had left open a Taxes-vertical candidate named "PPDG-2R" ("Пореска пријава за утврђивање годишњег пореза на доходак грађана", the pre-2022 decision-based process). Independently re-verified this cycle: PPDG-2R's own PDF is still live on purs.gov.rs, but it governed determination of the annual personal income tax "by decision" (по решењу) of the Tax Administration — a mechanism the Republic of Serbia retired starting with the tax calculated for the 2022 tax year (first filed in 2023), replaced by the self-assessment (самоопорезивање) system implemented through this Form PP GPDG. PPDG-2R survives today only as the vehicle for amending or reversing (storno) a pre-2022-tax-year return; it no longer represents Serbia's current, ongoing annual personal income tax filing process, so this schema models PP GPDG instead. Full sourcing detail for both forms is in this version's own VERIFICATION.md. Sourced from the Tax Administration's own official user-instructions PDF (Korisničko uputstvo za podnošenje poreske prijave o obračunatom godišnjem porezu na dohodak građana, April 2023 edition), which documents the return's six parts field-by-field, including two portal screenshots (labelled Slika 1 and Slika 3-5 in the source) showing the actual on-screen form and its dropdown option sets, both read in full and cross-checked against the surrounding instructional text before modeling any field. The return's structure runs: a filing-metadata part (type of filing — general/ex-officio/after-deadline/control-order/court-decision/extended-deadline — plus the tax year, the date the tax liability arose, an interest-through date, and, only for amended or reversed filings, an amendment-type code, the identifier of the filing being amended, and — only for control/court-ordered filings — a basis code and decision number); Part 1, taxpayer identification (JMBG/EBS/PIB, date of birth, name/parent's-name/surname, full address including floor/apartment sub-fields visible only in the portal screenshot, phone, e-mail, and occupation — the source explicitly flags phone/e-mail/occupation as the fields never auto-filled even on a Tax-Administration-prepared return); Part 2, dependent family members (relationship, JMBG/EBS, and name fields, added one at a time through a modal dialog, with a system maximum of 20 entries, at most one "spouse" and at most two "parent" entries, and no self-listing — modeled here as a bounded 6-slot repeating group per this registry's established convention for dynamic lists lacking a printed row cap); Part 3, the taxable-income worksheet (numbered 3.1 to 3.20, covering withheld-at-source wage and non-employment income, self-employment income, income assessed by Tax Administration decision, self-assessed income under Article 100a, foreign-taxed income, a social-insurance-contribution refund, the under-40 additional reduction, the non-taxable threshold, personal deductions for the taxpayer and dependents, the two-bracket 10%/15% tax calculation, and an alternative-investment-fund tax credit); Part 4, a list of supporting evidence attached to the filing (an "other income" certificate, a birth-certificate extract for dependents, or another document type); and Part 5, a free-text note from the taxpayer, proxy, or representative. This v1.0.0 models 107 fields[] plus 3 documents[] entries. GovSchema is an independent, non-profit standards body and is not affiliated with, endorsed by, or operated by the Government of Serbia, the Ministarstvo finansija, or the Poreska uprava.
Registry entry
rs/purs/pp-gpdg-godisnji-porez-na-dohodak-gradjana
Authoritative source Poreska uprava, "Korisničko uputstvo za podnošenje poreske prijave o obračunatom godišnjem porezu na dohodak građana" (April 2023), describing Form ПП ГПДГ (PP GPDG)
Machine access
- Schema document
registry/rs/purs/pp-gpdg-godisnji-porez-na-dohodak-gradjana/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/rs/purs/pp-gpdg-godisnji-porez-na-dohodak-gradjana/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
107 fields, read from the published schema.json, with names, types, requiredness, and validation as the document states them. The live government form remains the authoritative source.
Fields
-
taxYearinteger requiredThe calendar year for which the annual personal income tax is being determined, selected from a dropdown at the top of the return.
range: 2022–∞ -
filingTypeenum requiredThe type of filing, selected from a dropdown. Code 1 (general filing) is the ordinary case where the taxpayer files on or before the statutory due date. Codes 2, 4, and 5 are typically applied by the Tax Administration itself, a tax-control order, or a court decision respectively, rather than chosen by a self-filing taxpayer, but are disclosed here as the field's full documented option set.
enum: general | ex-officio | after-deadline-article-182b | control-order | court-decision | extended-deadline-article-39 -
dateTaxLiabilityArosedate optionalThe due date of the tax liability under the Law. For a pre-filled return the Tax Administration sets this automatically when it posts the return to the portal; the field is shown as an editable date (not marked mandatory in the portal screenshot) and is otherwise system-derived from the tax year and filing type, so modeled optional rather than an invented always-required field.
-
interestCalculatedThroughDatedate optionalThe date through which late-payment interest has been calculated. Left blank for a general (on-time) filing; entered by the filer or the Tax Administration depending on filingType, only when there is a legal basis to calculate interest. The source describes this conditionality narratively rather than as a single clean gate on one other field's value, so it is modeled optional rather than an invented requiredWhen.
-
amendmentTypeenum optionalOnly completed when this filing amends a previously submitted return: an amendment under Article 40 ZPPPA (the taxpayer's own correction), an amendment ordered by a tax-control finding, or a reversal (storno) of a previously filed return.
enum: taxpayer-amendment-article-40 | control-order-amendment | reversal -
amendedFilingIdentifierstring optionalThe ID number of the previously filed tax return that this filing amends or reverses. Required whenever amendmentType is set: the source states that if a value is entered in the Врста (amendmentType) field, a previously recorded return with this identifier must exist and must belong to the same taxpayer.
-
controlOrCourtDecisionBasisenum optionalCompleted only when the return is filed pursuant to a tax inspector's order in an appeal/complaint proceeding: whether the underlying decision was a first-instance appeal ruling, a second-instance appeal ruling, or an administrative court decision.
enum: first-instance-appeal-decision | second-instance-appeal-decision | administrative-court-decision -
controlOrderOrCourtDecisionNumberstring optionalThe number of the tax-control order (when filingType is control-order or amendmentType is control-order-amendment/reversal) or the number of the court decision (when filingType is court-decision).
-
taxpayerIdNumberstring requiredThe taxpayer's personal identification number: JMBG (citizen's unique master number) for residents, EBS for foreign natural persons without a JMBG, or PIB (tax ID number) as applicable.
classification: sensitive-pii -
dateOfBirthdate requiredThe taxpayer's date of birth, used among other things to determine the under-40 additional-reduction eligibility (field additionalReductionUnder40).
classification: pii -
firstNamestring requiredThe taxpayer's first name.
classification: pii -
parentsNamestring requiredThe name of one of the taxpayer's parents, printed as a standard middle identifier on Serbian tax forms.
classification: pii -
surnamestring requiredThe taxpayer's surname.
classification: pii -
municipalitystring requiredThe municipality of the taxpayer's residence/domicile.
-
placestring requiredThe town/place of the taxpayer's residence/domicile.
-
streetNamestring requiredThe street name of the taxpayer's residence/domicile.
-
houseNumberstring requiredThe numeric part of the taxpayer's house number.
-
houseNumberLetterstring optionalThe letter suffix of the taxpayer's house number, if any (e.g. "12a").
-
floorstring optionalThe floor of the taxpayer's residence, if living in a multi-unit building. Visible in the portal screenshot as field 1.4.5 but not individually named in the instruction text's numbered walkthrough — visually confirmed via the render.
-
apartmentNumberstring optionalThe apartment number of the taxpayer's residence, if applicable.
-
apartmentLetterstring optionalThe letter suffix of the taxpayer's apartment number, if applicable.
-
phoneAreaCodestring requiredThe area code of the taxpayer's telephone number. The instructions explicitly flag this as one of the numeric fields the taxpayer must always enter themselves (never auto-filled).
classification: pii -
phoneNumberstring requiredThe taxpayer's telephone number, excluding area code. Explicitly flagged as always taxpayer-entered.
classification: pii -
emailstring requiredThe taxpayer's e-mail address. Explicitly flagged as always taxpayer-entered.
classification: pii -
occupationstring requiredThe taxpayer's occupation. Explicitly flagged as always taxpayer-entered.
-
dependent1Relationshipenum optionalRelationship of dependent family member 1 to the taxpayer, chosen from the portal's own dropdown. The portal enforces a maximum of one "spouse" entry and at most two "parent, or adoptive parent" entries across the whole dependents list, and disallows listing the taxpayer as their own dependent.
enum: child-or-adopted-child | spouse | parent-or-adoptive-parent | grandchild-living-in-household-not-supported-by-parents -
dependent1Jmbgstring optionalPersonal identification number (JMBG or EBS) of dependent family member 1. The portal auto-populates the dependent's name fields from this number when it is registered; the system otherwise enforces uniqueness (a JMBG cannot appear twice in the dependents list).
classification: sensitive-pii -
dependent1FirstNamestring optionalFirst name of dependent family member 1, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.
classification: pii -
dependent1ParentsNamestring optionalOne parent's name of dependent family member 1.
classification: pii -
dependent1Surnamestring optionalSurname of dependent family member 1.
classification: pii -
dependent2Relationshipenum optionalRelationship of dependent family member 2 to the taxpayer, chosen from the portal's own dropdown. The portal enforces a maximum of one "spouse" entry and at most two "parent, or adoptive parent" entries across the whole dependents list, and disallows listing the taxpayer as their own dependent.
enum: child-or-adopted-child | spouse | parent-or-adoptive-parent | grandchild-living-in-household-not-supported-by-parents -
dependent2Jmbgstring optionalPersonal identification number (JMBG or EBS) of dependent family member 2. The portal auto-populates the dependent's name fields from this number when it is registered; the system otherwise enforces uniqueness (a JMBG cannot appear twice in the dependents list).
classification: sensitive-pii -
dependent2FirstNamestring optionalFirst name of dependent family member 2, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.
classification: pii -
dependent2ParentsNamestring optionalOne parent's name of dependent family member 2.
classification: pii -
dependent2Surnamestring optionalSurname of dependent family member 2.
classification: pii -
dependent3Relationshipenum optionalRelationship of dependent family member 3 to the taxpayer, chosen from the portal's own dropdown. The portal enforces a maximum of one "spouse" entry and at most two "parent, or adoptive parent" entries across the whole dependents list, and disallows listing the taxpayer as their own dependent.
enum: child-or-adopted-child | spouse | parent-or-adoptive-parent | grandchild-living-in-household-not-supported-by-parents -
dependent3Jmbgstring optionalPersonal identification number (JMBG or EBS) of dependent family member 3. The portal auto-populates the dependent's name fields from this number when it is registered; the system otherwise enforces uniqueness (a JMBG cannot appear twice in the dependents list).
classification: sensitive-pii -
dependent3FirstNamestring optionalFirst name of dependent family member 3, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.
classification: pii -
dependent3ParentsNamestring optionalOne parent's name of dependent family member 3.
classification: pii -
dependent3Surnamestring optionalSurname of dependent family member 3.
classification: pii -
dependent4Relationshipenum optionalRelationship of dependent family member 4 to the taxpayer, chosen from the portal's own dropdown. The portal enforces a maximum of one "spouse" entry and at most two "parent, or adoptive parent" entries across the whole dependents list, and disallows listing the taxpayer as their own dependent.
enum: child-or-adopted-child | spouse | parent-or-adoptive-parent | grandchild-living-in-household-not-supported-by-parents -
dependent4Jmbgstring optionalPersonal identification number (JMBG or EBS) of dependent family member 4. The portal auto-populates the dependent's name fields from this number when it is registered; the system otherwise enforces uniqueness (a JMBG cannot appear twice in the dependents list).
classification: sensitive-pii -
dependent4FirstNamestring optionalFirst name of dependent family member 4, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.
classification: pii -
dependent4ParentsNamestring optionalOne parent's name of dependent family member 4.
classification: pii -
dependent4Surnamestring optionalSurname of dependent family member 4.
classification: pii -
dependent5Relationshipenum optionalRelationship of dependent family member 5 to the taxpayer, chosen from the portal's own dropdown. The portal enforces a maximum of one "spouse" entry and at most two "parent, or adoptive parent" entries across the whole dependents list, and disallows listing the taxpayer as their own dependent.
enum: child-or-adopted-child | spouse | parent-or-adoptive-parent | grandchild-living-in-household-not-supported-by-parents -
dependent5Jmbgstring optionalPersonal identification number (JMBG or EBS) of dependent family member 5. The portal auto-populates the dependent's name fields from this number when it is registered; the system otherwise enforces uniqueness (a JMBG cannot appear twice in the dependents list).
classification: sensitive-pii -
dependent5FirstNamestring optionalFirst name of dependent family member 5, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.
classification: pii -
dependent5ParentsNamestring optionalOne parent's name of dependent family member 5.
classification: pii -
dependent5Surnamestring optionalSurname of dependent family member 5.
classification: pii -
dependent6Relationshipenum optionalRelationship of dependent family member 6 to the taxpayer, chosen from the portal's own dropdown. The portal enforces a maximum of one "spouse" entry and at most two "parent, or adoptive parent" entries across the whole dependents list, and disallows listing the taxpayer as their own dependent.
enum: child-or-adopted-child | spouse | parent-or-adoptive-parent | grandchild-living-in-household-not-supported-by-parents -
dependent6Jmbgstring optionalPersonal identification number (JMBG or EBS) of dependent family member 6. The portal auto-populates the dependent's name fields from this number when it is registered; the system otherwise enforces uniqueness (a JMBG cannot appear twice in the dependents list).
classification: sensitive-pii -
dependent6FirstNamestring optionalFirst name of dependent family member 6, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.
classification: pii -
dependent6ParentsNamestring optionalOne parent's name of dependent family member 6.
classification: pii -
dependent6Surnamestring optionalSurname of dependent family member 6.
classification: pii -
wageIncomeinteger requiredAmount of wage income under Articles 15a-15v of the Law, excluding personal earnings of an entrepreneur or agricultural entrepreneur. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
wageTaxAndContributionsinteger requiredTax and mandatory social-insurance contributions charged to the employee on the wage income reported at 3.1.1, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
nonEmploymentIncomeArticle55integer requiredTaxable income earned outside an employment relationship, under Article 55 of the Law. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
nonEmploymentIncomeArticle55TaxAndContributionsinteger requiredTax and mandatory social-insurance contributions charged to the income recipient on the income reported at 3.1.3, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
employmentIncomeSubtotalinteger requiredComputed subtotal: the sum of 3.1.1 and 3.1.3 less the amounts at 3.1.2 and 3.1.4. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
nonEmploymentIncomeOtherArticlesinteger requiredTaxable income earned outside an employment relationship, under Articles 65v, 82, 84a and 85 of the Law. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
nonEmploymentIncomeOtherArticlesTaxAndContributionsinteger requiredTax and mandatory social-insurance contributions charged to the income recipient on the income reported at 3.1.6, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
nonEmploymentIncomeOtherArticlesSubtotalinteger requiredComputed subtotal: the difference between the amounts at 3.1.6 and 3.1.7. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfEmploymentIncomeinteger requiredTaxable profit under Article 33 paragraph 2 of the Law, or lump-sum-assessed income under Article 41, depending on how the taxpayer's income from independent activity is assessed and taxed. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfEmploymentTaxinteger requiredTax on income from independent activity for a taxpayer who pays tax on taxable profit under Article 33 paragraph 2 of the Law, on the amount reported at 3.2.1, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfEmploymentLumpSumTaxAndContributionsinteger requiredTax and mandatory social-insurance contributions on income from independent activity for a taxpayer who pays tax on a lump-sum-assessed income under Article 41 of the Law, on the amount reported at 3.2.1, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
entrepreneurPersonalEarningsinteger requiredPersonal earnings paid to an entrepreneur or agricultural entrepreneur, under Article 33a of the Law. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
entrepreneurPersonalEarningsTaxAndContributionsinteger requiredTax and mandatory social-insurance contributions on the personal earnings reported at 3.2.4, under Article 33a of the Law, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfEmploymentIncomeSubtotalinteger requiredComputed subtotal: the difference between the amounts at 3.2.1, 3.2.2 and 3.2.3, increased by the amount at 3.2.4, less 3.2.5. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
otherIncomeByTaxAuthorityDecisioninteger requiredTaxable income under Article 60 of the Law, realized in the calendar year for which the annual tax is being determined. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
otherIncomeByTaxAuthorityDecisionTaxAndContributionsinteger requiredTax and mandatory social-insurance contributions charged to the income recipient on the income reported at 3.3.1, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
otherIncomeByTaxAuthorityDecisionSubtotalinteger requiredComputed subtotal: the difference between the amounts at 3.3.1 and 3.3.2. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
otherIncomeArticle84bParagraph5integer requiredTaxable income under Article 84b paragraph 5 of the Law, for the calendar year for which the annual tax is being determined. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
otherIncomeArticle84bParagraph5Taxinteger requiredTax charged to the income recipient on the income reported at 3.3.4, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
otherIncomeArticle84bParagraph5Subtotalinteger requiredComputed subtotal: the difference between the amounts at 3.3.4 and 3.3.5. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfAssessedIncomeArticle100ainteger requiredTaxable income under Articles 15a and 55 of the Law for which the taxpayer is obliged to self-assess and pay tax and contributions, under Article 100a of the Law. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfAssessedIncomeArticle100aTaxAndContributionsinteger requiredTax and mandatory social-insurance contributions charged to the income recipient on the income reported at 3.4.1, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfAssessedIncomeArticle100aSubtotalinteger requiredComputed subtotal: the difference between the amounts at 3.4.1 and 3.4.2. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfAssessedIncomeOtherArticlesinteger requiredTaxable income under Articles 65v, 82, 84a and 85 of the Law for which the taxpayer is obliged to self-assess and pay tax and contributions. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfAssessedIncomeOtherArticlesTaxAndContributionsinteger requiredTax and mandatory social-insurance contributions charged to the income recipient on the income reported at 3.4.4, paid during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
selfAssessedIncomeOtherArticlesSubtotalinteger requiredComputed subtotal: the difference between the amounts at 3.4.4 and 3.4.5. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
foreignTaxedIncomeinteger requiredTaxable income under Articles 15a, 33, 41 and 55 of the Law, realized in the tax year and taxed in another state, per a certificate of that state's competent authority. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
foreignTaxedIncomeTaxinteger requiredTax charged to the income recipient on the income reported at 3.5.1, for the income for which the annual tax is being determined. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
foreignTaxedIncomeSubtotalinteger requiredComputed subtotal: the difference between the amounts at 3.5.1 and 3.5.2. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
foreignTaxedIncomeOtherArticlesinteger requiredTaxable income under Articles 65v, 82, 84a and 85 of the Law, realized in the tax year and taxed in another state. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
foreignTaxedIncomeOtherArticlesTaxinteger requiredTax charged to the income recipient on the income reported at 3.5.4, for the income for which the annual tax is being determined. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
foreignTaxedIncomeOtherArticlesSubtotalinteger requiredComputed subtotal: the difference between the amounts at 3.5.4 and 3.5.5. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
mandatorySocialInsuranceContributionRefundinteger requiredAmount paid to the taxpayer as a refund of mandatory social-insurance contributions, under the law governing mandatory social insurance contributions, during the tax year. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
totalAfterWithholdingCategoriesinteger requiredComputed total: the sum of the subtotals at 3.1.5, 3.2.6, 3.3.3, 3.4.3 and 3.5.3. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
additionalReductionUnder40integer optionalAutomatically entered amount equal to three average annual salaries per employee paid in the Republic in the year for which the tax is determined, under Article 87 paragraph 4 of the Law, for a taxpayer who has not yet turned 40 on 31 December of that year; entered as zero for a taxpayer aged 40 or over. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
totalAfterAdditionalReductioninteger requiredComputed subtotal: for a taxpayer under 40, the positive difference between 3.7 and 3.8 (zero if negative); for a taxpayer 40 or over, equal to 3.7. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
grandTotalinteger requiredComputed total: the sum of the amounts at 3.1.8, 3.3.6, 3.4.6, 3.5.6, 3.6 and 3.9. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
nonTaxableAmountinteger optionalAutomatically entered non-taxable threshold prescribed by Article 87 paragraph 1 of the Law: three times the average annual salary per employee paid in the Republic in the year for which the tax is determined. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxableIncomeBeforePersonalDeductionsinteger requiredComputed subtotal: the difference between the amounts at 3.10 and 3.11. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
personalDeductionsForTaxpayerinteger optionalAutomatically entered personal deduction for the taxpayer under Article 88 paragraph 1 item 1) of the Law. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
personalDeductionsForDependentsinteger optionalFreely entered personal-deduction amount for dependent family members under Article 88 paragraph 1 item 2) and paragraph 3 of the Law, only when dependents were reported in Part 2. The portal caps this at the product of the number of dependents reported in Part 2 and 15% of the average annual salary per employee paid in the Republic in the year for which the tax is determined, auto-correcting any higher entry down to that cap. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
personalDeductionsTotalinteger requiredAutomatically entered sum of 3.13.1 and 3.13.2; capped at 50% of the amount at 3.12 if their sum would exceed it. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxableIncomeinteger requiredComputed subtotal: the difference between the amounts at 3.12 and 3.13. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxableIncomeUpToSixAverageSalariesinteger requiredThe portion of taxable income up to six times the average annual salary per employee paid in the Republic in the year for which the tax is determined. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxableIncomeAboveSixAverageSalariesinteger requiredComputed subtotal: the difference between the amounts at 3.14 and 3.14.1. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxAtTenPercentinteger requiredComputed amount: 10% applied to the amount at 3.14.1. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxAtFifteenPercentinteger requiredComputed amount: 15% applied to the amount at 3.14.2. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
annualTaxinteger requiredComputed total: the sum of the amounts at 3.15 and 3.16. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxCreditinteger optionalTax credit under Article 89a of the Law (for investment in an alternative investment fund), which may not exceed 50% of the amount at 3.17. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
annualTaxAfterCreditinteger requiredComputed subtotal: the difference between the amounts at 3.17 and 3.18. Amounts are entered in dinars, with no decimals.
range: 0–∞ -
calculatedInterestinteger optionalAmount of late-payment interest calculated, only when there is a legal basis for its calculation (paralleling interestCalculatedThroughDate in the filing-metadata part). Amounts are entered in dinars, with no decimals.
range: 0–∞ -
taxpayerNotestring optionalFree-text note from the taxpayer, proxy, or representative concerning the filing. The portal caps this field at 500 characters.
length: 0–500
Verification record
This file is the source-review record for this document version, per the manual-source-review-v1 practice.
Current claim
status:draftverification.method:manual-source-review-v1verification.lastVerifiedAt:2026-07-13maturity.level:structural-reference
This is GovSchema Standard Research cycle GOV-2767, advancing Serbia's Taxes vertical — a candidate pre-scouted and left open in GOV-2760's own screening pass (CATALOG.md's "Known Gaps & Opportunities"), which named PPDG-2R as the strong lead.
Duplicate-concurrent-run check
Checked git branch -a | grep -i rs-purs and gh pr list --state all --search "rs/purs" before starting — neither found an existing rs/purs branch or PR, so no reconciliation was needed this cycle.
Source verification, part 1 — the pre-scouted PPDG-2R lead re-confirmed live, but found stale
Independently re-fetched PPDG-2R from scratch rather than trusting the prior cycle's own memory record:
- PDF source:
https://purs.gov.rs/upload/media/2025/2/4/609132/ObrazacPPDG-2R.pdf— fetched viacurl -s: HTTP 200,application/pdf, 254,833 bytes,sha256:888aa229a8cd09338055703ada3e195db931ac72e2db4e4ac5ccd4d80ba5be90. Confirmed viapdfjs-dist@3: 2 pages, zero Widget annotations (a genuine print/portal-preview specimen, not an AcroForm), a fully extractable Cyrillic text layer, both pages also rendered to PNG and visually cross-checked. The specimen's structure (numbered items 1.1-1.4, 2, and a 3.1-3.19 income worksheet ending at "5. Напомена пореског обвезника/пуномоćника/заступника" with no printed signature line) is genuinely well-formed and extractable. - However, cross-referencing the Tax Administration's own currently published user-instructions document (see part 2 below) revealed that PPDG-2R governs determination of the annual personal income tax "by decision" (по решењу) of the Tax Administration — the mechanism in force through the tax calculated for the 2021 tax year. Starting with the tax calculated for the 2022 tax year (first filed in 2023), Serbia switched this tax to a self-assessment (самоопорезивање) system, implemented through a different form, ПП ГПДГ (PP GPDG), filed exclusively electronically through the e-Porezi portal with a qualified electronic certificate. PPDG-2R survives today only as the vehicle for amending or reversing (storno) a pre-2022-tax-year return — it is a legacy/historical form for an ongoing, but narrowing, use case, not the process a taxpayer uses today to file their current annual personal-income-tax return.
- Per the task's own explicit contingency ("if the PPDG-2R lead is stale, but you find a different genuine, live, first-party form, author that instead and explain the substitution"), this schema models PP GPDG instead of PPDG-2R. This is a disclosed substitution, not a silent departure from the pre-scouted lead.
Source verification, part 2 — PP GPDG, the current form
PP GPDG has no static downloadable blank-form PDF — it exists only as an interactive return inside the e-Porezi portal (either pre-filled by the Tax Administration from official records, or completed by the taxpayer via a "Text entry"/"XML entry" option). The Tax Administration's own official user-instructions PDF is therefore the authoritative first-party description of every field, screen, and validation rule:
- PDF source:
https://www.purs.gov.rs/upload/media/2025/2/4/386327/Korisnickouputstvozapodnosenjeporeskeprijaveoobracunatomgodisnjemporezunadohodakgradjana.pdf("Корисничко упутство за подношење пореске пријаве о обрачунатом годишњем порезу на доходак грађана", April 2023 edition) — fetched viacurl -s: HTTP 200,application/pdf, 1,185,205 bytes,sha256:6a453bedd83074b9718858fe609a3e1ff1e075f8348e0bce86f4436aef12cf70. Domainpurs.gov.rs(Poreska uprava / Tax Administration, under the Ministarstvo finansija) is the correct, official first-party agency for Serbian personal income tax. - Confirmed via
pdfjs-dist@3: 21 pages, zero Widget annotations (a plain instructional PDF, not an AcroForm).getTextContent()returned a full, clean Cyrillic text layer, read in full across all 21 pages before modeling any field. - The document explicitly states the self-assessment switch: "Годишњи порез на доходак грађана, почевши од пореза који се обрачунава за 2022. годину, обрачунава се и плаћа по систему самоопорезивања, уместо по решењу пореског органа како је то било до сада" (page 2) — corroborating part 1's finding above.
- Page-image cross-check. Two of the document's embedded portal screenshots were rendered to PNG via
pdfjs-dist@3+node-canvas(page 4, "Slika 1" — the filing-metadata/Part-1-taxpayer-data screen; pages 5-6, "Slika 3-5" — the Part-2 dependents add-dialog and its "Сродство" dropdown) and visually cross-checked against the surrounding instructional text:- Slika 1 confirmed the exact field layout and order of the filing-metadata row (Врста пријаве / Датум настанка пореске обавезе / Датум до ког је обрачуната камата, then Врста / Идентификатор измењене пријаве / Основ / Број решења/одлуке суда) and Part 1's taxpayer-data grid, including field 1.4.5 (Спрат / Стан број / Стан слово), which the surrounding instructional text's numbered walkthrough skips over (it names 1.4.1-1.4.4 then jumps to "поље 1.4.6" for phone) but which is visibly present in the rendered screenshot — included in this schema (
floor/apartmentNumber/apartmentLetter) on the strength of the render, not invented from the numbering gap alone. - Slika 1 also confirmed which fields carry a required-field asterisk in the portal: only 1.4.6 (Телефон позивни, Телефон број), 1.4.7 (Електронска пошта), and 1.5 (Занимање) are asterisked — because in the pre-filled-return scenario the screenshot depicts, JMBG/date of birth/name/address are already auto-filled and grayed out. Part II's own text (page 11) states that a self-filing taxpayer (no pre-filled return available) must supply JMBG/EBS/PIB, date of birth, name/parent's-name/surname, and address themselves — so this schema treats those fields as
required: truedespite the absence of a visible asterisk in the pre-filled-scenario screenshot, a disclosed judgment call grounded in Part II's explicit text. - Slika 3-5 confirmed the exact "Сродство" (relationship) dropdown option set for dependents — Деца/усвојеници, Брачни друг, Родитељи/усвојиоци, Унуци (не издржавани од родитеља, живе у домаћинству) — matching
dependentNRelationship's enum exactly.
- Slika 1 confirmed the exact field layout and order of the filing-metadata row (Врста пријаве / Датум настанка пореске обавезе / Датум до ког је обрачуната камата, then Врста / Идентификатор измењене пријаве / Основ / Број решења/одлуке суда) and Part 1's taxpayer-data grid, including field 1.4.5 (Спрат / Стан број / Стан слово), which the surrounding instructional text's numbered walkthrough skips over (it names 1.4.1-1.4.4 then jumps to "поље 1.4.6" for phone) but which is visibly present in the rendered screenshot — included in this schema (
Field derivation
The return's own six parts (page 8: "Образац ПП ГПДГ састоји се из шест делова"), reconstructed from the instructions' numbered walkthrough (pages 7-16) and cross-checked against the two rendered screenshots:
- Filing metadata ("ДЕО - ПОДАЦИ О ПРИЈАВИ", pages 8-11): type of filing (6 codes), tax year, date tax liability arose, interest-through date, and — only for amended/reversed filings — an amendment-type code, the identifier of the filing being amended, and — only for control/court-ordered filings — a basis code and decision number.
- Part 1, taxpayer data (page 11): JMBG/EBS/PIB, date of birth, name/ parent's-name/surname, full address (municipality, place, street, house number and letter, floor/apartment sub-fields), phone, e-mail, occupation.
- Part 2, dependent family members (pages 11, 5-6): relationship, JMBG/ EBS, name/parent's-name/surname, added one at a time via a modal dialog.
- Part 3, taxable-income worksheet (pages 11-16): numbered 3.1 to 3.20.
- Part 4, list of attached evidence (pages 16-18): a dropdown of 3 document categories.
- Part 5, note of the taxpayer/proxy/representative (page 18): free text, capped at 500 characters.
Every numbered item in parts 1-5 (and every filing-metadata item) was mapped to one of this schema's 107 fields[] entries or 3 documents[] entries. See each field's own sourceRef for the exact instructions-document part/item it was read from.
Scoping and modeling judgment calls
- Dependents modeled as a bounded 6-slot repeating group (
dependent1..dependent6× relationship/JMBG/first name/parent's name/surname), all optional: the source describes a dynamic add-one-at-a-time list with a system maximum of 20 entries (at most one "spouse", at most two "parent" entries, no self-listing) — there is no printed row grid to size against, unlike e.g.rs/mfa/visa-application's 3-row children table. Six slots follow this registry's established precedent for a flat-fields repeating group of comparable real-world family size (jo/istd/pit-return-employee's own 6-rowdependentNprecedent), disclosed here as a representative bound rather than the source's own dynamic/20-entry ceiling, since v0.3's field model has no native array type. dateTaxLiabilityArose,interestCalculatedThroughDate,additionalReductionUnder40,nonTaxableAmount,personalDeductionsForTaxpayermodeled optional despite being system-auto-filled in the pre-filled-return scenario: the source describes these as amounts/dates the Tax Administration computes and enters automatically (from the tax year, filing type, the taxpayer's age, and the statutory non-taxable threshold respectively); modeling them as always-required would invent a taxpayer-input obligation the source does not actually impose on the taxpayer in every case.interestCalculatedThroughDate/calculatedInterestleft optional with norequiredWhengate: the source's own conditionality ("uписује se ... ako ima osnova za obračun kamate", varying by filing type) is narrative and multi-branched rather than a single clean field-equals-value gate, so no gate was invented, per this registry's established no-invented-gate convention.amendedFilingIdentifiergated byrequiredWhen: { field: "amendmentType", in: [...] }(the v0.3inoperator, §8.1): the source states plainly that if a value is entered in the Врста (amendmentType) field, a previously recorded return with the given identifier must exist — a clean, explicit requirement, not an invented one.- All
3.xworksheet subtotal/total fields (e.g.employmentIncomeSubtotal,grandTotal,taxableIncome,annualTax) modeledrequired: true, itemized component lines beneath them also modeledrequired: truewithminimum: 0, defaulting to 0 when not applicable: the source states every3.xfield is auto-populated with 0 for a self-filed return except 3.11 (non-taxable amount) and 3.13.1 (personal deduction for the taxpayer) — i.e. the worksheet has no blank/absent state, matching this registry's established convention (e.g.jo/istd/pit-return-employee's own worksheet-box fields) of treating a numeric ledger's every line as present-with-a-value rather than optional.additionalReductionUnder40,nonTaxableAmount,personalDeductionsForTaxpayer,personalDeductionsForDependents,taxCredit, andcalculatedInterestare the sole worksheet fields left optional (see above and below). - Amounts modeled
integerwithminimum: 0: the source states amounts are entered "у динарима, без децимала" (in dinars, without decimals) and that a negative computed result is floored to zero by the portal itself. filingTypekeeps all 6 documented codes even though codes 2 (ex officio) and 4 (control order) are typically applied by the Tax Administration rather than chosen by a self-filing taxpayer: disclosed in the field's own description rather than narrowed to a taxpayer-only subset, since the source presents all 6 as the field's one documented option set.- Classification: JMBG/EBS/PIB and dependents' JMBG/EBS are tagged
sensitive-pii; name pieces, date of birth, address, phone, and e-mail (taxpayer's and dependents') are taggedpii, matching this registry's established precedent (e.g.rs/mfa/visa-application's own passport- number/name classification). Plain enumerated/free-text filing-metadata and worksheet amount fields are left unclassified.
Conformance run
Two hand-authored valid fixtures under conformance/rs/purs/pp-gpdg-godisnji-porez-na-dohodak-gradjana/1.0.0/:
valid-wage-earner-minimal.json— a single wage-earning taxpayer, no dependents, no amendment, filing type "general", exercising the schema's minimal required-field path (every non-applicable worksheet line entered as 0, matching the portal's own default).valid-self-employed-with-dependents-and-amendment.json— a self-employed taxpayer with a spouse and child as dependents, self-employment and foreign-taxed income, an amended filing (amendmentType/amendedFilingIdentifierboth set), a tax credit, and a taxpayer note — exercising the schema'srequiredWhengate and its optional fields.
Eight mutation-control fixtures, each isolated to raise exactly one error:
mutation-control-missing-required-field.json— dropstaxpayerIdNumber(staticrequired: true).mutation-control-invalid-enum-value.json— setsfilingTypeto"urgent", not one of the enum's 6 values.mutation-control-invalid-date-format.json— setsdateOfBirthto"22-03-1994", not the requiredYYYY-MM-DDshape.mutation-control-invalid-type-wage-income.json— setswageIncometo the string"not-a-number"instead of an integer.mutation-control-invalid-minimum-wage-income.json— setswageIncometo-100, belowvalidation.minimum: 0.mutation-control-missing-conditional-amended-filing-identifier.json— setsamendmentTypeto"taxpayer-amendment-article-40"without itsamendedFilingIdentifiercompanion.mutation-control-invalid-minimum-tax-year.json— setstaxYearto2021, belowvalidation.minimum: 2022(the first self-assessment year).mutation-control-invalid-maxlength-note.json— setstaxpayerNoteto a 501-character string, abovevalidation.maxLength: 500.
All ten fixtures were checked with a from-scratch Node conformance checker (validate_conformance.mjs, not committed — a disposable script run from an isolated /tmp scratch directory, per this registry's own established practice since no committed conformance-fixture validator exists) implementing this schema's own required/requiredWhen (including the in operator)/type/validation.enum/validation.minimum/ validation.maxLength grammar directly:
`` $ node validate_conformance.mjs registry/rs/purs/pp-gpdg-godisnji-porez-na-dohodak-gradjana/1.0.0/schema.json conformance/rs/purs/pp-gpdg-godisnji-porez-na-dohodak-gradjana/1.0.0 OK mutation-control-invalid-date-format.json errors=["dateOfBirth: invalid date format \"22-03-1994\", expected YYYY-MM-DD"] OK mutation-control-invalid-enum-value.json errors=["filingType: value \"urgent\" not in enum [\"general\",\"ex-officio\",\"after-deadline-article-182b\",\"control-order\",\"court-decision\",\"extended-deadline-article-39\"]"] OK mutation-control-invalid-maxlength-note.json errors=["taxpayerNote: length 501 above maxLength 500"] OK mutation-control-invalid-minimum-tax-year.json errors=["taxYear: value 2021 below minimum 2022"] OK mutation-control-invalid-minimum-wage-income.json errors=["wageIncome: value -100 below minimum 0"] OK mutation-control-invalid-type-wage-income.json errors=["wageIncome: expected type integer, got string (\"not-a-number\")"] OK mutation-control-missing-conditional-amended-filing-identifier.json errors=["amendedFilingIdentifier: required but missing"] OK mutation-control-missing-required-field.json errors=["taxpayerIdNumber: required but missing"] OK valid-self-employed-with-dependents-and-amendment.json errors=[] OK valid-wage-earner-minimal.json errors=[] ``
All eight negative controls raised exactly one error each, and neither valid scenario raised an unexpected error.
The registry's zero-dependency structural validator and its ajv-based meta-schema validator were both run against the full registry (including this new schema) and pass:
``` $ node tools/validate.mjs 416/416 document(s) passed. 3/3 mapping.json companion(s) passed.
$ node tools/validate-ajv.mjs 416/416 document(s) validated against the meta-schema (ajv 2020-12). 3/3 mapping.json companion(s) validated. ```
tools/ had no node_modules at all this cycle (not merely stale); ran npm ci --include=dev inside tools/ to install ajv per this registry's documented gotcha, rather than a scoped npm install <pkg> --no-save. The scratch pdfjs-dist/canvas install used for PDF extraction and rendering was done in an isolated /tmp scratch directory, never inside tools/ or tools/govschema-client/.
tools/govschema-client/registry-index.json was regenerated via npm run build-index inside tools/govschema-client/.
Scope and jurisdiction notes
- Advances Serbia's Taxes vertical, following Business Formation (GOV-2725, 48th jurisdiction) and Visa (GOV-2760). Serbia now stands at 3 of 6 verticals (Business Formation, Visa, Taxes); DMV, National ID, and Passport remain open, unscreened-this-cycle backlog candidates.
jurisdiction.levelisnational— the Tax Administration is Serbia's national tax authority.process.typeisfiling, matching this registry's established convention for tax-return forms (e.g.jo/istd/pit-return-employee,at/bmf/employee-tax-assessment).process.languageissr, matchingrs/apr/jrpps-pr-sole-proprietor-registration's andrs/mfa/visa-application's own convention for this jurisdiction.- PPDG-2R (
https://purs.gov.rs/upload/media/2025/2/4/609132/ObrazacPPDG-2R.pdf) remains genuinely live and could still be modeled as a distinct, narrower-scope schema for amending/reversing pre-2022-tax-year returns — left as a disclosed, low-priority backlog item, since it addresses a shrinking population of historical tax years rather than Serbia's current ongoing filing process.
Re-verification
Per the practice's cadence, nextReviewBy is set to 2027-01-13 (6 months). A future review should prioritize: (1) confirming whether the Korisničko uputstvo has been updated for a later tax year (the April 2023 edition in hand describes the 2022-tax-year rollout; later editions may adjust thresholds/rates); (2) screening Serbia's remaining DMV, National ID, and Passport verticals; (3) considering whether field 1.4.5 (floor/apartment) merits a stronger source (e.g. a fresh portal screenshot) beyond this cycle's rendered instructions-document image.
View the raw record (VERIFICATION.md)
Version history
-
1.0.0draftlatestthis pagehas verification recordschema.json
Independent and non-affiliated
GovSchema is an independent, open-source project. This reference is not produced, reviewed, or endorsed by Poreska uprava (Tax Administration), Ministarstvo finansija (Ministry of Finance) or any government. The authoritative source is always the live government form and its official instructions.