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

Jurisdiction
Thailand · national
Version
1.0.0
Verification
draft
Authority
Revenue Department

Authoritative source ภ.ง.ด.90 (PIT 90), tax year 2568 (2025 CE) edition

Machine access

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

  • taxYear string required

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

    The taxpayer's 13-digit Thai Taxpayer Identification Number.

    patternlength: 13–13classification: sensitive-pii
  • spouseTin string

    The 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
  • taxpayerBirthDay integer required

    Date of birth: day

    range: 1–31
  • taxpayerBirthMonth integer required

    Date of birth: month

    range: 1–12
  • taxpayerBirthYear integer required

    Notes 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
  • spouseBirthDay integer

    Spouse's date of birth: day

    range: 1–31
  • spouseBirthMonth integer

    Spouse's date of birth: month

    range: 1–12
  • spouseBirthYear integer

    Spouse's date of birth: year (Buddhist Era)

    range: 2400–2700
  • taxpayerName string required

    Instruction beneath: state clearly whether Mr./Mrs./Miss/rank/undivided estate/ordinary partnership/community enterprise.

  • taxpayerMiddleName string

    Middle name

  • taxpayerSurname string required

    Surname

  • spouseName string

    Spouse's first name

  • spouseMiddleName string

    Spouse's middle name

  • spouseSurname string

    Spouse's surname

  • businessEstablishmentName string

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

  • businessWebsite string

    The main website used for e-commerce transactions, applicable only to a VAT-registered e-commerce filer.

  • addressBuilding string

    Building

  • addressRoomNo string

    Room number

  • addressFloor string

    Floor

  • addressVillage string

    Village

  • addressHouseNo string

    House number

  • addressMoo string

    Moo (village group) number

  • addressSoi string

    Soi (alley)

  • addressJunction string

    Junction (Yaek)

  • addressRoad string

    Road

  • addressSubDistrict string

    Sub-district / Khwaeng

  • addressDistrict string

    District / Khet

  • addressProvince string

    Province

  • addressPostalCode string

    Postal code

    patternlength: 5–5
  • returnFilingType enum required

    Whether this is an original/normal filing or an additional/amended filing for the same tax year.

    enum: normal | amended
  • incomeEarnerStatus enum required

    Legal-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
  • maritalStatus enum required

    Marital status

    enum: single | married | widowed
  • marriedStatusDetail enum

    Sub-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
  • filingStatus enum

    Whether 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
  • spouseIncomeSection enum

    Declares 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
  • spousePassportNumber string

    Only 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
  • spouseNationality string

    Spouse's nationality

  • spouseForeignCountry string

    Spouse's country

  • taxpayerDonationWish enum required

    Declaration of intent to allocate part of the taxpayer's tax payment to a political party.

    enum: wishesToDonate | doesNotWishToDonate
  • taxpayerDonationAmount number

    Taxpayer's donation amount (baht)

    range: 0–∞classification: financial
  • taxpayerDonationPartyCode string

    Only a Thai-national individual taxpayer may donate to a political party through this mechanism, per the source's own footnote.

  • spouseDonationWish enum

    Spouse: donate tax to a political party?

    enum: wishesToDonate | doesNotWishToDonate
  • spouseDonationAmount number

    Spouse's donation amount (baht)

    range: 0–∞classification: financial
  • spouseDonationPartyCode string

    Spouse's chosen political party code

  • summaryExcessTaxPaid number

    A 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
  • summaryAdditionalTaxDue number

    A page-1 recap box mirroring the final result of ข้อ 11 (see section11FinalDueOrOverpaid) rather than an independent computation.

    range: 0–∞classification: financial
  • refundRequestedAmount number

    The 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
  • attachedEvidenceSheetCount integer

    Count of supporting evidence sheets attached to the refund request (rights-entitlement certificate, income certificate, special-development-zone income certificate, foreign-income certificate).

    range: 0–∞
  • taxpayerSignatureDate date

    Date of taxpayer's signature

  • representativeName string

    Optional — 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.

  • representativeCapacity string

    The representative's relationship/capacity in respect of the taxpayer (e.g. executor, guardian, attorney).

  • representativeAddressLine1 string

    Representative's address (line 1)

  • representativeAddressLine2 string

    Representative's address (line 2)

  • representativeSignatureDate date

    Date of representative's signature

  • section1PayerTin string

    Taxpayer ID of the (single, bounded) payer of this employment/service income — e.g. the employer.

    patternlength: 13–13classification: sensitive-pii
  • section1Section40_1Income number required

    1. Income under section 40(1) (salary, wages, pension, etc.)

    range: 0–∞classification: financial
  • section1ProvidentFundExcessDeduction number

    2.(1) Provident fund contribution (amount over 10,000 baht)

    range: 0–∞classification: financial
  • section1GpfDeduction number

    2.(2) Government Pension Fund (GPF) contribution

    range: 0–∞classification: financial
  • section1PrivateTeacherFundDeduction number

    2.(3) Private school teacher welfare fund contribution

    range: 0–∞classification: financial
  • section1SeverancePayDeduction number

    Only when included in this tax computation, per the source's own parenthetical.

    range: 0–∞classification: financial
  • section1TotalDeductions1to4 number

    2. Total of (1) to (4)

    range: 0–∞classification: financial
  • section1AttachmentSheetCount integer

    Number of evidence sheets attached for (1)-(4)

    range: 0–∞
  • section1Section40_2Income number

    3. Income under section 40(2) (meeting fees, commissions, etc.)

    range: 0–∞classification: financial
  • section1Subtotal number

    Line 1 minus line 2 plus line 3. Source presents this as a literal computed cell.

    classification: financial
  • section1ExpenseDeduction number

    5. Less expenses (50%, not exceeding 100,000 baht)

    range: 0–100000classification: financial
  • section1NetIncomeCarriedForward number required

    Carried 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
  • section11IncomeAfterExpenses number required

    Total 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
  • section11AllowancesDeduction number required

    Carried from the last line of the personal-deductions/allowances attachment (attachmentItem24Total).

    range: 0–∞classification: financial
  • section11Subtotal1 number required

    ข้อ 11.3 Remaining (1. - 2.)

    classification: financial
  • section11Donation1Deduction number required

    Political/education/sports-style donations eligible for the 2x multiplier, capped at 10% of line 3.

    range: 0–∞classification: financial
  • section11Subtotal2 number required

    ข้อ 11.5 Remaining (3. - 4.)

    classification: financial
  • section11Donation2Deduction number required

    General (1x) donations, capped at 10% of line 5.

    range: 0–∞classification: financial
  • section11NetIncome number required

    ข้อ 11.7 Net income (5. - 6.)

    range: 0–∞classification: financial
  • section11TaxFromNetIncome number required

    Progressive 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
  • section11AlternativeTaxBase number required

    Total 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
  • section11AlternativeTaxComputed number required

    section11AlternativeTaxBase multiplied by 0.005.

    range: 0–∞classification: financial
  • section11TaxPayable number required

    The 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
  • section11SpecialZoneTax number required

    ข้อ 11.11 Tax due from the special development zone income certificate

    range: 0–∞classification: financial
  • section11TotalTaxPayable number required

    ข้อ 11.12 Total tax payable

    range: 0–∞classification: financial
  • section11ForeignTaxCredit number required

    Not to exceed the tax otherwise payable under Thai law.

    range: 0–∞classification: financial
  • section11TaxAfterForeignCredit number required

    ข้อ 11.14 Tax payable after foreign tax credit (12. - 13.)

    range: 0–∞classification: financial
  • section11WithholdingTaxCredit number required

    ข้อ 11.15 Less withholding tax and tax credit

    range: 0–∞classification: financial
  • section11Pit93Prepayment number required

    ข้อ 11.15a Tax paid in advance via Form PIT 93

    range: 0–∞classification: financial
  • section11Pit94Prepayment number required

    ข้อ 11.15b Tax paid in advance via Form PIT 94

    range: 0–∞classification: financial
  • section11NetTaxDueOrOverpaid number required

    Signed 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
  • section11CarriedFromRealEstateSchedule number

    Carried 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
  • section11Line18AttachmentCount integer

    Number of evidence sheets attached for lines 4, 6, 13, 15 and 17

    range: 0–∞
  • section11TotalDueOrOverpaid number required

    ข้อ 11.18 Total additional tax due / overpaid tax

    classification: financial
  • section11AddFromGiftSchedule number

    Carried from ข้อ 9 (the separate-taxation gift/inheritance-income schedule), out of scope for this v1.0.0.

    classification: financial
  • section11AddFromAttachmentLine6 number

    ข้อ 11.20 Plus additional tax due (from attachment line 6, if any)

    classification: financial
  • section11LessFromAttachmentLine7 number

    ข้อ 11.21 Less overpaid tax (from attachment line 7, if any)

    classification: financial
  • section11LessAmendedOriginalTax number

    Only 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
  • section11Subtotal3 number required

    ข้อ 11.23 Additional tax due / overpaid tax (subtotal)

    classification: financial
  • section11Surcharge number

    ข้อ 11.24 Plus surcharge (if any)

    range: 0–∞classification: financial
  • section11FinalDueOrOverpaid number required

    The 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
  • attachmentFormType enum required

    Whether this personal-deductions/allowances attachment is filed alongside form PIT 90 or form PIT 91.

    enum: pit90 | pit91
  • attachmentTaxpayerTin string required

    Attachment: taxpayer ID number

    patternlength: 13–13classification: sensitive-pii
  • attachmentSpouseTin string

    Attachment: spouse's ID number

    patternlength: 13–13classification: sensitive-pii
  • attachmentTaxpayerName string required

    Attachment: taxpayer's first name

  • attachmentTaxpayerMiddleName string

    Attachment: taxpayer's middle name

  • attachmentTaxpayerSurname string required

    Attachment: taxpayer's surname

  • attachmentSpouseName string

    Attachment: spouse's first name

  • attachmentSpouseMiddleName string

    Attachment: spouse's middle name

  • attachmentSpouseSurname string

    Attachment: spouse's surname

  • attachmentItem1PersonalAllowance number required

    60,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
  • attachmentItem2SpouseAllowance number

    60,000 baht, applicable when the spouse has income aggregated into this joint computation, or has no income of their own.

    range: 0–∞classification: financial
  • attachmentItem3ChildCount integer

    The 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–∞
  • attachmentItem3ChildAllowance number

    3. Total child allowance (30,000 baht per child)

    range: 0–∞classification: financial
  • attachmentItem3bAdditionalChildCount integer

    The 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–∞
  • attachmentItem3bAdditionalChildAllowance number

    3. Total additional child allowance (60,000 baht per qualifying child)

    range: 0–∞classification: financial
  • attachmentItem4FatherOfTaxpayerId string

    4. Taxpayer's father: citizen ID number

    classification: sensitive-pii
  • attachmentItem4FatherOfTaxpayerAllowance number

    4. Taxpayer's father: parental care allowance

    range: 0–∞classification: financial
  • attachmentItem4MotherOfTaxpayerId string

    4. Taxpayer's mother: citizen ID number

    classification: sensitive-pii
  • attachmentItem4MotherOfTaxpayerAllowance number

    4. Taxpayer's mother: parental care allowance

    range: 0–∞classification: financial
  • attachmentItem4FatherOfSpouseId string

    4. Spouse's father: citizen ID number

    classification: sensitive-pii
  • attachmentItem4FatherOfSpouseAllowance number

    4. Spouse's father: parental care allowance

    range: 0–∞classification: financial
  • attachmentItem4MotherOfSpouseId string

    4. Spouse's mother: citizen ID number

    classification: sensitive-pii
  • attachmentItem4MotherOfSpouseAllowance number

    4. Spouse's mother: parental care allowance

    range: 0–∞classification: financial
  • attachmentItem5DisabilityCareAllowance number

    Carried from Form L.Y. 04.

    range: 0–∞classification: financial
  • attachmentItem6HealthInsuranceAllowance number

    6. Health insurance premium for parents of taxpayer and spouse

    range: 0–∞classification: financial
  • attachmentItem6FatherOfTaxpayerId string

    6. Taxpayer's father: citizen ID number

    classification: sensitive-pii
  • attachmentItem6MotherOfTaxpayerId string

    6. Taxpayer's mother: citizen ID number

    classification: sensitive-pii
  • attachmentItem6FatherOfSpouseId string

    6. Spouse's father: citizen ID number

    classification: sensitive-pii
  • attachmentItem6MotherOfSpouseId string

    6. Spouse's mother: citizen ID number

    classification: sensitive-pii
  • attachmentItem7LifeInsurancePremium number

    7. Life insurance premium

    range: 0–∞classification: financial
  • attachmentItem7HealthInsurancePremium number

    7. Health insurance premium (own)

    range: 0–∞classification: financial
  • attachmentItem7PensionLifeInsurancePremium number

    7. Pension-type life insurance premium

    range: 0–∞classification: financial
  • attachmentItem8ProvidentFundDeduction number

    8. Provident fund contribution (not exceeding 10,000 baht)

    range: 0–10000classification: financial
  • attachmentItem9NationalSavingsFundDeduction number

    9. National Savings Fund contribution

    range: 0–∞classification: financial
  • attachmentItem10RmfPurchase number

    10. RMF (Retirement Mutual Fund) unit purchase

    range: 0–∞classification: financial
  • attachmentItem11MortgageInterestDeduction number

    11. Mortgage interest on a home purchase/lease/construction

    range: 0–∞classification: financial
  • attachmentItem12SocialSecurityContribution number

    12. Social security contribution

    range: 0–∞classification: financial
  • attachmentItem13CctvPurchase number

    Applicable only to income under sections 40(5), (6), (7), and (8) earned in a special development zone.

    range: 0–∞classification: financial
  • attachmentItem14PrenatalChildbirthExpense number

    14. Prenatal care and childbirth expenses

    range: 0–∞classification: financial
  • attachmentItem15PoliticalPartyDonation number

    15. Donation to a political party

    range: 0–∞classification: financial
  • attachmentItem16SocialEnterpriseInvestment number

    16. Investment in shares/partnership to establish or increase capital of a registered social enterprise

    range: 0–∞classification: financial
  • attachmentItem17EasyEReceiptTotal number

    Only for goods/services purchases with a full tax invoice or electronic receipt (e-Tax Invoice & e-Receipt).

    range: 0–∞classification: financial
  • attachmentItem17_1VatGoodsServices number

    17.1 Goods/services within the VAT system

    range: 0–∞classification: financial
  • attachmentItem17_2Books number

    17.2 Books, newspapers, and magazines

    range: 0–∞classification: financial
  • attachmentItem17_3EBooks number

    17.3 E-books and electronic magazine/newspaper services via internet

    range: 0–∞classification: financial
  • attachmentItem17_4OtopGoods number

    17.4 OTOP, community enterprise, and social enterprise goods

    range: 0–∞classification: financial
  • attachmentItem18ThaiEsgPurchase number

    18. Thai ESG fund unit purchase

    range: 0–∞classification: financial
  • attachmentItem19_1ThaiEsgxPurchase number

    19.1 Thai ESGX fund unit purchase

    range: 0–∞classification: financial
  • attachmentItem19_2LtfSwitchValue number

    19.2 Value of units switched from an LTF fund into Thai ESGX

    range: 0–∞classification: financial
  • attachmentItem20NewHomeConstructionCost number

    Paid to a contractor who is a VAT-registered operator.

    range: 0–∞classification: financial
  • attachmentItem21ArtPurchase number

    21. Purchase of art/artwork

    range: 0–∞classification: financial
  • attachmentItem22DomesticTourismTotal number

    22. Domestic tourism expenses total (29 Oct - 15 Dec 2568)

    range: 0–∞classification: financial
  • attachmentItem22_1MainCityETaxInvoice number

    22.1 Main tourist city, e-Tax invoice

    range: 0–∞classification: financial
  • attachmentItem22_1MainCityPaperInvoice number

    22.1 Main tourist city, paper tax invoice

    range: 0–∞classification: financial
  • attachmentItem22_2SecondaryCityETaxInvoice number

    22.2 Secondary tourist city, e-Tax invoice

    range: 0–∞classification: financial
  • attachmentItem22_2SecondaryCityPaperInvoice number

    22.2 Secondary tourist city, paper tax invoice

    range: 0–∞classification: financial
  • attachmentItem23Other number

    23. Other

    range: 0–∞classification: financial
  • attachmentItem24Total number required

    Carried 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: draft
  • verification.method: manual-source-review-v1
  • verification.lastVerifiedAt: 2026-07-12
  • maturity.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: 1629183 bytes, Last-Modified: Mon, 12 Jan 2026 03:35:04 GMT.
    • sha256: e47796b2b5a5e253407dc6e1d0accebb0ebcf18456ff5ee08396c487786e84e5 (computed independently via sha256sum on the freshly-downloaded file, not copied from the task's cited figure) — matches exactly.
  • Parsed with pdfjs-dist@3 (legacy build, getAnnotations({intent:'display'}), filtered to subtype === '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/buttonValue was dumped and correlated against getTextContent()'s position-sorted text rows (grouped by rounded y, sorted by x within 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:

  1. 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.
  2. ข้อ 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.
  3. ข้อ 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.
  4. 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) and maritalStatus (Radio Button49, 3 values: single/married/widowed) are two separate, nested radio groups under one shared "สถานภาพของผู้มีเงินได้" heading — maritalStatus sits directly beneath incomeEarnerStatus'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) and filingStatus (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 from filingStatus itself, 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/spouseForeignCountry sit 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 no requiredWhen, 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 a requiredWhen trigger 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, no radioButton/checkBox, no buttonValue) 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 the section11AlternativeTaxBase/ section11AlternativeTaxComputed fields 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 — drops taxpayerTin (a static required: true field) from the single-filer valid fixture.
  • mutation-control-missing-conditional-spouse-tin.json — starts from the married valid fixture (maritalStatus: "married") and drops only spouseTin, isolating the requiredWhen violation.
  • mutation-control-missing-conditional-donation-amount.json — starts from the married valid fixture (taxpayerDonationWish: "wishesToDonate") and drops only taxpayerDonationAmount.
  • mutation-control-invalid-enum-value.json — sets returnFilingType to "resubmission", not one of the enum's two values.
  • mutation-control-invalid-tin-pattern.json — sets taxpayerTin to a 13-character all-letter string ("ABCDEFGHIJKLM"), preserving length 13 so only the pattern check (not minLength) 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.level is national — the Revenue Department is Thailand's national tax authority.
  • No edition member: GovSchema v0.3's edition.scheme vocabulary is closed to us-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 with ke/kra/it1-individual-resident-return's own precedent (also an annual return with no edition member), the tax-year identity is instead modeled via a plain taxYear field and disclosed in source.documentRef.
  • process.type is filing; process.language is th (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 as refundRequestedAmount above).
  • 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 an mfa.go.th CDN). 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.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 Revenue Department or any government. The authoritative source is always the live government form and its official instructions.