Registry entry
Rwanda National ID Application for Diaspora Rwandans Without an NPR Number — Gusaba Indangamuntu ku Banyarwanda baba mu Mahanga Badafite Umubare wa NPR
The National Identification Agency's (NIDA) national-ID application pathway for Rwandan citizens living abroad who do not already hold an NPR (National Population Register) number, filed through Irembo — Rwanda's e-government service portal. NIDA's ordinary domestic ID application requires a pre-issued NPR number (assigned in person inside Rwanda), which is a dead end on its own for a diaspora applicant who has never been registered; this diaspora-specific pathway is the genuine unauthenticated online alternative. Reached via Irembo's public service catalog (Irembo homepage → Irangamimerere → "Gusaba Indangamuntu" → choosing the "Gusaba indangamuntu ku banyarwanda baba mu mahanga badafite umubare wa NPR" option from the service's own sub-service picker), the service is a live Angular single-page application with no login required to view or fill the first of its three steps (Dosiye isaba / Incamake / Kwishyura — Application details / Summary / Payment). This schema models the first step, "Dosiye isaba" (application details), in full: the applicant's personal details, a birth-country-gated cascade (a Rwandan district picker when the birth country is Rwanda, or a free-text city when it is any other country), passport details gated on whether the applicant holds one, a civil-status-gated spouse-details cascade, parents' details, contact and residence details, and the step's own document checklist (itself gated by civil status). It does not model the second (Incamake/Summary, a read-only review of already-entered data with no new fields) or third (Kwishyura/Payment) steps — GovSchema describes and verifies government processes; it does not submit or pay for them, and no real application was advanced past the first step's document-upload validation in producing this schema. Filing this application is a citizen action performed directly with NIDA through Irembo; this schema does not file the application itself, and the live source (irembo.gov.rw) is always authoritative. GovSchema is independent and is not affiliated with, endorsed by, or operated by the Republic of Rwanda, NIDA, or Irembo.
Registry entry
rw/irembo/nida-diaspora-application
Authoritative source Irembo's live "Gusaba indangamuntu ku banyarwanda baba mu mahanga badafite umubare wa NPR" Angular single-page-application wizard, step 1 of 3 ("Dosiye isaba").
Machine access
- Schema document
registry/rw/irembo/nida-diaspora-application/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/rw/irembo/nida-diaspora-application/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
25 fields across 1 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.
Dosiye isaba
-
applicantSurnamestring requiredThe applicant's surname/family name.
length: 0–100classification: pii -
applicantOtherNamesstring requiredThe applicant's other/given name(s).
length: 0–100classification: pii -
dateOfBirthdate requiredThe applicant's date of birth.
patternclassification: pii -
birthCountrystring requiredThe applicant's country of birth, selected from the live portal's own external country-reference list (confirmed values include RWANDA and UGANDA; not reproduced in full — see VERIFICATION.md). Selecting Rwanda activates the `birthDistrict` cascade below; selecting any other country instead activates the free-text `birthCity`.
-
birthDistrictstring optionalThe Rwandan district (Akarere) of the applicant's birthplace, selected from a live district picker that replaces the free-text city field only when `birthCountry` is Rwanda — confirmed live by toggling the birth-country selector between Rwanda and Uganda and diffing the resulting form controls.
-
birthCitystring optionalThe city of the applicant's birthplace, shown and required only when `birthCountry` is any country other than Rwanda (in which case `birthDistrict` above does not apply).
-
genderenum requiredThe applicant's gender.
enum: MALE | FEMALE -
occupationstring requiredThe applicant's occupation, selected from the live portal's own large external occupation-reference list (confirmed to include entries such as "Umukozi wa banki" (bank employee) and dozens of other occupation-specific entries when searched; not reproduced in full — see VERIFICATION.md).
-
heightCminteger requiredThe applicant's height in centimetres.
range: 30–250 -
hasPassportboolean requiredWhether the applicant holds a passport. Selecting "Yego" (yes) reveals the four required `passport*` fields below; selecting "Oya" (no) hides them.
-
passportNumberstring optionalThe applicant's passport number.
length: 0–30 -
passportDateOfIssuedate optionalThe passport's date of issue.
pattern -
passportExpiryDatedate optionalThe passport's expiry date.
pattern -
passportCountryOfIssuestring optionalThe country that issued the applicant's passport, from the same external country-reference list as `birthCountry`.
-
civilStatusenum requiredThe applicant's civil/marital status. Selecting "Arubatse" (married) reveals the required `spouseName` field below; every value other than "Ingaragu" (single) additionally requires the `civilStatusDocument` attachment (see `documents[]` below) — both confirmed live by toggling this selector through all five values and diffing the resulting form.
enum: MARRIED | SINGLE | DIVORCED | WIDOWER | WIDOW -
spouseNationalitystring optionalThe applicant's spouse's nationality, from the same external country-reference list as `birthCountry`. Shown only when `civilStatus` is married; unlike `spouseName`, this field carried no asterisk on the live form and is not required even when shown.
-
spouseNamestring optionalThe applicant's spouse's full name.
length: 0–150classification: pii -
fatherNationalitystring optionalThe applicant's father's nationality, from the same external country-reference list as `birthCountry`. Optional — no asterisk on the live form.
-
fatherNamesstring optionalThe applicant's father's full name. Optional.
length: 0–150classification: pii -
motherNationalitystring optionalThe applicant's mother's nationality, from the same external country-reference list as `birthCountry`. Optional.
-
motherNamesstring optionalThe applicant's mother's full name. Optional.
length: 0–150classification: pii -
phoneNumberstring requiredThe applicant's contact phone number, entered via an international phone-number widget defaulting to Rwanda's +250 country code (the applicant, being diaspora-resident, may select a different country code).
length: 0–20classification: pii -
otherNationalitystring optionalAny additional nationality the applicant holds, from the same external country-reference list as `birthCountry`. Optional.
-
countryOfResidencestring requiredThe applicant's current country of residence, from the same external country-reference list as `birthCountry`.
-
cityOfResidencestring requiredThe city where the applicant currently resides.
length: 0–100
Verification record
Candidate selection
GOV-3288 ("GovSchema Standard Research", 2026-07-16) scouted Rwanda's National ID vertical (Rwanda was at 4/6: Passport, DMV, Business Formation, Visa modelled; Taxes and National ID open) and left this candidate as a disclosed, ready-to-author backlog item (GOV-3295), which this cycle (GOV-3298) picked up and completed.
NIDA's ordinary domestic ID service requires a pre-issued NPR (National Population Register) number — assigned in person inside Rwanda — which is a dead end on its own for a diaspora applicant who has never been registered. Rwanda's Taxes vertical was re-confirmed a dead end this same cycle: RRA's etax.rra.gov.rw/myrra.rra.gov.rw are login-only for every individual personal-income-tax filing category, with no downloadable PDF return form found.
Reaching the live wizard
The deep-link URL alone (https://irembo.gov.rw/user/citizen/service/nida/nid_diaspora_without_npr_revamp) redirects to Irembo's generic all-services page when fetched cold — it appears to depend on client-side navigation state, not a bare GET. The real path (walked live with Playwright + Chromium, waitUntil: 'domcontentloaded' plus explicit settle delays, since this is an Angular SPA with continuous background requests that never reach networkidle):
https://irembo.gov.rw/home/citizen/all_services— the public service catalog, unauthenticated.- Click the "Gusaba Indangamuntu" service card (an Angular
(click)handler with no plainhref, requires a real click event, not a linkgoto). - A
mat-dialogservice-selection modal opens, containing anng-selectsub-service picker (anngx-selectcomponent, not a native<select>) with three options once its own async content finishes loading:- "Gusaba indangamuntu ku banyarwanda baba mu mahanga badafite umubare wa NPR" (this schema's target)
- "Gusaba Indangamuntu" (the ordinary domestic pathway, NPR-gated)
- "Kwishyurira indangamuntu (mu buryo bwihariye)" (a special-arrangement payment variant, not screened this cycle)
- Selecting the first option shows a service-preview panel: processing time 30 minutes, fee RWF 500, 3 required documents, provided by NIDA.
- Clicking "Saba" (Apply) navigates to the exact URL cited in
source.urlabove — confirming the deep link is real, just not directly fetchable without first establishing this client-side navigation state.
Extraction technique
Every field name in schema.json is a real Angular formcontrolname attribute read directly from the live DOM via document.querySelectorAll('[formcontrolname]'), not inferred from visible labels alone. Two genuine requiredWhen/visibleWhen cascades were confirmed live by toggling the relevant control and diffing the DOM/visible document checklist before and after, rather than assumed from static markup:
- Birth-country cascade. Selecting "Rwanda" in the first
locationCountryFormControlreveals a requiredlocationDistrictFormControl(Akarere/district picker). Selecting any other country (tested with Uganda) instead reveals a required free-text city-of-birth field in the same position. Confirmed by readingdocument.querySelectorAll('[formcontrolname]')before and after each selection and diffing the control list. - Civil-status cascade. Selecting "Arubatse" (married) in
civilStatusFormControlreveals a requiredspouseNametext field (and an unrequiredspouseNationalitycountry picker) not present for any other value. Independently, toggling through all five civil-status values (Arubatse/Ingaragu/Uwatandukanye n'uwo bashakanye/ Umupfakazi(Gabo)/Umupfakazi(Gore)) and re-reading the "Imigereka" (attachments) checklist each time showed a 4th checklist item ("Civil Status document") appearing for every value except Ingaragu (single) — modelled asrequiredWhen civilStatus notEquals SINGLE. - Passport-details cascade. Toggling
havePassportFormControlbetween "Yego" (yes) and "Oya" (no) revealed/hid four fields (passportNumberFormControl,dateOfIssueFormControl,expiryDateFormControl, and a secondlocationCountryFormControlinstance for place of issue) — confirmed the same diffing way.
Live required-field validation. Clicking "Ibikurikira" (Next) with every field left blank produced a live mat-error "Uyu mwanya ni ngombwa." (this field is required) message under each of the twelve asterisked fields — independently corroborating every required: true field in schema.json beyond the mere presence of an asterisk in the label.
Genuine server-side photo validation. The applicantPhoto document upload was tested with a synthetic solid-grey JPEG generated via the sharp npm package. The two plain identity-document-copy uploads (identityOrTravelDocumentCopy, residenceCountryIdCopy) accepted this file without complaint, but the photo upload specifically was rejected with a live error explaining the required composition (white background, centered face, eyes open and forward-facing) — confirming this endpoint runs genuine image-content validation, not just file-type/extension checking, the same class of finding already made for tz/immigration/passport-application's photo upload. This gate is why the session was not advanced past step 1 ("Dosiye isaba") into steps 2 ("Incamake"/Summary) and 3 ("Kwishyura"/Payment) — fabricating a passing photo, or advancing toward an actual payment step, was out of scope. Steps 2 and 3 are therefore not modelled in this schema version; Incamake is understood (per the wizard's own step labels and this registry's experience with structurally similar wizards) to be a read-only review of already-entered data rather than a source of new fields, but this was not directly observed this cycle and is disclosed as such rather than asserted.
civilStatusFormControl's five options were read directly from the live ng-select dropdown panel and are modelled as a closed enum. professionFormControl and the various locationCountryFormControl instances are backed by much larger external reference lists — searching "Umukozi" in the occupation picker alone returned nine distinct bank/civil-service/embassy/UN-related entries — and are modelled as free-text string fields per this registry's established convention for such large external-list-backed selectors (see tz/immigration/passport-application's birthCountry/visitCountry fields for precedent).
Disclosed judgment calls
- Only step 1 ("Dosiye isaba") is modelled. Steps 2 and 3 were not reached this cycle (see the photo-validation gate above); this is disclosed as an accepted scope boundary rather than silently omitted, matching this registry's precedent for
tz/immigration/passport-applicationstopping short of its own Declaration/Payment/Complete steps. spouseNationalityhas norequiredWhen, onlyvisibleWhen— the live form shows no asterisk on this field even when visible (married), unlike its siblingspouseName, which does carry one.birthDistrict/birthCityare mutually exclusive viarequiredWhen/equals+notEqualson the samebirthCountryfield — exactly one of the two is ever shown/required at a time, confirmed live.heightCmvalidation bounds (30–250) are a sanity range this registry applies by convention for human height in centimetres; the live form itself does not print an explicit numeric range.- The international phone widget (
ngx-intl-tel-input) defaults to Rwanda's +250 country code but is a genuine international input — a diaspora applicant is not restricted to a Rwandan number.
Validation
node tools/validate.mjs— 502/502 documents pass (501 prior + this one).node tools/validate-ajv.mjs— 502/502 documents validate against the v0.3 meta-schema.node tools/verify-sources.mjs --base origin/main— confirms the cited source URL.- Conformance fixtures under
conformance/rw/irembo/nida-diaspora-application/1.0.0/: valid fixtures covering both the Rwanda/foreign birth-country branches and both civil status branches (married-with-document, single-without-document), plus mutation-control fixtures each raising exactly one error.
GovSchema is independent and is not affiliated with, endorsed by, or operated by the Republic of Rwanda, NIDA, or Irembo. This schema does not file the application itself; the live source (irembo.gov.rw) is always authoritative.
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 Agency (NIDA), via Irembo (Rwanda's e-government service portal) or any government. The authoritative source is always the live government form and its official instructions.