Registry entry
Morocco Passport Application (Demande de Passeport)
The Direction Générale de la Sûreté Nationale's (DGSN) online passport request form, served unauthenticated at passeport.ma/FormDemande/FormDemande. Completing this form online produces a reference number/receipt for an in-person appointment at a passport bureau (in Morocco) or consulate (abroad), where the biometric capture and physical supporting documents are handled; this schema models only the online data-entry step, not the in-person biometric/document-submission step. The form's single 'Raison' (reason/applicant-category) radio group drives four branches: an adult applicant ('Majeur'), an adult under legal guardianship ('Majeur placé sous tutelle'), a minor aged 12 to 18 ('Mineur de 12 à 18 ans'), and a minor under 12 ('Mineur moins de 12 ans'). The three minor/guardianship branches additionally render a parents'-information block and a legal-representative block; the legal-representative block itself can hand off to a proxy/mandatary ('mandataire') block if the representative grants a power of attorney. This schema does NOT model: the CAPTCHA field (`CaptchaText`), a bot-mitigation control rather than an application datum; the six document-upload/checklist pages linked from the site's own 'Pièces à fournir' menu (physical documents checked in person, not uploaded through this form); the five explanatory modal dialogs describing each non-parent legal-representative category (Tuteur Testamentaire, Kafil, Juge, Tuteur Datif, Autre) — informational prose only, with no additional form fields of their own; and the ~194-entry static country-name option lists behind `countryOfBirth`, `fatherNationality`, `motherNationality`, `legalRepresentativeNationality`, `mandataryNationality`, and the numerically-coded ~194-entry list behind `countryOfResidence` — all six are modelled as open strings rather than reproduced as literal enums, to avoid transcription error at that scale (see verification.notes for the exact option-value scheme each one uses, which is not consistent across the form). This schema was sourced directly from the live, unauthenticated HTML the site returns to a plain, unauthenticated GET request plus its own linked `FormDemande.js`, both fetched with a standard desktop browser User-Agent and no login/CAPTCHA/WAF gate on either asset (the CAPTCHA only gates final submission, not the page/field data itself). No application was actually submitted and no fee was paid in producing this schema. Filing this application is a traveller/citizen action performed directly with the Direction Générale de la Sûreté Nationale through passeport.ma; this schema does not file the application itself, and the live source is always authoritative. GovSchema is independent and is not affiliated with, endorsed by, or operated by Morocco or its Direction Générale de la Sûreté Nationale.
Registry entry
ma/dgsn/passport-application
Machine access
- Schema document
registry/ma/dgsn/passport-application/1.0.0/schema.jsonapplication/schema+json- Verification record
registry/ma/dgsn/passport-application/1.0.0/VERIFICATION.mdtext/markdown- Registry catalog
registry/index.jsonone record per schema id
Field reference
49 fields across 5 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.
Application Category & Fee
-
reasonForApplicationstring requiredThe applicant category, selected from a 4-option radio group that determines which downstream blocks (parents, legal representative, mandatary) apply. Modelled with the form's own literal wire values: "1" = Majeur (adult), "2" = Majeur placé sous tutelle (adult under legal guardianship), "3" = Mineur de 12 à 18 ans (minor aged 12-18), "4" = Mineur moins de 12 ans (minor under 12). "1" is pre-selected by default in the live form.
enum: 1 | 2 | 3 | 4 -
feeExemptionClaimedboolean optionalWhether the applicant claims exemption from the stamp-duty fee. Only rendered by the live form for the Majeur, Mineur, and Mineur-12 branches (hidden entirely for Majeur placé sous tutelle). Carries `data-val-required` per the ASP.NET MVC checkbox idiom disclosed in verification.notes; modelled as an optional attestation, not a hard requirement.
-
stampCodestring optionalThe pre-purchased electronic stamp-duty code ("e-Timbre") the applicant enters instead of paying in person. Required unless the applicant has claimed fee exemption via `feeExemptionClaimed`.
patternlength: 0–16 -
cnieNumberstring optionalThe applicant's Carte Nationale d'Identité Electronique number. Required for the Majeur, Majeur placé sous tutelle, and Mineur (12-18) branches; the live form hides the field's required-asterisk (`#cnieAsterix`) specifically for the Mineur-12 (under-12) branch, since children under 12 typically do not yet hold a CNIE.
patternlength: 0–10classification: sensitive-pii
Applicant Information
-
lastNameLatinstring requiredThe applicant's last/family name in Latin characters.
patternlength: 0–45classification: pii -
firstNameLatinstring requiredThe applicant's first/given name in Latin characters.
patternlength: 0–45classification: pii -
firstNameArabicstring requiredThe applicant's first/given name in Arabic characters.
patternlength: 0–45classification: pii -
lastNameArabicstring requiredThe applicant's last/family name in Arabic characters.
patternlength: 0–45classification: pii -
birthDateUnknownDayMonthboolean optionalAttestation that neither day nor month of birth is known, waiving `birthDay` and `birthMonth`. See verification.notes on the ASP.NET MVC checkbox idiom.
-
birthDateUnknownDayboolean optionalAttestation that only the day of birth is unknown, waiving `birthDay`. See verification.notes on the ASP.NET MVC checkbox idiom.
-
birthDaystring optionalTwo-digit day of birth. The source's own `data-val-regex-pattern` (`[0-9]{2}$`) is not left-anchored; modelled here with the evidently-intended `^[0-9]{2}$` (see verification.notes).
patternclassification: pii -
birthMonthstring optionalTwo-digit month of birth. The source's own `data-val-regex-pattern` (`[0-9]{2}$`) is not left-anchored; modelled here with the evidently-intended `^[0-9]{2}$` (see verification.notes).
patternclassification: pii -
birthYearstring requiredFour-digit year of birth; always required, with no corresponding "unknown" waiver checkbox.
patternclassification: pii -
genderstring requiredThe applicant's declared gender. The live form's own wire values are counter-intuitive: "1" = Féminin (female), "2" = Masculin (male) — confirmed directly from the two radio inputs' `value` attributes.
enum: 1 | 2classification: pii -
placeOfBirthstring requiredThe applicant's city/town of birth.
patternlength: 0–30classification: pii -
countryOfBirthstring requiredThe applicant's country of birth, chosen from the form's own static ~194-entry country dropdown. Modelled as an open string rather than a literal enum to avoid transcription error at that scale (see verification.notes); the option `value` is the country's own display name (e.g. "ALGERIE"), not an ISO code — a scheme distinct from `countryOfResidence` (see verification.notes finding 1).
-
phonestring optionalThe applicant's Moroccan mobile phone number (9 digits, entered after a fixed, non-editable "+212" prefix). The source's own `data-val-regex-pattern` (`^[5-6-7]{1}[0-9]{8}$`) contains a malformed character class; modelled here with the evidently-intended `^[5-7][0-9]{8}$` (see verification.notes). Carries no `data-val-required` in the fetched markup.
patternclassification: pii -
emailstring optionalThe applicant's email address, format-checked on blur by a `checkEmail()` JavaScript function rather than an inline regex. Carries no `data-val-required` in the fetched markup.
length: 0–80classification: pii -
postalAddressstring requiredThe applicant's postal address. The source's own `data-val-regex-pattern` is prefixed `(?i)`, a .NET-only inline case-insensitivity flag invalid in JavaScript `RegExp`, so the client-side check never actually fires in-browser (see verification.notes); modelled here with the `(?i)` prefix stripped.
patternlength: 0–60classification: pii -
citystring requiredThe applicant's city of residence.
length: 0–20classification: pii -
postalCodestring requiredThe applicant's postal code.
length: 0–10 -
countryOfResidencestring requiredThe applicant's country of residence, chosen from a separate ~194-entry country dropdown whose option `value`s are an unrelated numeric code (e.g. "201" for Afghanistan, "202" for Afrique du Sud) rather than the country name used by `countryOfBirth` and the other nationality selects on this same form (see verification.notes finding 1). Modelled as an open string rather than a literal enum to avoid transcription error at that scale.
Parents' Information (minors only)
-
fatherUnknownboolean optionalAttestation that the applicant's father is unknown, which disables and clears the other father fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.
-
fatherDeceasedNoIdboolean optionalAttestation that the applicant's father is deceased and left no identity document, which disables and clears the other father fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.
-
fatherLastNamestring optionalThe father's last name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).
patternlength: 0–45classification: pii -
fatherFirstNamestring optionalThe father's first name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).
patternlength: 0–45classification: pii -
fatherNationalitystring optionalThe father's nationality, chosen from the same country-name-valued dropdown as `countryOfBirth`. Modelled as an open string for the same reason.
-
fatherIdTypestring optionalThe type of identity document held by the father, the one father-block field that genuinely carries `data-val-required` in the fetched markup. Required whenever the parent-information block applies and the father is neither declared unknown nor deceased-without-ID.
enum: 1 | 2 | 3 | 4 | 5 | 6 -
fatherIdNumberstring optionalThe father's identity document number. Carries no `data-val` attribute at all in the fetched markup (not even a format check), let alone `data-val-required`.
length: 0–10classification: sensitive-pii -
motherUnknownboolean optionalAttestation that the applicant's mother is unknown, which disables and clears the other mother fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.
-
motherDeceasedNoIdboolean optionalAttestation that the applicant's mother is deceased and left no identity document, which disables and clears the other mother fields client-side. See verification.notes on the ASP.NET MVC checkbox idiom.
-
motherLastNamestring optionalThe mother's last name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).
patternlength: 0–45classification: pii -
motherFirstNamestring optionalThe mother's first name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).
patternlength: 0–45classification: pii -
motherNationalitystring optionalThe mother's nationality, chosen from the same country-name-valued dropdown as `countryOfBirth`. Modelled as an open string for the same reason.
-
motherIdTypestring optionalThe type of identity document held by the mother, the one mother-block field that genuinely carries `data-val-required` in the fetched markup. Required whenever the parent-information block applies and the mother is neither declared unknown nor deceased-without-ID.
enum: 1 | 2 | 3 | 4 | 5 | 6 -
motherIdNumberstring optionalThe mother's identity document number. Carries no `data-val` attribute at all in the fetched markup (not even a format check), let alone `data-val-required`.
length: 0–10classification: sensitive-pii
Legal Representative Information
-
legalRepresentativeCapacitystring optionalThe legal representative's relationship to the minor/protected applicant. The live form's own footnote explains the father remains the legal representative of his minor children even after divorce, and maternal custody does not by itself confer legal-representative status on the mother.
enum: 7 values -
legalRepresentativeLastNamestring optionalThe legal representative's last name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).
patternlength: 0–45classification: pii -
legalRepresentativeFirstNamestring optionalThe legal representative's first name. Carries no `data-val-required` in the fetched markup despite appearing in a visually mandatory-seeming block (see verification.notes finding 3).
patternlength: 0–45classification: pii -
legalRepresentativeNationalitystring optionalThe legal representative's nationality, chosen from the same country-name-valued dropdown as `countryOfBirth`. Modelled as an open string for the same reason. Carries no `data-val` attribute at all in the fetched markup.
-
legalRepresentativeIdTypestring optionalThe type of identity document held by the legal representative, the one representative-block field that genuinely carries `data-val-required` in the fetched markup. Required whenever the legal-representative block applies.
enum: 1 | 2 | 3 | 4 | 5 | 6 -
legalRepresentativeIdNumberstring optionalThe legal representative's identity document number. Carries no `data-val` attribute at all in the fetched markup (not even a format check), let alone `data-val-required`.
length: 0–10classification: sensitive-pii -
powerOfAttorneyGrantedboolean optionalWhether the legal representative grants a power of attorney to a mandatary (e.g. the mother, or another close relative) to accompany the minor and complete the process. Checking this reveals the Proxy/Mandatary Information step. See verification.notes on the ASP.NET MVC checkbox idiom.
Proxy / Mandatary Information
-
motherIsMandataryboolean optionalShortcut attestation that the mother herself is the mandatary, which the live form uses to copy the mother's own name/nationality/ID fields into the mandatary fields. Only rendered for the Mineur and Mineur-12 branches (hidden for Majeur placé sous tutelle, which has no separate mother block to copy from).
-
mandataryLastNamestring optionalThe mandatary's last name. Carries no `data-val-required` in the fetched markup.
patternlength: 0–45classification: pii -
mandataryFirstNamestring optionalThe mandatary's first name. Carries no `data-val-required` in the fetched markup.
patternlength: 0–45classification: pii -
mandataryNationalitystring optionalThe mandatary's nationality, chosen from the same country-name-valued dropdown as `countryOfBirth`. Modelled as an open string for the same reason.
-
mandataryIdTypestring optionalThe type of identity document held by the mandatary, the one mandatary-block field that genuinely carries `data-val-required` in the fetched markup. Required whenever a power of attorney has been granted.
enum: 1 | 2 | 3 | 4 | 5 | 6 -
mandataryIdNumberstring optionalThe mandatary's identity document number. Carries no `data-val` attribute at all in the fetched markup (not even a format check), let alone `data-val-required`.
length: 0–10classification: sensitive-pii
Verification record
Candidate selection
GOV-4114 ("GovSchema Standard Research") found no pre-banked candidate still open at cycle start — the prior cycle's Netherlands Visa / Austria DMV pair (GOV-4092/GOV-4094) had both been authored (GOV-4107, GOV-4100). Scouted two fresh candidates in parallel: Morocco's five unscreened verticals (Business Formation, DMV, Passport, Taxes, National ID — every one open since Morocco's only schema, ma/maec/evisa-application, opened the jurisdiction via Visa in GOV-3454), and Egypt's previously-unscreened National ID vertical. Egypt's National ID confirmed weak: the Civil Status Authority's own digital.gov.eg/cso.moi.gov.eg request- initiation front end is real but sits behind an authenticated citizen account, the underlying issuance step remains fundamentally in-person and biometric, and the one third-party site with a detailed field-by-field paper-form transcription had dead download links — left as screened, confirmed weak. Morocco's Passport vertical won decisively: DGSN's own passeport.ma/FormDemande/FormDemande is a plain, unauthenticated ASP.NET MVC form with every field's name/id/data-val* attribute readable directly from the served HTML — no login, CAPTCHA, or WAF gate on the GET itself (the CAPTCHA only gates final submission). This is markedly stronger than Morocco's other four open verticals, all of which remained login-gated or unreachable this session (OMPIC/ directentreprise.ma for Business Formation; NARSA for DMV; DGI/SIMPL for Taxes, with only unverifiable PDF adhesion forms as a fallback; cnie.ma for National ID, unreachable with no field-level secondary source).
Reaching the live source
Fetched https://www.passeport.ma/FormDemande/FormDemande and its linked https://www.passeport.ma/js/FormDemande.js this session with a plain curl and a standard desktop Chrome User-Agent string.
- Form page: HTTP 200,
Content-Type: text/html; charset=utf-8, 132,381 bytes, sha256a2c802b2722886ee227d5816f97c0ecb504d53a5ce87c77cebdf8e61aac7b116. - JS file: HTTP 200,
Content-Type: application/javascript, 58,447 bytes, sha25686e346986f8c665f1bf0d214eaf61c8deea2ca1ead141d22adba505a8caf51c8.
Both served directly with only session/anti-bot cookies set (TS01400756, TS1a8944dc027, MI=...) — no login redirect, no CAPTCHA challenge, and no WAF block on the GET request itself.
Structure of the source
The form is a classic ASP.NET MVC unobtrusive-validation page: every input's real, wire-level name attribute (e.g. _Nom_FR, _Num_CNIE, _Code_Qualite_Representant) and every client-side rule (data-val-required, data-val-regex/data-val-regex-pattern, data-val-length-max, data-val-number) is present as plain, un-minified HTML — not reconstructed from rendered output. The single Raison radio group (name="Raison", values "1"-"4") drives which of the form's five conceptual blocks are relevant, confirmed from FormDemande.js's own .RadioRaison .change() handler (.show()/.hide() calls on #Demandeur, #Min12Ans, #RepLegal, #Mandataire), and the #procuration/#pinconnu/#pdecede/ #minconnu/#mdecede change handlers that disable and clear their respective dependent-person sub-blocks. This schema models 49 fields[] across 5 steps (application_category, applicant_information, parent_information, legal_representative_information, proxy_mandatary_information) and 0 documents[].
Six disclosed findings from this session's own read of the fetched assets
- Two inconsistent country-code schemes on the same form.
_PaysNaissance_FR(country of birth) and the three dependent-person nationality selects (_Pays_Pere,_Pays_Mere,_Pays_Representant,_Pays_Mandataire) all use the country's own display NAME as the optionvalue(e.g.value="ALGERIE"), while_Pays(country of residence) uses an unrelated numeric code (value="201"for Afghanistan,"202"for Afrique du Sud, ...) — confirmed by a direct diff of the two<select>option blocks in the fetched HTML. Both are modelled as open strings (not literal enums, to avoid transcription error across ~194 options each) with this discrepancy documented in each field's own description. - The ASP.NET MVC boolean-checkbox idiom. Every boolean checkbox on this form (
NoMoisJour,NoJour,PereInconnu,PereDecede,MereInconnu,MereDecede,procuration) is paired with a same-named hiddentype="false"fallback input and carries adata-val-requiredattribute. This is the standardHtml.CheckBoxForoutput pattern (the framework always emitsdata-val-requiredso the field always binds to a boolean, not because the box must be checked) — confirmed by checking that none of these boxes are pre-checked and none of the fourRadioRaisonbranches are blocked from proceeding by them. All seven are modelled as optional attestations (required: false), not gated ondata-val-required's literal presence. - Asymmetric requiredness inside each dependent-person block. Across all four blocks (père, mère, représentant légal, mandataire), only the "type de pièce d'identité"
<select>(typeIdPere/typeIdMere/typeIdRep/typeIdMan) carries a genuinedata-val-requiredin the fetched markup — confirmed by grepping each block's full markup directly. The corresponding name (_Nom_*/_Prenom_*), nationality (_Pays_*), and ID-number (_Num_CNIE_*) fields in all four blocks carry at mostdata-val="true"(format-check only) and neverdata-val-required; two of the four ID-number fields (_Num_CNIE_Pere,_Num_CNIE_Mere) and the mandataire/représentant nationality selects carry nodata-valattribute at all. Modelled faithfully —required: falseon every name/nationality/ID-number field in these blocks,requiredWhenonly on the four ID-type selects — rather than assuming the whole visually-grouped block is mandatory. - A broken client-side regex on the postal address field.
_Adresse_FR's owndata-val-regex-patternis(?i)^[a-zA-Z0-9'-/.: ,\s-]+$. The leading(?i)inline case-insensitivity flag is .NETRegexsyntax (from the server-side[RegularExpression]attribute); it is not valid JavaScriptRegExpsyntax. Confirmed this session by attemptingnew RegExp("(?i)^[a-zA-Z0-9...")in a Node REPL, which throwsSyntaxError: Invalid regular expression— meaning jQuery Validate's unobtrusive adapter would throw constructing this pattern in-browser, and the format check silently never fires client-side. Modelled with the(?i)prefix stripped (the evidently-intended pattern). - A non-left-anchored regex on the day/month birth-date fields.
_DateNaissanceJour/_DateNaissanceMois's owndata-val-regex-patternis[0-9]{2}$— anchored only on the right, so it would technically accept any string merely ending in two digits. Modelled with the evidently-intended^[0-9]{2}$. - A malformed character class on the phone field.
_Num_Tel's owndata-val-regex-patternis^[5-6-7]{1}[0-9]{8}$.[5-6-7]parses as the range 5–6, plus a literal-, plus a literal7— not "one of 5, 6, or 7" as the field's own tooltip text (7XXXXXXXX, 6XXXXXXXX ou 5XXXXXXXX) states. Modelled with the evidently-intended^[5-7][0-9]{8}$.
Scope boundaries (disclosed, not silently dropped)
CaptchaText. A bot-mitigation control, not an application datum — not modelled, consistent with this registry's existingma/maec/evisa-applicationprecedent.- Document uploads / in-person supporting-document checklist. This form has no
type="file"inputs at all — completing it online produces a reference number for an in-person appointment at a passport bureau (in Morocco) or consulate (abroad), where physical supporting documents are checked. The site's own "Pièces à fournir" menu documents that checklist separately; not modelled, nodocuments[]array in this schema. - The five representative-category explanatory modals. "Tuteur Testamentaire", "Kafil", "Juge", "Tuteur Datif", and "Autre" each open a Bootstrap modal with explanatory prose about that legal-guardianship category (sourced from Moroccan family/child-protection law) — no additional form fields of their own; not modelled beyond the
legalRepresentativeCapacityenum value each corresponds to. - ~194-entry static country lists (six select fields).
countryOfBirth,fatherNationality,motherNationality,legalRepresentativeNationality,mandataryNationality(all country-name-valued), andcountryOfResidence(numeric-code-valued) are all modelled as open strings rather than literalenumarrays, to avoid transcription error at that scale — see finding 1 above for the two schemes' exact values. - No application was submitted and no fee was paid producing this schema.
Conformance
2 valid fixtures (0 errors each — an adult applicant paying by stamp code with no dependent-person blocks at all, and a 12-to-18-year-old minor with both parents known and the father acting as legal representative with no power of attorney granted) plus 8 mutation-control fixtures (each raising exactly 1 error: a plain missing-required-field case, a requiredWhen fee-exemption cascade violation, an invalid-pattern case on the CNIE number, two requiredWhen cascade violations inside the parent/legal-representative blocks, an invalid-enum case on gender, a requiredWhen cascade violation on the mandatary ID-type field once a power of attorney is granted, and an unknown-field-rejected case) are committed under conformance/ma/dgsn/passport-application/1.0.0/. All 10 were independently checked this session against a from-scratch mock validator implementing this schema's required/requiredWhen/visibleWhen/ pattern/enum/maxLength rules, each producing the exact expected error count. Both tools/validate.mjs and tools/validate-ajv.mjs pass with this document included.
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 Direction Générale de la Sûreté Nationale or any government. The authoritative source is always the live government form and its official instructions.