Registry entry
Thailand Personal Income Tax Return (PIT 90 / ภ.ง.ด.90)
The Revenue Department's (RD) ภ.ง.ด.90 ("PIT 90") personal income tax return, tax year 2568 (2025 CE) edition — the return for a resident individual with income beyond pure employment (Revenue Code sections 40(2) through 40(8)), as opposed to ภ.ง.ด.91 (the simpler pure-salary return). Opens Thailand as this registry's 44th jurisdiction, via its Taxes vertical (1 of 6). The live 5-page, 432-AcroForm-widget source is a wide, multi-schedule return covering up to eight separate income-type schedules across pages 2-4 (ข้อ 1 through ข้อ 10), plus a personal-deductions/allowances rider attachment (page 5). This v1.0.0 deliberately scopes to the general/salaried-income filing pathway: page 1's full taxpayer/spouse identification, marital/filing-status, political-party tax-donation, and refund-request/signature blocks; ข้อ 1 (income under Revenue Code sections 40(1)-(2): employment/wages/pension and service-fee/commission income — the single most common income category); ข้อ 11 (the final tax computation, lines 1 through 25, completed by every filer regardless of income type); and the page 5 personal-deductions/allowances attachment (items 1-24), which feeds directly into ข้อ 11 and is used by virtually every filer. Out of scope for this v1.0.0, disclosed in VERIFICATION.md: ข้อ 2 through ข้อ 10 — the section 40(3) royalty/goodwill schedule, 40(4) dividend/interest schedule, 40(5) rental-income schedule, 40(6) professional-fee schedule, the shared 40(3)/(5)/(6)/(7)/(8) actual-expense sub-form, 40(7) contracting-income schedule, 40(8) business/commerce/agriculture schedule, the separate-taxation real-estate-sale schedule (ข้อ 8), the separate-taxation gift/inheritance-income schedule (ข้อ 9), and ข้อ 10 (income electing exclusion from the aggregate computation for RMF/Thai-ESG/pension-insurance purposes) — none of which apply to the general employment/service-income filer this v1.0.0 targets. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Government of Thailand or the Revenue Department.
Registry entry
th/rd/pit-90-personal-income-tax-return
Authoritative source ภ.ง.ด.90 (PIT 90), tax year 2568 (2025 CE) edition
Machine access
- Schema document
registry/th/rd/pit-90-personal-income-tax-return/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/th/rd/pit-90-personal-income-tax-return/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
154 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
-
taxYearstring requiredThe Buddhist-Era tax year this return covers, e.g. "2568" (2025 CE). Printed as a blank fill-in on the main form ("ปีภาษี ............."); this schema's conformance fixtures use "2568", matching the source PDF's own tax-year edition and the printed "ปีภาษี 2568" on the page 5 attachment header.
pattern -
taxpayerTinstring requiredThe taxpayer's 13-digit Thai Taxpayer Identification Number.
patternlength: 13–13classification: sensitive-pii -
spouseTinstringThe spouse's 13-digit Thai Taxpayer Identification Number. Required only when maritalStatus is married, per this document's own maritalStatus/marriedStatusDetail gating.
patternlength: 13–13classification: sensitive-pii -
taxpayerBirthDayinteger requiredDate of birth: day
range: 1–31 -
taxpayerBirthMonthinteger requiredDate of birth: month
range: 1–12 -
taxpayerBirthYearinteger requiredNotes at this row also state a taxpayer aged 65+ must additionally complete a separate rights-declaration form (ใบแสดงสิทธิฯ) not modeled in this v1.0.0.
range: 2400–2700 -
spouseBirthDayintegerSpouse's date of birth: day
range: 1–31 -
spouseBirthMonthintegerSpouse's date of birth: month
range: 1–12 -
spouseBirthYearintegerSpouse's date of birth: year (Buddhist Era)
range: 2400–2700 -
taxpayerNamestring requiredInstruction beneath: state clearly whether Mr./Mrs./Miss/rank/undivided estate/ordinary partnership/community enterprise.
-
taxpayerMiddleNamestringMiddle name
-
taxpayerSurnamestring requiredSurname
-
spouseNamestringSpouse's first name
-
spouseMiddleNamestringSpouse's middle name
-
spouseSurnamestringSpouse's surname
-
businessEstablishmentNamestringOnly applicable to a VAT-registered filer with a place of business; the source instructs a filer with more than one place of business to itemize each in a separate attachment (not modeled in this v1.0.0).
-
businessWebsitestringThe main website used for e-commerce transactions, applicable only to a VAT-registered e-commerce filer.
-
addressBuildingstringBuilding
-
addressRoomNostringRoom number
-
addressFloorstringFloor
-
addressVillagestringVillage
-
addressHouseNostringHouse number
-
addressMoostringMoo (village group) number
-
addressSoistringSoi (alley)
-
addressJunctionstringJunction (Yaek)
-
addressRoadstringRoad
-
addressSubDistrictstringSub-district / Khwaeng
-
addressDistrictstringDistrict / Khet
-
addressProvincestringProvince
-
addressPostalCodestringPostal code
patternlength: 5–5 -
returnFilingTypeenum requiredWhether this is an original/normal filing or an additional/amended filing for the same tax year.
enum: normal | amended -
incomeEarnerStatusenum requiredLegal-personality classification of the filer. Values, per the source's own six numbered options: an ordinary individual; a person who died during the tax year; an undivided estate; an ordinary partnership that is not a juristic person; a body of persons that is not a juristic person; or a community enterprise under the Community Enterprise Promotion Act B.E. 2548.
enum: individual | deceasedDuringTaxYear | undividedEstate | ordinaryPartnership | bodyOfPersons | communityEnterprise -
maritalStatusenum requiredMarital status
enum: single | married | widowed -
marriedStatusDetailenumSub-classification of when the marriage/dissolution occurred within the tax year, which affects whether spousal income is aggregated for the full year or only part of it.
enum: marriedAndLivingTogetherAllYear | marriedDuringTaxYear | divorcedDuringTaxYear | spouseDiedDuringTaxYear -
filingStatusenumWhether the couple computes tax jointly, files separately, or files separately for section 40(1) income only. DISCLOSED SIMPLIFICATION: a second, narrower radio-button group on the same source column (2 further options, plus a "single income type and separate filing" annotation) sits immediately below this one and could not be confidently correlated to a distinct printed label pair given the compressed layout; it is not separately modeled in this v1.0.0 — see VERIFICATION.md.
enum: jointComputation | separateFiling | separateFilingSection40_1Only -
spouseIncomeSectionenumDeclares which Revenue Code section(s) the spouse's own income falls under, or that the spouse has no income — used together with maritalStatus/filingStatus to determine whether/how spousal income is aggregated. Modeled only for the spouse: the taxpayer filing this return is, by definition, always a person with income, so the source form carries no equivalent taxpayer-side toggle.
enum: section40_1To8 | section40_2To8 | section40_1Only | noIncome -
spousePassportNumberstringOnly applicable when the spouse is a foreign national with no income of their own. No discrete boolean field on the source drives this condition (it is a heading, not a gated widget), so this schema leaves it optional rather than encoding an unsupported requiredWhen — disclosed in VERIFICATION.md.
classification: sensitive-pii -
spouseNationalitystringSpouse's nationality
-
spouseForeignCountrystringSpouse's country
-
taxpayerDonationWishenum requiredDeclaration of intent to allocate part of the taxpayer's tax payment to a political party.
enum: wishesToDonate | doesNotWishToDonate -
taxpayerDonationAmountnumberTaxpayer's donation amount (baht)
range: 0–∞classification: financial -
taxpayerDonationPartyCodestringOnly a Thai-national individual taxpayer may donate to a political party through this mechanism, per the source's own footnote.
-
spouseDonationWishenumSpouse: donate tax to a political party?
enum: wishesToDonate | doesNotWishToDonate -
spouseDonationAmountnumberSpouse's donation amount (baht)
range: 0–∞classification: financial -
spouseDonationPartyCodestringSpouse's chosen political party code
-
summaryExcessTaxPaidnumberA page-1 recap box, immediately above the certification/refund-request block, mirroring the final result of ข้อ 11 (see section11FinalDueOrOverpaid) rather than an independent computation.
range: 0–∞classification: financial -
summaryAdditionalTaxDuenumberA page-1 recap box mirroring the final result of ข้อ 11 (see section11FinalDueOrOverpaid) rather than an independent computation.
range: 0–∞classification: financial -
refundRequestedAmountnumberThe source carries no discrete Yes/No widget for "do you request a refund" separate from this amount field itself; a filer requesting no refund simply leaves this blank. Not gated by requiredWhen for that reason — disclosed in VERIFICATION.md.
range: 0–∞classification: financial -
attachedEvidenceSheetCountintegerCount of supporting evidence sheets attached to the refund request (rights-entitlement certificate, income certificate, special-development-zone income certificate, foreign-income certificate).
range: 0–∞ -
taxpayerSignatureDatedateDate of taxpayer's signature
-
representativeNamestringOptional — completed only when the return is filed by a legal representative or attorney (e.g. for an undivided estate or a deceased taxpayer). The source has no discrete boolean gating this block, so it is left fully optional rather than encoded with an unsupported requiredWhen.
-
representativeCapacitystringThe representative's relationship/capacity in respect of the taxpayer (e.g. executor, guardian, attorney).
-
representativeAddressLine1stringRepresentative's address (line 1)
-
representativeAddressLine2stringRepresentative's address (line 2)
-
representativeSignatureDatedateDate of representative's signature
-
section1PayerTinstringTaxpayer ID of the (single, bounded) payer of this employment/service income — e.g. the employer.
patternlength: 13–13classification: sensitive-pii -
section1Section40_1Incomenumber required1. Income under section 40(1) (salary, wages, pension, etc.)
range: 0–∞classification: financial -
section1ProvidentFundExcessDeductionnumber2.(1) Provident fund contribution (amount over 10,000 baht)
range: 0–∞classification: financial -
section1GpfDeductionnumber2.(2) Government Pension Fund (GPF) contribution
range: 0–∞classification: financial -
section1PrivateTeacherFundDeductionnumber2.(3) Private school teacher welfare fund contribution
range: 0–∞classification: financial -
section1SeverancePayDeductionnumberOnly when included in this tax computation, per the source's own parenthetical.
range: 0–∞classification: financial -
section1TotalDeductions1to4number2. Total of (1) to (4)
range: 0–∞classification: financial -
section1AttachmentSheetCountintegerNumber of evidence sheets attached for (1)-(4)
range: 0–∞ -
section1Section40_2Incomenumber3. Income under section 40(2) (meeting fees, commissions, etc.)
range: 0–∞classification: financial -
section1SubtotalnumberLine 1 minus line 2 plus line 3. Source presents this as a literal computed cell.
classification: financial -
section1ExpenseDeductionnumber5. Less expenses (50%, not exceeding 100,000 baht)
range: 0–100000classification: financial -
section1NetIncomeCarriedForwardnumber requiredCarried forward as the input to section11IncomeAfterExpenses (ข้อ 11, line 1). Because this schema models only ข้อ 1 of the source's seven income-category schedules (ข้อ 1 through ข้อ 7), for the general/salaried scope this schema targets this figure is expected to equal section11IncomeAfterExpenses directly.
classification: financial -
section11IncomeAfterExpensesnumber requiredTotal from the last line of ข้อ 1 through ข้อ 7 (this schema models only ข้อ 1's section1NetIncomeCarriedForward; ข้อ 2 through ข้อ 7 are out of scope — see VERIFICATION.md).
range: 0–∞classification: financial -
section11AllowancesDeductionnumber requiredCarried from the last line of the personal-deductions/allowances attachment (attachmentItem24Total).
range: 0–∞classification: financial -
section11Subtotal1number requiredข้อ 11.3 Remaining (1. - 2.)
classification: financial -
section11Donation1Deductionnumber requiredPolitical/education/sports-style donations eligible for the 2x multiplier, capped at 10% of line 3.
range: 0–∞classification: financial -
section11Subtotal2number requiredข้อ 11.5 Remaining (3. - 4.)
classification: financial -
section11Donation2Deductionnumber requiredGeneral (1x) donations, capped at 10% of line 5.
range: 0–∞classification: financial -
section11NetIncomenumber requiredข้อ 11.7 Net income (5. - 6.)
range: 0–∞classification: financial -
section11TaxFromNetIncomenumber requiredProgressive personal income tax computed on section11NetIncome per Thailand's statutory tax bands. This schema does not itself assert or embed the current band table; the figure is a field the source presents, computed per Revenue Code Section 48.
range: 0–∞classification: financial -
section11AlternativeTaxBasenumber requiredTotal gross income before deducting expenses, from ข้อ 1 through ข้อ 7, EXCLUDING income under section 40(1). Required only when this total is 120,000 baht or more (per the source's own threshold); this schema still models the field for the general case, since for a pure section-40(1) salaried filer with no other income category modeled, this figure is 0.
range: 0–∞classification: financial -
section11AlternativeTaxComputednumber requiredsection11AlternativeTaxBase multiplied by 0.005.
range: 0–∞classification: financial -
section11TaxPayablenumber requiredThe greater of section11TaxFromNetIncome and section11AlternativeTaxComputed, except that when line 9 computes to 5,000 baht or less, line 8's figure is used instead (the source's own de-minimis floor for the alternative 0.5% computation).
range: 0–∞classification: financial -
section11SpecialZoneTaxnumber requiredข้อ 11.11 Tax due from the special development zone income certificate
range: 0–∞classification: financial -
section11TotalTaxPayablenumber requiredข้อ 11.12 Total tax payable
range: 0–∞classification: financial -
section11ForeignTaxCreditnumber requiredNot to exceed the tax otherwise payable under Thai law.
range: 0–∞classification: financial -
section11TaxAfterForeignCreditnumber requiredข้อ 11.14 Tax payable after foreign tax credit (12. - 13.)
range: 0–∞classification: financial -
section11WithholdingTaxCreditnumber requiredข้อ 11.15 Less withholding tax and tax credit
range: 0–∞classification: financial -
section11Pit93Prepaymentnumber requiredข้อ 11.15a Tax paid in advance via Form PIT 93
range: 0–∞classification: financial -
section11Pit94Prepaymentnumber requiredข้อ 11.15b Tax paid in advance via Form PIT 94
range: 0–∞classification: financial -
section11NetTaxDueOrOverpaidnumber requiredSigned figure: positive means additional tax due, negative means overpaid tax. DISCLOSED SIMPLIFICATION: the source pairs this computed amount with a small "which applies" Yes/No radio-button toggle; this schema models only the signed numeric result rather than a separate toggle plus an always-positive magnitude, consistent with how the source's own plain subtraction lines (e.g. section11Subtotal1) are modeled — see VERIFICATION.md.
classification: financial -
section11CarriedFromRealEstateSchedulenumberCarried from ข้อ 8 (the separate-taxation real-estate-sale schedule), which is out of scope for this v1.0.0. Modeled as an optional field defaulting to 0/absent for a filer with no such income.
classification: financial -
section11Line18AttachmentCountintegerNumber of evidence sheets attached for lines 4, 6, 13, 15 and 17
range: 0–∞ -
section11TotalDueOrOverpaidnumber requiredข้อ 11.18 Total additional tax due / overpaid tax
classification: financial -
section11AddFromGiftSchedulenumberCarried from ข้อ 9 (the separate-taxation gift/inheritance-income schedule), out of scope for this v1.0.0.
classification: financial -
section11AddFromAttachmentLine6numberข้อ 11.20 Plus additional tax due (from attachment line 6, if any)
classification: financial -
section11LessFromAttachmentLine7numberข้อ 11.21 Less overpaid tax (from attachment line 7, if any)
classification: financial -
section11LessAmendedOriginalTaxnumberOnly applicable when returnFilingType is amended — the tax already computed on the taxpayer's original PIT 90/91 filing for the same tax year.
classification: financial -
section11Subtotal3number requiredข้อ 11.23 Additional tax due / overpaid tax (subtotal)
classification: financial -
section11Surchargenumberข้อ 11.24 Plus surcharge (if any)
range: 0–∞classification: financial -
section11FinalDueOrOverpaidnumber requiredThe return's bottom-line figure: a positive value is additional tax owed to the Revenue Department, a negative value is a refund due to the taxpayer. Cross-references summaryExcessTaxPaid/summaryAdditionalTaxDue on page 1 and refundRequestedAmount.
classification: financial -
attachmentFormTypeenum requiredWhether this personal-deductions/allowances attachment is filed alongside form PIT 90 or form PIT 91.
enum: pit90 | pit91 -
attachmentTaxpayerTinstring requiredAttachment: taxpayer ID number
patternlength: 13–13classification: sensitive-pii -
attachmentSpouseTinstringAttachment: spouse's ID number
patternlength: 13–13classification: sensitive-pii -
attachmentTaxpayerNamestring requiredAttachment: taxpayer's first name
-
attachmentTaxpayerMiddleNamestringAttachment: taxpayer's middle name
-
attachmentTaxpayerSurnamestring requiredAttachment: taxpayer's surname
-
attachmentSpouseNamestringAttachment: spouse's first name
-
attachmentSpouseMiddleNamestringAttachment: spouse's middle name
-
attachmentSpouseSurnamestringAttachment: spouse's surname
-
attachmentItem1PersonalAllowancenumber required60,000 baht for a taxpayer filing separately, or 120,000 baht when filing jointly with a spouse, per the source's own parenthetical.
range: 0–∞classification: financial -
attachmentItem2SpouseAllowancenumber60,000 baht, applicable when the spouse has income aggregated into this joint computation, or has no income of their own.
range: 0–∞classification: financial -
attachmentItem3ChildCountintegerThe source's own four blank citizen-ID-number lines beneath this item (for listing each child) have no corresponding AcroForm widgets in the source PDF and are not modeled individually — disclosed in VERIFICATION.md.
range: 0–∞ -
attachmentItem3ChildAllowancenumber3. Total child allowance (30,000 baht per child)
range: 0–∞classification: financial -
attachmentItem3bAdditionalChildCountintegerThe higher 60,000-baht rate applies from the second qualifying child onward, when that child was born in or after B.E. 2561 (2018 CE).
range: 0–∞ -
attachmentItem3bAdditionalChildAllowancenumber3. Total additional child allowance (60,000 baht per qualifying child)
range: 0–∞classification: financial -
attachmentItem4FatherOfTaxpayerIdstring4. Taxpayer's father: citizen ID number
classification: sensitive-pii -
attachmentItem4FatherOfTaxpayerAllowancenumber4. Taxpayer's father: parental care allowance
range: 0–∞classification: financial -
attachmentItem4MotherOfTaxpayerIdstring4. Taxpayer's mother: citizen ID number
classification: sensitive-pii -
attachmentItem4MotherOfTaxpayerAllowancenumber4. Taxpayer's mother: parental care allowance
range: 0–∞classification: financial -
attachmentItem4FatherOfSpouseIdstring4. Spouse's father: citizen ID number
classification: sensitive-pii -
attachmentItem4FatherOfSpouseAllowancenumber4. Spouse's father: parental care allowance
range: 0–∞classification: financial -
attachmentItem4MotherOfSpouseIdstring4. Spouse's mother: citizen ID number
classification: sensitive-pii -
attachmentItem4MotherOfSpouseAllowancenumber4. Spouse's mother: parental care allowance
range: 0–∞classification: financial -
attachmentItem5DisabilityCareAllowancenumberCarried from Form L.Y. 04.
range: 0–∞classification: financial -
attachmentItem6HealthInsuranceAllowancenumber6. Health insurance premium for parents of taxpayer and spouse
range: 0–∞classification: financial -
attachmentItem6FatherOfTaxpayerIdstring6. Taxpayer's father: citizen ID number
classification: sensitive-pii -
attachmentItem6MotherOfTaxpayerIdstring6. Taxpayer's mother: citizen ID number
classification: sensitive-pii -
attachmentItem6FatherOfSpouseIdstring6. Spouse's father: citizen ID number
classification: sensitive-pii -
attachmentItem6MotherOfSpouseIdstring6. Spouse's mother: citizen ID number
classification: sensitive-pii -
attachmentItem7LifeInsurancePremiumnumber7. Life insurance premium
range: 0–∞classification: financial -
attachmentItem7HealthInsurancePremiumnumber7. Health insurance premium (own)
range: 0–∞classification: financial -
attachmentItem7PensionLifeInsurancePremiumnumber7. Pension-type life insurance premium
range: 0–∞classification: financial -
attachmentItem8ProvidentFundDeductionnumber8. Provident fund contribution (not exceeding 10,000 baht)
range: 0–10000classification: financial -
attachmentItem9NationalSavingsFundDeductionnumber9. National Savings Fund contribution
range: 0–∞classification: financial -
attachmentItem10RmfPurchasenumber10. RMF (Retirement Mutual Fund) unit purchase
range: 0–∞classification: financial -
attachmentItem11MortgageInterestDeductionnumber11. Mortgage interest on a home purchase/lease/construction
range: 0–∞classification: financial -
attachmentItem12SocialSecurityContributionnumber12. Social security contribution
range: 0–∞classification: financial -
attachmentItem13CctvPurchasenumberApplicable only to income under sections 40(5), (6), (7), and (8) earned in a special development zone.
range: 0–∞classification: financial -
attachmentItem14PrenatalChildbirthExpensenumber14. Prenatal care and childbirth expenses
range: 0–∞classification: financial -
attachmentItem15PoliticalPartyDonationnumber15. Donation to a political party
range: 0–∞classification: financial -
attachmentItem16SocialEnterpriseInvestmentnumber16. Investment in shares/partnership to establish or increase capital of a registered social enterprise
range: 0–∞classification: financial -
attachmentItem17EasyEReceiptTotalnumberOnly for goods/services purchases with a full tax invoice or electronic receipt (e-Tax Invoice & e-Receipt).
range: 0–∞classification: financial -
attachmentItem17_1VatGoodsServicesnumber17.1 Goods/services within the VAT system
range: 0–∞classification: financial -
attachmentItem17_2Booksnumber17.2 Books, newspapers, and magazines
range: 0–∞classification: financial -
attachmentItem17_3EBooksnumber17.3 E-books and electronic magazine/newspaper services via internet
range: 0–∞classification: financial -
attachmentItem17_4OtopGoodsnumber17.4 OTOP, community enterprise, and social enterprise goods
range: 0–∞classification: financial -
attachmentItem18ThaiEsgPurchasenumber18. Thai ESG fund unit purchase
range: 0–∞classification: financial -
attachmentItem19_1ThaiEsgxPurchasenumber19.1 Thai ESGX fund unit purchase
range: 0–∞classification: financial -
attachmentItem19_2LtfSwitchValuenumber19.2 Value of units switched from an LTF fund into Thai ESGX
range: 0–∞classification: financial -
attachmentItem20NewHomeConstructionCostnumberPaid to a contractor who is a VAT-registered operator.
range: 0–∞classification: financial -
attachmentItem21ArtPurchasenumber21. Purchase of art/artwork
range: 0–∞classification: financial -
attachmentItem22DomesticTourismTotalnumber22. Domestic tourism expenses total (29 Oct - 15 Dec 2568)
range: 0–∞classification: financial -
attachmentItem22_1MainCityETaxInvoicenumber22.1 Main tourist city, e-Tax invoice
range: 0–∞classification: financial -
attachmentItem22_1MainCityPaperInvoicenumber22.1 Main tourist city, paper tax invoice
range: 0–∞classification: financial -
attachmentItem22_2SecondaryCityETaxInvoicenumber22.2 Secondary tourist city, e-Tax invoice
range: 0–∞classification: financial -
attachmentItem22_2SecondaryCityPaperInvoicenumber22.2 Secondary tourist city, paper tax invoice
range: 0–∞classification: financial -
attachmentItem23Othernumber23. Other
range: 0–∞classification: financial -
attachmentItem24Totalnumber requiredCarried forward as the input to section11AllowancesDeduction (ข้อ 11, line 2), or, for a PIT 91 filer, to that form's own line 6.
range: 0–∞classification: financial
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-12maturity.level:structural-reference
This is GovSchema Standard Research cycle GOV-2593. It opens Thailand as this registry's 44th jurisdiction, via its Taxes vertical (1 of 6), using the Revenue Department's (RD) "ภ.ง.ด.90" (PIT 90) personal income tax return, tax year 2568 (2025 CE) edition. Thailand was scouted and screened in GOV-2591's prior cycle (see that issue's own memory record): Rwanda's remaining three verticals were confirmed dead ends and Thailand was picked up as a new-jurisdiction candidate via this PIT 90 source (432 AcroForm fields).
Source verification (independently re-derived, not copied from the task)
- URL:
https://www.rd.go.th/fileadmin/tax_pdf/pit/2568/241268PIT90.pdf - Fetched independently this cycle via
curl:- HTTP 200,
Content-Type: application/pdf,Content-Length: 1629183bytes,Last-Modified: Mon, 12 Jan 2026 03:35:04 GMT. sha256:e47796b2b5a5e253407dc6e1d0accebb0ebcf18456ff5ee08396c487786e84e5(computed independently viasha256sumon the freshly-downloaded file, not copied from the task's cited figure) — matches exactly.
- HTTP 200,
- Parsed with
pdfjs-dist@3(legacy build,getAnnotations({intent:'display'}), filtered tosubtype === 'Widget'), installed in a scratch directory (not a repo dependency), following this registry's established PDF-extraction practice:- 5 pages, 432 AcroForm widgets total.
- Per-page breakdown: 76 (page 1) / 95 (page 2) / 112 (page 3) / 78 (page 4) / 71 (page 5) — matches the task's cited breakdown exactly.
- Every widget's
fieldName/fieldType/rect/radioButton/buttonValuewas dumped and correlated againstgetTextContent()'s position-sorted text rows (grouped by roundedy, sorted byxwithin each row) for all five pages, to read every Thai label and confirm each widget's meaning before modeling it — not assumed from field names alone. Radio-button groups sharing one field name were resolved by reading the printed text at the same/adjacent row-and-column position, per this registry's established coordinate-correlation technique.
Scoping decision (per GOV-2593's own explicit permission)
PIT 90 is a wide, multi-schedule return (up to 8 income-type schedules across pages 2-4, ข้อ 1 through ข้อ 10, plus a personal-deductions attachment on page 5). This v1.0.0 deliberately scopes to the general/salaried-income filing pathway, modeling:
- Page 1 — full taxpayer + spouse identification, marital/filing status, the spouse's income-section declaration, the political-party tax-donation declaration (taxpayer and spouse), and the refund-request/ signature/representative block.
- ข้อ 1 (page 2) — income under Revenue Code sections 40(1)-(2) (employment/wages/pension and service-fee/commission income): payer TIN, the main income line, the 4 numbered deduction sub-lines under section 40(1), the running total plus attachment-sheet count, the section 40(2) line, and the computed subtotal/expense-deduction/net-income lines that carry forward to ข้อ 11.
- ข้อ 11 (page 4) — the final tax computation, all 25 numbered lines, including the alternative 0.5%-of-gross computation and its 5,000-baht floor exception, the foreign tax credit, the withholding-tax/ PIT-93/PIT-94 prepayment credits, and the final due/overpaid amount plus surcharge line.
- Page 5 attachment ("ใบแนบแสดงรายละเอียดรายการลดหย่อนและยกเว้นหลังจากหักค่าใช้จ่าย") — all 24 numbered deduction/allowance items, including item 3's two child- allowance rates (pre-/post-2018 60,000-baht rate), item 4's four parent- care ID+amount pairs, item 6's combined health-insurance amount plus four parent ID fields, item 7's three insurance sub-lines, item 17's Easy E-Receipt 2.0 total plus its four 17.1-17.4 sub-items, item 19's Thai ESGX unit-purchase and LTF-switch sub-lines, and item 22's domestic- tourism total plus its main-city/secondary-city × e-Tax-invoice/paper- invoice four-way split.
Out of scope, disclosed (per the task's own explicit list)
ข้อ 2 through ข้อ 10 on pages 2-4 are not modeled, each because it does not apply to the general employment/service-income filer this v1.0.0 targets:
- ข้อ 2 (page 2, y≈543) — section 40(3) royalty/goodwill schedule.
- ข้อ 3 (page 2, y≈302 / page 4 header text confirms placement) — section 40(4) dividend/interest schedule, including its own foreign- dividend/digital-token sub-lines and dividend tax credit.
- ข้อ 4 (page 2, y≈298) — section 40(5) rental-income schedule.
- ข้อ 5 (page 3, y≈727) — section 40(6) professional-fee schedule (medical/law/engineering/architecture/accounting/fine-arts).
- ข้อ 6 (page 3, y≈469) — section 40(7) contracting-income schedule.
- ข้อ 7 (page 3, y≈343) — section 40(8) business/commerce/agriculture schedule.
- The shared 40(3)/(5)/(6)/(7)/(8) "actual expense" claim sub-form (page 3, the repeating "สำหรับเงินได้ตามมาตรา 40(3)/(5)/(6)/(7)/(8)" right-column blocks alongside ข้อ 3 through ข้อ 7).
- ข้อ 8 (page 4, y≈804) — the separate-taxation real-estate-sale schedule. Its own bottom-line carry-forward figure into ข้อ 11 line 17 (
section11CarriedFromRealEstateSchedule) is still modeled, as an optional field, since the in-scope ข้อ 11 sheet itself presents it. - ข้อ 9 (page 4, y≈672) — the separate-taxation gift/inheritance- income schedule. Its own carry-forward into ข้อ 11 line 19 (
section11AddFromGiftSchedule) is likewise modeled as an optional pass-through field. - ข้อ 10 (page 4, y≈560, and a companion amount-only block found at the top-right of page 2 between the ข้อ 1 header and the y≈700 row, covering digital-token/crypto gains and RMF/LTF/SSF/Thai-ESG fund redemption gains with "ยกเว้น/ไม่ยกเว้น" (exempt/not exempt) elections) — income electing exclusion from the aggregate computation for RMF/Thai- ESG/pension-insurance purposes. Disclosed judgment call: this right-hand-column content on page 2 initially looked like it might belong to ข้อ 1 (given the shared page-2 top position and the shared "carried to ข้อ 11 line 1" destination phrase used in both the left-column ข้อ 1 computation and this right-column list), but the content itself (crypto/ token transfer gains, RMF/LTF/SSF/ThaiESG unit-redemption gains with cost-basis and exempt-election sub-lines) does not describe salary/wage/ service income — it matches ข้อ 10's own printed description almost verbatim. Confirmed by checking page 4: no AcroForm widget exists between ข้อ 10's own header (y≈560) and ข้อ 11's header (y≈509) other than a single amount field, consistent with ข้อ 10's real data entry living on page 2 rather than page 4. Treated as ข้อ 10 and excluded, per the task's own explicit instruction.
Field-by-field inventory and disclosed judgment calls
Page 1 (identification, status, donation, refund/signature)
Read from getTextContent()'s position-sorted rows and correlated to each widget's rect. Notable disclosed decisions:
incomeEarnerStatus(Radio Button48, 6 values) andmaritalStatus(Radio Button49, 3 values: single/married/widowed) are two separate, nested radio groups under one shared "สถานภาพของผู้มีเงินได้" heading —maritalStatussits directly beneathincomeEarnerStatus's option (1) "individual" row. Modeled as two independent fields rather than one combined enum, since the source presents them as two separately-clickable radio groups.marriedStatusDetail(Radio Button44, 4 values) andfilingStatus(Radio Button46, 3 values) sit in the address-block's right-hand columns under "สถานภาพการสมรส"/"สถานะการยื่นแบบฯ" headers, sharing vertical rows with the (unrelated) street-address entry widgets in the same y-range — confirmed these are genuinely separate widget groups at different x positions on the same rows, not a mapping conflict.- Disclosed simplification: a second, narrower 2-option radio group (Radio Button47, under the same "สถานะการยื่นแบบฯ" header, with labels "รวมคำนวณภาษี \*" / "แยกยื่นแบบ" plus a further annotation "ประเภทเดียวและ แยกยื่นแบบฯ") sits immediately below
filingStatus's own widget group. Given the compressed, overlapping label layout, this could not be confidently correlated to a distinct printed meaning separate fromfilingStatusitself, and is not separately modeled in this v1.0.0 — disclosed here rather than guessed. spouseIncomeSection(Radio Button45, 4 values) is modeled only for the spouse; the taxpayer filing this return definitionally always has income, so the source carries no equivalent taxpayer-side toggle.spousePassportNumber/spouseNationality/spouseForeignCountrysit under a heading ("กรณีคู่สมรสเป็นคนต่างด้าวและไม่มีเงินได้โปรดระบุ" — "if spouse is a foreign national without income, please specify") that has no discrete boolean widget of its own. Left optional with norequiredWhen, since encoding one would require inventing a field the source does not present — disclosed rather than silently modeled.refundRequestedAmount: the source has no separate Yes/No widget for "do you want a refund" distinct from the amount field itself. Left optional, undocumented as arequiredWhentrigger for the same reason.- Representative block (
representativeName/representativeCapacity/representativeAddressLine1/representativeAddressLine2/representativeSignatureDate): no discrete boolean gates this block on the source (it is used only when an attorney/guardian/estate representative files on the taxpayer's behalf). Left fully optional. - A page-1 top-right control (
Button1,fieldType: Btn, noradioButton/checkBox, nobuttonValue) sits beside the "หน้า 1" page marker. Not a data field — most likely a barcode/QR-style print control. Not modeled, disclosed here rather than silently dropped without explanation. summaryExcessTaxPaid/summaryAdditionalTaxDue: a page-1 recap box immediately above the certification/refund block. These mirror ข้อ 11's final line (section11FinalDueOrOverpaid) rather than being an independent computation — modeled as plain optional fields, disclosed as a recap rather than a distinct source of truth.
ข้อ 1 (page 2)
12 fields modeled: section1PayerTin, the main section-40(1) income line, the 4 numbered deduction sub-lines ((1) provident fund excess, (2) GPF, (3) private-school-teacher fund, (4) severance pay), the running total plus its own attachment-sheet count, the section 40(2) line, and the computed subtotal/expense-deduction/net-income-carried-forward lines. All widget names (Text31.0.0, Text32.0.0-Text32.11.0, Text3, Text61) were individually correlated to their printed row text by y-coordinate; no ambiguity encountered in this section.
ข้อ 11 (page 4)
29 fields modeled across the 25 numbered lines (line 9 has two sub-fields — the gross-income base and the resulting 0.5% tax; line 15 has two prepayment sub-fields for PIT 93/PIT 94; line 18 has its own attachment-sheet-count sub-field).
Disclosed simplification: several of the "ภาษีที่ชำระเพิ่มเติม/ชำระไว้ เกิน" (additional-tax-due / overpaid-tax) lines (16, 17, 18, 23, 25) are each paired in the source with a small Yes/No radio-button toggle (Radio Button89, 99, 93, 105, 106) selecting which of the two applies, alongside an always-non-negative magnitude field. This schema models each such line as a single signed numeric field (positive = additional tax due, negative = overpaid) rather than a separate toggle plus magnitude — consistent with how the source's own plain subtraction lines (e.g. line 3, line 5) are modeled as signed numbers with no paired toggle. Disclosed rather than silently resolved; a future cycle wanting bit-for-bit widget parity could reintroduce the toggle fields.
Page 5 attachment
67 fields modeled (8 header-identification fields + 1 form-type radio + 58 numbered-item fields). Widget-to-label correlation for the repeating sub-blocks (item 4's four parent ID+amount pairs, item 6's four parent ID fields, item 17's four Easy-E-Receipt sub-items, item 19's two ESGX sub-items, item 22's two-city × two-invoice-type four-way split) was done by matching each widget's rect x/y position against the corresponding sub-item's printed label row, confirmed against the running total feeding item 24 (ยกไปรวมในข้อ 11 2. ของแบบภ.ง.ด.90).
Disclosed absence: item 3's (and item 3's post-2018-child variant's) four blank citizen-ID-number lines per child, printed beneath each allowance's count/amount fields, have no corresponding AcroForm widgets in the source PDF — confirmed by dumping all widgets in that y-range and finding none. Not modeled individually; attachmentItem3ChildCount/ attachmentItem3bAdditionalChildCount capture the count, and attachmentItem24Total's conformance figures do not depend on the missing per-child ID fields.
Conformance run
Two hand-authored valid fixtures under conformance/th/rd/pit-90-personal-income-tax-return/1.0.0/:
valid-single-salaried-employee-refund-due.json— a single filer with 600,000 baht of section 40(1) salary income, the 100,000-baht capped expense deduction, 79,000 baht of allowances (personal allowance, provident fund, social security), a computed net income of 421,000 baht, tax of 19,600 baht computed via Thailand's publicly documented progressive bands (0% to 150,000; 5% to 300,000; 10% to 500,000; ... — used here only for internal fixture consistency, not asserted as this schema's own embedded authority, since the source itself does not print the band table within the in-scope pages), 20,000 baht already withheld, resulting in a small refund due (-400 baht).valid-married-joint-children-disability-tax-due.json— a married filer electing joint computation, with section 40(1) salary (1,500,000 baht) and section 40(2) commission income (80,000 baht), 2 children plus 1 additional post-2018 child, a disability-care allowance, a life-insurance premium, a political-party donation, and thesection11AlternativeTaxBase/section11AlternativeTaxComputedfields exercised (nonzero, since section 40(2) income is included in that base), resulting in additional tax due (17,600 baht).
Both were checked with a from-scratch Node conformance checker (check_conformance.mjs, not committed — a disposable script per this registry's own established practice) validating required/requiredWhen/ type/validation.{enum,minimum,maximum,pattern,minLength,maxLength} directly against spec/v0.3/SPEC.md's own rules:
`` $ node check_conformance.mjs schema.json \ valid-single-salaried-employee-refund-due.json \ valid-married-joint-children-disability-tax-due.json valid-single-salaried-employee-refund-due.json: 0 error(s) valid-married-joint-children-disability-tax-due.json: 0 error(s) ``
Five mutation-control fixtures, each isolated to raise exactly one error:
mutation-control-missing-required-field.json— dropstaxpayerTin(a staticrequired: truefield) from the single-filer valid fixture.mutation-control-missing-conditional-spouse-tin.json— starts from the married valid fixture (maritalStatus: "married") and drops onlyspouseTin, isolating therequiredWhenviolation.mutation-control-missing-conditional-donation-amount.json— starts from the married valid fixture (taxpayerDonationWish: "wishesToDonate") and drops onlytaxpayerDonationAmount.mutation-control-invalid-enum-value.json— setsreturnFilingTypeto"resubmission", not one of the enum's two values.mutation-control-invalid-tin-pattern.json— setstaxpayerTinto a 13-character all-letter string ("ABCDEFGHIJKLM"), preserving length 13 so only thepatterncheck (notminLength) fires — an earlier draft of this fixture used a 6-character value and raised two errors (pattern+minLength) at once; corrected to isolate exactly one.
`` $ node check_conformance.mjs schema.json \ mutation-control-missing-required-field.json \ mutation-control-missing-conditional-spouse-tin.json \ mutation-control-missing-conditional-donation-amount.json \ mutation-control-invalid-enum-value.json \ mutation-control-invalid-tin-pattern.json mutation-control-missing-required-field.json: 1 error(s) - taxpayerTin: required but missing mutation-control-missing-conditional-spouse-tin.json: 1 error(s) - spouseTin: required but missing mutation-control-missing-conditional-donation-amount.json: 1 error(s) - taxpayerDonationAmount: required but missing mutation-control-invalid-enum-value.json: 1 error(s) - returnFilingType: value "resubmission" not in enum ["normal","amended"] mutation-control-invalid-tin-pattern.json: 1 error(s) - taxpayerTin: value "ABCDEFGHIJKLM" does not match pattern ^[0-9]{13}$ ``
All five negative controls raised exactly one error each, and neither valid scenario raised an unexpected error.
Both registry validators were run against the schema document and pass:
``` $ node tools/validate.mjs registry/th/rd/pit-90-personal-income-tax-return/1.0.0/schema.json ok registry/th/rd/pit-90-personal-income-tax-return/1.0.0/schema.json 1/1 document(s) passed.
$ node tools/validate-ajv.mjs registry/th/rd/pit-90-personal-income-tax-return/1.0.0/schema.json ok registry/th/rd/pit-90-personal-income-tax-return/1.0.0/schema.json [v0.3] 1/1 document(s) validated against the meta-schema (ajv 2020-12). ```
(tools/node_modules did not have ajv present in this worktree at the start of this cycle; ran npm ci --include=dev inside tools/ first, per this registry's own known NODE_ENV=production gotcha.)
node tools/verify-sources.mjs registry/th/rd/pit-90-personal-income-tax-return/1.0.0 was run clean immediately before opening this PR (1 directory, 3 URLs checked, 0 warnings, 0 allowlisted). The full registry (all 389 schema.json documents, including this one) was also re-validated with both tools/validate.mjs and confirmed to pass, to check this PR did not regress any other document.
tools/govschema-client/registry-index.json was regenerated via npm run build-index inside tools/govschema-client/ (389 entries, up from 388 before this cycle).
Scope and jurisdiction notes
- Opens Thailand as this registry's 44th jurisdiction, via its Taxes vertical (1 of 6).
jurisdiction.levelisnational— the Revenue Department is Thailand's national tax authority. - No
editionmember: GovSchema v0.3'sedition.schemevocabulary is closed tous-tax-year/gb-tax-year/award-year(§5.7), none of which fit a Thai Buddhist-Era tax year, and extending that closed vocabulary is a one-way-door spec change out of scope for this cycle. Consistent withke/kra/it1-individual-resident-return's own precedent (also an annual return with noeditionmember), the tax-year identity is instead modeled via a plaintaxYearfield and disclosed insource.documentRef. process.typeisfiling;process.languageisth(the source form is entirely in Thai).documents[]carries the printed certification statement (attestation) and the refund-request supporting evidence (supporting-evidence, disclosed as not machine-gated for the same reason asrefundRequestedAmountabove).- Companion-schedule candidates for a future cycle, in priority order: ข้อ 8 (real-estate-sale separate taxation), ข้อ 4-7 (rental/professional- fee/contracting income), ข้อ 3 (dividend/interest), ข้อ 9 (gift/ inheritance), and ข้อ 10 (RMF/Thai-ESG/pension-insurance exclusion election) — largest-to-smallest by expected filer incidence.
- Two runner-up Thailand candidates from this cycle's scouting (GOV-2591) remain open backlog for a future Business Formation/Visa vertical cycle: DBD Form บอจ.1 (Business Formation, 101 AcroForm fields,
dbd.go.th) and the MFA Non-Immigrant Visa B/Employment application (58 AcroForm fields, served from anmfa.go.thCDN). Thailand's DMV, Passport, and National ID verticals were screened this cycle and found weak/dead-end: each is an in-person/biometric process (vehicle registration via the Department of Land Transport, passport issuance via the Department of Consular Affairs, and the national ID card via the Department of Provincial Administration) with no unauthenticated fillable specimen found.
Re-verification
Per the practice's cadence, nextReviewBy is set to 2027-01-12 (6 months). A future review should prioritize: (1) independently confirming Thailand's currently legislated personal income tax bands and the 0.5% alternative-computation threshold, since this schema's conformance fixtures use the publicly documented band table for internal consistency only, not as an asserted-current legal figure encoded in the schema itself; (2) the ข้อ 8 real-estate-sale schedule as the strongest companion-schedule candidate, since it is the schedule with its own dedicated carry-forward line already modeled in ข้อ 11; (3) the two disclosed Thailand candidates (DBD Form บอจ.1, MFA Non-Immigrant Visa B) for opening Thailand's Business Formation and Visa verticals.
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 Revenue Department or any government. The authoritative source is always the live government form and its official instructions.