Registry entry
Nigeria (FCT) Personal Income Tax Return Form A (FCT-IRS)
The Federal Capital Territory Internal Revenue Service (FCT-IRS)'s "Form A", the Personal Income Tax Return Form for a resident individual in Nigeria's Federal Capital Territory (Abuja), filed under the Personal Income Tax Act (PITA), Cap. P8, Laws of the Federation of Nigeria 2004 (as amended). Closes Nigeria's Taxes vertical (2 of 6; Business Formation via `ng/cac/cac-1-1-application-for-registration-of-company` already modelled, GOV-2518). Personal income tax in Nigeria is administered on a state-by-state basis (each state, plus the FCT, has its own Internal Revenue Service under the PAYE/direct-assessment regime of the nationally-standardized PITA), so this schema is deliberately scoped to the FCT-IRS edition of Form A rather than asserted as Nigeria's single national tax-return form; other states' Internal Revenue Services administer their own editions of what is structurally the same nationally-standardized Form A design. This is a 2-page flat, print-and-hand-fill specimen (0 AcroForm widgets, confirmed via `pdfjs-dist` `getAnnotations()`), covering Part A (Personal Details), Part B (Statement of Income — earned income from trade/employment/pension/foreign sources, and investment income from dividends/interest/rents/other profits), a conditional spouse-and-children declaration block, Part C (Benefits in Kind — residence, rent, domestic servants, vehicles, and other benefits), and Part D (Allowances for Life Assurance, Gratuities, NHIS, and Pension Contribution), closing with a signed declaration. This v1.0.0 models 82 `fields[]` (derived from the form's lettered/numbered items, since a flat print form carries no AcroForm widget names to source from) and 8 `documents[]` entries (the form's own "Attach ..." instructions plus the signed declaration statement), including four disclosed bounded repeating groups (a 4-slot children table, a 2-slot domestic-servants table, a 2-slot vehicles table, and a 2-slot life-assurance-policy table in Part D), each bounded to the number of rows the specimen itself prints, per this registry's established bounded-repeating-group convention. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Government of Nigeria, the Federal Capital Territory Administration, or FCT-IRS.
Registry entry
ng/firs/fct-irs-personal-income-tax-return-form-a
Authoritative source "Form A" (footer: "FCT-IRS Form A"), "PERSONAL INCOME TAX RETURN FORM FOR YEAR ENDED 31ST DECEMBER ____", a 2-page flat (0 AcroForm widgets) PDF published directly on fctirs.gov.ng.
Machine access
- Schema document
registry/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
82 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
-
firstNamestring requiredFirst Name
length: 0–100classification: pii -
middleNamestring optionalNot required: not every taxpayer has a middle name and the form provides no separate "none" indicator.
length: 0–100classification: pii -
surnamestring requiredSurname
length: 0–100classification: pii -
fctIrsTinstring requiredThe taxpayer's FCT-IRS Tax Identification Number.
length: 0–20classification: pii -
emailAddressstring requirede-mail Address
patternlength: 0–150classification: pii -
contactTelephoneNumbersstring requiredOne printed blank line; the label's own "No(s)." plural allows more than one number to be entered on it (e.g. comma-separated), not modelled as a repeating group since only one blank is printed.
length: 0–100classification: pii -
tradeBusinessProfessionVocationIncomenumber requiredEnter 0 if the taxpayer has no self-employment/trade income for the year; this specimen carries no asterisk or other required-field marking anywhere (confirmed by a full-text scan), so every Part B income-statement line is modelled required with a 0-permitting minimum, on the disclosed judgment that a filer with none of a given income type still enters 0 rather than leaving the line blank — see VERIFICATION.md.
range: 0–∞classification: financial -
employmentSalarynumber required(ii) Employment: Salary
range: 0–∞classification: financial -
employmentCommissionsBonusesnumber required(ii) Employment: Commissions, Bonuses etc
range: 0–∞classification: financial -
employmentAllowancesnumber required(ii) Employment: Allowances
range: 0–∞classification: financial -
pensionFromnumber requiredState name and address of the payer (see the pensionAnnuityGratuityPayerDetails document entry).
range: 0–∞classification: financial -
annuityFromnumber required(iii) Annuity From
range: 0–∞classification: financial -
gratuitiesnumber required(iii) Gratuities
range: 0–∞classification: financial -
incomeFromOutsideNigerianumber required(iv) Income received in or brought into Nigeria from all sources outside Nigeria
range: 0–∞classification: financial -
aggregateEarnedIncomenumber requiredSum of items (i)-(iv) above. The source presents this as a literal blank to be filled in (typically computed by the filer), not a pre-printed total.
range: 0–∞classification: financial -
dividendsFromNigerianCompaniesnumber required(v) Dividends from Nigerian Companies
range: 0–∞classification: financial -
dividendsFromOutsideCountrynumber requiredEnter the gross amount before tax deduction, per the source's own parenthetical instruction.
range: 0–∞classification: financial -
interestIncomenumber required(vi) Interest
range: 0–∞classification: financial -
rentsIncomenumber required(vii) Rents
range: 0–∞classification: financial -
otherProfitsIncomenumber required(viii) Income in respect of other profits arising from sources not included above
range: 0–∞classification: financial -
aggregateInvestmentIncomenumber requiredSum of items (v)-(viii) above. DISCLOSED DISCREPANCY: the source's own printed label reads "Aggregate Investment Income (iv - vii above) (Y)", but item (iv) is already summed into the preceding "Aggregate Earned Income (i-iv above) (X)" line, so the printed item range cannot be the literal one intended — modelled here as the sum of (v)-(viii), the only numerically consistent reading, with the printed range preserved verbatim in this description rather than silently reworded. See VERIFICATION.md.
range: 0–∞classification: financial -
totalIncomenumber requiredaggregateEarnedIncome + aggregateInvestmentIncome.
range: 0–∞classification: financial -
spouseFullNamestring optionalThis block is printed under the instruction "If Married, State Spouse's and Children's details"; the specimen has no separate Marital Status tick-box or other boolean field to machine-gate this block against (unlike, e.g., rw/dgie's dedicated tick-box), so — per this registry's ng/cac Section D/D1 precedent of not fabricating a gating field the source does not itself provide — this and the remaining spouse/children fields are modelled plain-optional rather than requiredWhen-gated. See VERIFICATION.md.
length: 0–150classification: pii -
spouseDateOfBirthdate optionalSpouse's Date of Birth
classification: sensitive-pii -
spouseEmployerOrBusinessNamestring optionalSpouse's Employer's/Business Name
length: 0–150classification: pii -
spouseOccupationstring optionalSpouse's Occupation
length: 0–100 -
spouseEmployerOrBusinessAddressstring optionalSpouse's Employer's/Business Address
length: 0–250classification: pii -
child1FullNamestring optionalThe printed children table has exactly 4 numbered rows (1-4); flattened here to child1..child4, per this registry's bounded-repeating-group convention. Not required: an applicant with no children (or fewer than 4) leaves the remaining rows blank.
length: 0–150classification: pii -
child1DateOfBirthdate optionalAccompanying child 1: Date of Birth
classification: sensitive-pii -
child1EducationalInstitutionNameAddressstring optionalAccompanying child 1: Name & Address of Educational Institution
length: 0–250 -
child1IncomeOwnRightnumber optionalAccompanying child 1: Child's Income on own right (N)
range: 0–∞classification: financial -
child1SchoolFeesnumber optionalAccompanying child 1: School Fees
range: 0–∞classification: financial -
child2FullNamestring optionalAccompanying child 2: Full name
length: 0–150classification: pii -
child2DateOfBirthdate optionalAccompanying child 2: Date of Birth
classification: sensitive-pii -
child2EducationalInstitutionNameAddressstring optionalAccompanying child 2: Name & Address of Educational Institution
length: 0–250 -
child2IncomeOwnRightnumber optionalAccompanying child 2: Child's Income on own right (N)
range: 0–∞classification: financial -
child2SchoolFeesnumber optionalAccompanying child 2: School Fees
range: 0–∞classification: financial -
child3FullNamestring optionalAccompanying child 3: Full name
length: 0–150classification: pii -
child3DateOfBirthdate optionalAccompanying child 3: Date of Birth
classification: sensitive-pii -
child3EducationalInstitutionNameAddressstring optionalAccompanying child 3: Name & Address of Educational Institution
length: 0–250 -
child3IncomeOwnRightnumber optionalAccompanying child 3: Child's Income on own right (N)
range: 0–∞classification: financial -
child3SchoolFeesnumber optionalAccompanying child 3: School Fees
range: 0–∞classification: financial -
child4FullNamestring optionalAccompanying child 4: Full name
length: 0–150classification: pii -
child4DateOfBirthdate optionalAccompanying child 4: Date of Birth
classification: sensitive-pii -
child4EducationalInstitutionNameAddressstring optionalAccompanying child 4: Name & Address of Educational Institution
length: 0–250 -
child4IncomeOwnRightnumber optionalAccompanying child 4: Child's Income on own right (N)
range: 0–∞classification: financial -
child4SchoolFeesnumber optionalAccompanying child 4: School Fees
range: 0–∞classification: financial -
residentialAddressAsAt1Januarystring requiredEvery filer has a residence as at 1 January of the return year, so this is modelled required, unlike the remaining, genuinely conditional Part C/D items.
length: 0–250classification: pii -
residentialAddressChangesDuringYearstring optionalNot required: only applicable if the filer's residence changed during the year.
length: 0–250classification: pii -
rentPaidnumber optionalThe gross amount, per the guide notes ("Rent Paid is the gross amount"). Not required: only applicable to a filer who pays rent.
range: 0–∞classification: financial -
rentPaidByEmployernumber optionalRent Paid by the Employer
range: 0–∞classification: financial -
rentPaidOrReimbursedByApplicantnumber optionalRent Paid or Reimbursed by you
range: 0–∞classification: financial -
domesticServant1Namestring optionalItem e's printed table ("Name of Domestic Servants (e.g. Maids, Drivers, Gardener, Watchmen, Cooks, Stewards, Cleaners etc)") is bounded to 2 rows, confirmed by rendering the specimen's vector table geometry (the header/body text itself is invisible under a font-rendering defect affecting this specimen's bold typeface — see VERIFICATION.md); flattened to domesticServant1/2, per this registry's bounded-repeating-group convention. Not required: a filer with no domestic servants leaves the table blank. The guide notes instruct asterisking any servant paid for by the employer or a separate entity apart from self, disclosed here rather than modelled as a separate field (no corresponding blank exists for it).
length: 0–150classification: pii -
domesticServant1ResidentialAddressstring optionalDomestic Servant 1: Residential Address
length: 0–250classification: pii -
domesticServant1AmountPaidnumber optionalDomestic Servant 1: Amount Paid
range: 0–∞classification: financial -
domesticServant2Namestring optionalDomestic Servant 2: Name
length: 0–150classification: pii -
domesticServant2ResidentialAddressstring optionalDomestic Servant 2: Residential Address
length: 0–250classification: pii -
domesticServant2AmountPaidnumber optionalDomestic Servant 2: Amount Paid
range: 0–∞classification: financial -
vehicle1DateOfPurchasedate optionalItem g's printed "Vehicle(s)" section prints exactly 2 "Date of Purchase .../Cost/Brand/Model/Year" rows (confirmed both from getTextContent()'s duplicated row text and the rendered vector table geometry); flattened to vehicle1/2. Not required: a filer with no employer/self-owned vehicle benefit leaves the table blank.
-
vehicle1Costnumber optionalVehicle 1: Cost (N)
range: 0–∞classification: financial -
vehicle1Brandstring optionalVehicle 1: Brand
length: 0–100 -
vehicle1Modelstring optionalVehicle 1: Model
length: 0–100 -
vehicle1Yearinteger optionalThe vehicle's model/manufacture year, distinct from vehicle1DateOfPurchase.
range: 1900–2100 -
vehicle2DateOfPurchasedate optionalVehicle 2: Date of Purchase
-
vehicle2Costnumber optionalVehicle 2: Cost (N)
range: 0–∞classification: financial -
vehicle2Brandstring optionalVehicle 2: Brand
length: 0–100 -
vehicle2Modelstring optionalVehicle 2: Model
length: 0–100 -
vehicle2Yearinteger optionalVehicle 2: Year
range: 1900–2100 -
otherBenefitInKind1Descriptionstring optionalItem h's printed "Other Benefits in Kind" section prints exactly 2 numbered rows (1, 2), each a description blank followed by a "Cost N" blank; flattened to otherBenefitInKind1/2. Not required: a filer with no other benefits in kind leaves the table blank.
length: 0–200 -
otherBenefitInKind1Costnumber optionalOther Benefit in Kind 1: Cost (N)
range: 0–∞classification: financial -
otherBenefitInKind2Descriptionstring optionalOther Benefit in Kind 2: Description
length: 0–200 -
otherBenefitInKind2Costnumber optionalOther Benefit in Kind 2: Cost (N)
range: 0–∞classification: financial -
lifeAssurancePolicy1CompanyNamestring optionalPart D's printed table is bounded to 2 rows (confirmed via the rendered vector table geometry — see VERIFICATION.md); flattened to lifeAssurancePolicy1/2. Not required: only applicable to a filer with a life-assurance policy, gratuity, NHIS, or pension contribution to declare. A certificate/receipt must be attached as evidence of payment, per the source's own note — see the lifeAssuranceCertificateOrReceipt document entry.
length: 0–150 -
lifeAssurancePolicy1LifeOfSelfOrSpouseenum optionalLife Assurance Policy 1: Whether on life of Self or Spouse
enum: self | spouse -
lifeAssurancePolicy1CapitalSumPaidOnDeathnumber optionalLife Assurance Policy 1: Capital sum paid on death, excluding any bonus or additional benefit (N)
range: 0–∞classification: financial -
lifeAssurancePolicy1PremiumsPaidnumber optionalLife Assurance Policy 1: Premiums Paid during the year ended 31st December 20__ (to the nearest N)
range: 0–∞classification: financial -
lifeAssurancePolicy2CompanyNamestring optionalLife Assurance Policy 2: Name of Company (Insurance/Employer/HMO/PFA)
length: 0–150 -
lifeAssurancePolicy2LifeOfSelfOrSpouseenum optionalLife Assurance Policy 2: Whether on life of Self or Spouse
enum: self | spouse -
lifeAssurancePolicy2CapitalSumPaidOnDeathnumber optionalLife Assurance Policy 2: Capital sum paid on death, excluding any bonus or additional benefit (N)
range: 0–∞classification: financial -
lifeAssurancePolicy2PremiumsPaidnumber optionalLife Assurance Policy 2: Premiums Paid during the year ended 31st December 20__ (to the nearest N)
range: 0–∞classification: financial -
declarantFullNamestring requiredThe blank in the declaration's own opening "I ________ hereby declare that..." — see the declarationStatement document entry for the full attested text.
length: 0–200classification: pii -
declarationDatedate requiredThe date the declaration was given, printed as a sentence with day/month/year blanks ("Given under my hand this ___ Day of ___ 20 ___") rather than boxed D/M/Y fields; modelled as a single date field, consistent with this registry's convention for an unambiguous date-of-signing item. The adjoining "(Signature/Thumb print of Returnee)" line is excluded per this registry's signature-capture convention.
Verification record
This file is the source-review record for this document version. It documents the provenance of the published fields/documents and states the current verification claim honestly.
Current claim
status:draftverification.method:manual-source-review-v1verification.lastVerifiedAt:2026-07-12maturity.level:structural-reference
This is GovSchema Standard Research cycle GOV-2553. It closes Nigeria's Taxes vertical (2 of 6), via FCT-IRS's "Form A", the Personal Income Tax Return Form for the Federal Capital Territory. Nigeria opened this registry's 42nd jurisdiction via GOV-2518 (Business Formation, CAC Form 1.1); Passport, DMV, Visa, and National ID remain open, unscreened backlog for Nigeria after this cycle.
Jurisdiction scoping: why FCT, not "Nigeria" nationally
Nigerian personal income tax is administered state by state: each of the 36 states plus the Federal Capital Territory operates its own State/Territory Internal Revenue Service under the nationally-standardized Personal Income Tax Act (PITA) framework, and each publishes its own edition of the PITA-mandated "Form A" (or an equivalent). This schema is deliberately scoped to jurisdiction.level: subnational, jurisdiction.subdivision: NG-FC (ISO 3166-2 for the Federal Capital Territory) rather than asserted as a single national form — the same class of scoping decision this registry has made for other sub-national tax administrations. A future cycle could add sibling editions for other Nigerian states' own Form A/equivalent, following this document's own field inventory as a starting template (the underlying PITA-mandated data items are expected to be materially the same across states, though this was not independently confirmed against any other state's own specimen this cycle).
Sources examined
Source 1 — the FCT-IRS Form A PDF (chosen as source.url)
- URL: https://fctirs.gov.ng/wp-content/uploads/Personal-Income-Tax-Return-Form-A.pdf
- Independently re-fetched this cycle via
curl: HTTP 200,Content-Type: application/pdf, 323,404 bytes,Last-Modified: Thu, 09 Oct 2025 ...(2025-10-09), sha256: 5062478b44c42c94524d773691e0903d2328640a9d5f3a252475c094a3bd324d — this matches the assigned task's own citation exactly, corroborated independently rather than trusted on the citation's word alone. pdfjs-dist(legacy build)getDocument()/getAnnotations()confirms a genuine 2-page PDF with 0 Widget annotations on either page — a flat, print-and-hand-fill specimen, the same tier this registry has already modeled forrw/dgie/visa-application,pe/sunat/formulario-virtual-709-declaracion-renta,uy/dgi/inscripcion-actualizacion-empresas-formulario-0351, andke/brs/cr1-application-to-register-a-company.node tools/verify-sources.mjs registry/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0ran clean this cycle (1 directory, 3 URLs checked, 0 warnings, 0 allowlisted) —fctirs.gov.ngresolves cleanly via Node'sfetch(), no TLS override or allowlist entry needed (unlike, e.g.,kra.go.ke's documented apex-certificate mismatch).
Source 2 — pdfjs-dist text-layer extraction (own re-derivation)
getTextContent() was read on both pages, items grouped by rounded transform y-coordinate and sorted by x, to reconstruct each printed row in reading order (a disposable extract2.mjs, not committed — see the excerpt below). This is the technique this registry has used for every other 0-widget flat form, since there are no AcroForm field names to source from.
A full-text scan of both pages' extracted text found **zero asterisk () characters used as a required-field marker anywhere in Parts A-D* (the guide notes on page 2 use two literal asterisks, but only inside prose describing employer-paid domestic-servant/benefit annotation conventions — "should be asterisked (*)" — not as a per-field required-marker on Parts A-D themselves). This is a materially different situation from ng/cac's specimen (which prints visible asterisks that the authoritative source turned out not to honor either) — here there is no required-field marking convention on the specimen at all, disclosed as the basis for this schema's own requiredness judgment calls (see "Requiredness policy" below).
Source 3 — pdfjs-dist + node-canvas rendering (table-geometry cross-check only)
Both pages were rendered to PNG at 2.5x-4x scale via page.render(). This rendering surfaced a font-rendering defect in the specimen's embedded bold typeface: pdfjs-dist/node-canvas repeatedly logged getPathGenerator - ignoring character and TT: undefined function: 32 warnings, and the resulting PNGs show every bold-styled caption (e.g. "PART A: PERSONAL DETAILS", "First Name", section letters/headers) as invisible blank space, while regular/italic-styled text (guide notes, parenthetical instructions) renders correctly. This means the rendered PNGs could not be used to read captions — only to read vector-drawn table/ruling geometry (row and column counts), cross-checked against the position-sorted text dump from Source 2 for every actual label. This defect is disclosed here because it materially shaped this cycle's method: table row counts for the two tables whose header captions are affected by this defect (domestic servants, Part D allowances) were confirmed via rendered ruling-line geometry rather than by reading a rendered caption directly.
Concretely:
- The children table (4 numbered rows: "1"/"2"/"3"/"4") was confirmed directly from the text dump (each row's leading digit is regular-weight and renders/extracts fine) — no rendering cross-check needed.
- The vehicles table (2 "Date of Purchase .../Cost N/Brand/Model/Year" rows) was confirmed two independent ways: the text dump shows the exact same row of column captions printed twice in sequence (once per vehicle slot), and the rendered PNG's ruled-line geometry shows exactly 2 rows of 7 column-segments (day/month/year sub-boxes plus Cost/Brand/Model/Year) in the affected region.
- The domestic-servants table ("Name"/"Residential Address"/"Amount Paid") and the Part D allowances table ("Name of Company"/"Whether on life of Self or Spouse"/"Capital sum paid on death"/"Premiums Paid") both have bold captions invisible under the rendering defect; their row counts (2 each) were read directly from the rendered vector ruling-line geometry (crops inspected directly, not inferred from a naming pattern), each showing an outer bordered box containing exactly 2 grid/ruled body rows beneath the (invisible) header row. Both tables are modeled as bounded 2-slot repeating groups (
domesticServant1/2*,lifeAssurancePolicy1/2*) accordingly.
Field inventory and scoping/disclosure decisions
- Part A (Personal Details) — 6 fields.
firstName/surnamerequired,middleNameoptional (no "none" indicator on the form, and not every filer has one);fctIrsTin/emailAddress/contactTelephoneNumbersrequired as basic identity/contact information FCT-IRS needs to process and correspond about the return. - Part B (Statement of Income) — 16 fields, all
required: truewith aminimum: 0. This specimen carries zero asterisks or any other field-level required-marking convention anywhere in its text (confirmed by the full-text scan in Source 2 above) — a genuine absence, not a discrepancy likeng/cac's unused-asterisk finding. Given that absence, this schema's disclosed judgment call is: every Part B income-statement line, plus the two aggregate subtotal lines and the grand total, is modeled required with a0-permittingminimum, on the basis that a filer with none of a given income type still enters0on that line rather than leaving the return incomplete — the same convention this registry used forke/kra/it1-individual-resident-return's per-employer income lines. This is a judgment call, disclosed rather than asserted as a literal instruction from the source. - Disclosed printed-label discrepancy:
aggregateInvestmentIncome. The source's own printed label reads "Aggregate Investment Income (iv - vii above) (Y)". But item (iv) ("Income received in or brought into Nigeria from all sources outside Nigeria") is already one of the four items summed into the immediately preceding "Aggregate Earned Income (i-iv above) (X)" line — so a second aggregate line cannot also be summing item (iv) into a different total without double-counting it. The only numerically consistent reading is that the "Y" aggregate is meant to sum items (v) through (viii) (dividends, interest, rents, other profits) — the four items actually printed between the two aggregate lines. This schema'saggregateInvestmentIncomefield is modeled as that (v)-(viii) sum, with the source's own printed range quoted verbatim in the field'sdescriptionrather than silently corrected or re-typeset. Both conformance fixtures computeaggregateInvestmentIncomeasdividendsFromNigerianCompanies + dividendsFromOutsideCountry + interestIncome + rentsIncome + otherProfitsIncomefor consistency with this reading (otherProfitsIncomeis item (viii);rentsIncomeis (vii); both included). - Spouse/children block — 25 fields, all
required: false, norequiredWhengate. The block sits under the plain instruction "If Married, State Spouse's and Children's details" with no separate Marital Status checkbox/enum field anywhere on this specimen to machine-gate against (a contrast with, e.g.,rw/dgie/visa-application's dedicated tick-box, which this schema's ownrequiredWhenconvention depends on). Per this registry'sng/cacSection D/D1 precedent — do not fabricate a synthetic gating field with no corresponding printed widget/blank just to make arequiredWhenexpressible — these 25 fields (spouseFullNamethroughchild4SchoolFees) are modeled plain-optional, disclosed here rather than silently gated on an invented field. This also sidesteps this registry's own documentednotEquals ""-against-an- absent-optional-field bug class entirely, since no conditional gate is constructed here in the first place. - Children table bounded to 4 slots. Per the assigned task's own explicit instruction and independently confirmed from the printed table's 4 numbered rows (1-4) — no synthetic cap invented.
- Part C (Benefits in Kind).
residentialAddressAsAt1Januaryis modeledrequired: true(every filer has a residence as at 1 January of the return year, unlike the remaining, genuinely conditional items in this Part);residentialAddressChangesDuringYear,rentPaid/rentPaidByEmployer/rentPaidOrReimbursedByApplicant, the 2-slotdomesticServant1/2*table, the 2-slotvehicle1/2*table, and the 2-slototherBenefitInKind1/2*table are all modeled optional — Part C as a whole only applies to a filer who actually receives one or more of these employer-provided benefits. - Domestic servants and vehicles bounded to 2 slots each — see Source 3 above for how each row count was confirmed despite the font-rendering defect hiding the affected header captions.
vehicle{N}Yearmodeledtype: integer,minimum: 1900/maximum: 2100, matching this registry'srw/rra/vrf-e06-motor-vehicle-registration-formprecedent for an analogous "vehicle model/manufacture year" field, distinct fromvehicle{N}DateOfPurchase(a full day/month/year date).- Part D (Allowances for Life Assurance, Gratuities, NHIS and Pension Contribution) bounded to 2 slots, all fields optional (only applies to a filer with a policy/contribution to declare).
lifeAssurancePolicy{N}LifeOfSelfOrSpouseis modeled as a 2-value enum (self/spouse) directly from the printed "Whether on life of Self or Spouse" column caption — not an invented value set. - Declaration — 2 fields.
declarantFullName(the blank in "I ________ hereby declare...") anddeclarationDateare modeled required (a return cannot be validly declared without them); the "(Signature/Thumb print of Returnee)" line itself is excluded, per this registry's established signature-capture convention (cf.ng/cac's two excluded "Signature:" boxes,rw/dgie's excluded signature line).declarationDateis modeledtype: dateeven though printed as a sentence with day/ "Day of"/year blanks rather than boxed D/M/Y fields, since it is unambiguous chronological information — consistent with this registry's convention for date-of-signing items elsewhere (e.g.rw/dgie's "Done at, on" block). documents[]— 8 entries, sourced from this specimen's own parenthetical "Attach ..." instructions under items (i), (ii), (vi), (vii), (viii), the Part B closing note, and Part D's closing note, plus the declaration statement itself (attestation,required: true— the only unconditionally required document). The 6 conditional supporting- evidence entries (e.g.accountsForTradeBusinessIncome,interestIncomeSourceList) are each leftrequired: falsewith the triggering condition disclosed via the entry's ownhandlingprose rather than a fabricatedrequiredWhenagainst agreaterThan 0condition on a required-but-frequently-zero numeric field — such a condition would flag every zero-income return (the common case for most of these lines), which is not the intended business rule. This mirrors this registry'sng/cacprecedent of disclosing a conditional-document trigger in prose when no clean boolean/enum field exists to gate a machine-checkedrequiredWhenon cleanly.
Legal-currency and current-process check
A web search confirms the Personal Income Tax Act (PITA), Cap. P8, Laws of the Federation of Nigeria 2004 (as amended, most substantially by the Personal Income Tax (Amendment) Act 2011) remains the governing statute for individual income tax in Nigeria, with the Nigeria Tax Act 2025 and Nigeria Tax Administration Act 2025 (both assented to in 2025, with a 2026 commencement) confirmed as a live, current legislative reform package consolidating Nigeria's tax statutes going forward — disclosed here as relevant context for a future review rather than independently reconciled against this schema's own field-level scope, since none of PITA's specific computational provisions (reliefs, bands, allowances) are modeled as fields in this v1.0.0 (the source form itself does not print any computed tax liability line, unlike, e.g., ke/kra's workbook). A web search separately confirms the Federal Capital Territory Internal Revenue Service (FCT-IRS) — established under the FCT Internal Revenue Service Act 2015 — is a live, currently operating tax authority in 2026, distinct from the Federal Inland Revenue Service (FIRS) (which administers companies income tax and other federal taxes, not individual/personal income tax in the FCT).
Conformance run (mock, worked examples)
Two hand-authored valid fixtures under conformance/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0/:
valid-single-employed-no-benefits.json— a single-employer, pure PAYE-employment filer with no non-employment income, no spouse/children declared, and no Part C/D benefits — every Part B line other than salary/ allowances/aggregates/total is0, and thedeclarationStatementdocument is present.valid-married-with-children-and-benefits-in-kind.json— exercises the spouse block, both bounded children slots, employer-paid rent, one domestic-servant slot, one vehicle slot, and one Part D life-assurance policy slot, plus non-employment dividend/interest income and its ownaggregateInvestmentIncomecomputed per the disclosed (v)-(viii) reading above; both thedeclarationStatementand (since Part D is used) thelifeAssuranceCertificateOrReceiptdocuments are present.
Both were checked with a from-scratch, disposable Node conformance checker (check_conformance.mjs, not committed — implements required/ requiredWhen/type/validation.{enum,minimum,maximum,pattern,minLength, maxLength} plus documents[] requiredness, directly from spec/v0.3/SPEC.md's own Condition grammar, not reused from any other schema's checker):
`` $ node check_conformance.mjs schema.json \ valid-single-employed-no-benefits.json \ valid-married-with-children-and-benefits-in-kind.json valid-single-employed-no-benefits.json: 0 error(s) valid-married-with-children-and-benefits-in-kind.json: 0 error(s) ``
Four mutation-control fixtures, each isolated to raise exactly one error:
mutation-control-missing-required-field.json— dropsfctIrsTin(staticrequired: true) from the single-employed valid fixture.mutation-control-invalid-email-pattern.json— setsemailAddressto"not-an-email-address"on the single-employed valid fixture.mutation-control-invalid-enum-value.json— setslifeAssurancePolicy1LifeOfSelfOrSpouseto"child"(not in the printedself/spouseoption pair) on the married valid fixture.mutation-control-invalid-vehicle-year-range.json— setsvehicle1Yearto1750(below theminimum: 1900) on the married valid fixture.
`` $ node check_conformance.mjs schema.json \ mutation-control-missing-required-field.json \ mutation-control-invalid-email-pattern.json \ mutation-control-invalid-enum-value.json \ mutation-control-invalid-vehicle-year-range.json mutation-control-missing-required-field.json: 1 error(s) - fctIrsTin: required but missing mutation-control-invalid-email-pattern.json: 1 error(s) - emailAddress: PATTERN_VIOLATION ("not-an-email-address" does not match ^[^@\s]+@[^@\s]+\.[^@\s]+$) mutation-control-invalid-enum-value.json: 1 error(s) - lifeAssurancePolicy1LifeOfSelfOrSpouse: ENUM_VIOLATION ("child" not in ["self","spouse"]) mutation-control-invalid-vehicle-year-range.json: 1 error(s) - vehicle1Year: RANGE_VIOLATION (1750 < minimum 1900) ``
All four 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/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0/schema.json ok registry/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0/schema.json 1/1 document(s) passed.
$ node tools/validate-ajv.mjs registry/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0/schema.json ok registry/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0/schema.json [v0.3] 1/1 document(s) validated against the meta-schema (ajv 2020-12). ```
A full-registry re-run of both validators (node tools/validate.mjs / node tools/validate-ajv.mjs, no path argument) after adding this document passes at 384/384 (383 pre-existing + this one), confirming no regression to any other schema.
node tools/verify-sources.mjs registry/ng/firs/fct-irs-personal-income-tax-return-form-a/1.0.0 ran clean this cycle: 1 directory, 3 URLs checked, 0 warnings, 0 allowlisted.
tools/govschema-client's registry-index.json was regenerated (npm ci --include=dev then npm run build-index, per this registry's own documented gotcha about a local NODE_ENV=production making a bare npm ci skip dev dependencies) and now includes this document (384 entries total).
Scope and jurisdiction notes
- This is Nigeria's Taxes vertical's first document, bringing Nigeria to 2 of 6 verticals (Business Formation, Taxes). Passport, DMV, Visa, and National ID remain open, unscreened backlog for a future cycle.
jurisdiction.levelissubnationalwithsubdivision: NG-FC— see "Jurisdiction scoping" above for why this is not modeled as a national form.process.typeisfiling, consistent with this registry's other annual individual income tax returns.versionset to1.0.0: this document models the FCT-IRS Form A specimen in full (every printed Part/item); no companion schedule is disclosed as out-of-scope, since the source itself is a single self-contained 2-page form with no referenced sibling schedule.
What was NOT fully resolved (disclosed, not silently guessed)
- The font-rendering defect (Source 3 above) meant two tables' header captions could not be read directly from a rendered image; their row counts were instead confirmed from vector ruling-line geometry, cross- checked against the position-sorted text dump's surrounding labels. This is disclosed as the method actually used, not silently smoothed over.
- Whether other Nigerian states' own Form A editions are field-for-field identical to this FCT edition was not independently confirmed this cycle (no other state's specimen was fetched) — flagged as a future companion- schedule opportunity, not asserted either way.
- The Nigeria Tax Act 2025/Nigeria Tax Administration Act 2025 reform package's eventual effect on PITA's specific computational provisions (reliefs, bands) was not reconciled field-by-field against this schema, since this form itself prints no computed-tax-liability line for those provisions to attach to.
Re-verification
Per the practice's cadence, nextReviewBy is set to 2027-01-12 (6 months). A future review should prioritize: (1) re-fetching the source to confirm it remains live and unauthenticated, and re-checking whether a newer edition has been published (Last-Modified was 2025-10-09 at this cycle's fetch); (2) whether the Nigeria Tax Act 2025/Nigeria Tax Administration Act 2025 package's 2026 commencement has changed FCT-IRS's own Form A specimen; (3) scouting a second Nigerian state's own Form A/ equivalent as a sibling-jurisdiction companion candidate.
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 Federal Capital Territory Internal Revenue Service or any government. The authoritative source is always the live government form and its official instructions.