Registry entry
Kenya Individual Resident Income Tax Return (IT1)
Kenya Revenue Authority's (KRA) "IT1 Individual Resident Return" workbook (edition 18.0.1), the downloadable Microsoft Excel return template for a resident individual's annual income tax return under the Income Tax Act (Cap. 470). Closes Kenya's Taxes vertical (3 of 6; National ID via ke/nrb/application-for-identity-card and Business Formation via ke/brs/cr1-application-to-register-a-company already modelled). The live workbook is a 34-sheet, multi-pathway return covering employment income, self-employment/business income, farming, partnerships, estates/trusts, capital allowances, rental income, and a long tail of tax-credit and relief schedules. This v1.0.0 deliberately bounds scope to the most common "employed resident individual" filing pathway, modelling only five of the workbook's 34 sheets: A_Basic_Info (basic taxpayer identification, return-type, and gating questions), F_Employment_Income (employment income declarations), M_Details_of_PAYE_Deducted (PAYE already withheld by employer(s)), T_Income_Computation_Self (the taxpayer's own non-employment income aggregation, modelled at its "Consolidated" column only), and T_Tax_Computation (the final tax computation, reliefs, credits, and tax payable/refund). Every other sheet — self-employment/business Profit & Loss and Balance Sheet, Stock Analysis, Capital Allowances, Partnership Income, Estate/Trust Income, Car Benefit/Mortgage/Home Ownership Savings Plan/Insurance Relief computations, Installment/Withholding/Advance/DTAA tax credit schedules, Previous Years' Losses, and the entire mirrored "Wife" income-declaration pathway (Kenyan tax law permits spousal joint election) — is explicitly out of scope for this v1.0.0 and disclosed as a companion-schedule candidate for a future cycle in VERIFICATION.md. Bounded repeating groups (employer records, spanning both F_Employment_Income and M_Details_of_PAYE_Deducted) are flattened to a disclosed cap of 2 slots, per this registry's bounded-repeating-group convention. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Government of Kenya or KRA.
Registry entry
ke/kra/it1-individual-resident-return
Machine access
- Schema document
registry/ke/kra/it1-individual-resident-return/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/ke/kra/it1-individual-resident-return/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
86 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
-
personalIdentificationNumberstring requiredThe taxpayer's KRA Personal Identification Number (PIN). The workbook's own Validations sheet (row 2) records this field's length as fixed at 11 characters and cites an internal validatePIN() macro; the macro logic itself is not inspectable in this published edition (macros are stripped/disabled — see the workbook's own "Macros_Disabled" sheet), so the pattern below is modeled on Kenya's well-documented public KRA PIN format (one letter, nine digits, one letter) rather than decompiled from the source macro.
patternlength: 11–11classification: pii -
typeOfReturnenum requiredWhether this is the taxpayer's original return for the period, or an amended return replacing a previously filed one.
enum: original | amended -
returnPeriodFromdate requiredStart date of the tax period this return covers (Kenya's individual income tax year runs 1 January to 31 December).
-
returnPeriodTodate requiredEnd date of the tax period this return covers.
-
hasNonEmploymentIncomeboolean requiredGates the source workbook's Business/Profit-and-Loss, Balance Sheet, Stock Analysis, and Capital Allowance schedules (sheets B, C, D, E1, E2, E), all of which are out of scope for this v1.0.0 (see this document's own VERIFICATION.md). This schema targets the pure-employment filing pathway, where the answer is "No"; the field is still modeled because it is a real, always-present gating question on the in-scope A_Basic_Info sheet.
-
hasPartnershipIncomeboolean requiredGates the out-of-scope G_Partnership_Income sheet (not modeled in this v1.0.0).
-
hasEstateOrTrustIncomeboolean requiredGates the out-of-scope H_Estate_Trust_Income sheet (not modeled in this v1.0.0).
-
employerProvidedCarboolean requiredGates the out-of-scope I_Computation_of_Car_Benefit sheet. The resulting "Value of Car Benefit" total still surfaces as a top-level entry field on F_Employment_Income (see employer1CarBenefitValue/employer2CarBenefitValue), which this schema does model.
-
hasMortgageboolean requiredGates the out-of-scope J_Computation_of_Mortgage sheet. The resulting "Mortgage Interest" total still surfaces as a top-level entry field on T_Tax_Computation (see mortgageInterestDeduction), which this schema does model.
-
hasHomeOwnershipSavingsPlanboolean requiredGates the out-of-scope K_Home_Ownership_Saving_Plan sheet. The resulting deposit total still surfaces as a top-level entry field on T_Tax_Computation (see homeOwnershipSavingsPlanDeduction), which this schema does model.
-
hasLifeInsurancePolicyboolean requiredGates the out-of-scope L_Computation_of_Insu_Relief sheet. The resulting insurance relief total still surfaces as a top-level entry field on T_Tax_Computation (see insuranceRelief), which this schema does model.
-
hasCommercialVehicleboolean requiredGates the out-of-scope P_Advance_Tax_Credits sheet. The resulting advance tax credit total still surfaces as a top-level entry field on T_Tax_Computation (see commercialVehicleAdvanceTaxCredit), which this schema does model.
-
hasForeignIncomeboolean requiredGates the out-of-scope R_DTAA_Credits sheet (double tax agreement relief). The resulting credit total still surfaces as a top-level entry field on T_Tax_Computation (see dtaaTaxCredit), which this schema does model.
-
hasDisabilityExemptionCertificateboolean requiredWhether the taxpayer holds a KRA-issued tax exemption certificate for disability. Gates disabilityExemptionCertificateNumber/DateFrom/DateTo below, and the resulting exemption amount surfaces on T_Tax_Computation as disabilityTaxExemptionAmount.
-
declareSpouseIncomeboolean requiredKenyan tax law allows a married taxpayer to elect to declare a spouse's income jointly on the same return. This schema deliberately scopes to the taxpayer's own ("Self") computation only, per this document's own out-of-scope disclosures (T_Income_Computation_Wife, and every sheet's mirrored "(Wife)" section) — if this field is true, the source workbook requires a full parallel set of spouse fields (spouse employment income, spouse PAYE deducted, spouse tax computation) that this v1.0.0 does not model. Included here because it is a real, always-present field on the in-scope A_Basic_Info sheet.
-
spousePinstringThe spouse's KRA PIN, collected when declareSpouseIncome is true. See declareSpouseIncome's description — the spouse's own income/computation sections are out of scope for this v1.0.0.
patternlength: 11–11classification: pii -
disabilityExemptionCertificateNumberstringBounded to a single certificate slot for this v1.0.0; the source sheet's underlying named range (ExemptCerti.ListS) is a repeating list, but a resident individual is only issued one active disability exemption certificate at a time in practice.
-
disabilityExemptionCertificateDateFromdateDate From
-
disabilityExemptionCertificateDateTodateDate To
-
bankNamestringUsed by KRA to pay out a refund when the return's final tax computation (see taxDueOrRefundDue) is negative. DISCLOSED DISCREPANCY: the printed label carries a "*" (visually implying mandatory), but the workbook's own machine-readable Validations sheet (row 16) records this field's Mandatory flag as "N". This schema follows the authoritative Validations sheet and models the field as optional — see VERIFICATION.md.
-
bankBranchNamestringSame asterisk-vs-Validations-sheet discrepancy as bankName; modeled as optional per the Validations sheet (row 17, Mandatory "N").
-
bankCitystringSame asterisk-vs-Validations-sheet discrepancy as bankName; modeled as optional per the Validations sheet (row 18, Mandatory "N").
-
bankAccountHolderNamestringSame asterisk-vs-Validations-sheet discrepancy as bankName; modeled as optional per the Validations sheet (row 19, Mandatory "N").
classification: pii -
bankAccountNumberstringSame asterisk-vs-Validations-sheet discrepancy as bankName; modeled as optional per the Validations sheet (row 21, Mandatory "N").
classification: pii -
employer1Pinstring requiredEmployer identity is shared across F_Employment_Income and M_Details_of_PAYE_Deducted in this schema: both source sheets separately list "PIN of Employer"/"Name of Employer" columns for what is, in substance, the same employer per taxpayer, so this schema consolidates them into one employerN identity rather than duplicating PIN/Name fields per sheet — a disclosed synthesis judgment call, see VERIFICATION.md.
classification: pii -
employer1Namestring requiredName of Employer
-
employer1GrossPaynumber requiredGross Pay (Ksh) (A)
range: 0–∞classification: financial -
employer1OtherAllowancesAndBenefitsnumber requiredAllowances and Benefits from Employment (Other than Car and Housing) (Ksh) (B)
range: 0–∞classification: financial -
employer1CarBenefitValuenumber requiredTotal pulled from the out-of-scope I_Computation_of_Car_Benefit sheet (not modeled in this v1.0.0); this schema surfaces only the resulting total, as it is the field the in-scope F_Employment_Income sheet itself presents.
range: 0–∞classification: financial -
employer1NetHousingValuenumber requiredNet Value of Housing (Ksh) (D)
range: 0–∞classification: financial -
employer1PensionExcess300000number requiredPension if in excess of 300,000 (Ksh) (E)
range: 0–∞classification: financial -
employer1TotalEmploymentIncomenumber requiredSum of this employer's Gross Pay, Other Allowances and Benefits, Car Benefit Value, Net Housing Value, and Pension Excess. The source workbook presents this as a literal cell (typically computed by KRA's iTax system rather than hand-entered); modeled as a field because the in-scope sheet presents it as one.
range: 0–∞classification: financial -
employer2PinstringSecond employer slot, per this schema's disclosed bounded cap of 2 (see employer1Pin's description). All of employer 2's fields are optional, since the source sheet's base printed table has only one visible blank data-entry row (row 3) before its Total row (row 5).
classification: pii -
employer2NamestringSecond employer slot (see employer1Name's description); optional.
-
employer2GrossPaynumberGross Pay (Ksh) (A)
range: 0–∞classification: financial -
employer2OtherAllowancesAndBenefitsnumberAllowances and Benefits from Employment (Other than Car and Housing) (Ksh) (B)
range: 0–∞classification: financial -
employer2CarBenefitValuenumberTotal pulled from the out-of-scope I_Computation_of_Car_Benefit sheet (not modeled in this v1.0.0); this schema surfaces only the resulting total, as it is the field the in-scope F_Employment_Income sheet itself presents.
range: 0–∞classification: financial -
employer2NetHousingValuenumberNet Value of Housing (Ksh) (D)
range: 0–∞classification: financial -
employer2PensionExcess300000numberPension if in excess of 300,000 (Ksh) (E)
range: 0–∞classification: financial -
employer2TotalEmploymentIncomenumberSum of this employer's Gross Pay, Other Allowances and Benefits, Car Benefit Value, Net Housing Value, and Pension Excess. The source workbook presents this as a literal cell (typically computed by KRA's iTax system rather than hand-entered); modeled as a field because the in-scope sheet presents it as one.
range: 0–∞classification: financial -
employmentIncomeJanuaryToMarchnumber requiredTotal employment income (across all employers) for the January-March portion of the year, entered separately from the April-December portion for historical reasons: Kenya's Finance Act 2020 temporarily changed PAYE bands for part of that year, and this workbook template's period split (retained through the current 18.0.1 edition) reconciles income earned under differing rate periods. Cross-references taxOnTaxableEmploymentIncomeJanuaryToMarch on T_Tax_Computation.
range: 0–∞classification: financial -
employmentIncomeAprilToDecembernumber requiredTotal employment income (across all employers) for the April-December portion of the year. See employmentIncomeJanuaryToMarch's description.
range: 0–∞classification: financial -
employmentPensionJanuaryToMarchnumber requiredJanuary - March: Pension
range: 0–∞classification: financial -
employmentPensionAprilToDecembernumber requiredApril - December: Pension
range: 0–∞classification: financial -
employer1TaxableSalarynumber requiredTaxable Salary (Ksh)
range: 0–∞classification: financial -
employer1TaxPayableOnTaxableSalarynumber requiredTax Payable on Taxable Salary (Ksh) (A)
range: 0–∞classification: financial -
employer1TaxDeductedPayenumber requiredThe PAYE this employer already withheld and remitted to KRA on the taxpayer's behalf. Cross-references payeDeductedFromSalaryTotal on T_Tax_Computation (item 13.1), which the source describes as the "Total of 'Amount of Tax Deducted (PAYE)' from M_Details_of_PAYE_Deducted".
range: 0–∞classification: financial -
employer1TaxPayableOrRefundablePayenumber requiredA-B for this employer's PAYE reconciliation. Source workbook presents this as a literal cell (typically computed).
classification: financial -
employer2TaxableSalarynumberTaxable Salary (Ksh)
range: 0–∞classification: financial -
employer2TaxPayableOnTaxableSalarynumberTax Payable on Taxable Salary (Ksh) (A)
range: 0–∞classification: financial -
employer2TaxDeductedPayenumberThe PAYE this employer already withheld and remitted to KRA on the taxpayer's behalf. Cross-references payeDeductedFromSalaryTotal on T_Tax_Computation (item 13.1), which the source describes as the "Total of 'Amount of Tax Deducted (PAYE)' from M_Details_of_PAYE_Deducted".
range: 0–∞classification: financial -
employer2TaxPayableOrRefundablePayenumberA-B for this employer's PAYE reconciliation. Source workbook presents this as a literal cell (typically computed).
classification: financial -
nonEmploymentProfitOrLossnumberConsolidated bottom line of the taxpayer's Profit/Surplus/Loss Account. This schema models only the sheet's "Consolidated (Ksh)" column (column I); the six category sub-columns (Business/Farming/Rental/Interest/Commission/Other) that build up to each Consolidated line depend entirely on out-of-scope schedules (B_Profit_Loss_Account_Self, C_Balance_Sheet, D_Stock_Analysis, E1/E2/E capital allowances, G_Partnership_Income, S_Previous_Years_Losses) and on the Landlord/Tenant rental detail in A_Basic_Info, which this v1.0.0 also does not model. For the pure-employment filing pathway this schema targets, every one of these ten lines is normally 0; they are modeled because the source lists them as real, always-present fields on this in-scope sheet.
classification: financial -
nonEmploymentExemptIncomeDeductionnumber2. Less Exempt income (if included in Profit / Surplus and Loss Account)
classification: financial -
nonEmploymentAdjustedProfitOrLossnumberLine 1 minus line 2. Source workbook presents this as a literal cell (typically computed).
classification: financial -
nonEmploymentDisallowableDeductionsAddBacknumberSum of the sheet's disallowable-deduction sub-items 4.1-4.13 (depreciation, entertainment expenses, donations, etc.), each of which in turn pulls from the out-of-scope B_Profit_Loss_Account_Self sheet or the sheet's own "Part I: Other Disallowable Deductions" itemized table (rows 37-45, also not separately modeled in this v1.0.0).
classification: financial -
nonEmploymentAllowableDeductionsDeductnumberSum of the sheet's allowable-deduction sub-items 5.1-5.5 (capital allowances, scientific research expenditure, etc.), each of which in turn pulls from out-of-scope schedules or the sheet's own "Part II: Other Allowable Deductions" itemized table (rows 48-56, also not separately modeled).
classification: financial -
nonEmploymentPartnershipIncomenumberPulled from the out-of-scope G_Partnership_Income sheet.
classification: financial -
nonEmploymentTaxableIncomenumber7. Taxable Income (3+4-5+6)
classification: financial -
nonEmploymentLossBroughtForwardnumberPulled from the out-of-scope S_Previous_Years_Losses sheet.
classification: financial -
nonEmploymentAdjustedTaxableIncomenumberThe figure the source describes as feeding directly into T_Tax_Computation item 12.4 ("Net Taxable Income") as "Line Number 9 (Consolidated)"; see netTaxableIncome. For the pure-employment pathway this schema targets, this is 0.
classification: financial -
nonEmploymentLossCarriedForwardnumber10. Loss to be carried forward to next year for set off (If 7-8 is negative, else 0)
classification: financial -
pensionContributionDeductionnumber11.1 Defined / Pension Contribution
range: 0–∞classification: financial -
mortgageInterestDeductionnumberTotal pulled from the out-of-scope J_Computation_of_Mortgage sheet, capped at Ksh 300,000. This schema surfaces only the resulting capped total, as it is the field the in-scope T_Tax_Computation sheet itself presents. The source's own column F5 comment flags an unresolved design question ("Check required that either of the two deductions will be available. Check to be given here or sections or on validation?") about mutual exclusivity with homeOwnershipSavingsPlanDeduction — disclosed verbatim in VERIFICATION.md, not resolved by this schema.
range: 0–300000classification: financial -
homeOwnershipSavingsPlanDeductionnumberTotal pulled from the out-of-scope K_Home_Ownership_Saving_Plan sheet, capped at Ksh 72,000.
range: 0–72000classification: financial -
totalDeductionnumberPension/defined contribution deduction, plus whichever of the mortgage-interest or home-ownership-savings-plan deduction is larger (the source treats 11.2/11.3 as mutually-exclusive alternatives — see mortgageInterestDeduction's description). Source workbook presents this as a literal cell (typically computed).
range: 0–∞classification: financial -
taxableEmploymentIncomeTotalnumberCross-references the sum of employer1TotalEmploymentIncome and employer2TotalEmploymentIncome from F_Employment_Income.
range: 0–∞classification: financial -
taxableEstateTrustIncomenumberPulled from the out-of-scope H_Estate_Trust_Income sheet.
range: 0–∞classification: financial -
disabilityTaxExemptionAmountnumberApplies only when hasDisabilityExemptionCertificate is true; the source does not publish the computation formula for this amount within the in-scope sheets (it is not simply the certificate presence — KRA disability tax exemption is a statutory relief against taxable income up to a legislated ceiling, computed by KRA's iTax system).
range: 0–∞classification: financial -
netTaxableIncomenumber12.1 (taxableEmploymentIncomeTotal) + 12.2 (taxableEstateTrustIncome) + line 9 of T_Income_Computation_Self (nonEmploymentAdjustedTaxableIncome) - 11 (totalDeduction) - 12.3 (disabilityTaxExemptionAmount). Source workbook presents this as a literal cell (typically computed).
classification: financial -
taxOnTaxableIncomenumberComputed by applying Kenya's graduated resident individual income tax bands to netTaxableIncome. The source workbook's own column F15 comment records these bands verbatim as: "Tax Slabs: 0 to 1,21,968 (10%); 1,21,969 to 2,36,880 (15%); 2,36,881 to 3,51,792 (20%); 3,51,793 to 4,66,704 (25%); Over 4,66,704 (30%)" [figures as printed in the source, Indian-style digit grouping preserved verbatim] — quoted here for reference; this schema does not independently verify these are Kenya's currently legislated 2026 bands, since the Income Tax Act's rate bands have changed by Finance Act amendment in the past and this workbook edition's embedded comment may lag the law. See VERIFICATION.md.
range: 0–∞classification: financial -
taxOnTaxableEmploymentIncomeJanuaryToMarchnumberSee employmentIncomeJanuaryToMarch's description for why the source retains this period split.
range: 0–∞classification: financial -
taxOnTaxableEmploymentIncomeAprilToDecembernumber12.5b Tax on Taxable Employment Income April-December Period
range: 0–∞classification: financial -
personalReliefnumberKenya's flat annual personal relief, deducted from tax on taxable income. DISCLOSED CAVEAT: the source workbook's own column F18 comment reads "Keep it 13,944 but make it configurable", i.e. the workbook's own authors flagged 13,944 (Ksh/year) as a template default rather than an asserted-current legal figure. This schema does not assert 13,944 is Kenya's currently legislated personal relief amount — the conformance examples in this document use it only because it is the figure the source itself embeds, and this is flagged as a fact needing independent confirmation before production use. See VERIFICATION.md.
range: 0–∞classification: financial -
insuranceReliefnumberTotal pulled from the out-of-scope L_Computation_of_Insu_Relief sheet, capped at Ksh 60,000.
range: 0–60000classification: financial -
totalTaxPayableLessReliefsnumberSource workbook presents this as a literal cell (typically computed).
classification: financial -
payeDeductedFromSalaryTotalnumberCross-references the sum of employer1TaxDeductedPaye and employer2TaxDeductedPaye from M_Details_of_PAYE_Deducted.
range: 0–∞classification: financial -
estateTrustTaxCreditnumber30% of taxableEstateTrustIncome per the source's own formula note; pulled from the out-of-scope H_Estate_Trust_Income sheet.
range: 0–∞classification: financial -
installmentTaxPaidTotalnumberPulled from the out-of-scope N_Installment_Tax_Credits sheet.
range: 0–∞classification: financial -
withholdingTaxCreditnumberPulled from the out-of-scope O_WHT_Credits sheet. Common even for an otherwise pure-employment filer (e.g. withholding tax on bank interest), so unlike several of this sheet's other out-of-scope-linked totals this one is not necessarily 0 in practice.
range: 0–∞classification: financial -
commercialVehicleAdvanceTaxCreditnumberPulled from the out-of-scope P_Advance_Tax_Credits sheet; only relevant when hasCommercialVehicle is true.
range: 0–∞classification: financial -
incomeTaxPaidInAdvancenumberPulled from the out-of-scope Q_IT_Payment_Credits sheet.
range: 0–∞classification: financial -
dtaaTaxCreditnumberPulled from the out-of-scope R_DTAA_Credits sheet; only relevant when hasForeignIncome is true.
range: 0–∞classification: financial -
rentalWithholdingTaxCreditnumberWithholding tax on rental income; the underlying rental income detail (Landlord/Tenant sections of A_Basic_Info) is out of scope for this v1.0.0.
range: 0–∞classification: financial -
totalTaxCreditsnumberSource workbook presents this as a literal cell (typically computed).
range: 0–∞classification: financial -
taxDueOrRefundDuenumberThe return's bottom-line figure: a positive value is tax still owed to KRA, a negative value is a refund due to the taxpayer. The source's own column F31 comment notes "System should enable section A Part 2 only if this is negative" — i.e. KRA's iTax system only requires the bankName/bankBranchName/bankCity/bankAccountHolderName/bankAccountNumber fields on A_Basic_Info when this figure is negative (a refund is due). This v1.0.0 does not encode that as a requiredWhen condition on the bank fields, since taxDueOrRefundDue is itself a computed/derived field rather than a fixed applicant answer at fill time — disclosed here rather than silently modeled as a hard requirement.
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-2535. It closes Kenya's Taxes vertical (3 of 6), via the Kenya Revenue Authority's (KRA) downloadable "IT1 Individual Resident Return" Excel workbook. Kenya went into this cycle at 2 of 6 verticals (Business Formation via ke/brs/cr1-application-to-register-a-company, GOV-2493; National ID via ke/nrb/application-for-identity-card, GOV-2500). Taxes was Kenya's own sole open, previously-scouted-in-depth backlog candidate (see CATALOG.md's Known Gaps history, items 19/21) — Passport, DMV, and Visa were each already confirmed dead ends in the GOV-2500 cycle (fully online, login/payment-gated processes with no unauthenticated specimen).
Why this candidate, and the pre-existing "19.0.3/March 2026" caution
CATALOG.md's own history (item 21, GOV-2517 correction) already flags that an earlier same-cycle note ("KRA IT1, version 19.0.3, March 2026") could not be corroborated and remains an unconfirmed version-number claim, distinct from the candidate's live status, which was independently reconfirmed. This cycle did not chase the "19.0.3" string further (no 19.0.3-named file was found on kra.go.ke during this cycle's own fetches either); it instead used the two files CATALOG.md's own history already names as workable — IT1_Individual_Resident_Return_18.0.1latest.xls (used as source.url) and Updated-IT1_Individual_Resident_Return_XLS-18.0.9-2024.xls (cross-checked) — and treats the version-string discrepancy as still open and unresolved, not as evidence against the file's authenticity.
Sources examined
Source 1 — IT1_Individual_Resident_Return_18.0.1latest.xls (chosen as source.url)
- URL:
https://www.kra.go.ke/images/publications/IT1_Individual_Resident_Return_18.0.1latest.xls - Fetched two independent ways this cycle:
curl -sSkL(the-kflag is required for a real TLS certificate/apex-domain mismatch onkra.go.ke;-Lfollows the redirect from the barekra.go.kehost towww.kra.go.ke) — HTTP 200, 3,323,904 bytes.- Node's native
fetch()(a plainHEADrequest, no TLS override) also resolved this exact URL directly with HTTP 200 and no certificate error surfaced to the Node TLS stack — i.e. the mismatchcurlneeds-kfor is specific tocurl's handling of the initial bare-apex redirect hop, not a defect in the finalwww.kra.go.kecertificate itself. This matters fortools/verify-sources.mjs, which uses Node'sfetch()internally: it resolves this URL cleanly with no WARN.
sha256:7c85241bbabc797b9e3c6b708209a32866c4ec9131f9d845d0b87c9734e939e2(computed independently this cycle viasha256sum, not copied from any prior note).- Parsed with the
xlsxnpm package (XLSX.readFile): confirmed 34 sheets, exactly as the candidate's prior scouting described:Data,Read Me,Errors,Validations,ValidationList,Macros_Disabled,ImportCsv,A_Basic_Info,B_Profit_Loss_Account_Self,B_Profit_Loss_Account_Wife,C_Balance_Sheet,D_Stock_Analysis,E1_IDA_CA,E2_CA_WTA_WDV,E2_CA_WTA_SLM,E_Summary_of_Capital_Allowance,F_Employment_Income,G_Partnership_Income,H_Estate_Trust_Income,I_Computation_of_Car_Benefit,J_Computation_of_Mortgage,K_Home_Ownership_Saving_Plan,L_Computation_of_Insu_Relief,M_Details_of_PAYE_Deducted,N_Installment_Tax_Credits,O_WHT_Credits,P_Advance_Tax_Credits,Q_IT_Payment_Credits,R_DTAA_Credits,S_Previous_Years_Losses,T_Income_Computation_Self,T_Income_Computation_Wife,T_Tax_Computation,Sheet1. A_Basic_InfocellB1reads "Resident Individual Income Tax Return"; cellI1reads18.0.1; cellJ1reads2; cellC2reads "Version 18.0.1"; cellI2/J2readXLS/EXCEL 1997-2003. No password prompt at any point — the file opens and parses cleanly with plainxlsx.
Source 2 — Updated-IT1_Individual_Resident_Return_XLS-18.0.9-2024.xls (cross-check)
- URL:
https://www.kra.go.ke/images/publications/Updated-IT1_Individual_Resident_Return_XLS-18.0.9-2024.xls - Fetched via
curl -sSkL: HTTP 200, 3,406,336 bytes,sha256: e7eafe532f472a4d55b5a0d982ee030886be6856e1b40d5cab60a8c0464f2256(both figures computed independently this cycle). - Opens cleanly with
xlsx, no password. Its five in-scope-equivalent sheets (A_Basic_Info,F_Employment_Income,M_Details_of_PAYE_Deducted,T_Income_Computation_Self,T_Tax_Computation) carry the same field labels, row numbering, and sr.-no. structure as the 18.0.1 edition (spot-checked row-by-row for all five sheets). No material field-level difference was found between the two editions for this schema's in-scope content, so this document is authored against 18.0.1 without loss of currency relative to 18.0.9.
Sibling NOT used — IT1_Individual_Resident_Return_Version-18.03-Revised.xls
- This file (same host, different filename) is genuinely password/MS-Office-encrypted, per this registry's own prior-cycle finding (GOV-2507/GOV-2517). Not fetched again this cycle beyond confirming its filename still exists on the Publications page; not used as a source.
Sheet-by-sheet field inventory (in-scope sheets only)
Read cell-by-cell via a custom Node script using xlsx's XLSX.utils.decode_range/encode_cell, plus the workbook's own Validations and ValidationList sheets (which record each field's mandatory flag, min/max length, and named-range/validation-macro references — used to determine required/requiredWhen, not guessed from visual asterisks alone).
A_Basic_Info (24 fields modeled)
Section A Part 1 ("Return Information", rows 3-20) supplies personalIdentificationNumber, typeOfReturn, returnPeriodFrom, returnPeriodTo, and nine Yes/No gating questions (hasNonEmploymentIncome through hasDisabilityExemptionCertificate), plus declareSpouseIncome/spousePin. typeOfReturn's two enum values (original/amended) come from the workbook's own Data sheet, column D/E ("ReturnType"/"Return type code": Original/ORIGINAL, Amended/AMENDED), not invented. Section A Part 2 ("Bank Details", rows 21-27) supplies the five bank* fields. Section A Part 6 ("Details of Exemption Certificate for disability (Self)", row 67) supplies the three disabilityExemptionCertificate* fields, gated on hasDisabilityExemptionCertificate.
Out of scope within this sheet: Section A Part 3 (Details of Auditor — gated on business/self-employment income, out of scope), Section A Part 4 (Landlord Details) and Part 5 (Tenant Details) — both gated on the same RetInf.DeclareSelfBusIncome flag as the business schedules in the workbook's own ValidationList formulas (e.g. row 162's IF(RetInf.DeclareSelfBusIncome="Yes", compareValues(...), "NE")), i.e. rental income in this workbook is treated as part of the same business/profession pathway as B_Profit_Loss_Account_Self, which this v1.0.0 does not model. All of Part 3/4/5's "(Wife)" mirror sections are additionally out of scope per the spousal-pathway exclusion below.
Disclosed discrepancy: the five Bank Details field labels (rows 23-27) each carry a printed "*" (visually implying mandatory), but the workbook's own Validations sheet (rows 16-21) records their Mandatory flag as N. This schema follows the authoritative Validations sheet and models all five as optional — not silently "fixed" to match the visual asterisk, and called out per-field in schema.json's field descriptions.
F_Employment_Income (20 fields modeled, Self section only)
Row 2 is the Self section's header row (columns A-H: PIN of Employer, Name of Employer, Gross Pay, Allowances/Benefits, Car Benefit Value, Net Housing Value, Pension Excess, Total Employment Income); row 3 is the sheet's single visible blank data-entry row before its row-5 Total. This schema flattens this into a bounded repeating group of 2 employer slots (employer1*/employer2*, employer 1 required, employer 2 fully optional per this registry's bounded-repeating-group convention — see ke/brs's officer2* precedent), disclosing that the source ships only one visible entry row and that a taxpayer with more than one employer in the year would insert additional rows (a well-documented pattern in these KRA-published Excel workbooks). Rows 6-9 (Total, "January - March: Income/Pension", "April-December: Income/Pension") are modeled as four top-level (not per-employer) fields, since they sit under the section's Total row rather than the per-employer data row; their historical basis (a mid-year 2020 PAYE-band change under the Finance Act 2020, reconciled via a Jan-Mar/Apr-Dec split retained through the current 18.0.1 edition, and mirrored on T_Tax_Computation items 12.5a/12.5b) is disclosed in each field's own description rather than asserted as still legally relevant in 2026 without independent confirmation.
Out of scope: the "(Wife)" mirror section (rows 13-21).
M_Details_of_PAYE_Deducted (8 fields modeled, Self section only, merged into employerN*)
Row 2 is the Self section's header row (columns A-G: PIN of Employer, Name of Employer, Taxable Salary, Tax Payable on Taxable Salary, Amount of Tax Deducted (PAYE), Amount of Tax Payable or Refundable, spouse code); row 3 is the single blank data-entry row before the row-5 Total, mirroring F_Employment_Income's own layout exactly. Disclosed synthesis judgment call: this sheet separately lists its own "PIN of Employer"/"Name of Employer" columns, distinct (as raw named ranges) from F_Employment_Income's columns of the same name — but both represent the same employer per taxpayer in substance. Rather than duplicate employerNPin/employerNName under a second sheet-specific prefix, this schema reuses the same employer1/employer2 identity fields already defined for F_Employment_Income and adds only this sheet's four distinct data columns (employerNTaxableSalary, employerNTaxPayableOnTaxableSalary, employerNTaxDeductedPaye, employerNTaxPayableOrRefundablePaye) per employer. This satisfies the task's own instruction to use consistent field names for cross-sheet references (the PAYE-deducted figure explicitly rolls into T_Tax_Computation item 13.1, modeled here as payeDeductedFromSalaryTotal).
Out of scope: the "(Wife)" mirror section (rows 9-13).
T_Income_Computation_Self (10 fields modeled, Consolidated column only)
Rows 3-35 present ten numbered lines (1 through 10) across seven columns: Business, Farming, Rental, Interest, Commission, Other, and Consolidated. This schema models only the Consolidated column (nonEmploymentProfitOrLoss through nonEmploymentLossCarriedForward), because the six category sub-columns each depend entirely on out-of-scope schedules (see below) — there is no way to populate a Business/Farming/Rental/etc. breakdown without also modeling B_Profit_Loss_Account_Self, D_Stock_Analysis, capital allowances, partnership income, rental detail, and prior-year losses, none of which is in scope for this v1.0.0. Rows 37-56 ("Part I: Other Disallowable Deductions" and "Part II: Other Allowable Deductions" itemized name/amount tables) are one level further out of scope still (sub-schedules of already-out-of-scope lines 4.13/5.5) and are not modeled. Line 9 (nonEmploymentAdjustedTaxableIncome) is the figure the source explicitly cross-references as feeding T_Tax_Computation item 12.4 ("Net Taxable Income ... + Line Number 9 (Consolidated) ..."), which this schema's netTaxableIncome field's own description quotes.
For the pure-employment filing pathway this schema targets, every one of these ten fields is normally 0 (see both conformance examples); they are modeled because they are real, always-present fields on this in-scope sheet, not because a typical employed filer has non-zero values here.
Out of scope: the "(Wife)" mirror sheet, T_Income_Computation_Wife, in its entirety (per the spousal-pathway exclusion below).
T_Tax_Computation (24 fields modeled, Self column only)
Rows 3-31 present the final computation: total deductions (11, 11.1-11.3), total tax payable less reliefs (12, 12.1-12.7), tax credits (13, 13.1-13.8), and the bottom-line tax due/refund due (14). This schema models the Self (column C) values only, per the spousal-pathway exclusion below. Several of these fields' underlying detail computations live in out-of-scope companion sheets — mortgageInterestDeduction (11.2, from J_Computation_of_Mortgage), homeOwnershipSavingsPlanDeduction (11.3, from K_Home_Ownership_Saving_Plan), taxableEstateTrustIncome (12.2) and estateTrustTaxCredit (13.2, both from H_Estate_Trust_Income), insuranceRelief (12.7, from L_Computation_of_Insu_Relief), installmentTaxPaidTotal (13.3, from N_Installment_Tax_Credits), withholdingTaxCredit (13.4, from O_WHT_Credits), commercialVehicleAdvanceTaxCredit (13.5, from P_Advance_Tax_Credits), incomeTaxPaidInAdvance (13.6, from Q_IT_Payment_Credits), dtaaTaxCredit (13.7, from R_DTAA_Credits), and rentalWithholdingTaxCredit (13.8, from the out-of-scope rental detail) — each is modeled as the top-level total the in-scope T_Tax_Computation sheet itself presents, with its out-of-scope source disclosed in the field's own description, per the task's disclosure convention rather than silently omitting the field.
Disclosed ambiguity 1 (not resolved by this schema): the source's own column F6 comment on row 6 (11.2, Mortgage Interest) reads verbatim: "Check required that either of the two deductions will be available. Check to be given here or sections or on validation?" — i.e. the workbook's own authors left open whether 11.2 and 11.3 are meant to be mutually exclusive. Quoted verbatim in mortgageInterestDeduction's description; this schema does not add a requiredWhen/exclusivity rule resolving it.
Disclosed ambiguity 2 (not resolved by this schema): the source's own column F18 comment on row 18 (12.6, Personal Relief) reads verbatim: "Keep it 13,944 but make it configurable" — i.e. 13,944 (Ksh/year) is flagged by the workbook's own authors as a template default, not an asserted-current legal figure. This schema's personalRelief field quotes this comment verbatim and does not assert 13,944 is Kenya's currently legislated personal relief amount; the conformance examples use it only because it is the figure the source itself embeds.
Disclosed ambiguity 3 (quoted, not independently verified): the source's own column F15 comment on row 15 (12.5, Tax on Taxable Income) records five tax bands verbatim, including Indian-style digit grouping as printed in the source ("0 to 1,21,968 (10%)", "1,21,969 to 2,36,880 (15%)", "2,36,881 to 3,51,792 (20%)", "3,51,793 to 4,66,704 (25%)", "Over 4,66,704 (30%)"). Quoted verbatim in taxOnTaxableIncome's description without reformatting or independent verification that these remain Kenya's currently legislated bands in 2026 (Kenya's Income Tax Act bands have changed by Finance Act amendment before). The conformance examples' taxOnTaxableIncome figures are computed by applying these exact quoted bands to the example's netTaxableIncome, for internal consistency only — not as a claim of current legal accuracy.
Out of scope: the "(Wife)" column (column D) throughout.
Spousal-pathway exclusion (applies across all five in-scope sheets)
Kenyan tax law permits a married resident taxpayer to elect joint spousal filing (Section A Part 1's "Do you want to declare Wife's Income?"). This v1.0.0 deliberately scopes to the taxpayer's own ("Self") computation only. declareSpouseIncome and spousePin are modeled (they are real, always-present fields on the in-scope A_Basic_Info sheet), but no downstream spousal computation is modeled: every sheet's "(Wife)" mirror section — F_Employment_Income, M_Details_of_PAYE_Deducted, T_Income_Computation_Wife, and T_Tax_Computation's Wife column — is out of scope. A future companion-schedule cycle could add a parallel spouse1*/spouse2* employer/PAYE structure plus a T_Income_Computation_Wife consolidated-column set, mirroring this document's own Self-side design.
Out-of-scope companion-schedule candidates (future cycle)
Per the task's own explicit list, none of these were modeled, each for the reason given:
B_Profit_Loss_Account_Self/B_Profit_Loss_Account_Wife,C_Balance_Sheet,D_Stock_Analysis— self-employment/business income, a materially different filing pathway from pure employment income.E1_IDA_CA,E2_CA_WTA_WDV,E2_CA_WTA_SLM,E_Summary_of_Capital_Allowance— capital allowances, dependent on the business-income pathway above.G_Partnership_Income— partnership income.H_Estate_Trust_Income— estate/trust income.I_Computation_of_Car_Benefit,J_Computation_of_Mortgage,K_Home_Ownership_Saving_Plan,L_Computation_of_Insu_Relief— each a detailed sub-computation whose resulting total already surfaces as a field on an in-scope sheet (seeemployer1CarBenefitValue,mortgageInterestDeduction,homeOwnershipSavingsPlanDeduction,insuranceReliefabove).N_Installment_Tax_Credits,O_WHT_Credits,P_Advance_Tax_Credits,Q_IT_Payment_Credits,R_DTAA_Credits— tax-credit schedules whose totals likewise surface onT_Tax_Computation(13.3-13.7 above).S_Previous_Years_Losses— prior-year loss carryforward, surfaces onT_Income_Computation_SelfasnonEmploymentLossBroughtForward.T_Income_Computation_Wife— spousal computation, see the spousal- pathway exclusion above.Read Me,Errors,Validations,ValidationList,Macros_Disabled,ImportCsv,Data,Sheet1— workbook plumbing/reference-list sheets, not form content. (Data,Validations, andValidationListwere nonetheless read as supporting evidence for field enumerations and requiredness — see the sheet-by-sheet inventory above.)
Macro inspectability
The workbook's own Macros_Disabled sheet (and the Read Me sheet) both present instructions for enabling macros in older Excel versions, and this cycle's xlsx-based parsing confirms macros do not execute/are stripped in this published edition. Consequently, exact validation-macro logic (e.g. the named validatePIN() function repeatedly referenced in the Validations/ValidationList sheets) is not independently inspectable in this environment. personalIdentificationNumber/spousePin's pattern validation (^[A-Z]\d{9}[A-Z]$, 11 characters) is instead based on Kenya's well-documented public KRA PIN format, not decompiled from the source macro — disclosed in the field's own description.
Conformance run (mock, worked examples)
Two hand-authored valid fixtures under conformance/ke/kra/it1-individual-resident-return/1.0.0/:
valid-employed-resident-single-employer-tax-payable.json— the task's own suggested profile: a single-employer, pure-employment KRA PIN holder (A123456789Z) with one employer ("Acme Kenya Limited"), gross pay Ksh 1,200,000, PAYE already deducted Ksh 270,000, a Ksh 24,000 pension-contribution deduction, the source's own quoted Ksh 13,944 personal relief, no non-employment income/credits (all 0), and a resulting small tax payable of Ksh 9,988.80 — computed by applying the source's own quoted five-band tax slabs (see "Disclosed ambiguity 3" above) tonetTaxableIncome(Ksh 1,176,000), then subtracting personal relief and the PAYE credit.valid-two-employers-disability-relief-refund-due.json— exercises the bounded second employer slot,declareSpouseIncome/spousePin(spouse-declaration flag set, no downstream spousal computation modeled, consistent with the disclosed exclusion above), a disability exemption certificate (all three certificate fields present), and the optional bank-details block, resulting in a refund due (negativetaxDueOrRefundDue, Ksh -15,011.20).
Both were checked with a from-scratch Node conformance checker (validates required/requiredWhen/type/validation.{enum,minimum,maximum,pattern, minLength,maxLength} per field against the instance; not a copy of any other document's checker):
`` $ node check_conformance.mjs schema.json \ valid-employed-resident-single-employer-tax-payable.json \ valid-two-employers-disability-relief-refund-due.json valid-employed-resident-single-employer-tax-payable.json: 0 error(s) valid-two-employers-disability-relief-refund-due.json: 0 error(s) ``
Three mutation-control fixtures, each isolated to raise exactly one error:
mutation-control-missing-required-field.json— dropspersonalIdentificationNumber(a staticrequired: truefield) from the single-employer valid fixture.mutation-control-missing-conditional-spouse-pin.json— setsdeclareSpouseIncome: trueon the single-employer valid fixture without adding the now-requiredWhen-triggeredspousePin.mutation-control-missing-conditional-disability-certificate.json— starts from the two-employer valid fixture (which already hashasDisabilityExemptionCertificate: trueand all three certificate fields present) and drops onlydisabilityExemptionCertificateNumber, isolating exactly onerequiredWhenviolation rather than firing all three certificate fields' shared gating condition at once.
`` $ node check_conformance.mjs schema.json \ mutation-control-missing-required-field.json \ mutation-control-missing-conditional-spouse-pin.json \ mutation-control-missing-conditional-disability-certificate.json mutation-control-missing-required-field.json: 1 error(s) - personalIdentificationNumber: required but missing mutation-control-missing-conditional-spouse-pin.json: 1 error(s) - spousePin: required but missing mutation-control-missing-conditional-disability-certificate.json: 1 error(s) - disabilityExemptionCertificateNumber: required but missing ``
All three negative controls raised exactly one error each, and neither valid scenario raised an unexpected error — no defects were found in the schema itself during this authoring pass.
Both registry validators were run against the schema document and pass:
``` $ node tools/validate.mjs registry/ke/kra/it1-individual-resident-return/1.0.0/schema.json ok registry/ke/kra/it1-individual-resident-return/1.0.0/schema.json 1/1 document(s) passed.
$ node tools/validate-ajv.mjs registry/ke/kra/it1-individual-resident-return/1.0.0/schema.json ok registry/ke/kra/it1-individual-resident-return/1.0.0/schema.json [v0.3] 1/1 document(s) validated against the meta-schema (ajv 2020-12). ```
node tools/verify-sources.mjs registry/ke/kra/it1-individual-resident-return/1.0.0 was run clean (no allowlist entry needed — both cited kra.go.ke URLs resolve via Node's fetch() with no TLS override, per the note under Source 1 above) immediately before opening this PR.
Scope and jurisdiction notes
- This is Kenya's Taxes vertical's first document, bringing Kenya to 3 of 6 verticals (Business Formation, National ID, Taxes). Passport, DMV, and Visa remain confirmed dead ends (see GOV-2500's own VERIFICATION.md); no vertical remains open-and-unscreened for Kenya after this cycle.
jurisdiction.levelisnational— KRA is Kenya's national tax authority.process.typeisfiling, consistent with this registry's other annual individual income tax returns (e.g.pe/sunat/formulario-virtual-709-declaracion-renta,fi/vero/50a-earned-income-and-deductions).versionset to1.0.0: this document models one complete, self-contained procedural scope (the pure-employment resident-individual pathway) in full; the excluded business/farming/rental/partnership/ estate-trust/capital-allowance/credit schedules and the spousal pathway are disclosed companion-schedule candidates, not sibling-variant ambiguities.- No
documents[]array: the in-scope sheets do not themselves specify any required physical-document attachment (this is a self-declared return workbook, historically uploaded through KRA's login-gated iTax portal rather than filed with supporting documents attached to the workbook itself); this is a disclosed absence, not an oversight.
Re-verification
Per the practice's cadence, nextReviewBy is set to 2027-01-12 (6 months). A future review should prioritize: (1) independently confirming Kenya's currently legislated personal relief amount and tax bands, given this document's own disclosed caveats about the source's embedded 13,944/tax-slab comments; (2) the self-employment/business-income pathway (B/C/D/E* sheets) as the strongest companion-schedule candidate, since it is the single largest scope carve-out in this document; (3) re-resolving the still-unconfirmed "19.0.3/March 2026" version-number claim noted in CATALOG.md's own history, in case a newer edition surfaces on kra.go.ke by the next review.
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 Kenya Revenue Authority or any government. The authoritative source is always the live government form and its official instructions.