Registry entry
Uganda First-Time Registration and National Identification Card Application (Form 3, NIRA)
The National Identification and Registration Authority's (NIRA) "Form 3" — "Application for Registration and National Identification Card" under the Registration of Persons Act, 2015 — used for a person's first-time registration into Uganda's National Identification Register, for either a child or an adult (a single combined form, gated by a CHILD/ADULT tickbox at the top). This schema models the applicant-facing sections only: the registration-type tickbox; PART A's Personal Information, Place of Residence, Place of Birth, and Place of Origin (including citizenship type, dual citizenship, and passport particulars); PART B's Voter Information, Marital Status, and Spouse Details (printed applicable to adult registrations only); PART C's Father's Details, Mother's Details, and a conditional Grandparent(s)/Introducer block (applicable only when a citizenship-by-birth applicant's information for both parents is unavailable, per the form's own printed note) and the Particulars of Applicant's Children table; and PART E's Declaration. It excludes PART A's own Registration Location Code and Application ID (the form's own page-4 filling guide assigns both to "REGN OFFICER" / "to be generated by the Application"), PART D ("Form Section to be retained by the Registration Officer", a condensed duplicate of Parts A/B for officer records), and PART F ("FOR OFFICIAL USE ONLY" — citizenship assessment, documentary-proof ticks, and the registration officer's own signature) — none of this is applicant-supplied data. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Republic of Uganda or the National Identification and Registration Authority.
Registry entry
ug/nira/first-time-registration-application
Authoritative source Form 3 — "Application for Registration and National Identification Card", Registration of Persons Act, 2015
Machine access
- Schema document
registry/ug/nira/first-time-registration-application/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/ug/nira/first-time-registration-application/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
166 fields across 11 steps, 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.
Registration Type
-
registrationTypeenum requiredWhether this is a first-time registration application for a child (under 18) or an adult. Determines whether PART B (Voter Information, Marital Status, and Spouse Details) applies, per the form's own printed instruction "PART B. (to be filled for Adult registration only)".
enum: CHILD | ADULT
Personal Information
-
surnamestring requiredSurname
length: 0–60classification: pii -
givenNamestring requiredGiven Name
length: 0–60classification: pii -
otherNamesstring optionalOther Names
length: 0–100classification: pii -
maidenNamestring optionalMaiden Name
length: 0–60classification: pii -
previousNamesstring optionalThe applicant's own name(s) previously used, if ever changed. The source prints only the single word "Previous" for this field's label (not "Previous Names") in this section, unlike the fuller "Previous Names" label this same form uses in its Father's/Mother's/Spouse's Details blocks — disclosed here rather than silently normalized.
length: 0–100classification: pii -
sexenum requiredSex
enum: MALE | FEMALEclassification: pii -
dateOfBirthdate requiredDate of Birth
classification: sensitive-pii -
dateOfBirthEstimatedboolean optionalTicked when the date of birth above is an estimate rather than a documented date.
-
emailstring optionalEmail
length: 0–100classification: pii -
homePhoneNumberstring optionalHome Phone No.
length: 0–20classification: pii -
mobilePhoneNumberstring optionalThe source prints "(For Extra, Fill additional Form)" beside this field, instructing an applicant with more than one mobile number to record additional numbers on a separate continuation form; this schema models a single mobile number per the one printed blank.
length: 0–20classification: pii -
highestLevelOfEducationstring optionalHighest Level of Education
length: 0–100 -
professionstring optionalProfession
length: 0–100 -
occupationstring optionalOccupation
length: 0–100 -
religionstring optionalReligion
length: 0–100 -
disabilityBlindboolean optionalTicked when the applicant has a blind disability.
classification: health -
disabilityDeafboolean optionalTicked when the applicant has a deaf disability.
classification: health -
disabilityPhysicalboolean optionalTicked when the applicant has a physical disability.
classification: health -
disabilityMentalboolean optionalTicked when the applicant has a mental disability.
classification: health -
disabilityDumbboolean optionalTicked when the applicant is unable to speak. Modelled with the source form's own printed checkbox label ("Dumb") verbatim, per this registry's source-fidelity practice, though the term is dated; a consuming application MAY present a more contemporary label (e.g. "non-verbal") to the human end user.
classification: health
Place of Residence
-
residenceLocalOrForeignenum requiredPlace of Residence (Tick Appropriate)
enum: LOCAL | FOREIGN -
residenceCountrystring requiredCountry
length: 0–60 -
residenceDistrictstring optionalUganda administrative-unit field, applicable when the applicant's residence is Local (in Uganda).
length: 0–60 -
residenceCountystring optionalUganda administrative-unit field, applicable when the applicant's residence is Local (in Uganda).
length: 0–60 -
residenceSubCountystring optionalUganda administrative-unit field, applicable when the applicant's residence is Local (in Uganda).
length: 0–60 -
residenceParishWardstring optionalUganda administrative-unit field, applicable when the applicant's residence is Local (in Uganda).
length: 0–60 -
residenceVillagestring optionalUganda administrative-unit field, applicable when the applicant's residence is Local (in Uganda).
length: 0–60 -
residenceStreetstring optionalStreet
length: 0–100 -
residencePlotHouseNumberstring optionalPlot / House No.
length: 0–30 -
residenceYearsAtAddressinteger optionalPage 4 filling guide: "Allowed values are 1 to 99".
range: 1–99 -
residencePreviousDistrictstring optionalDistrict of Previous Place of Residence
length: 0–60 -
residencePostalAddressstring optionalPostal Address
length: 0–100
Place of Birth
-
birthCountrystring requiredCountry
length: 0–60 -
birthDistrictstring optionalDistrict
length: 0–60 -
birthCountystring optionalCounty
length: 0–60 -
birthSubCountystring optionalSub-County
length: 0–60 -
birthParishWardstring optionalParish/Ward
length: 0–60 -
birthVillagestring optionalVillage
length: 0–60 -
birthCityTownstring optionalCity/Town
length: 0–60 -
birthHealthFacilitystring optionalHealth Facility
length: 0–100
Place of Origin and Citizenship
-
originCountrystring requiredCountry
length: 0–60 -
originDistrictstring optionalDistrict
length: 0–60 -
originCountystring optionalCounty
length: 0–60 -
originSubCountystring optionalSub-County
length: 0–60 -
originParishWardstring optionalParish/Ward
length: 0–60 -
originVillagestring optionalVillage
length: 0–60 -
indigenousCommunityTribestring optionalIndigenous Community/Tribe
length: 0–100 -
clanstring optionalClan
length: 0–60 -
citizenshipTypeenum requiredCitizenship Type
enum: BY_BIRTH | BY_REGISTRATION | BY_NATURALIZATION -
dualCitizenshipboolean optionalDual Citizenship
-
citizenshipArticle9boolean optionalCitizenship Acquired Under Article 9 of the 1995 Constitution
-
citizenshipCertificateNumberstring optionalCitizenship Certificate Number
length: 0–40classification: sensitive-pii -
otherNationalityIfDualstring optionalOther Nationality
length: 0–60 -
passportNumberstring optionalPassport Number
length: 0–20classification: sensitive-pii -
fileNumberstring optionalPage 4 filling guide gives the expected format as "FA/XXXXXX or IM/XXXXXX"; not enforced as a validation.pattern here since the guide does not fully specify the placeholder alphabet.
length: 0–20
Voter Information, Marital Status, and Spouse Details (Adult Only)
-
preferredPollingStationenum optionalPreferred Polling Station
enum: RESIDENCE | ORIGIN -
pollingStationNamestring optionalPolling Station Name
length: 0–100 -
maritalStatusenum optionalMarital Status (Tick Appropriate)
enum: MARRIED | SINGLE | DIVORCED | WIDOWED | SEPARATED -
spouseSurnamestring optionalSurname
length: 0–60classification: pii -
spouseOtherNamesstring optionalOther Names
length: 0–100classification: pii -
spouseGivenNamesstring optionalGiven Names
length: 0–60classification: pii -
spousePreviousNamesstring optionalPrevious Names
length: 0–100classification: pii -
spouseMaidenNamestring optionalMaiden Name
length: 0–60classification: pii -
spouseNinstring optionalSpouse's National ID Number (NIN)
length: 0–20classification: sensitive-pii -
spouseCitizenshipTypeenum optionalSpouse's Citizenship Type
enum: BY_BIRTH | BY_REGISTRATION | BY_NATURALIZATION -
spouseDualCitizenshipboolean optionalSpouse's Dual Citizenship
-
spouseCitizenshipArticle9boolean optionalSpouse's Citizenship Acquired Under Article 9 of the 1995 Constitution
-
spouseOtherNationalityIfDualstring optionalUnlike the applicant's own, Father's, and Mother's citizenship blocks, this form's Spouse Details block prints no "Citizenship Certificate Number" line — disclosed as a genuine source asymmetry, not an extraction omission.
length: 0–60 -
placeOfMarriagestring optionalPlace of Marriage
length: 0–100 -
dateOfMarriagedate optionalDate of Marriage
-
typeOfMarriageenum optionalType of Marriage
enum: CIVIL | RELIGIOUS | CULTURAL | CUSTOMARY -
marriageCertificateNumberstring optionalMarriage Certificate Number
length: 0–40 -
hasOtherSpousesboolean optionalOther Spouses (on separate sheet)
-
numberOfOtherSpousesinteger optionalIf yes, Number of other spouses
range: 1–20
Father's Details
-
fatherSurnamestring optionalSurname
length: 0–60classification: pii -
fatherGivenNamesstring optionalGiven Names
length: 0–60classification: pii -
fatherOtherNamesstring optionalOther Names
length: 0–100classification: pii -
fatherPreviousNamesstring optionalPrevious Names
length: 0–100classification: pii -
fatherNinstring optionalNational ID Number (NIN)
length: 0–20classification: sensitive-pii -
fatherIdDocumentNumberstring optionalID Document Number
length: 0–30classification: sensitive-pii -
fatherCitizenshipTypeenum optionalCitizenship Type
enum: BY_BIRTH | BY_REGISTRATION | BY_NATURALIZATION -
fatherDualCitizenshipboolean optionalDual Citizenship
-
fatherCitizenshipArticle9boolean optionalCitizenship Acquired Under Article 9 of the 1995 Constitution
-
fatherCitizenshipCertificateNumberstring optionalCitizenship Certificate Number
length: 0–40classification: sensitive-pii -
fatherOtherNationalityIfDualstring optionalOther Nationality
length: 0–60 -
fatherLivingStatusenum optionalLiving Status
enum: ALIVE | DECEASED | UNKNOWN -
fatherOccupationstring optionalOccupation
length: 0–100 -
fatherResidenceCountrystring optionalCountry
length: 0–60 -
fatherResidenceDistrictstring optionalDistrict
length: 0–60 -
fatherResidenceCountystring optionalCounty
length: 0–60 -
fatherResidenceSubCountystring optionalSub-County
length: 0–60 -
fatherResidenceParishWardstring optionalParish/Ward
length: 0–60 -
fatherResidenceVillagestring optionalVillage
length: 0–60 -
fatherResidenceStreetstring optionalStreet
length: 0–100 -
fatherResidenceStreetHouseNumberstring optionalThe printed column header for this field reads "Street/House No." — distinct from this form's own applicant Place of Residence section, which prints separate "Street" and "Plot / House No." columns instead. Modelled per the Father's Details block's own printed label rather than normalized to the applicant section's wording.
length: 0–30 -
fatherOriginCountrystring optionalCountry
length: 0–60 -
fatherOriginDistrictstring optionalDistrict
length: 0–60 -
fatherOriginCountystring optionalCounty
length: 0–60 -
fatherOriginSubCountystring optionalSub-County
length: 0–60 -
fatherOriginParishWardstring optionalParish/Ward
length: 0–60 -
fatherOriginVillagestring optionalVillage
length: 0–60 -
fatherIndigenousCommunityTribestring optionalIndigenous Community/Tribe
length: 0–100 -
fatherClanstring optionalClan
length: 0–60
Mother's Details
-
motherSurnamestring optionalSurname
length: 0–60classification: pii -
motherGivenNamesstring optionalGiven Names
length: 0–60classification: pii -
motherOtherNamesstring optionalOther Names
length: 0–100classification: pii -
motherMaidenNamesstring optionalMaiden Names
length: 0–60classification: pii -
motherPreviousNamesstring optionalPrevious Names
length: 0–100classification: pii -
motherNinstring optionalNational ID Number (NIN)
length: 0–20classification: sensitive-pii -
motherIdDocumentNumberstring optionalID Document Number
length: 0–30classification: sensitive-pii -
motherCitizenshipTypeenum optionalCitizenship Type
enum: BY_BIRTH | BY_REGISTRATION | BY_NATURALIZATION -
motherDualCitizenshipboolean optionalDual Citizenship
-
motherCitizenshipArticle9boolean optionalCitizenship Acquired Under Article 9 of the 1995 Constitution
-
motherCitizenshipCertificateNumberstring optionalCitizenship Certificate Number
length: 0–40classification: sensitive-pii -
motherOtherNationalityIfDualstring optionalOther Nationality
length: 0–60 -
motherLivingStatusenum optionalLiving Status
enum: ALIVE | DECEASED | UNKNOWN -
motherOccupationstring optionalOccupation
length: 0–100 -
motherResidenceCountrystring optionalCountry
length: 0–60 -
motherResidenceDistrictstring optionalDistrict
length: 0–60 -
motherResidenceCountystring optionalCounty
length: 0–60 -
motherResidenceSubCountystring optionalSub-County
length: 0–60 -
motherResidenceParishWardstring optionalParish/Ward
length: 0–60 -
motherResidenceVillagestring optionalVillage
length: 0–60 -
motherResidenceStreetstring optionalStreet
length: 0–100 -
motherResidenceStreetHouseNumberstring optionalThe printed column header for this field reads "Street/House No." — distinct from this form's own applicant Place of Residence section, which prints separate "Street" and "Plot / House No." columns instead. Modelled per the Mother's Details block's own printed label rather than normalized to the applicant section's wording.
length: 0–30 -
motherOriginCountrystring optionalCountry
length: 0–60 -
motherOriginDistrictstring optionalDistrict
length: 0–60 -
motherOriginCountystring optionalCounty
length: 0–60 -
motherOriginSubCountystring optionalSub-County
length: 0–60 -
motherOriginParishWardstring optionalParish/Ward
length: 0–60 -
motherOriginVillagestring optionalVillage
length: 0–60 -
motherIndigenousCommunityTribestring optionalIndigenous Community/Tribe
length: 0–100 -
motherClanstring optionalClan
length: 0–60
Grandparent(s)/Introducer Details
-
grandparentSurnamestring optionalSurname of the Grandparent or Introducer. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60classification: pii -
grandparentGivenNamesstring optionalGiven names of the Grandparent or Introducer. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60classification: pii -
grandparentDateOfBirthdate optionalDate of birth of the Grandparent or Introducer. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
classification: sensitive-pii -
grandparentOtherNamesstring optionalOther names of the Grandparent or Introducer. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–100classification: pii -
grandparentNinstring optionalNational ID number of the Grandparent or Introducer, if available. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–20classification: sensitive-pii -
grandparentOriginCountrystring optionalCountry of the Grand Parents' Place of Origin. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60 -
grandparentOriginDistrictstring optionalDistrict of the Grand Parents' Place of Origin. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60 -
grandparentOriginCountystring optionalCounty of the Grand Parents' Place of Origin. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60 -
grandparentOriginSubCountystring optionalSub-County of the Grand Parents' Place of Origin. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60 -
grandparentOriginParishWardstring optionalParish/Ward of the Grand Parents' Place of Origin. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60 -
grandparentOriginVillagestring optionalVillage of the Grand Parents' Place of Origin. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60 -
grandparentIndigenousCommunityTribestring optionalIndigenous community/tribe of the Grandparent(s)/Introducer. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–100 -
grandparentClanstring optionalClan of the Grandparent(s)/Introducer. Applicable only for an applicant registering under Citizenship by Birth/descent whose information for both parents is not available, per the form's own printed note; the source prints no applicant-fillable gating checkbox for this condition, so this field is modelled optional with the condition recorded here rather than as a fabricated requiredWhen (consistent with this registry's lk/drp precedent for the same pattern).
length: 0–60
Particulars of Applicant's Children
-
child1Namestring optionalThe specimen prints a bounded 4-row table (no explicit row-count label on the form itself, confirmed by counting this table's own printed horizontal rule lines), not an open-ended list; flattened here to child1..4, matching this registry's bounded-repeating-group convention (e.g. ng/nis/application-for-nigeria-standard-passport). Not required: an applicant with no children, or fewer than 4, leaves the remaining rows blank.
length: 0–150classification: pii -
child1Sexenum optionalParticulars of Applicant's Children, row 1: Sex (M/F)
enum: MALE | FEMALEclassification: pii -
child1DateOfBirthdate optionalParticulars of Applicant's Children, row 1: Date of Birth
classification: sensitive-pii -
child1NationalIdNumberstring optionalParticulars of Applicant's Children, row 1: National ID Number (if available)
length: 0–20classification: sensitive-pii -
child2Namestring optionalThe specimen prints a bounded 4-row table (no explicit row-count label on the form itself, confirmed by counting this table's own printed horizontal rule lines), not an open-ended list; flattened here to child1..4, matching this registry's bounded-repeating-group convention (e.g. ng/nis/application-for-nigeria-standard-passport). Not required: an applicant with no children, or fewer than 4, leaves the remaining rows blank.
length: 0–150classification: pii -
child2Sexenum optionalParticulars of Applicant's Children, row 2: Sex (M/F)
enum: MALE | FEMALEclassification: pii -
child2DateOfBirthdate optionalParticulars of Applicant's Children, row 2: Date of Birth
classification: sensitive-pii -
child2NationalIdNumberstring optionalParticulars of Applicant's Children, row 2: National ID Number (if available)
length: 0–20classification: sensitive-pii -
child3Namestring optionalThe specimen prints a bounded 4-row table (no explicit row-count label on the form itself, confirmed by counting this table's own printed horizontal rule lines), not an open-ended list; flattened here to child1..4, matching this registry's bounded-repeating-group convention (e.g. ng/nis/application-for-nigeria-standard-passport). Not required: an applicant with no children, or fewer than 4, leaves the remaining rows blank.
length: 0–150classification: pii -
child3Sexenum optionalParticulars of Applicant's Children, row 3: Sex (M/F)
enum: MALE | FEMALEclassification: pii -
child3DateOfBirthdate optionalParticulars of Applicant's Children, row 3: Date of Birth
classification: sensitive-pii -
child3NationalIdNumberstring optionalParticulars of Applicant's Children, row 3: National ID Number (if available)
length: 0–20classification: sensitive-pii -
child4Namestring optionalThe specimen prints a bounded 4-row table (no explicit row-count label on the form itself, confirmed by counting this table's own printed horizontal rule lines), not an open-ended list; flattened here to child1..4, matching this registry's bounded-repeating-group convention (e.g. ng/nis/application-for-nigeria-standard-passport). Not required: an applicant with no children, or fewer than 4, leaves the remaining rows blank.
length: 0–150classification: pii -
child4Sexenum optionalParticulars of Applicant's Children, row 4: Sex (M/F)
enum: MALE | FEMALEclassification: pii -
child4DateOfBirthdate optionalParticulars of Applicant's Children, row 4: Date of Birth
classification: sensitive-pii -
child4NationalIdNumberstring optionalParticulars of Applicant's Children, row 4: National ID Number (if available)
length: 0–20classification: sensitive-pii
Declaration
-
declarantNamestring requiredDeclarant Name
length: 0–150classification: pii -
declarantSignatureOrThumbprintstring requiredSignature/Thumbprint of Applicant or Parent/Guardian
classification: pii -
declarationDatedate requiredDate of Declaration
Verification record
Candidate selection
GOV-4353, a child issue of GOV-4351 ("GovSchema Standard Research"). Closes the last of Uganda's pre-scouted 3-of-6 STRONG backlog first identified in the GOV-4307 cycle (see CATALOG.md's Known Gaps entry 0e): DMV (ug/mowt/driving-licence-application, GOV-4335/GOV-4337) and Business Formation (ug/ursb/business-name-registration-individual, GOV-4343) were already authored; National ID (NIRA Form 3, First-Time Registration) had failed to connect on the two prior re-check cycles (GOV-4335, GOV-4343), both times against the bare nira.go.ug host. Brings Uganda to 3 of 6 verticals (Visa, Passport, and Taxes remain confirmed dead ends per the GOV-4307 cycle's own six-vertical screening pass).
Reaching the live source
Target: https://www.nira.go.ug/media/2025/07/Form-3-NIRA-First-Time-Registration-Form.pdf.
- The
wwwsubdomain is required. The barenira.go.ughost connection-times-out (curlexit 28) — independently re-confirmed this cycle — which is exactly the blocker that stalled the two prior re-check cycles (GOV-4335, GOV-4343), both of which only tried the bare host. Thewwwsubdomain resolves and serves the PDF normally. - The TLS certificate chain served by
www.nira.go.ugis incomplete, so the fetch requirescurl -k(or an equivalent relaxed-verification client); this is a server misconfiguration, not a login/WAF gate. - Independently re-fetched and re-hashed rather than trusted from the issue brief alone: HTTP 200,
Content-Type: application/pdf, 312,831 bytes, byte-for-byte match with the brief's own reported size. - sha256 of the retrieved bytes:
37e7df2b2800bd6e2e210944cd02f1c08ed265c924b2775fedc1b70cb54e4623— matches the brief exactly. - Confirmed mechanically: the retrieved bytes begin
%PDF-1.7and contain zero/AcroForm,/Widget, and/FToccurrences — a flat, print-and-fill specimen (4 pages), not an interactive AcroForm PDF, consistent with the brief's own description. - The form's own letterhead and footer print "REPUBLIC OF UGANDA" and "National Identification and Registration Authority" alongside a "My Country, My Identity" tagline;
authoritynames NIRA per the form's own printed letterhead, withauthority.urlpointing to the authority's own site (https://www.nira.go.ug).
Extraction method
Text extracted via pdfjs-dist's getTextContent() API (vendored at /tmp/node_modules/pdfjs-dist), grouped by y-coordinate (rounded to a small tolerance) and sorted by x-coordinate within each row, across all 4 pages — independently re-derived from the raw PDF rather than trusted from the issue brief's own field list alone, per the task's own instruction.
Attempted visual cross-check by rendering all 4 pages to PNG via pdfjs-dist + node-canvas at 2.5x scale (with the bundled standard_fonts data directory supplied). This specimen's embedded fonts triggered getPathGenerator glyph-resolution warnings for effectively every character on every page, so the rendered PNGs show the form's own grid/table border lines cleanly but render text as blank (a font-embedding issue in the source PDF itself, not an extraction bug — the same getTextContent() API used for the primary extraction is unaffected, since it reads the content stream's text-positioning operators directly rather than rasterizing glyphs). Consequently, ambiguous layout questions were resolved not by reading rendered text but by directly inspecting the PDF content stream's own vector line-drawing operators (page.getOperatorList(), filtering constructPath rectangle fills that render as hairline table/grid rules):
- "Particulars of Applicant's Children" (Section 10) row count. The table prints no numeric row-count label. Its own printed horizontal rule lines were counted directly from the content stream: 6 lines (at PDF y-coordinates 111.74, 98.28, 82.8, 67.56, 51.48, 35.52), i.e. 1 header row + 4 data rows. Column boundaries at the same y-coordinates (x ≈ 36, 306, 353/354, 414, 573) were cross-checked against the header text's own x-positions ("Names of Child" ~41, "Sex (M/F)" ~306, "Date of Birth" ~359, "National ID Number (if available)" ~432) and matched. Modelled as a bounded 4-row repeating group (
child1..child4), this registry's established convention for a printed bounded table with no array/nested field-type primitive available (GSP-0009 still undecided) — see, e.g.,ng/nis/application-for-nigeria-standard-passport's ownchild1..child4precedent. This is a lower-confidence provenance than an explicitly printed row-count label (disclosed as Finding 6 below). - Father's/Mother's "Street"/"Street/House No." column pair (Sections 7/8). Confirmed via x-coordinate clustering (left column "Street" at x≈39, right column "Street/House No." at x≈280-282 on both blocks) that these are two distinct printed columns, not a single wrapped label — see Finding 2.
Models 166 fields[] across 11 steps[] (Registration Type; Personal Information; Place of Residence; Place of Birth; Place of Origin and Citizenship; Voter Information/Marital Status/Spouse Details — Adult Only; Father's Details; Mother's Details; Grandparent(s)/Introducer Details; Particulars of Applicant's Children; Declaration), with a transitions branch out of the place_of_origin step: registrationType == ADULT routes to the voters_and_marital step, everything else falls through directly to father_details — the flow-level expression of PART B's own printed "(to be filled for Adult registration only)" gate, composed with matching field-level visibleWhen/requiredWhen on every PART B field.
Excludes, per the brief and the form's own page-4 filling guide: PART A's Registration Location Code and Application ID (guide: "To be generated by the Application" / "REGN OFFICER"); PART D ("Form Section to be retained by the Registration Officer", a condensed duplicate of Parts A/B for officer records); and PART F ("FOR OFFICIAL USE ONLY" — citizenship assessment, documentary-proof ticks, the registration officer's own signature). None of this is applicant-supplied data.
Disclosed source-fidelity findings
previousNames(Section 1) modelled from a printed label reading only "Previous", not "Previous Names". Confirmed via direct x/y re-extraction around that row: the printed label is the single word "Previous", unlike the fuller "Previous Names" label this same form prints in its Father's, Mother's, and Spouse's Details blocks. Modelled withlabel: "Previous"verbatim and the discrepancy disclosed in the field's owndescription, rather than silently normalized to "Previous Names".- Father's/Mother's Place of Residence blocks print "Street" + "Street/House No." as two separate columns, not the "Street" + "Plot / House No." pairing the applicant's own Place of Residence section (Section 2) uses. Modelled per each block's own printed label (
fatherResidenceStreetHouseNumber/motherResidenceStreetHouseNumber, both labelled "Street/House No.") rather than normalized to the applicant's own wording. - The Spouse Details block (Section 6, PART B) prints no "Citizenship Certificate Number" line, unlike the applicant's own, Father's, and Mother's citizenship blocks, which all print one. Confirmed by direct row-by-row re-extraction of Section 6's citizenship lines (Citizenship Type → Dual Citizenship → Citizenship acquired under article 9 → If Dual, state Citizenship and other Nationality — no certificate-number line between the last two). Modelled as a genuine, disclosed source asymmetry:
spouseOtherNationalityIfDualexists with no siblingspouseCitizenshipCertificateNumberfield. citizenshipTypemodelled as a 3-value enum (BY_BIRTH,BY_REGISTRATION,BY_NATURALIZATION) plus a separatedualCitizenshipboolean, matching the form's own printed layout of three tickboxes plus one additional "Dual Citizenship" tickbox (repeated identically for the applicant, Spouse, Father, and Mother blocks) — even though the page-4 filling guide's own prose summary lists "By Birth, By registration, By Naturalisation, DUAL, Citizen under 95 Constitution" as if these were five coequal options. The printed form itself, not the guide's summary prose, governs this schema's structure.- Grandparent(s)/Introducer block (Section 9) modelled entirely optional, with no
requiredWhengate. The form's own section heading states this block applies "if information of both parents is not available for Applicants under Citizenship by Birth/descent", but prints no applicant-fillable tickbox recording whether that condition holds — there is no boolean field to attach aConditionto. Each field's owndescriptionrecords the applicability condition in prose instead, consistent with this registry'slk/drp/application-for-a-national-identity-cardprecedent for the same disclose-rather-than-fabricate pattern. - Children table row count (4) derived from counting printed rule lines, not a printed row-count label — see Extraction method above. Disclosed as a lower-confidence provenance than an explicit "1/2/3/4" row label.
- Local/Foreign administrative-subdivision conditionality applies only to the Residence block, not Birth or Origin. The applicant's own Place of Residence section (Section 2) prints an explicit "Local Foreign" tickbox gating District/County/Sub-County/Parish/Ward/Village; Place of Birth (Section 3) and Place of Origin (Section 4) print no equivalent gate, so their own District..Village fields are modelled unconditionally optional rather than inventing a matching conditional the source does not print.
disabilityDumbretains the source form's own printed checkbox label ("Dumb") verbatim, per this registry's source-fidelity practice, though the term is dated; the field's owndescriptionflags this and suggests a consuming application may present a more contemporary label (e.g. "non-verbal") to a human end user.registrationType(top-of-form CHILD/ADULT tick) gates PART B only, not PART C. The form applies Father's Details, Mother's Details, the Grandparent(s)/Introducer block, and the Particulars of Applicant's Children table uniformly to both child and adult registrations (no printed "Adult only"/"Child only" qualifier on PART C, unlike PART B's explicit one) — so none of PART C's fields carry aregistrationTypevisibleWhen/requiredWhengate.
Conformance
2 valid scenarios (a child, citizenship-by-birth registration with a Grandparent/Introducer block populated and a Local Uganda residence; an adult, married, dual-citizen registration with a naturalized father, a dual-citizen mother, other spouses declared, and two of the four children rows populated) plus 23 mutation-control fixtures (each raising exactly 1 error: one missing-required-field case for each of the 13 statically required: true fields, 8 targeted requiredWhen cases spanning the Residence/Citizenship/Marital/Spouse/Father/Mother conditional rules, one invalid enum value, and one unknown top-level field) are committed under conformance/ug/nira/first-time-registration-application/1.0.0/. An ephemeral, from-scratch conformance checker (deriving required/ requiredWhen/visibleWhen/enum/type rules directly from this schema's own fields[], discarded after use, not committed) ran all 25 fixtures: both valid scenarios at 0 errors, all 23 mutation controls each raising exactly 1 error. Validated clean with node tools/validate.mjs and node tools/validate-ajv.mjs, individually and as part of the full registry run. registry-index.json regenerated via npm run build-index in tools/govschema-client/.
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 National Identification and Registration Authority or any government. The authoritative source is always the live government form and its official instructions.