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

Jurisdiction
Serbia · national
Version
1.0.0
Verification
draft

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

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

  • taxYear integer required

    The calendar year for which the annual personal income tax is being determined, selected from a dropdown at the top of the return.

    range: 2022–∞
  • filingType enum required

    The 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
  • dateTaxLiabilityArose date optional

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

  • interestCalculatedThroughDate date optional

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

  • amendmentType enum optional

    Only 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
  • amendedFilingIdentifier string optional

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

  • controlOrCourtDecisionBasis enum optional

    Completed 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
  • controlOrderOrCourtDecisionNumber string optional

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

  • taxpayerIdNumber string required

    The 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
  • dateOfBirth date required

    The taxpayer's date of birth, used among other things to determine the under-40 additional-reduction eligibility (field additionalReductionUnder40).

    classification: pii
  • firstName string required

    The taxpayer's first name.

    classification: pii
  • parentsName string required

    The name of one of the taxpayer's parents, printed as a standard middle identifier on Serbian tax forms.

    classification: pii
  • surname string required

    The taxpayer's surname.

    classification: pii
  • municipality string required

    The municipality of the taxpayer's residence/domicile.

  • place string required

    The town/place of the taxpayer's residence/domicile.

  • streetName string required

    The street name of the taxpayer's residence/domicile.

  • houseNumber string required

    The numeric part of the taxpayer's house number.

  • houseNumberLetter string optional

    The letter suffix of the taxpayer's house number, if any (e.g. "12a").

  • floor string optional

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

  • apartmentNumber string optional

    The apartment number of the taxpayer's residence, if applicable.

  • apartmentLetter string optional

    The letter suffix of the taxpayer's apartment number, if applicable.

  • phoneAreaCode string required

    The 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
  • phoneNumber string required

    The taxpayer's telephone number, excluding area code. Explicitly flagged as always taxpayer-entered.

    classification: pii
  • email string required

    The taxpayer's e-mail address. Explicitly flagged as always taxpayer-entered.

    classification: pii
  • occupation string required

    The taxpayer's occupation. Explicitly flagged as always taxpayer-entered.

  • dependent1Relationship enum optional

    Relationship 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
  • dependent1Jmbg string optional

    Personal 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
  • dependent1FirstName string optional

    First name of dependent family member 1, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.

    classification: pii
  • dependent1ParentsName string optional

    One parent's name of dependent family member 1.

    classification: pii
  • dependent1Surname string optional

    Surname of dependent family member 1.

    classification: pii
  • dependent2Relationship enum optional

    Relationship 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
  • dependent2Jmbg string optional

    Personal 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
  • dependent2FirstName string optional

    First name of dependent family member 2, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.

    classification: pii
  • dependent2ParentsName string optional

    One parent's name of dependent family member 2.

    classification: pii
  • dependent2Surname string optional

    Surname of dependent family member 2.

    classification: pii
  • dependent3Relationship enum optional

    Relationship 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
  • dependent3Jmbg string optional

    Personal 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
  • dependent3FirstName string optional

    First name of dependent family member 3, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.

    classification: pii
  • dependent3ParentsName string optional

    One parent's name of dependent family member 3.

    classification: pii
  • dependent3Surname string optional

    Surname of dependent family member 3.

    classification: pii
  • dependent4Relationship enum optional

    Relationship 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
  • dependent4Jmbg string optional

    Personal 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
  • dependent4FirstName string optional

    First name of dependent family member 4, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.

    classification: pii
  • dependent4ParentsName string optional

    One parent's name of dependent family member 4.

    classification: pii
  • dependent4Surname string optional

    Surname of dependent family member 4.

    classification: pii
  • dependent5Relationship enum optional

    Relationship 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
  • dependent5Jmbg string optional

    Personal 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
  • dependent5FirstName string optional

    First name of dependent family member 5, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.

    classification: pii
  • dependent5ParentsName string optional

    One parent's name of dependent family member 5.

    classification: pii
  • dependent5Surname string optional

    Surname of dependent family member 5.

    classification: pii
  • dependent6Relationship enum optional

    Relationship 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
  • dependent6Jmbg string optional

    Personal 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
  • dependent6FirstName string optional

    First name of dependent family member 6, auto-filled from the JMBG/EBS when recognized, otherwise entered manually.

    classification: pii
  • dependent6ParentsName string optional

    One parent's name of dependent family member 6.

    classification: pii
  • dependent6Surname string optional

    Surname of dependent family member 6.

    classification: pii
  • wageIncome integer required

    Amount 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–∞
  • wageTaxAndContributions integer required

    Tax 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–∞
  • nonEmploymentIncomeArticle55 integer required

    Taxable income earned outside an employment relationship, under Article 55 of the Law. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • nonEmploymentIncomeArticle55TaxAndContributions integer required

    Tax 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–∞
  • employmentIncomeSubtotal integer required

    Computed 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–∞
  • nonEmploymentIncomeOtherArticles integer required

    Taxable 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–∞
  • nonEmploymentIncomeOtherArticlesTaxAndContributions integer required

    Tax 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–∞
  • nonEmploymentIncomeOtherArticlesSubtotal integer required

    Computed subtotal: the difference between the amounts at 3.1.6 and 3.1.7. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • selfEmploymentIncome integer required

    Taxable 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–∞
  • selfEmploymentTax integer required

    Tax 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–∞
  • selfEmploymentLumpSumTaxAndContributions integer required

    Tax 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–∞
  • entrepreneurPersonalEarnings integer required

    Personal earnings paid to an entrepreneur or agricultural entrepreneur, under Article 33a of the Law. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • entrepreneurPersonalEarningsTaxAndContributions integer required

    Tax 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–∞
  • selfEmploymentIncomeSubtotal integer required

    Computed 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–∞
  • otherIncomeByTaxAuthorityDecision integer required

    Taxable 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–∞
  • otherIncomeByTaxAuthorityDecisionTaxAndContributions integer required

    Tax 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–∞
  • otherIncomeByTaxAuthorityDecisionSubtotal integer required

    Computed subtotal: the difference between the amounts at 3.3.1 and 3.3.2. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • otherIncomeArticle84bParagraph5 integer required

    Taxable 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–∞
  • otherIncomeArticle84bParagraph5Tax integer required

    Tax 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–∞
  • otherIncomeArticle84bParagraph5Subtotal integer required

    Computed subtotal: the difference between the amounts at 3.3.4 and 3.3.5. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • selfAssessedIncomeArticle100a integer required

    Taxable 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–∞
  • selfAssessedIncomeArticle100aTaxAndContributions integer required

    Tax 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–∞
  • selfAssessedIncomeArticle100aSubtotal integer required

    Computed subtotal: the difference between the amounts at 3.4.1 and 3.4.2. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • selfAssessedIncomeOtherArticles integer required

    Taxable 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–∞
  • selfAssessedIncomeOtherArticlesTaxAndContributions integer required

    Tax 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–∞
  • selfAssessedIncomeOtherArticlesSubtotal integer required

    Computed subtotal: the difference between the amounts at 3.4.4 and 3.4.5. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • foreignTaxedIncome integer required

    Taxable 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–∞
  • foreignTaxedIncomeTax integer required

    Tax 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–∞
  • foreignTaxedIncomeSubtotal integer required

    Computed subtotal: the difference between the amounts at 3.5.1 and 3.5.2. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • foreignTaxedIncomeOtherArticles integer required

    Taxable 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–∞
  • foreignTaxedIncomeOtherArticlesTax integer required

    Tax 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–∞
  • foreignTaxedIncomeOtherArticlesSubtotal integer required

    Computed subtotal: the difference between the amounts at 3.5.4 and 3.5.5. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • mandatorySocialInsuranceContributionRefund integer required

    Amount 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–∞
  • totalAfterWithholdingCategories integer required

    Computed 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–∞
  • additionalReductionUnder40 integer optional

    Automatically 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–∞
  • totalAfterAdditionalReduction integer required

    Computed 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–∞
  • grandTotal integer required

    Computed 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–∞
  • nonTaxableAmount integer optional

    Automatically 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–∞
  • taxableIncomeBeforePersonalDeductions integer required

    Computed subtotal: the difference between the amounts at 3.10 and 3.11. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • personalDeductionsForTaxpayer integer optional

    Automatically 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–∞
  • personalDeductionsForDependents integer optional

    Freely 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–∞
  • personalDeductionsTotal integer required

    Automatically 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–∞
  • taxableIncome integer required

    Computed subtotal: the difference between the amounts at 3.12 and 3.13. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • taxableIncomeUpToSixAverageSalaries integer required

    The 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–∞
  • taxableIncomeAboveSixAverageSalaries integer required

    Computed subtotal: the difference between the amounts at 3.14 and 3.14.1. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • taxAtTenPercent integer required

    Computed amount: 10% applied to the amount at 3.14.1. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • taxAtFifteenPercent integer required

    Computed amount: 15% applied to the amount at 3.14.2. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • annualTax integer required

    Computed total: the sum of the amounts at 3.15 and 3.16. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • taxCredit integer optional

    Tax 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–∞
  • annualTaxAfterCredit integer required

    Computed subtotal: the difference between the amounts at 3.17 and 3.18. Amounts are entered in dinars, with no decimals.

    range: 0–∞
  • calculatedInterest integer optional

    Amount 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–∞
  • taxpayerNote string optional

    Free-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: draft
  • verification.method: manual-source-review-v1
  • verification.lastVerifiedAt: 2026-07-13
  • maturity.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 via curl -s: HTTP 200, application/pdf, 254,833 bytes, sha256: 888aa229a8cd09338055703ada3e195db931ac72e2db4e4ac5ccd4d80ba5be90. Confirmed via pdfjs-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 via curl -s: HTTP 200, application/pdf, 1,185,205 bytes, sha256: 6a453bedd83074b9718858fe609a3e1ff1e075f8348e0bce86f4436aef12cf70. Domain purs.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:
    1. 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.
    2. 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: true despite the absence of a visible asterisk in the pre-filled-scenario screenshot, a disclosed judgment call grounded in Part II's explicit text.
    3. Slika 3-5 confirmed the exact "Сродство" (relationship) dropdown option set for dependents — Деца/усвојеници, Брачни друг, Родитељи/усвојиоци, Унуци (не издржавани од родитеља, живе у домаћинству) — matching dependentNRelationship's enum exactly.

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:

  1. 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.
  2. 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.
  3. 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.
  4. Part 3, taxable-income worksheet (pages 11-16): numbered 3.1 to 3.20.
  5. Part 4, list of attached evidence (pages 16-18): a dropdown of 3 document categories.
  6. 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-row dependentN precedent), 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, personalDeductionsForTaxpayer modeled 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/calculatedInterest left optional with no requiredWhen gate: 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.
  • amendedFilingIdentifier gated by requiredWhen: { field: "amendmentType", in: [...] } (the v0.3 in operator, §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.x worksheet subtotal/total fields (e.g. employmentIncomeSubtotal, grandTotal, taxableIncome, annualTax) modeled required: true, itemized component lines beneath them also modeled required: true with minimum: 0, defaulting to 0 when not applicable: the source states every 3.x field 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, and calculatedInterest are the sole worksheet fields left optional (see above and below).
  • Amounts modeled integer with minimum: 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.
  • filingType keeps 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 tagged pii, 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/amendedFilingIdentifier both set), a tax credit, and a taxpayer note — exercising the schema's requiredWhen gate and its optional fields.

Eight mutation-control fixtures, each isolated to raise exactly one error:

  • mutation-control-missing-required-field.json — drops taxpayerIdNumber (static required: true).
  • mutation-control-invalid-enum-value.json — sets filingType to "urgent", not one of the enum's 6 values.
  • mutation-control-invalid-date-format.json — sets dateOfBirth to "22-03-1994", not the required YYYY-MM-DD shape.
  • mutation-control-invalid-type-wage-income.json — sets wageIncome to the string "not-a-number" instead of an integer.
  • mutation-control-invalid-minimum-wage-income.json — sets wageIncome to -100, below validation.minimum: 0.
  • mutation-control-missing-conditional-amended-filing-identifier.json — sets amendmentType to "taxpayer-amendment-article-40" without its amendedFilingIdentifier companion.
  • mutation-control-invalid-minimum-tax-year.json — sets taxYear to 2021, below validation.minimum: 2022 (the first self-assessment year).
  • mutation-control-invalid-maxlength-note.json — sets taxpayerNote to a 501-character string, above validation.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.level is national — the Tax Administration is Serbia's national tax authority.
  • process.type is filing, matching this registry's established convention for tax-return forms (e.g. jo/istd/pit-return-employee, at/bmf/employee-tax-assessment).
  • process.language is sr, matching rs/apr/jrpps-pr-sole-proprietor-registration's and rs/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.0 draft latest this page has verification record schema.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.